From 25257bbb67c099f7ef9ac82ccbddba78c8097425 Mon Sep 17 00:00:00 2001 From: dzlab Date: Thu, 20 Aug 2026 15:45:14 -0700 Subject: [PATCH 1/6] Add JAX MiniGPT training article --- _posts/2026-08-20-build-train-llm-jax.md | 550 ++++++++++++++++++ .../08/20260820-jax-llm-training-loss.png | Bin 0 -> 154294 bytes 2 files changed, 550 insertions(+) create mode 100644 _posts/2026-08-20-build-train-llm-jax.md create mode 100644 assets/2026/08/20260820-jax-llm-training-loss.png diff --git a/_posts/2026-08-20-build-train-llm-jax.md b/_posts/2026-08-20-build-train-llm-jax.md new file mode 100644 index 0000000..1cc91dc --- /dev/null +++ b/_posts/2026-08-20-build-train-llm-jax.md @@ -0,0 +1,550 @@ +--- +layout: post +comments: true +title: "Build and Train a MiniGPT with JAX" +excerpt: "A practical walkthrough of a MiniGPT workflow with Flax NNX, Grain, Optax, Orbax, and TinyStories." +categories: genai +tags: [ai,llm,jax,flax] +toc: true +img_excerpt: +mermaid: true +--- + +Training a language model is easier to understand when the whole system is small enough to fit on one page, but still complete enough to show the real moving parts. The key pieces are the decoder architecture, tokenized data pipeline, differentiable training step, checkpoint handling, and an inference loop that turns token logits back into text. + +In this article, we will build a compact GPT-style language model with JAX and Flax NNX, train it on TinyStories, save a checkpoint with Orbax, and run text generation from the restored model. The companion source material is available in [Build and Train an LLM with JAX](https://github.com/dzlab/deeplearning.ai/tree/main/2026/03/BuildandTrainanLLMwithJAX), but the implementation flow below is self-contained. + +## Workflow + +The project follows the same path as a production language-model training workflow, but at teaching scale: + +```mermaid +flowchart LR + A[TinyStories text] --> B[GPT-2 tokenizer] + B --> C[Fixed-length token batches] + C --> D[MiniGPT decoder] + D --> E[Optax loss and optimizer] + E --> F[NNX JIT training step] + F --> G[Orbax checkpoint] + G --> H[Text generation] + + classDef data fill:#e8f4ff,stroke:#1677b9,color:#0b2d42; + classDef preprocess fill:#fff4cc,stroke:#b58100,color:#3d2b00; + classDef model fill:#efe8ff,stroke:#6a45b8,color:#241340; + classDef train fill:#ffe8ec,stroke:#c43e5c,color:#4b1420; + classDef artifact fill:#e8f8ef,stroke:#23834d,color:#0e3d24; + classDef inference fill:#fdeee2,stroke:#bf5b17,color:#4a2105; + class A data; + class B,C preprocess; + class D model; + class E,F train; + class G artifact; + class H inference; +``` + +The useful part of this exercise is not that the model becomes a strong storyteller in a few minutes. It is that every major system boundary is visible: + +| Stage | Library | Role | +|---|---|---| +| Model definition | Flax NNX | Defines stateful modules for embeddings, attention blocks, and the output projection. | +| Array computation | JAX | Handles array operations, automatic differentiation, vectorization, and JIT compilation. | +| Data loading | Grain | Samples stories and batches fixed-shape token arrays. | +| Optimization | Optax | Provides cross-entropy, AdamW, and a warmup cosine learning-rate schedule. | +| Checkpointing | Orbax | Saves and restores model state as a PyTree. | + +## Setup + +The examples use the following Python dependencies: + +```text +jax==0.6.2 +flax==0.10.7 +grain==0.2.13 +tiktoken==0.4.0 +ipywidgets==8.1.8 +typing-extensions==4.15.0 +jupyter==1.1.1 +matplotlib==3.10.8 +``` + +The core imports and model constants are: + +```python +import jax +import jax.numpy as jnp +import flax.nnx as nnx +import grain.python as grain +import optax +import tiktoken +from pathlib import Path + +tokenizer = tiktoken.get_encoding("gpt2") + +vocab_size = tokenizer.n_vocab +maxlen = 128 +embed_dim = 192 +num_heads = 6 +num_transformer_blocks = 6 +feed_forward_dim = 512 +batch_size = 32 +num_epochs = 3 +``` + +The course environment also has Orbax available for checkpointing. In a fresh local environment, install `optax` and `orbax-checkpoint` explicitly if they are not pulled in by the Flax/JAX stack. + +## Model Architecture + +The model is intentionally small: a 20.2M parameter decoder with the GPT-2 tokenizer vocabulary, a context length of 128 tokens, and six causal attention blocks. That makes it big enough to expose realistic tensor shapes while still being manageable on a local machine. + +| Setting | Value | +|---|---:| +| Vocabulary size | 50,257 | +| Context length | 128 tokens | +| Embedding dimension | 192 | +| Attention heads | 6 | +| Transformer blocks | 6 | +| Feed-forward dimension setting | 512 | +| Parameters | 20,212,608 | + +At runtime, each batch starts as token IDs with shape `batch_size x maxlen`. The model turns those IDs into embeddings, applies the causal decoder blocks, and projects every position back to the GPT-2 vocabulary. During training, the resulting logits are compared with the same batch shifted one token to the left. + +```mermaid +flowchart LR + B["Token batch
batch_size x maxlen"] --> T["Token embedding
batch_size x maxlen x embed_dim"] + B --> P["Position IDs
1 x maxlen"] + P --> PE["Position embedding
1 x maxlen x embed_dim"] + T --> S["Add token + position embeddings"] + PE --> S + P --> M["Causal attention mask
maxlen x maxlen"] + S --> X["Decoder block 1"] + M --> X + X --> R["Decoder blocks 2..6"] + M --> R + R --> O["Vocabulary projection"] + O --> L["Logits
batch_size x maxlen x vocab_size"] + B --> Y["Shifted targets
batch_size x maxlen"] + L --> C["Cross-entropy loss"] + Y --> C + + classDef input fill:#e8f4ff,stroke:#1677b9,color:#0b2d42; + classDef embedding fill:#fff4cc,stroke:#b58100,color:#3d2b00; + classDef mask fill:#eef2f7,stroke:#64748b,color:#102a43; + classDef decoder fill:#efe8ff,stroke:#6a45b8,color:#241340; + classDef output fill:#e8f8ef,stroke:#23834d,color:#0e3d24; + classDef loss fill:#ffe8ec,stroke:#c43e5c,color:#4b1420; + class B,P,Y input; + class T,PE,S embedding; + class M mask; + class X,R,O decoder; + class L output; + class C loss; +``` + +The embedding layer combines token identity with position. The token embedding maps GPT-2 token IDs into dense vectors, while the positional embedding gives the model an order signal. + +```python +class TokenAndPositionEmbedding(nnx.Module): + def __init__(self, maxlen, vocab_size, embed_dim, *, rngs): + self.token_emb = nnx.Embed(vocab_size, embed_dim, rngs=rngs) + self.pos_emb = nnx.Embed(maxlen, embed_dim, rngs=rngs) + + def __call__(self, x): + seq_len = x.shape[1] + positions = jnp.arange(seq_len)[None, :] + return self.token_emb(x) + self.pos_emb(positions) +``` + +The attention block uses Flax NNX's `MultiHeadAttention`. A causal mask prevents each token from attending to future tokens, which is the core rule that makes next-token prediction work. + +```python +class TransformerBlock(nnx.Module): + def __init__(self, embed_dim, num_heads, ff_dim, *, rngs): + self.attention = nnx.MultiHeadAttention( + num_heads=num_heads, + in_features=embed_dim, + qkv_features=embed_dim, + out_features=embed_dim, + decode=False, + rngs=rngs, + ) + + def __call__(self, x, mask=None): + attn_out = self.attention(x, mask=mask) + x = x + attn_out + return x +``` + +The full `MiniGPT` model wires together embeddings, repeated attention blocks, and a final vocabulary projection. It returns one logit vector per position in the input sequence. + +```python +class MiniGPT(nnx.Module): + def __init__(self, maxlen, vocab_size, embed_dim, num_heads, + feed_forward_dim, num_transformer_blocks, *, rngs): + self.maxlen = maxlen + self.embedding = TokenAndPositionEmbedding( + maxlen, vocab_size, embed_dim, rngs=rngs + ) + self.transformer_blocks = [ + TransformerBlock(embed_dim, num_heads, feed_forward_dim, rngs=rngs) + for _ in range(num_transformer_blocks) + ] + self.output_layer = nnx.Linear( + embed_dim, vocab_size, use_bias=False, rngs=rngs + ) + + def causal_attention_mask(self, seq_len): + return jnp.tril(jnp.ones((seq_len, seq_len))) + + def __call__(self, token_ids): + seq_len = token_ids.shape[1] + mask = self.causal_attention_mask(seq_len) + x = self.embedding(token_ids) + + for block in self.transformer_blocks: + x = block(x, mask=mask) + + return self.output_layer(x) +``` + +This is not a full modern production GPT block. For example, this compact version keeps the block minimal and does not turn the feed-forward dimension into a full MLP sublayer. That simplification is useful for learning because it keeps the focus on causal attention, model state, batching, and training mechanics. + +## Training Data + +The training data starts as a `TinyStories-1000.txt` file split on the `<|endoftext|>` delimiter. It contains 1,000 stories; in this sample the shortest story has 61 whitespace-separated words, the longest has 837, and the average is about 184 words. + +For a quick run, use a smaller 100-story subset: + +```text +Loading data from TinyStories-1000.txt (max 100 stories) +Loaded 100 stories +Estimated batches per epoch: 3 +Created DataLoader with batch_size=32, maxlen=128 +``` + +A compact loader for this small text file is: + +```python +def load_stories_from_file(file_path, max_stories=None): + text = Path(file_path).read_text(encoding="utf-8", errors="replace") + stories = [ + story.strip() + "<|endoftext|>" + for story in text.split("<|endoftext|>") + if story.strip() + ] + + if max_stories is not None: + return stories[:max_stories] + + return stories +``` + +Each story becomes a fixed-length token sequence. Longer stories are truncated to the context length, and shorter stories are right-padded with zeros. Right padding matters because the generation function later uses the same alignment when it predicts the next token from a shorter prompt. + +The `StoryDataset` transformation is intentionally simple: load one story, encode it with the GPT-2 tokenizer, normalize it to `maxlen`, and let Grain stack those rows into a training batch. For example, the first TinyStories sample begins with "One day, a little girl...", which tokenizes to IDs starting with `[3198, 1110, 11, 257, 1310, 2576, ...]`. + +```mermaid +flowchart LR + A["Raw story text
One day, a little girl named Lily..."] --> B["Story record
append <|endoftext|>"] + B --> C["GPT-2 tokenizer
tokenizer.encode(..., allowed_special=...)"] + C --> D["Token IDs
[3198, 1110, 11, 257, 1310, 2576, ...]"] + D --> E{"More than maxlen tokens?"} + E -- yes --> F["Truncate
tokens[:128]"] + E -- no --> G["Keep encoded story"] + F --> H["Right pad with 0
until length = 128"] + G --> H + H --> I["StoryDataset row
[token_0, ..., token_127]"] + I --> J["Grain batch
batch_size x maxlen"] + + classDef text fill:#e8f4ff,stroke:#1677b9,color:#0b2d42; + classDef tokenize fill:#fff4cc,stroke:#b58100,color:#3d2b00; + classDef branch fill:#fdeee2,stroke:#bf5b17,color:#4a2105; + classDef shape fill:#e8f8ef,stroke:#23834d,color:#0e3d24; + classDef batch fill:#efe8ff,stroke:#6a45b8,color:#241340; + class A,B text; + class C,D tokenize; + class E,F,G branch; + class H,I shape; + class J batch; +``` + +```python +class StoryDataset: + def __init__(self, stories, maxlen, tokenizer): + self.stories = stories + self.maxlen = maxlen + self.tokenizer = tokenizer + self.end_token = tokenizer.encode( + "<|endoftext|>", + allowed_special={"<|endoftext|>"}, + )[0] + + def __len__(self): + return len(self.stories) + + def __getitem__(self, idx): + story = self.stories[idx] + tokens = self.tokenizer.encode( + story, + allowed_special={"<|endoftext|>"}, + ) + + if len(tokens) > self.maxlen: + tokens = tokens[:self.maxlen] + + tokens.extend([0] * (self.maxlen - len(tokens))) + return tokens +``` + +Grain supplies the sampler and the fixed-size batching operation. The important choice is `drop_remainder=True`, which keeps every training batch the same shape and makes JIT compilation simpler. + +```python +def create_dataloader(stories, tokenizer, maxlen, batch_size, + shuffle=False, num_epochs=1, seed=42, + worker_count=0): + dataset = StoryDataset(stories, maxlen, tokenizer) + estimated_batches = len(dataset) // batch_size + + sampler = grain.IndexSampler( + num_records=len(dataset), + shuffle=shuffle, + seed=seed, + shard_options=grain.NoSharding(), + num_epochs=num_epochs, + ) + + dataloader = grain.DataLoader( + data_source=dataset, + sampler=sampler, + operations=[ + grain.Batch(batch_size=batch_size, drop_remainder=True) + ], + worker_count=worker_count, + ) + + return dataloader, estimated_batches +``` + +## Training Loop + +The training objective is next-token prediction. The model receives the input sequence and learns to predict the target sequence. The target is the same token sequence shifted left by one position: + +```python +prep_target_batch = jax.vmap( + lambda tokens: jnp.concatenate((tokens[1:], jnp.array([0]))) +) +``` + +The full loop repeatedly pulls a batch from Grain, builds input and target arrays, runs the JIT-compiled training step, updates metrics, and advances until every epoch has been consumed. + +```mermaid +flowchart LR + A["Grain DataLoader
fixed-size token batches"] --> B["Epoch loop"] + B --> C["Fetch next batch"] + C --> D["Convert to JAX int32
input_batch"] + D --> E["Shift tokens left
target_batch"] + E --> F["JIT train_step"] + F --> G["MiniGPT forward pass
logits"] + G --> H["Cross-entropy
logits vs targets"] + H --> I["value_and_grad
loss + gradients"] + I --> J["AdamW update
model parameters"] + I --> K["metrics.update
loss history"] + J --> L{"More batches?"} + K --> L + L -- yes --> C + L -- no --> M{"More epochs?"} + M -- yes --> B + M -- no --> N["Trained model
checkpoint-ready"] + + classDef data fill:#e8f4ff,stroke:#1677b9,color:#0b2d42; + classDef loop fill:#fdeee2,stroke:#bf5b17,color:#4a2105; + classDef tensor fill:#fff4cc,stroke:#b58100,color:#3d2b00; + classDef compute fill:#efe8ff,stroke:#6a45b8,color:#241340; + classDef update fill:#ffe8ec,stroke:#c43e5c,color:#4b1420; + classDef output fill:#e8f8ef,stroke:#23834d,color:#0e3d24; + class A,C data; + class B,L,M loop; + class D,E tensor; + class F,G,H,I compute; + class J,K update; + class N output; +``` + +Optax computes token-level softmax cross-entropy and averages it across the batch. + +```python +def loss_fn(model, batch): + inputs, targets = batch + logits = model(inputs) + loss = optax.softmax_cross_entropy_with_integer_labels( + logits, targets + ).mean() + return loss, logits +``` + +The training setup builds a warmup cosine schedule over the available steps and uses AdamW: + +```python +total_steps = batches_per_epoch * num_epochs +warmup_steps = max(1, total_steps // 10) + +lr_schedule = optax.warmup_cosine_decay_schedule( + init_value=0.0, + peak_value=3e-4, + warmup_steps=warmup_steps, + decay_steps=total_steps, + end_value=1e-5, +) + +optimizer = nnx.Optimizer( + model, + optax.adamw(learning_rate=lr_schedule, weight_decay=0.01), +) +``` + +The compact training step is where JAX starts to pay off. `nnx.value_and_grad` computes the loss and gradients, `metrics.update` records training metrics, and `optimizer.update` mutates the model parameters through the NNX optimizer wrapper. `@nnx.jit` compiles that whole step. + +```python +@nnx.jit +def train_step(model, optimizer, metrics, batch): + grad_fn = nnx.value_and_grad(loss_fn, has_aux=True) + (loss, logits), grads = grad_fn(model, batch) + + metrics.update(loss=loss, logits=logits, labels=batch[1]) + optimizer.update(grads) +``` + +The loop converts each Grain batch into JAX integer arrays, builds the shifted targets, and calls the compiled step: + +```python +metrics_history = {"train_loss": []} + +for epoch in range(num_epochs): + step = 0 + for batch in text_dl: + input_batch = jnp.array(jnp.array(batch).T).astype(jnp.int32) + target_batch = prep_target_batch(input_batch).astype(jnp.int32) + + train_step(model, optimizer, metrics, (input_batch, target_batch)) + + if (step + 1) % 2 == 0: + for metric, value in metrics.compute().items(): + metrics_history[f"train_{metric}"].append(value) + metrics.reset() + + step += 1 +``` + +For the quick run, 100 stories, batch size 32, and 3 epochs produce 9 total steps: + +```text +Total training steps: 9 +Warmup steps: 1 + +Epoch: 1, Step 2, Loss: 10.8881, LR: 3.00e-04 +Epoch: 2, Step 2, Loss: 10.5748, LR: 3.00e-04 +Epoch: 3, Step 2, Loss: 10.2045, LR: 3.00e-04 +``` + +The lesson also includes a longer run over 2,000,000 stories for 3 epochs. The loss drops quickly in the early steps and then flattens near 2. + +![Training loss for the extended MiniGPT run]({{ "/assets/2026/08/20260820-jax-llm-training-loss.png" | absolute_url }}){: .center-image } + +## Checkpointing + +Once the model has trained, save the NNX model state with Orbax: + +```python +from pathlib import Path +import orbax + +checkpoint_path = Path.cwd() / "small_checkpoint.orbax" +checkpointer = orbax.checkpoint.PyTreeCheckpointer() +checkpointer.save(checkpoint_path, nnx.state(model), force=True) +``` + +The inference lesson restores a checkpoint onto a CPU device by building matching restore arguments for the model state PyTree: + +```python +from orbax import checkpoint +from jax.sharding import SingleDeviceSharding + +cpu_device = jax.devices("cpu")[0] +cpu_sharding = SingleDeviceSharding(cpu_device) + +restore_args = jax.tree_util.tree_map( + lambda _: checkpoint.ArrayRestoreArgs(sharding=cpu_sharding), + nnx.state(model), +) +``` + +That restore step is important because the checkpoint is not just a flat file. It is structured model state, and each array needs sharding information when it is loaded. + +## Generation + +Generation is a loop around next-token prediction. The function keeps a growing token list, slices the latest model context, right-pads if the prompt is shorter than `maxlen`, runs the model, and selects the next token. + +```python +def generate_text(model, start_tokens, max_new_tokens=50, temperature=1.0): + tokens = list(start_tokens) + + for _ in range(max_new_tokens): + context = tokens[-model.maxlen:] + actual_len = len(context) + + if actual_len < model.maxlen: + context = context + [0] * (model.maxlen - actual_len) + + context_array = jnp.array(context)[None, :] + logits = model(context_array) + next_token_logits = logits[0, actual_len - 1, :] / temperature + next_token = int(jnp.argmax(next_token_logits)) + + if next_token == tokenizer.encode( + "<|endoftext|>", + allowed_special={"<|endoftext|>"}, + )[0]: + break + + tokens.append(next_token) + + return tokenizer.decode(tokens) +``` + +Wrap the tokenizer and generator in a small convenience function: + +```python +def generate_story(model, story_prompt, temperature=1.0, max_new_tokens=50): + start_tokens = tokenizer.encode(story_prompt)[:maxlen] + return generate_text( + model, + start_tokens, + max_new_tokens=max_new_tokens, + temperature=temperature, + ) +``` + +The restored model generates a short TinyStories-like continuation: + +```text +Once upon a time a big bear ops were in the forest. He was very happy and he was always looking for something to do. One day, he saw a big, shiny rock +``` + +The text is imperfect, which is expected from a compact teaching model. The point is that the full pipeline is working: prompt tokens go in, logits come out, the loop chooses new tokens, and the tokenizer turns those tokens back into text. + +## Practical Notes + +For local experimentation, the main practical lessons are: + +| Concern | Practical choice | +|---|---| +| Fixed shapes | Use truncation, padding, and `drop_remainder=True` so JIT compilation sees stable batch shapes. | +| Short runs | Keep the 100-story run for fast feedback, but do not judge model quality from 9 update steps. | +| Longer training | Use larger data and more steps to see a meaningful loss curve. | +| Checkpoints | Save and restore structured NNX state with Orbax rather than trying to serialize ad hoc arrays. | +| Generation | Match inference padding to the training-time data layout. | + +## Takeaways + +The value of this MiniGPT project is that it makes the language-model stack concrete. JAX provides the differentiable array runtime, Flax NNX gives the model a clean stateful shape, Grain makes token batches explicit, Optax defines the training objective and optimizer, and Orbax preserves learned state. + +For a production LLM, each of these sections becomes much deeper: larger datasets, more complete transformer blocks, distributed training, evaluation, sampling strategies, checkpoint management, and serving infrastructure. But the skeleton is already here, and that makes the larger system easier to reason about. diff --git a/assets/2026/08/20260820-jax-llm-training-loss.png b/assets/2026/08/20260820-jax-llm-training-loss.png new file mode 100644 index 0000000000000000000000000000000000000000..1520ae3b7fc62536caa5f84d874ed9cc44f9ed3c GIT binary patch literal 154294 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

X-D+ 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 P75JyAj!?^2wGR0|V}y~> literal 0 HcmV?d00001 From a4f5d82d4868ea98bbdfded1b62ccd80972e69f6 Mon Sep 17 00:00:00 2001 From: dzlab Date: Fri, 21 Aug 2026 17:07:11 -0700 Subject: [PATCH 2/6] edit intro --- _posts/2026-08-20-build-train-llm-jax.md | 35 ++++++++++++------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/_posts/2026-08-20-build-train-llm-jax.md b/_posts/2026-08-20-build-train-llm-jax.md index 1cc91dc..6f3f929 100644 --- a/_posts/2026-08-20-build-train-llm-jax.md +++ b/_posts/2026-08-20-build-train-llm-jax.md @@ -2,7 +2,7 @@ layout: post comments: true title: "Build and Train a MiniGPT with JAX" -excerpt: "A practical walkthrough of a MiniGPT workflow with Flax NNX, Grain, Optax, Orbax, and TinyStories." +excerpt: "A practical walkthrough of building and training a MiniGPT with Flax NNX, Grain, Optax, Orbax, and TinyStories." categories: genai tags: [ai,llm,jax,flax] toc: true @@ -10,13 +10,8 @@ img_excerpt: mermaid: true --- -Training a language model is easier to understand when the whole system is small enough to fit on one page, but still complete enough to show the real moving parts. The key pieces are the decoder architecture, tokenized data pipeline, differentiable training step, checkpoint handling, and an inference loop that turns token logits back into text. +In this article, we will build a workflow for training a language-model using JAX ecosystem. Specifically, we will build a compact GPT-style language model with JAX and Flax NNX, train it on a small text dataset called TinyStories, use Orbax for checkpointing, and run text generation from the restored model. -In this article, we will build a compact GPT-style language model with JAX and Flax NNX, train it on TinyStories, save a checkpoint with Orbax, and run text generation from the restored model. The companion source material is available in [Build and Train an LLM with JAX](https://github.com/dzlab/deeplearning.ai/tree/main/2026/03/BuildandTrainanLLMwithJAX), but the implementation flow below is self-contained. - -## Workflow - -The project follows the same path as a production language-model training workflow, but at teaching scale: ```mermaid flowchart LR @@ -42,19 +37,13 @@ flowchart LR class H inference; ``` -The useful part of this exercise is not that the model becomes a strong storyteller in a few minutes. It is that every major system boundary is visible: +Although the model is small, we still can cover the core pieces of a language model: the decoder architecture, tokenized data pipeline, differentiable training step, checkpoint handling, and an inference loop that turns token logits back into text. -| Stage | Library | Role | -|---|---|---| -| Model definition | Flax NNX | Defines stateful modules for embeddings, attention blocks, and the output projection. | -| Array computation | JAX | Handles array operations, automatic differentiation, vectorization, and JIT compilation. | -| Data loading | Grain | Samples stories and batches fixed-shape token arrays. | -| Optimization | Optax | Provides cross-entropy, AdamW, and a warmup cosine learning-rate schedule. | -| Checkpointing | Orbax | Saves and restores model state as a PyTree. | +The complete source material is available in [Build and Train an LLM with JAX](https://github.com/dzlab/deeplearning.ai/tree/main/2026/03/BuildandTrainanLLMwithJAX). ## Setup -The examples use the following Python dependencies: +First, install the following Python dependencies: ```text jax==0.6.2 @@ -67,7 +56,9 @@ jupyter==1.1.1 matplotlib==3.10.8 ``` -The core imports and model constants are: +> Note: If Orbax was not pulled in by the Flax/JAX stack, it can be install by adding explicitly these dependencies `optax` and `orbax-checkpoint`. + +Then, imports the libraries and set global constants: ```python import jax @@ -90,7 +81,15 @@ batch_size = 32 num_epochs = 3 ``` -The course environment also has Orbax available for checkpointing. In a fresh local environment, install `optax` and `orbax-checkpoint` explicitly if they are not pulled in by the Flax/JAX stack. +We will use these libraries to implement various stages of the training workflow: + +| Stage | Library | Role | +|---|---|---| +| Model definition | Flax NNX | Defines stateful modules for embeddings, attention blocks, and the output projection. | +| Array computation | JAX | Handles array operations, automatic differentiation, vectorization, and JIT compilation. | +| Data loading | Grain | Samples stories and batches fixed-shape token arrays. | +| Optimization | Optax | Provides cross-entropy, AdamW, and a warmup cosine learning-rate schedule. | +| Checkpointing | Orbax | Saves and restores model state as a PyTree. | ## Model Architecture From d407b396fecd637ae6d29564839ff52ae3f715c2 Mon Sep 17 00:00:00 2001 From: dzlab Date: Fri, 21 Aug 2026 18:59:45 -0700 Subject: [PATCH 3/6] edit Model Architecture --- _posts/2026-08-20-build-train-llm-jax.md | 76 ++++++++++++------------ 1 file changed, 37 insertions(+), 39 deletions(-) diff --git a/_posts/2026-08-20-build-train-llm-jax.md b/_posts/2026-08-20-build-train-llm-jax.md index 6f3f929..fe97df0 100644 --- a/_posts/2026-08-20-build-train-llm-jax.md +++ b/_posts/2026-08-20-build-train-llm-jax.md @@ -93,7 +93,7 @@ We will use these libraries to implement various stages of the training workflow ## Model Architecture -The model is intentionally small: a 20.2M parameter decoder with the GPT-2 tokenizer vocabulary, a context length of 128 tokens, and six causal attention blocks. That makes it big enough to expose realistic tensor shapes while still being manageable on a local machine. +The model we will be building is small in size, a 20.2M parameter decoder with the GPT-2 tokenizer vocabulary, a context length of 128 tokens, and six causal attention blocks. The different model parameters are as follows: | Setting | Value | |---|---:| @@ -105,41 +105,7 @@ The model is intentionally small: a 20.2M parameter decoder with the GPT-2 token | Feed-forward dimension setting | 512 | | Parameters | 20,212,608 | -At runtime, each batch starts as token IDs with shape `batch_size x maxlen`. The model turns those IDs into embeddings, applies the causal decoder blocks, and projects every position back to the GPT-2 vocabulary. During training, the resulting logits are compared with the same batch shifted one token to the left. - -```mermaid -flowchart LR - B["Token batch
batch_size x maxlen"] --> T["Token embedding
batch_size x maxlen x embed_dim"] - B --> P["Position IDs
1 x maxlen"] - P --> PE["Position embedding
1 x maxlen x embed_dim"] - T --> S["Add token + position embeddings"] - PE --> S - P --> M["Causal attention mask
maxlen x maxlen"] - S --> X["Decoder block 1"] - M --> X - X --> R["Decoder blocks 2..6"] - M --> R - R --> O["Vocabulary projection"] - O --> L["Logits
batch_size x maxlen x vocab_size"] - B --> Y["Shifted targets
batch_size x maxlen"] - L --> C["Cross-entropy loss"] - Y --> C - - classDef input fill:#e8f4ff,stroke:#1677b9,color:#0b2d42; - classDef embedding fill:#fff4cc,stroke:#b58100,color:#3d2b00; - classDef mask fill:#eef2f7,stroke:#64748b,color:#102a43; - classDef decoder fill:#efe8ff,stroke:#6a45b8,color:#241340; - classDef output fill:#e8f8ef,stroke:#23834d,color:#0e3d24; - classDef loss fill:#ffe8ec,stroke:#c43e5c,color:#4b1420; - class B,P,Y input; - class T,PE,S embedding; - class M mask; - class X,R,O decoder; - class L output; - class C loss; -``` - -The embedding layer combines token identity with position. The token embedding maps GPT-2 token IDs into dense vectors, while the positional embedding gives the model an order signal. +The first block of the model is the embedding layer that combines token identity with position. The token embedding maps GPT-2 token IDs into dense vectors, while the positional embedding gives the model an order signal. It is defined as: ```python class TokenAndPositionEmbedding(nnx.Module): @@ -153,7 +119,7 @@ class TokenAndPositionEmbedding(nnx.Module): return self.token_emb(x) + self.pos_emb(positions) ``` -The attention block uses Flax NNX's `MultiHeadAttention`. A causal mask prevents each token from attending to future tokens, which is the core rule that makes next-token prediction work. +The attention block uses Flax NNX's `MultiHeadAttention`. A causal mask prevents each token from attending to future tokens, which is the core rule that makes next-token prediction work. It is defined as: ```python class TransformerBlock(nnx.Module): @@ -173,7 +139,7 @@ class TransformerBlock(nnx.Module): return x ``` -The full `MiniGPT` model wires together embeddings, repeated attention blocks, and a final vocabulary projection. It returns one logit vector per position in the input sequence. +The full `MiniGPT` model wires together embeddings, repeated attention blocks, and a final vocabulary projection. It returns one logit vector per position in the input sequence. It is defined as: ```python class MiniGPT(nnx.Module): @@ -205,7 +171,39 @@ class MiniGPT(nnx.Module): return self.output_layer(x) ``` -This is not a full modern production GPT block. For example, this compact version keeps the block minimal and does not turn the feed-forward dimension into a full MLP sublayer. That simplification is useful for learning because it keeps the focus on causal attention, model state, batching, and training mechanics. +During training/inference, as depicted by the diagram below, the data will flow through the model in batches of token IDs with shape `batch_size x maxlen`. The model, first turns those IDs into embeddings, then applies a succession of causal decoder blocks, and finally projects every position back to the GPT-2 vocabulary. During training, the resulting logits are compared with the same batch shifted one token to the left. + +```mermaid +flowchart LR + B["Token batch
batch_size x maxlen"] --> T["Token embedding
batch_size x maxlen x embed_dim"] + B --> P["Position IDs
1 x maxlen"] + P --> PE["Position embedding
1 x maxlen x embed_dim"] + T --> S["Add token + position embeddings"] + PE --> S + P --> M["Causal attention mask
maxlen x maxlen"] + S --> X["Decoder block 1"] + M --> X + X --> R["Decoder blocks 2..6"] + M --> R + R --> O["Vocabulary projection"] + O --> L["Logits
batch_size x maxlen x vocab_size"] + B --> Y["Shifted targets
batch_size x maxlen"] + L --> C["Cross-entropy loss"] + Y --> C + + classDef input fill:#e8f4ff,stroke:#1677b9,color:#0b2d42; + classDef embedding fill:#fff4cc,stroke:#b58100,color:#3d2b00; + classDef mask fill:#eef2f7,stroke:#64748b,color:#102a43; + classDef decoder fill:#efe8ff,stroke:#6a45b8,color:#241340; + classDef output fill:#e8f8ef,stroke:#23834d,color:#0e3d24; + classDef loss fill:#ffe8ec,stroke:#c43e5c,color:#4b1420; + class B,P,Y input; + class T,PE,S embedding; + class M mask; + class X,R,O decoder; + class L output; + class C loss; +``` ## Training Data From 46196025c68798bba060d5dec867e15d187bb93d Mon Sep 17 00:00:00 2001 From: dzlab Date: Fri, 21 Aug 2026 21:59:28 -0700 Subject: [PATCH 4/6] edit Training Data --- _posts/2026-08-20-build-train-llm-jax.md | 73 +++++++++++------------- 1 file changed, 34 insertions(+), 39 deletions(-) diff --git a/_posts/2026-08-20-build-train-llm-jax.md b/_posts/2026-08-20-build-train-llm-jax.md index fe97df0..fed6352 100644 --- a/_posts/2026-08-20-build-train-llm-jax.md +++ b/_posts/2026-08-20-build-train-llm-jax.md @@ -207,18 +207,10 @@ flowchart LR ## Training Data -The training data starts as a `TinyStories-1000.txt` file split on the `<|endoftext|>` delimiter. It contains 1,000 stories; in this sample the shortest story has 61 whitespace-separated words, the longest has 837, and the average is about 184 words. +The training data used here is a small dataset of short stories where each story ends with `<|endoftext|>` delimiter. There are 1,000 stories; with the shortest story has 61 whitespace-separated words, the longest has 837, and the average is about 184 words. -For a quick run, use a smaller 100-story subset: -```text -Loading data from TinyStories-1000.txt (max 100 stories) -Loaded 100 stories -Estimated batches per epoch: 3 -Created DataLoader with batch_size=32, maxlen=128 -``` - -A compact loader for this small text file is: +First, we need to define a helper function to read stories text file: ```python def load_stories_from_file(file_path, max_stories=None): @@ -235,34 +227,7 @@ def load_stories_from_file(file_path, max_stories=None): return stories ``` -Each story becomes a fixed-length token sequence. Longer stories are truncated to the context length, and shorter stories are right-padded with zeros. Right padding matters because the generation function later uses the same alignment when it predicts the next token from a shorter prompt. - -The `StoryDataset` transformation is intentionally simple: load one story, encode it with the GPT-2 tokenizer, normalize it to `maxlen`, and let Grain stack those rows into a training batch. For example, the first TinyStories sample begins with "One day, a little girl...", which tokenizes to IDs starting with `[3198, 1110, 11, 257, 1310, 2576, ...]`. - -```mermaid -flowchart LR - A["Raw story text
One day, a little girl named Lily..."] --> B["Story record
append <|endoftext|>"] - B --> C["GPT-2 tokenizer
tokenizer.encode(..., allowed_special=...)"] - C --> D["Token IDs
[3198, 1110, 11, 257, 1310, 2576, ...]"] - D --> E{"More than maxlen tokens?"} - E -- yes --> F["Truncate
tokens[:128]"] - E -- no --> G["Keep encoded story"] - F --> H["Right pad with 0
until length = 128"] - G --> H - H --> I["StoryDataset row
[token_0, ..., token_127]"] - I --> J["Grain batch
batch_size x maxlen"] - - classDef text fill:#e8f4ff,stroke:#1677b9,color:#0b2d42; - classDef tokenize fill:#fff4cc,stroke:#b58100,color:#3d2b00; - classDef branch fill:#fdeee2,stroke:#bf5b17,color:#4a2105; - classDef shape fill:#e8f8ef,stroke:#23834d,color:#0e3d24; - classDef batch fill:#efe8ff,stroke:#6a45b8,color:#241340; - class A,B text; - class C,D tokenize; - class E,F,G branch; - class H,I shape; - class J batch; -``` +During transformation, each story becomes a fixed-length token sequence. Longer stories are truncated to the context length, and shorter stories are right-padded with zeros. Right padding matters because the generation function later uses the same alignment when it predicts the next token from a shorter prompt. This is implemented as follows: ```python class StoryDataset: @@ -292,7 +257,8 @@ class StoryDataset: return tokens ``` -Grain supplies the sampler and the fixed-size batching operation. The important choice is `drop_remainder=True`, which keeps every training batch the same shape and makes JIT compilation simpler. +Next, we use the [Grain library](https://github.com/google/grain) to implement a Data loader that will create batches for training from the raw text. + ```python def create_dataloader(stories, tokenizer, maxlen, batch_size, @@ -321,6 +287,35 @@ def create_dataloader(stories, tokenizer, maxlen, batch_size, return dataloader, estimated_batches ``` +> The parameter `drop_remainder=True` helps keep every batch of the same shape and makes JIT compilation simpler. + +The transformation is depicted by the following diagram: load one story, encode it with the GPT-2 tokenizer, normalize it to `maxlen`, and let Grain stack those rows into a training batch. + +```mermaid +flowchart LR + A["Raw story text
One day, a little girl named Lily..."] --> B["Story record
append <|endoftext|>"] + B --> C["GPT-2 tokenizer
tokenizer.encode(..., allowed_special=...)"] + C --> D["Token IDs
[3198, 1110, 11, 257, 1310, 2576, ...]"] + D --> E{"More than maxlen tokens?"} + E -- yes --> F["Truncate
tokens[:128]"] + E -- no --> G["Keep encoded story"] + F --> H["Right pad with 0
until length = 128"] + G --> H + H --> I["StoryDataset row
[token_0, ..., token_127]"] + I --> J["Grain batch
batch_size x maxlen"] + + classDef text fill:#e8f4ff,stroke:#1677b9,color:#0b2d42; + classDef tokenize fill:#fff4cc,stroke:#b58100,color:#3d2b00; + classDef branch fill:#fdeee2,stroke:#bf5b17,color:#4a2105; + classDef shape fill:#e8f8ef,stroke:#23834d,color:#0e3d24; + classDef batch fill:#efe8ff,stroke:#6a45b8,color:#241340; + class A,B text; + class C,D tokenize; + class E,F,G branch; + class H,I shape; + class J batch; +``` + ## Training Loop The training objective is next-token prediction. The model receives the input sequence and learns to predict the target sequence. The target is the same token sequence shifted left by one position: From ade48b4f475dbbabb4225469c9e2b60e94ec9c4b Mon Sep 17 00:00:00 2001 From: dzlab Date: Fri, 21 Aug 2026 23:00:19 -0700 Subject: [PATCH 5/6] edit Training Loop --- _posts/2026-08-20-build-train-llm-jax.md | 85 +++++++++++------------- 1 file changed, 37 insertions(+), 48 deletions(-) diff --git a/_posts/2026-08-20-build-train-llm-jax.md b/_posts/2026-08-20-build-train-llm-jax.md index fed6352..049c3aa 100644 --- a/_posts/2026-08-20-build-train-llm-jax.md +++ b/_posts/2026-08-20-build-train-llm-jax.md @@ -318,7 +318,7 @@ flowchart LR ## Training Loop -The training objective is next-token prediction. The model receives the input sequence and learns to predict the target sequence. The target is the same token sequence shifted left by one position: +For training the model we need first to define the training objective which is next-token prediction. Our model receives an input sequence and learns to predict the target sequence. The target is the same token sequence shifted left by one position which can be implemented in JAX as: ```python prep_target_batch = jax.vmap( @@ -326,42 +326,7 @@ prep_target_batch = jax.vmap( ) ``` -The full loop repeatedly pulls a batch from Grain, builds input and target arrays, runs the JIT-compiled training step, updates metrics, and advances until every epoch has been consumed. - -```mermaid -flowchart LR - A["Grain DataLoader
fixed-size token batches"] --> B["Epoch loop"] - B --> C["Fetch next batch"] - C --> D["Convert to JAX int32
input_batch"] - D --> E["Shift tokens left
target_batch"] - E --> F["JIT train_step"] - F --> G["MiniGPT forward pass
logits"] - G --> H["Cross-entropy
logits vs targets"] - H --> I["value_and_grad
loss + gradients"] - I --> J["AdamW update
model parameters"] - I --> K["metrics.update
loss history"] - J --> L{"More batches?"} - K --> L - L -- yes --> C - L -- no --> M{"More epochs?"} - M -- yes --> B - M -- no --> N["Trained model
checkpoint-ready"] - - classDef data fill:#e8f4ff,stroke:#1677b9,color:#0b2d42; - classDef loop fill:#fdeee2,stroke:#bf5b17,color:#4a2105; - classDef tensor fill:#fff4cc,stroke:#b58100,color:#3d2b00; - classDef compute fill:#efe8ff,stroke:#6a45b8,color:#241340; - classDef update fill:#ffe8ec,stroke:#c43e5c,color:#4b1420; - classDef output fill:#e8f8ef,stroke:#23834d,color:#0e3d24; - class A,C data; - class B,L,M loop; - class D,E tensor; - class F,G,H,I compute; - class J,K update; - class N output; -``` - -Optax computes token-level softmax cross-entropy and averages it across the batch. +Next we define the loss function for the training. Using [Optax](https://optax.readthedocs.io/) we compute token-level softmax cross-entropy and averages it across the batch. ```python def loss_fn(model, batch): @@ -373,7 +338,7 @@ def loss_fn(model, batch): return loss, logits ``` -The training setup builds a warmup cosine schedule over the available steps and uses AdamW: +Next we step the Learning Rate schedule (a warmup cosine schedule) and the optimizer (AdamW): ```python total_steps = batches_per_epoch * num_epochs @@ -393,7 +358,7 @@ optimizer = nnx.Optimizer( ) ``` -The compact training step is where JAX starts to pay off. `nnx.value_and_grad` computes the loss and gradients, `metrics.update` records training metrics, and `optimizer.update` mutates the model parameters through the NNX optimizer wrapper. `@nnx.jit` compiles that whole step. +Next we define the training step with `@nnx.jit` to compile it. We perform a forward pass, use `nnx.value_and_grad` to compute the loss and gradients, the use `metrics.update` to record training metrics, and finally `optimizer.update` to mutate the model parameters through the NNX optimizer wrapper. ```python @nnx.jit @@ -405,7 +370,7 @@ def train_step(model, optimizer, metrics, batch): optimizer.update(grads) ``` -The loop converts each Grain batch into JAX integer arrays, builds the shifted targets, and calls the compiled step: +Finally, we defind the training loop: convert each Grain batch into JAX integer arrays, builds the shifted targets, calls the JIT-compiled training step, and record the metrics: ```python metrics_history = {"train_loss": []} @@ -426,18 +391,42 @@ for epoch in range(num_epochs): step += 1 ``` -For the quick run, 100 stories, batch size 32, and 3 epochs produce 9 total steps: +The following diagram puts together the different parts of the training loop: -```text -Total training steps: 9 -Warmup steps: 1 +```mermaid +flowchart LR + A["Grain DataLoader
fixed-size token batches"] --> B["Epoch loop"] + B --> C["Fetch next batch"] + C --> D["Convert to JAX int32
input_batch"] + D --> E["Shift tokens left
target_batch"] + E --> F["JIT train_step"] + F --> G["MiniGPT forward pass
logits"] + G --> H["Cross-entropy
logits vs targets"] + H --> I["value_and_grad
loss + gradients"] + I --> J["AdamW update
model parameters"] + I --> K["metrics.update
loss history"] + J --> L{"More batches?"} + K --> L + L -- yes --> C + L -- no --> M{"More epochs?"} + M -- yes --> B + M -- no --> N["Trained model
checkpoint-ready"] -Epoch: 1, Step 2, Loss: 10.8881, LR: 3.00e-04 -Epoch: 2, Step 2, Loss: 10.5748, LR: 3.00e-04 -Epoch: 3, Step 2, Loss: 10.2045, LR: 3.00e-04 + classDef data fill:#e8f4ff,stroke:#1677b9,color:#0b2d42; + classDef loop fill:#fdeee2,stroke:#bf5b17,color:#4a2105; + classDef tensor fill:#fff4cc,stroke:#b58100,color:#3d2b00; + classDef compute fill:#efe8ff,stroke:#6a45b8,color:#241340; + classDef update fill:#ffe8ec,stroke:#c43e5c,color:#4b1420; + classDef output fill:#e8f8ef,stroke:#23834d,color:#0e3d24; + class A,C data; + class B,L,M loop; + class D,E tensor; + class F,G,H,I compute; + class J,K update; + class N output; ``` -The lesson also includes a longer run over 2,000,000 stories for 3 epochs. The loss drops quickly in the early steps and then flattens near 2. +When running this loop over 2,000,000 stories for 3 epochs, the loss drops quickly in the early steps and then flattens near 2. ![Training loss for the extended MiniGPT run]({{ "/assets/2026/08/20260820-jax-llm-training-loss.png" | absolute_url }}){: .center-image } From 54c0b710a416297efd06cc0c7b91630a5053874f Mon Sep 17 00:00:00 2001 From: dzlab Date: Sat, 22 Aug 2026 12:24:09 -0700 Subject: [PATCH 6/6] wrap up article --- _posts/2026-08-20-build-train-llm-jax.md | 30 +++++++----------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/_posts/2026-08-20-build-train-llm-jax.md b/_posts/2026-08-20-build-train-llm-jax.md index 049c3aa..0b0f018 100644 --- a/_posts/2026-08-20-build-train-llm-jax.md +++ b/_posts/2026-08-20-build-train-llm-jax.md @@ -432,7 +432,7 @@ When running this loop over 2,000,000 stories for 3 epochs, the loss drops quick ## Checkpointing -Once the model has trained, save the NNX model state with Orbax: +Once the model has trained, we can use [Orbax](https://orbax.readthedocs.io/) to save the NNX model state: ```python from pathlib import Path @@ -443,7 +443,7 @@ checkpointer = orbax.checkpoint.PyTreeCheckpointer() checkpointer.save(checkpoint_path, nnx.state(model), force=True) ``` -The inference lesson restores a checkpoint onto a CPU device by building matching restore arguments for the model state PyTree: +Then during inference we can restore the checkpoint onto a CPU device: ```python from orbax import checkpoint @@ -458,11 +458,11 @@ restore_args = jax.tree_util.tree_map( ) ``` -That restore step is important because the checkpoint is not just a flat file. It is structured model state, and each array needs sharding information when it is loaded. +> Note: A checkpoint is not just a flat file, it is structured model state, and each array needs sharding information when it is loaded. -## Generation +## Inference -Generation is a loop around next-token prediction. The function keeps a growing token list, slices the latest model context, right-pads if the prompt is shorter than `maxlen`, runs the model, and selects the next token. +During inference, we simply loop around next-token prediction: keep track of the growing token list, slices the latest model context, right-pads if the prompt is shorter than `maxlen`, runs the model, and selects the next token. ```python def generate_text(model, start_tokens, max_new_tokens=50, temperature=1.0): @@ -510,22 +510,8 @@ The restored model generates a short TinyStories-like continuation: Once upon a time a big bear ops were in the forest. He was very happy and he was always looking for something to do. One day, he saw a big, shiny rock ``` -The text is imperfect, which is expected from a compact teaching model. The point is that the full pipeline is working: prompt tokens go in, logits come out, the loop chooses new tokens, and the tokenizer turns those tokens back into text. +Depending on the input prompt, the model may generate garbage or an imperfect text that look like a story, but this is expected considering how small the model is as well as the training. -## Practical Notes - -For local experimentation, the main practical lessons are: - -| Concern | Practical choice | -|---|---| -| Fixed shapes | Use truncation, padding, and `drop_remainder=True` so JIT compilation sees stable batch shapes. | -| Short runs | Keep the 100-story run for fast feedback, but do not judge model quality from 9 update steps. | -| Longer training | Use larger data and more steps to see a meaningful loss curve. | -| Checkpoints | Save and restore structured NNX state with Orbax rather than trying to serialize ad hoc arrays. | -| Generation | Match inference padding to the training-time data layout. | - -## Takeaways - -The value of this MiniGPT project is that it makes the language-model stack concrete. JAX provides the differentiable array runtime, Flax NNX gives the model a clean stateful shape, Grain makes token batches explicit, Optax defines the training objective and optimizer, and Orbax preserves learned state. +--- -For a production LLM, each of these sections becomes much deeper: larger datasets, more complete transformer blocks, distributed training, evaluation, sampling strategies, checkpoint management, and serving infrastructure. But the skeleton is already here, and that makes the larger system easier to reason about. +_I hope you enjoyed this article. Feel free to leave a comment or reach out on twitter [@bachiirc](https://twitter.com/bachiirc)._