{"id":97858,"date":"2026-08-30T14:24:52","date_gmt":"2026-08-30T06:24:52","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/97858.html"},"modified":"2026-08-30T14:24:52","modified_gmt":"2026-08-30T06:24:52","slug":"nanogpt-%e9%80%90%e8%a1%8c%e8%ae%b2%e8%a7%a3","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/97858.html","title":{"rendered":"nanoGPT \u9010\u884c\u8bb2\u89e3"},"content":{"rendered":"<h5>\u4e00\u3001model.py \u5b8c\u6574\u89e3\u6790<\/h5>\n<p>model.py \u662f\u6574\u4e2a\u9879\u76ee\u7684\u6838\u5fc3&#xff0c;\u53ea\u6709 330 \u884c\u4ee3\u7801&#xff0c;\u5374\u5b9e\u73b0\u4e86\u5b8c\u6574\u7684 GPT \u6a21\u578b\u3002<\/p>\n<h6>1. LayerNorm&#xff08;\u7b2c18-27\u884c&#xff09;<\/h6>\n<p>\nclass LayerNorm(nn.Module):<br \/>\n\u00a0 \u00a0 def __init__(self, ndim, bias):<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 super().__init__()<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.weight &#061; nn.Parameter(torch.ones(ndim))<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.bias &#061; nn.Parameter(torch.zeros(ndim)) if bias else None<\/p>\n<p>\u00a0 \u00a0 def forward(self, input):<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 return F.layer_norm(input, self.weight.shape, self.weight, self.bias, 1e-5)<br \/>\n\u00a0<\/p>\n<p>\u4f5c\u7528&#xff1a;\u5c42\u5f52\u4e00\u5316&#xff0c;\u8ba9\u6bcf\u5c42\u7684\u8f93\u51fa\u5206\u5e03\u66f4\u7a33\u5b9a<\/p>\n<p>\u5173\u952e\u70b9&#xff1a;<br \/>\n&#8211; &#096;weight&#096; \u548c &#096;bias&#096; \u662f\u53ef\u5b66\u4e60\u53c2\u6570<br \/>\n&#8211; PyTorch \u7684 &#096;F.layer_norm&#096; \u9ed8\u8ba4\u4e0d\u652f\u6301 bias&#061;False&#xff0c;\u8fd9\u91cc\u505a\u4e86\u5c01\u88c5<br \/>\n&#8211; &#096;1e-5&#096; \u662f epsilon&#xff0c;\u9632\u6b62\u9664\u96f6<\/p>\n<h6>\u00a02. CausalSelfAttention&#xff08;\u7b2c29-76\u884c&#xff09;\u2014\u2014 \u6700\u91cd\u8981&#xff01;<\/h6>\n<p>\nclass CausalSelfAttention(nn.Module):<br \/>\n\u00a0 \u00a0 def __init__(self, config):<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 super().__init__()<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 assert config.n_embd % config.n_head &#061;&#061; 0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # QKV \u6295\u5f71&#xff1a;\u4e00\u4e2a\u7ebf\u6027\u5c42\u540c\u65f6\u8ba1\u7b97 Q, K, V<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.c_attn &#061; nn.Linear(config.n_embd, 3 * config.n_embd, bias&#061;config.bias)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # \u8f93\u51fa\u6295\u5f71<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.c_proj &#061; nn.Linear(config.n_embd, config.n_embd, bias&#061;config.bias)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # \u6b63\u5219\u5316<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.attn_dropout &#061; nn.Dropout(config.dropout)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.resid_dropout &#061; nn.Dropout(config.dropout)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.n_head &#061; config.n_head<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.n_embd &#061; config.n_embd<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.dropout &#061; config.dropout<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # Flash Attention \u68c0\u67e5&#xff08;PyTorch &gt;&#061; 2.0&#xff09;<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.flash &#061; hasattr(torch.nn.functional, &#039;scaled_dot_product_attention&#039;)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 if not self.flash:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # \u56e0\u679c\u63a9\u7801&#xff1a;\u786e\u4fdd\u53ea\u80fd\u770b\u5230\u5de6\u8fb9\u7684token<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.register_buffer(&#034;bias&#034;, torch.tril(torch.ones(config.block_size, config.block_size))<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .view(1, 1, config.block_size, config.block_size))<\/p>\n<p>\u00a0 \u00a0 def forward(self, x):<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 B, T, C &#061; x.size() \u00a0# Batch, Time, Channel<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # 1. \u6295\u5f71\u5f97\u5230 Q, K, V<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 q, k, v &#061; self.c_attn(x).split(self.n_embd, dim&#061;2)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # 2. \u591a\u5934\u91cd\u5851&#xff1a;[B, T, C] \u2192 [B, heads, T, head_dim]<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 k &#061; k.view(B, T, self.n_head, C \/\/ self.n_head).transpose(1, 2)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 q &#061; q.view(B, T, self.n_head, C \/\/ self.n_head).transpose(1, 2)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 v &#061; v.view(B, T, self.n_head, C \/\/ self.n_head).transpose(1, 2)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # 3. \u8ba1\u7b97\u6ce8\u610f\u529b<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 if self.flash:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # \u9ad8\u6548\u5b9e\u73b0&#xff08;PyTorch 2.0&#043;&#xff09;<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 y &#061; torch.nn.functional.scaled_dot_product_attention(<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 q, k, v, attn_mask&#061;None,\u00a0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 dropout_p&#061;self.dropout if self.training else 0,\u00a0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 is_causal&#061;True<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 )<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 else:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # \u624b\u52a8\u5b9e\u73b0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 att &#061; (q &#064; k.transpose(-2, -1)) * (1.0 \/ math.sqrt(k.size(-1)))<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 att &#061; att.masked_fill(self.bias[:,:,:T,:T] &#061;&#061; 0, float(&#039;-inf&#039;))<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 att &#061; F.softmax(att, dim&#061;-1)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 att &#061; self.attn_dropout(att)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 y &#061; att &#064; v<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # 4. \u5408\u5e76\u591a\u5934\u8f93\u51fa<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 y &#061; y.transpose(1, 2).contiguous().view(B, T, C)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # 5. \u8f93\u51fa\u6295\u5f71<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 y &#061; self.resid_dropout(self.c_proj(y))<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 return y<\/p>\n<p>\u6570\u636e\u6d41\u8be6\u89e3&#xff1a;<br \/>\n\u8f93\u5165: [B, T, C] \u00a0(Batch, Sequence, Embedding Dim)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u25bc<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502 \u00a0c_attn: Linear(C \u2192 3*C) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502<br \/>\n\u2502 \u00a0\u4e00\u6b21\u6295\u5f71\u540c\u65f6\u5f97\u5230 Q, K, V \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u25bc<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502 \u00a0\u91cd\u5851\u4e3a\u591a\u5934 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502<br \/>\n\u2502 \u00a0[B, T, 3*C] \u2192 [B, heads, T, hs] \u00a0 \u2502<br \/>\n\u2502 \u00a0\u5176\u4e2d hs &#061; C \/ heads \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u25bc<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502 \u00a0Attention(Q, K, V) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502<br \/>\n\u2502 \u00a0&#061; softmax(QK^T \/ \u221ahs) &#064; V \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u25bc<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502 \u00a0\u5408\u5e76\u591a\u5934 &#043; \u8f93\u51fa\u6295\u5f71 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502<br \/>\n\u2502 \u00a0[B, heads, T, hs] \u2192 [B, T, C] \u00a0 \u00a0 \u00a0\u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n\u00a0<\/p>\n<p>\u4e3a\u4ec0\u4e48\u53eb&#034;Causal&#034;&#xff08;\u56e0\u679c&#xff09;&#xff1f;<\/p>\n<p>\u56e0\u4e3a\u63a9\u7801\u77e9\u9635 &#096;self.bias&#096; \u662f\u4e0b\u4e09\u89d2\u77e9\u9635&#xff1a;<\/p>\n<p>[[1, 0, 0, 0],<br \/>\n\u00a0[1, 1, 0, 0],<br \/>\n\u00a0[1, 1, 1, 0],<br \/>\n\u00a0[1, 1, 1, 1]]<\/p>\n<p>\u8fd9\u786e\u4fdd\u4f4d\u7f6e i \u53ea\u80fd\u770b\u5230\u4f4d\u7f6e 0~i&#xff0c;\u770b\u4e0d\u5230\u672a\u6765\u3002<\/p>\n<\/p>\n<h6>\u00a03. MLP \/ Feed-Forward Network&#xff08;\u7b2c78-92\u884c&#xff09;<\/h6>\n<p>\nclass MLP(nn.Module):<br \/>\n\u00a0 \u00a0 def __init__(self, config):<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 super().__init__()<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # \u8f93\u5165\u6295\u5f71&#xff1a;C \u2192 4C<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.c_fc \u00a0 \u00a0&#061; nn.Linear(config.n_embd, 4 * config.n_embd, bias&#061;config.bias)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.gelu \u00a0 \u00a0&#061; nn.GELU() \u00a0# \u6fc0\u6d3b\u51fd\u6570<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # \u8f93\u51fa\u6295\u5f71&#xff1a;4C \u2192 C<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.c_proj \u00a0&#061; nn.Linear(4 * config.n_embd, config.n_embd, bias&#061;config.bias)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.dropout &#061; nn.Dropout(config.dropout)<\/p>\n<p>\u00a0 \u00a0 def forward(self, x):<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 x &#061; self.c_fc(x) \u00a0 \u00a0 \u00a0# [B, T, C] \u2192 [B, T, 4C]<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 x &#061; self.gelu(x) \u00a0 \u00a0 \u00a0# GELU \u6fc0\u6d3b<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 x &#061; self.c_proj(x) \u00a0 \u00a0# [B, T, 4C] \u2192 [B, T, C]<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 x &#061; self.dropout(x)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 return x<\/p>\n<p>\u4f5c\u7528&#xff1a;\u9010\u4f4d\u7f6e\u5904\u7406&#xff0c;\u6bcf\u4e2a token \u72ec\u7acb\u53d8\u6362<\/p>\n<p>\u4e3a\u4ec0\u4e48\u662f 4 \u500d&#xff1f;<br \/>\n&#8211; GPT-2 \u8bba\u6587\u4e2d\u7684\u6807\u51c6\u8bbe\u7f6e<br \/>\n&#8211; \u6269\u5927\u5bb9\u91cf\u540e\u518d\u538b\u7f29&#xff0c;\u5b66\u4e60\u66f4\u590d\u6742\u7684\u7279\u5f81<\/p>\n<\/p>\n<h6>4. Block&#xff08;\u7b2c94-106\u884c&#xff09;\u2014\u2014 Transformer \u5c42<\/h6>\n<p>\nclass Block(nn.Module):<br \/>\n\u00a0 \u00a0 def __init__(self, config):<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 super().__init__()<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.ln_1 &#061; LayerNorm(config.n_embd, bias&#061;config.bias)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.attn &#061; CausalSelfAttention(config)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.ln_2 &#061; LayerNorm(config.n_embd, bias&#061;config.bias)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.mlp &#061; MLP(config)<\/p>\n<p>\u00a0 \u00a0 def forward(self, x):<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # \u9884\u5f52\u4e00\u5316 &#043; \u6b8b\u5dee\u8fde\u63a5<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 x &#061; x &#043; self.attn(self.ln_1(x)) \u00a0 # \u6ce8\u610f\u529b\u5b50\u5c42<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 x &#061; x &#043; self.mlp(self.ln_2(x)) \u00a0 \u00a0# FFN \u5b50\u5c42<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 return x<\/p>\n<p>\u7ed3\u6784\u56fe\u793a&#xff1a;<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 x<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u2502<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u25bc\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u25bc<br \/>\n\u00a0 \u00a0 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u00a0 \u00a0 \u2502 Layer\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502 Layer\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502<br \/>\n\u00a0 \u00a0 \u2502 Norm\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0\u2502 Norm\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502<br \/>\n\u00a0 \u00a0 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u25bc\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u25bc<br \/>\n\u00a0 \u00a0 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u00a0 \u00a0 \u2502 Attention\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502 \u00a0MLP\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502<br \/>\n\u00a0 \u00a0 \u2502 (Multi-\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502(FFN)\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502<br \/>\n\u00a0 \u00a0 \u2502 \u00a0Head)\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n\u00a0 \u00a0 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0\u2502<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u25bc<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0 x (\u8f93\u51fa)<br \/>\n\u00a0<\/p>\n<p>\u6b8b\u5dee\u8fde\u63a5\u7684\u4f5c\u7528&#xff1a;<br \/>\n&#8211; \u68af\u5ea6\u53ef\u4ee5\u76f4\u901a&#xff0c;\u7f13\u89e3\u6d88\u5931\u68af\u5ea6\u95ee\u9898<br \/>\n&#8211; \u4fdd\u7559\u539f\u59cb\u4fe1\u606f&#xff0c;\u795e\u7ecf\u7f51\u7edc\u53ea\u5b66&#034;\u589e\u91cf&#034;<\/p>\n<h6>5. GPTConfig&#xff08;\u7b2c108-116\u884c&#xff09;<\/h6>\n<p>\n&#064;dataclass<br \/>\nclass GPTConfig:<br \/>\n\u00a0 \u00a0 block_size: int &#061; 1024 \u00a0 \u00a0 \u00a0# \u6700\u5927\u5e8f\u5217\u957f\u5ea6<br \/>\n\u00a0 \u00a0 vocab_size: int &#061; 50304 \u00a0 \u00a0 # GPT-2 \u8bcd\u8868\u5927\u5c0f (50257 \u8865\u9f50\u5230 64 \u7684\u500d\u6570)<br \/>\n\u00a0 \u00a0 n_layer: int &#061; 12 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # Transformer \u5c42\u6570<br \/>\n\u00a0 \u00a0 n_head: int &#061; 12 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0# \u6ce8\u610f\u529b\u5934\u6570<br \/>\n\u00a0 \u00a0 n_embd: int &#061; 768 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # \u5d4c\u5165\u7ef4\u5ea6<br \/>\n\u00a0 \u00a0 dropout: float &#061; 0.0 \u00a0 \u00a0 \u00a0 \u00a0# \u00a0dropout \u7387<br \/>\n\u00a0 \u00a0 bias: bool &#061; True \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # \u662f\u5426\u4f7f\u7528 bias<\/p>\n<h6>6. GPT \u6a21\u578b&#xff08;\u7b2c118-330\u884c&#xff09;<\/h6>\n<p>\nclass GPT(nn.Module):<br \/>\n\u00a0 \u00a0 def __init__(self, config):<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 super().__init__()<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.config &#061; config<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 # Transformer \u4e3b\u4f53<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.transformer &#061; nn.ModuleDict(dict(<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 wte &#061; nn.Embedding(config.vocab_size, config.n_embd), \u00a0# \u8bcd\u5d4c\u5165<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 wpe &#061; nn.Embedding(config.block_size, config.n_embd), \u00a0# \u4f4d\u7f6e\u5d4c\u5165<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 drop &#061; nn.Dropout(config.dropout),<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 h &#061; nn.ModuleList([Block(config) for _ in range(config.n_layer)]), \u00a0# \u591a\u5c42 Block<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ln_f &#061; LayerNorm(config.n_embd, bias&#061;config.bias), \u00a0# \u6700\u7ec8\u5f52\u4e00\u5316<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 ))<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # \u8bed\u8a00\u6a21\u578b\u5934<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.lm_head &#061; nn.Linear(config.n_embd, config.vocab_size, bias&#061;False)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # Weight Tying&#xff1a;\u8f93\u51fa\u6295\u5f71\u590d\u7528\u8bcd\u5d4c\u5165\u6743\u91cd<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.transformer.wte.weight &#061; self.lm_head.weight<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 # \u6743\u91cd\u521d\u59cb\u5316<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 self.apply(self._init_weights)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 for pn, p in self.named_parameters():<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if pn.endswith(&#039;c_proj.weight&#039;):<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 torch.nn.init.normal_(p, mean&#061;0.0, std&#061;0.02\/math.sqrt(2 * config.n_layer))<br \/>\n&#096;&#096;&#096;<\/p>\n<p>**\u524d\u5411\u4f20\u64ad&#xff08;\u7b2c170-193\u884c&#xff09;&#xff1a;**<\/p>\n<p>&#096;&#096;&#096;python<br \/>\ndef forward(self, idx, targets&#061;None):<br \/>\n\u00a0 \u00a0 device &#061; idx.device<br \/>\n\u00a0 \u00a0 b, t &#061; idx.size()<br \/>\n\u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 # \u4f4d\u7f6e\u7f16\u7801<br \/>\n\u00a0 \u00a0 pos &#061; torch.arange(0, t, dtype&#061;torch.long, device&#061;device)<br \/>\n\u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 # 1. Token Embedding &#043; Position Embedding<br \/>\n\u00a0 \u00a0 tok_emb &#061; self.transformer.wte(idx) \u00a0 \u00a0 \u00a0# [B, T, C]<br \/>\n\u00a0 \u00a0 pos_emb &#061; self.transformer.wpe(pos) \u00a0 \u00a0 \u00a0# [T, C]<br \/>\n\u00a0 \u00a0 x &#061; self.transformer.drop(tok_emb &#043; pos_emb)<br \/>\n\u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 # 2. \u901a\u8fc7\u6240\u6709 Transformer \u5c42<br \/>\n\u00a0 \u00a0 for block in self.transformer.h:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 x &#061; block(x)<br \/>\n\u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 # 3. \u6700\u7ec8\u5f52\u4e00\u5316<br \/>\n\u00a0 \u00a0 x &#061; self.transformer.ln_f(x)<br \/>\n\u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 # 4. \u8f93\u51fa logits<br \/>\n\u00a0 \u00a0 if targets is not None:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # \u8bad\u7ec3\u6a21\u5f0f&#xff1a;\u8ba1\u7b97\u6240\u6709\u4f4d\u7f6e\u7684\u635f\u5931<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 logits &#061; self.lm_head(x)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 loss &#061; F.cross_entropy(logits.view(-1, logits.size(-1)), targets.view(-1))<br \/>\n\u00a0 \u00a0 else:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # \u63a8\u7406\u6a21\u5f0f&#xff1a;\u53ea\u53d6\u6700\u540e\u4e00\u4e2a\u4f4d\u7f6e\u7684 logits&#xff08;\u6548\u7387\u4f18\u5316&#xff09;<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 logits &#061; self.lm_head(x[:, [-1], :])<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 loss &#061; None<br \/>\n\u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 return logits, loss<\/p>\n<p>\u5173\u952e\u4f18\u5316&#xff1a;\u63a8\u7406\u65f6\u53ea\u53d6\u6700\u540e\u4e00\u4e2a\u4f4d\u7f6e<\/p>\n<p>\nlogits &#061; self.lm_head(x[:, [-1], :]) \u00a0# \u53ea\u53d6\u6700\u540e\u4e00\u6b65<br \/>\n\u00a0<\/p>\n<p>\u56e0\u4e3a GPT \u662f\u81ea\u56de\u5f52\u6a21\u578b&#xff0c;\u6211\u4eec\u53ea\u9700\u8981\u9884\u6d4b\u4e0b\u4e00\u4e2a token&#xff0c;\u524d\u9762\u7684 position \u7684 logits \u4e0d\u7528\u8ba1\u7b97\u3002<\/p>\n<h6>7. \u751f\u6210\u51fd\u6570&#xff08;\u7b2c305-330\u884c&#xff09;<\/h6>\n<p>\n&#064;torch.no_grad()<br \/>\ndef generate(self, idx, max_new_tokens, temperature&#061;1.0, top_k&#061;None):<br \/>\n\u00a0 \u00a0 for _ in range(max_new_tokens):<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # 1. \u5982\u679c\u5e8f\u5217\u592a\u957f&#xff0c;\u53ea\u4fdd\u7559\u6700\u540e block_size \u4e2a token<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 idx_cond &#061; idx if idx.size(1) &lt;&#061; self.config.block_size else idx[:, -self.config.block_size:]<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # 2. \u524d\u5411\u4f20\u64ad<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 logits, _ &#061; self(idx_cond)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # 3. \u53d6\u6700\u540e\u4e00\u4e2a\u4f4d\u7f6e\u7684 logits&#xff0c;\u9664\u4ee5 temperature<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 logits &#061; logits[:, -1, :] \/ temperature<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # 4. Top-k \u88c1\u526a<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 if top_k is not None:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 v, _ &#061; torch.topk(logits, min(top_k, logits.size(-1)))<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 logits[logits &lt; v[:, [-1]]] &#061; -float(&#039;Inf&#039;)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # 5. Softmax \u8f6c\u6982\u7387<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 probs &#061; F.softmax(logits, dim&#061;-1)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # 6. \u91c7\u6837<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 idx_next &#061; torch.multinomial(probs, num_samples&#061;1)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # 7. \u8ffd\u52a0\u5230\u5e8f\u5217<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 idx &#061; torch.cat((idx, idx_next), dim&#061;1)<br \/>\n\u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 return idx<\/p>\n<p>\u91c7\u6837\u7b56\u7565&#xff1a;<\/p>\n<p>| \u53c2\u6570\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 | \u4f5c\u7528\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 | \u63a8\u8350\u503c |<br \/>\n|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-|&#8212;&#8212;&#8212;&#8211;|<br \/>\n| &#096;temperature&#096; | \u63a7\u5236\u968f\u673a\u6027&#xff0c;\u8d8a\u4f4e\u8d8a\u4fdd\u5b88\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 | 0.8-1.0 |<br \/>\n| &#096;top_k&#096;\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0| \u53ea\u4ece\u6982\u7387\u6700\u9ad8\u7684 k \u4e2a token \u4e2d\u91c7\u6837 | 50-200 |<\/p>\n<\/p>\n<h5>\u4e8c\u3001train.py \u5b8c\u6574\u89e3\u6790<\/h5>\n<p>train.py \u662f\u8bad\u7ec3\u5faa\u73af&#xff0c;\u7ea6 330 \u884c\u3002<\/p>\n<h6>1. \u914d\u7f6e\u53c2\u6570&#xff08;\u7b2c32-78\u884c&#xff09;<\/h6>\n<p>\n# \u6570\u636e<br \/>\ndataset &#061; &#039;openwebtext&#039;<br \/>\nbatch_size &#061; 12 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # \u6bcf\u4e2a GPU \u7684 batch size<br \/>\nblock_size &#061; 1024 \u00a0 \u00a0 \u00a0 \u00a0 # \u5e8f\u5217\u957f\u5ea6<br \/>\ngradient_accumulation_steps &#061; 5 * 8 \u00a0# \u68af\u5ea6\u7d2f\u79ef\u6b65\u6570<\/p>\n<p># \u6a21\u578b<br \/>\nn_layer &#061; 12<br \/>\nn_head &#061; 12<br \/>\nn_embd &#061; 768<br \/>\ndropout &#061; 0.0<\/p>\n<p># \u4f18\u5316\u5668<br \/>\nlearning_rate &#061; 6e-4<br \/>\nmax_iters &#061; 600000<br \/>\nweight_decay &#061; 1e-1<br \/>\nbeta1 &#061; 0.9<br \/>\nbeta2 &#061; 0.95<br \/>\ngrad_clip &#061; 1.0<\/p>\n<p># \u5b66\u4e60\u7387\u8c03\u5ea6<br \/>\nwarmup_iters &#061; 2000<br \/>\nlr_decay_iters &#061; 600000<br \/>\nmin_lr &#061; 6e-5<\/p>\n<h6>2. \u6570\u636e\u52a0\u8f7d&#xff08;\u7b2c114-131\u884c&#xff09;<\/h6>\n<p>\ndef get_batch(split):<br \/>\n\u00a0 \u00a0 # \u4f7f\u7528 memmap \u907f\u514d\u5185\u5b58\u6cc4\u6f0f<br \/>\n\u00a0 \u00a0 if split &#061;&#061; &#039;train&#039;:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 data &#061; np.memmap(os.path.join(data_dir, &#039;train.bin&#039;), dtype&#061;np.uint16, mode&#061;&#039;r&#039;)<br \/>\n\u00a0 \u00a0 else:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 data &#061; np.memmap(os.path.join(data_dir, &#039;val.bin&#039;), dtype&#061;np.uint16, mode&#061;&#039;r&#039;)<br \/>\n\u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 # \u968f\u673a\u9009\u62e9 batch_size \u4e2a\u8d77\u59cb\u4f4d\u7f6e<br \/>\n\u00a0 \u00a0 ix &#061; torch.randint(len(data) &#8211; block_size, (batch_size,))<br \/>\n\u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 # \u63d0\u53d6\u8f93\u5165 x \u548c\u76ee\u6807 y<br \/>\n\u00a0 \u00a0 x &#061; torch.stack([torch.from_numpy((data[i:i&#043;block_size]).astype(np.int64)) for i in ix])<br \/>\n\u00a0 \u00a0 y &#061; torch.stack([torch.from_numpy((data[i&#043;1:i&#043;1&#043;block_size]).astype(np.int64)) for i in ix])<br \/>\n\u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 # \u79fb\u5230 GPU<br \/>\n\u00a0 \u00a0 if device_type &#061;&#061; &#039;cuda&#039;:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 x, y &#061; x.pin_memory().to(device, non_blocking&#061;True), y.pin_memory().to(device, non_blocking&#061;True)<br \/>\n\u00a0 \u00a0 else:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 x, y &#061; x.to(device), y.to(device)<br \/>\n\u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 return x, y<\/p>\n<p>\u5173\u952e\u8bbe\u8ba1&#xff1a;<br \/>\n&#8211; &#096;memmap&#096;&#xff1a;\u5185\u5b58\u6620\u5c04\u6587\u4ef6&#xff0c;\u4e0d\u5360\u7528\u5b9e\u9645\u5185\u5b58<br \/>\n&#8211; &#096;x&#096; \u548c &#096;y&#096; \u7684\u5173\u7cfb&#xff1a;y \u662f x \u53f3\u79fb\u4e00\u4f4d&#xff08;\u9884\u6d4b\u4e0b\u4e00\u4e2a token&#xff09;<br \/>\n&#8211; &#096;pin_memory()&#096;&#xff1a;\u52a0\u901f CPU\u2192GPU \u6570\u636e\u4f20\u8f93<\/p>\n<h6>3. \u6a21\u578b\u521d\u59cb\u5316&#xff08;\u7b2c146-193\u884c&#xff09;<\/h6>\n<p>\n# \u4e09\u79cd\u521d\u59cb\u5316\u65b9\u5f0f<br \/>\nif init_from &#061;&#061; &#039;scratch&#039;:<br \/>\n\u00a0 \u00a0 # \u4ece\u96f6\u5f00\u59cb<br \/>\n\u00a0 \u00a0 gptconf &#061; GPTConfig(**model_args)<br \/>\n\u00a0 \u00a0 model &#061; GPT(gptconf)<br \/>\nelif init_from &#061;&#061; &#039;resume&#039;:<br \/>\n\u00a0 \u00a0 # \u4ece\u68c0\u67e5\u70b9\u6062\u590d<br \/>\n\u00a0 \u00a0 checkpoint &#061; torch.load(ckpt_path, map_location&#061;device)<br \/>\n\u00a0 \u00a0 model.load_state_dict(checkpoint[&#039;model&#039;])<br \/>\nelif init_from.startswith(&#039;gpt2&#039;):<br \/>\n\u00a0 \u00a0 # \u4ece OpenAI \u9884\u8bad\u7ec3\u6743\u91cd\u52a0\u8f7d<br \/>\n\u00a0 \u00a0 model &#061; GPT.from_pretrained(init_from, override_args)<\/p>\n<\/p>\n<h6>\u00a04. \u635f\u5931\u4f30\u7b97&#xff08;\u7b2c215-228\u884c&#xff09;<\/h6>\n<p>\n&#064;torch.no_grad()<br \/>\ndef estimate_loss():<br \/>\n\u00a0 \u00a0 out &#061; {}<br \/>\n\u00a0 \u00a0 model.eval()<br \/>\n\u00a0 \u00a0 for split in [&#039;train&#039;, &#039;val&#039;]:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 losses &#061; torch.zeros(eval_iters)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 for k in range(eval_iters):<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 X, Y &#061; get_batch(split)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 with ctx:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 logits, loss &#061; model(X, Y)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 losses[k] &#061; loss.item()<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 out[split] &#061; losses.mean()<br \/>\n\u00a0 \u00a0 model.train()<br \/>\n\u00a0 \u00a0 return out<\/p>\n<p>\u4e3a\u4ec0\u4e48\u7528 &#096;&#064;torch.no_grad()&#096;&#xff1f;<br \/>\n&#8211; \u8bc4\u4f30\u65f6\u4e0d\u9700\u8981\u8ba1\u7b97\u68af\u5ea6&#xff0c;\u8282\u7701\u5185\u5b58<br \/>\n&#8211; \u901f\u5ea6\u66f4\u5feb<\/p>\n<h6>\u00a05. \u5b66\u4e60\u7387\u8c03\u5ea6&#xff08;\u7b2c230-242\u884c&#xff09;<\/h6>\n<p>\ndef get_lr(it):<br \/>\n\u00a0 \u00a0 # 1. \u7ebf\u6027 warmup<br \/>\n\u00a0 \u00a0 if it &lt; warmup_iters:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 return learning_rate * (it &#043; 1) \/ (warmup_iters &#043; 1)<br \/>\n\u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 # 2. \u8d85\u8fc7 decay_iters \u540e\u4f7f\u7528\u6700\u5c0f\u5b66\u4e60\u7387<br \/>\n\u00a0 \u00a0 if it &gt; lr_decay_iters:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 return min_lr<br \/>\n\u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 # 3. Cosine \u8870\u51cf<br \/>\n\u00a0 \u00a0 decay_ratio &#061; (it &#8211; warmup_iters) \/ (lr_decay_iters &#8211; warmup_iters)<br \/>\n\u00a0 \u00a0 coeff &#061; 0.5 * (1.0 &#043; math.cos(math.pi * decay_ratio))<br \/>\n\u00a0 \u00a0 return min_lr &#043; coeff * (learning_rate &#8211; min_lr)<\/p>\n<p>\u5b66\u4e60\u7387\u66f2\u7ebf&#xff1a;<\/p>\n<p>lr<br \/>\n\u2502 \u00a0 \u00a0\u256d\u2500\u2500\u2500 warmup<br \/>\n\u2502 \u00a0 \u2571<br \/>\n\u2502 \u00a0\u2571<br \/>\n\u2502 \u2571<br \/>\n\u256d\u2500\u256f<br \/>\n\u2502 \u00a0 \u00a0 \u00a0 \u00a0\u2572_________ cosine decay<br \/>\n\u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 iter<br \/>\n\u00a0 \u00a0 \u00a00 \u00a0 2000 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0600000<\/p>\n<p>\u00a06. \u8bad\u7ec3\u5faa\u73af&#xff08;\u7b2c249-333\u884c&#xff09;<\/p>\n<p>\n# \u83b7\u53d6\u7b2c\u4e00\u6279\u6570\u636e<br \/>\nX, Y &#061; get_batch(&#039;train&#039;)<br \/>\nt0 &#061; time.time()<\/p>\n<p>while True:<br \/>\n\u00a0 \u00a0 # 1. \u8bbe\u7f6e\u5b66\u4e60\u7387<br \/>\n\u00a0 \u00a0 lr &#061; get_lr(iter_num)<br \/>\n\u00a0 \u00a0 for param_group in optimizer.param_groups:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 param_group[&#039;lr&#039;] &#061; lr<br \/>\n\u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 # 2. \u5b9a\u671f\u8bc4\u4f30\u548c\u4fdd\u5b58<br \/>\n\u00a0 \u00a0 if iter_num % eval_interval &#061;&#061; 0 and master_process:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 losses &#061; estimate_loss()<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 print(f&#034;step {iter_num}: train loss {losses[&#039;train&#039;]:.4f}, val loss {losses[&#039;val&#039;]:.4f}&#034;)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # \u4fdd\u5b58\u6700\u4f73\u6a21\u578b<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 if losses[&#039;val&#039;] &lt; best_val_loss:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 best_val_loss &#061; losses[&#039;val&#039;]<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 torch.save(checkpoint, os.path.join(out_dir, &#039;ckpt.pt&#039;))<br \/>\n\u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 # 3. \u524d\u5411 &#043; \u53cd\u5411 &#043; \u66f4\u65b0<br \/>\n\u00a0 \u00a0 for micro_step in range(gradient_accumulation_steps):<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 if ddp:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 model.require_backward_grad_sync &#061; (micro_step &#061;&#061; gradient_accumulation_steps &#8211; 1)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 with ctx:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 logits, loss &#061; model(X, Y)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 loss &#061; loss \/ gradient_accumulation_steps \u00a0# \u68af\u5ea6\u7d2f\u79ef<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # \u5f02\u6b65\u9884\u53d6\u4e0b\u4e00\u6279\u6570\u636e<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 X, Y &#061; get_batch(&#039;train&#039;)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 # \u53cd\u5411\u4f20\u64ad<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 scaler.scale(loss).backward()<br \/>\n\u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 # 4. \u68af\u5ea6\u88c1\u526a<br \/>\n\u00a0 \u00a0 if grad_clip !&#061; 0.0:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 scaler.unscale_(optimizer)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 torch.nn.utils.clip_grad_norm_(model.parameters(), grad_clip)<br \/>\n\u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 # 5. \u4f18\u5316\u5668\u6b65\u8fdb<br \/>\n\u00a0 \u00a0 scaler.step(optimizer)<br \/>\n\u00a0 \u00a0 scaler.update()<br \/>\n\u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 # 6. \u6e05\u7a7a\u68af\u5ea6<br \/>\n\u00a0 \u00a0 optimizer.zero_grad(set_to_none&#061;True)<br \/>\n\u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 # 7. \u8ba1\u65f6\u548c\u65e5\u5fd7<br \/>\n\u00a0 \u00a0 t1 &#061; time.time()<br \/>\n\u00a0 \u00a0 dt &#061; t1 &#8211; t0<br \/>\n\u00a0 \u00a0 # &#8230; \u6253\u5370 loss, time, mfu &#8230;<br \/>\n\u00a0 \u00a0\u00a0<br \/>\n\u00a0 \u00a0 iter_num &#043;&#061; 1<br \/>\n\u00a0 \u00a0 if iter_num &gt; max_iters:<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 break<\/p>\n<\/p>\n<h5>\u00a0\u4e09\u3001\u6574\u4f53\u6570\u636e\u6d41\u56fe<\/h5>\n<p>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u8bad\u7ec3\u6d41\u7a0b<br \/>\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550<\/p>\n<p>\u00a0 train.bin \/ val.bin (uint16 token IDs)<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u25bc<br \/>\n\u00a0 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u00a0 \u2502 \u00a0 get_batch() \u00a0 \u2502 \u00a0\u2190 \u968f\u673a\u91c7\u6837 block_size \u4e2a\u8fde\u7eed token<br \/>\n\u00a0 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u25bc<br \/>\n\u00a0 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u00a0 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0 GPT Model\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502<br \/>\n\u00a0 \u2502 \u00a0\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u00a0 \u00a0 \u00a0 \u00a0\u00a0\u00a0\u2502<br \/>\n\u00a0 \u2502 \u00a0\u2502\u00a0 \u00a0 \u00a0 \u00a0 wte &#043; wpe\u00a0 \u00a0 \u00a0\u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502 \u00a0\u2190 Token &#043; Position Embedding<br \/>\n\u00a0 \u2502 \u00a0\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502<br \/>\n\u00a0 \u2502 \u00a0\u2502\u00a0 \u00a0 \u00a0 \u00a0 Block \u00d7 N\u00a0 \u00a0 \u00a0 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502 \u00a0\u2190 N \u5c42 Transformer<br \/>\n\u00a0 \u2502 \u00a0\u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0&#8211; Attn\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502\u00a0 \u00a0 \u00a0 \u00a0 \u2502<br \/>\n\u00a0 \u2502 \u00a0\u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0&#8211; FFN \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502\u00a0 \u00a0 \u00a0 \u00a0 \u2502<br \/>\n\u00a0 \u2502 \u00a0\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u00a0 \u00a0 \u00a0 \u00a0 \u2502<br \/>\n\u00a0 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502<br \/>\n\u00a0 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u25bc\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502<br \/>\n\u00a0 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 lm_head\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2502 \u00a0\u2190 \u6295\u5f71\u5230\u8bcd\u8868\u5927\u5c0f<br \/>\n\u00a0 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0\u00a0\u2502<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u25bc<br \/>\n\u00a0 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u00a0 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0\u00a0CrossEntropy\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502 \u00a0\u2190 \u8ba1\u7b97 loss<br \/>\n\u00a0 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Loss\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502<br \/>\n\u00a0 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0\u00a0\u2502<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0\u25bc<br \/>\n\u00a0 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u00a0 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0\u00a0Backward &#043;\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0\u2502 \u00a0\u2190 \u53cd\u5411\u4f20\u64ad<br \/>\n\u00a0 \u2502\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Optimizer\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502<br \/>\n\u00a0 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u2502<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u25bc<br \/>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u66f4\u65b0\u6743\u91cd<\/p>\n<h5>\u00a0\u56db\u3001\u5173\u952e\u6570\u5b57\u603b\u7ed3<\/h5>\n<p>| \u53c2\u6570 | GPT-2 (124M) | \u8bf4\u660e |<br \/>\n|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-|&#8212;&#8212;&#8212;&#8212;-|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-|<br \/>\n| &#096;vocab_size&#096; | 50304\u00a0 \u00a0| \u8bcd\u8868\u5927\u5c0f\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0 |<br \/>\n| &#096;n_embd&#096;\u00a0 \u00a0 \u00a0 \u00a0| 768\u00a0 \u00a0 \u00a0 \u00a0| \u5d4c\u5165\u7ef4\u5ea6\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0 |<br \/>\n| &#096;n_layer&#096;\u00a0 \u00a0 \u00a0 \u00a0\u00a0 | 12\u00a0 \u00a0 \u00a0 \u00a0 \u00a0| Transformer \u5c42\u6570 |<br \/>\n| &#096;n_head&#096;\u00a0 \u00a0 \u00a0 \u00a0 \u00a0| 12\u00a0 \u00a0 \u00a0 \u00a0 | \u6ce8\u610f\u529b\u5934\u6570\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0|<br \/>\n| &#096;block_size&#096;\u00a0 \u00a0| 1024\u00a0 \u00a0 | \u6700\u5927\u5e8f\u5217\u957f\u5ea6\u00a0 \u00a0 \u00a0\u00a0 |<br \/>\n| \u53c2\u6570\u91cf\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 | ~124M\u00a0| 1.24 \u4ebf\u53c2\u6570\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 |<\/p>\n<p>\u8ba1\u7b97\u91cf\u4f30\u7b97&#xff1a;<\/p>\n<p>\u6bcf token FLOPs \u2248 6 \u00d7 \u53c2\u6570\u91cf &#061; 6 \u00d7 124M \u2248 744M FLOPs<\/p>\n<h5>\u00a0\u4e94\u3001\u5b66\u4e60\u5efa\u8bae<\/h5>\n<p>1. \u5148\u8dd1\u901a&#xff1a;&#096;python train.py config\/train_shakespeare_char.py&#096;<br \/>\n2. \u8bfb\u4ee3\u7801&#xff1a;\u9010\u884c\u7406\u89e3 model.py \u7684\u6bcf\u4e2a\u7c7b<br \/>\n3. \u6539\u53c2\u6570&#xff1a;\u5c1d\u8bd5\u4fee\u6539 n_layer, n_head, n_embd \u89c2\u5bdf\u53d8\u5316<br \/>\n4. \u52a0\u529f\u80fd&#xff1a;\u5c1d\u8bd5\u52a0\u5165\u65b0\u7684\u5c42\u6216\u4fee\u6539 attention \u673a\u5236<br \/>\n\u00a0<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u3001model.py \u5b8c\u6574\u89e3\u6790model.py \u662f\u6574\u4e2a\u9879\u76ee\u7684\u6838\u5fc3&#xff0c;\u53ea\u6709 330 \u884c\u4ee3\u7801&#xff0c;\u5374\u5b9e\u73b0\u4e86\u5b8c\u6574\u7684 GPT \u6a21\u578b\u30021. LayerNorm&#xff08;\u7b2c18-27\u884c&#xff09;class LayerNorm(nn.Module):def __init__(self, ndim, bias):super().__init__()self.weight  nn.Parameter(torch.ones(ndim))self.bias  nn<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[11215,11214,152,50,86],"topic":[],"class_list":["post-97858","post","type-post","status-publish","format-standard","hentry","category-server","tag-nanochat","tag-nanogtp","tag-pytorch","tag-50","tag-86"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>nanoGPT \u9010\u884c\u8bb2\u89e3 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/97858.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"nanoGPT \u9010\u884c\u8bb2\u89e3 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u4e00\u3001model.py \u5b8c\u6574\u89e3\u6790model.py \u662f\u6574\u4e2a\u9879\u76ee\u7684\u6838\u5fc3&#xff0c;\u53ea\u6709 330 \u884c\u4ee3\u7801&#xff0c;\u5374\u5b9e\u73b0\u4e86\u5b8c\u6574\u7684 GPT \u6a21\u578b\u30021. LayerNorm&#xff08;\u7b2c18-27\u884c&#xff09;class LayerNorm(nn.Module):def __init__(self, ndim, bias):super().__init__()self.weight nn.Parameter(torch.ones(ndim))self.bias nn\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/97858.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-30T06:24:52+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/97858.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/97858.html\",\"name\":\"nanoGPT \u9010\u884c\u8bb2\u89e3 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-08-30T06:24:52+00:00\",\"dateModified\":\"2026-08-30T06:24:52+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/97858.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/97858.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/97858.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"nanoGPT \u9010\u884c\u8bb2\u89e3\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"nanoGPT \u9010\u884c\u8bb2\u89e3 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/97858.html","og_locale":"zh_CN","og_type":"article","og_title":"nanoGPT \u9010\u884c\u8bb2\u89e3 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u4e00\u3001model.py \u5b8c\u6574\u89e3\u6790model.py \u662f\u6574\u4e2a\u9879\u76ee\u7684\u6838\u5fc3&#xff0c;\u53ea\u6709 330 \u884c\u4ee3\u7801&#xff0c;\u5374\u5b9e\u73b0\u4e86\u5b8c\u6574\u7684 GPT \u6a21\u578b\u30021. LayerNorm&#xff08;\u7b2c18-27\u884c&#xff09;class LayerNorm(nn.Module):def __init__(self, ndim, bias):super().__init__()self.weight nn.Parameter(torch.ones(ndim))self.bias nn","og_url":"https:\/\/www.wsisp.com\/helps\/97858.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-08-30T06:24:52+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"8 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/97858.html","url":"https:\/\/www.wsisp.com\/helps\/97858.html","name":"nanoGPT \u9010\u884c\u8bb2\u89e3 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-08-30T06:24:52+00:00","dateModified":"2026-08-30T06:24:52+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/97858.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/97858.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/97858.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"nanoGPT \u9010\u884c\u8bb2\u89e3"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/97858","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=97858"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/97858\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=97858"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=97858"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=97858"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=97858"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}