Skip to main content

Module explain_network

Module explain_network 

Source
Expand description

The course GPT’s network diagram at level 2, generated (make network-figure) and held current by a test.

§The course GPT’s network

The network diagram of corpus/nlp/05_gpt.psk’s loss at D = 64, H = 2, L = 2, B = 2, T = 16, in f64, at level 2: GPT.apply opened and its stack of blocks opened to one layer, as the page’s Network tab draws it, composed from each box’s frame (plan 0.14.0 step 3, plan 0.14.1). Generated by make network-figure, that is

presk dump corpus/nlp/05_gpt.psk --stage network --entry loss --const D=64 --const H=2 --const L=2 --dim B=2 --dim T=16 --level 2 --format svg

and held current by a test of presk-explain. Each box carries its function’s formula in the printer’s Unicode form, its parameters and the cost model’s W and Q, a layer’s inside the stack; each arrow is coloured by its realized type, its width by its bytes; the random keys are left out. The report’s two figures (presk-specs report/figures/network-gpt.tex and network-gpt-block.tex) are level 1 and Block alone, by the same layout in TikZ; the page opens any set of boxes, and --level all every one.

loss θ 113 k f64 · W 7.37 M · Q 3.67 MB batch ad:loss/%5 GPT.apply · GPT θ 113 k f64 · W 7.34 M · Q 3.65 MB %6 = cross_entropy %5, y cross_entropy %7 = mean %6 mean result ids mask = causal_mask seq: T causal_mask seq %5 = embed tok, ids embed %7 = positions seq: T positions seq %8 = embed pos, %7 embed h0 = %5 + %8 add ad:GPT.apply/%18 blocks ×2 · Block θ 100 k f64 · W 6.94 M · Q 3.33 MB ad:GPT.apply/%22 lnf · LayerNorm{64} θ 128 f64 · W 18.8 k · Q 101 kB μ = mean axis model x σ2 = mean axis model (x − μ)² ⟦LayerNorm.apply⟧(θ, x) = ((x − μ) / √(σ2 + 1e-5)) × γ + β %24 = dot %22, head dot θ.tok θ 5.89 k f64 θ.pos θ 1.02 k f64 θ.head θ 5.89 k f64 result s mask ad:Block.apply/%16 ln1 · LayerNorm{64} θ 128 f64 · W 18.8 k · Q 101 kB μ = mean axis model x σ2 = mean axis model (x − μ)² ⟦LayerNorm.apply⟧(θ, x) = ((x − μ) / √(σ2 + 1e-5)) × γ + β ad:Block.apply/%18 attn · SelfAttention θ 16.6 k f64 · W 1.22 M · Q 643 kB q = split_heads HxHD ⟦wq.apply⟧(x) k = split_heads HxHD ⟦wk.apply⟧(x) v = split_heads HxHD ⟦wv.apply⟧(x) s[batch, heads, seq, seq2] = (∑_{hd} q[batch, heads, seq, hd] k[batch, heads, seq2, hd]) / √HD a = dropout 0.2, kd, (softmax axis seq2 s, mask) u[batch, heads, seq, hd] = ∑_{seq2} a[batch, heads, seq, seq2] v[batch, heads, seq2, hd] ⟦SelfAttention.apply⟧(θ, x, mask, kd) = ⟦wo.apply⟧(merge_heads HxHD u) h = x + %18 add ad:Block.apply/%24 ln2 · LayerNorm{64} θ 128 f64 · W 18.8 k · Q 101 kB μ = mean axis model x σ2 = mean axis model (x − μ)² ⟦LayerNorm.apply⟧(θ, x) = ((x − μ) / √(σ2 + 1e-5)) × γ + β ad:Block.apply/%26 ff · FeedForward θ 33.1 k f64 · W 2.21 M · Q 723 kB ⟦FeedForward.apply⟧(θ, x) = ⟦down.apply⟧(gelu ⟦up.apply⟧(x)) %29 = h + %26 add result loss/%3: idx[92][batch: 2, seq: 16], idx, 256 B loss/%5: ℝ[batch: 2, seq: 16, vocab: 92], f64, 23552 B loss/%4: idx[92][batch: 2, seq: 16], idx, 256 B loss/%6: ℝ[batch: 2, seq: 16], f64, 256 B loss/%7: ℝ[], f64, 8 B GPT.apply/%4: ℝ[vocab: 92, model: 64], f64, 47104 B loss/%3: idx[92][batch: 2, seq: 16], idx, 256 B GPT.apply/%6: ℝ[16, 64], f64, 8192 B GPT.apply/%7: idx[16][seq: 16], idx, 128 B GPT.apply/%5: ℝ[batch: 2, seq: 16, model: 64], f64, 16384 B GPT.apply/%8: ℝ[seq: 16, 64], f64, 8192 B GPT.apply/%9: ℝ[batch: 2, seq: 16, model: 64], f64, 16384 B GPT.apply/%3: bool[seq: 16, seq2: 16], bool, 2048 B GPT.apply/%19: ℝ[batch: 2, seq: 16, model: 64], f64, 16384 B GPT.apply/%22: ℝ[batch: 2, seq: 16, model: 64], f64, 16384 B GPT.apply/%23: ℝ[64, 92], f64, 47104 B GPT.apply/%24: ℝ[batch: 2, seq: 16, 92], f64, 23552 B Block.apply/%3: ℝ[batch: 2, seq: 16, model: 64], f64, 16384 B Block.apply/%16: ℝ[batch: 2, seq: 16, model: 64], f64, 16384 B GPT.apply/%3: bool[seq: 16, seq2: 16], bool, 2048 B Block.apply/%3: ℝ[batch: 2, seq: 16, model: 64], f64, 16384 B Block.apply/%18: ℝ[batch: 2, seq: 16, model: 64], f64, 16384 B Block.apply/%21: ℝ[batch: 2, seq: 16, model: 64], f64, 16384 B Block.apply/%24: ℝ[batch: 2, seq: 16, model: 64], f64, 16384 B Block.apply/%21: ℝ[batch: 2, seq: 16, model: 64], f64, 16384 B Block.apply/%26: ℝ[batch: 2, seq: 16, model: 64], f64, 16384 B Block.apply/%29: ℝ[batch: 2, seq: 16, model: 64], f64, 16384 B