For usage-facing content (installation, import paths, running experiments, troubleshooting), see the companion User Guide.
1. Architecture Overview
What This Project Does
labml_nn is an open-source Python package that provides annotated, educational PyTorch implementations of 60+ deep learning research papers. It is structured as both a pip-installable library (package name labml-nn, import name labml_nn) and a literate-programming documentation site rendered at nn.labml.ai.
The repository serves a dual purpose:
- Library: Every implementation is a standard
nn.Modulethat can be imported and composed into larger models - Documentation: Every Python file contains extensive docstrings with LaTeX math and explanatory prose. A build pipeline converts these annotated sources into side-by-side HTML (code + explanation) published to nn.labml.ai
The project depends on the labml ecosystem (a separate set of packages by the same authors) for experiment tracking, configuration management, and training loop infrastructure.
Component Architecture
labml_nn (pip package)
├── transformers/ 22+ transformer variants (MHA, XL, RoPE, ViT, etc.)
├── diffusion/ DDPM, DDIM, Stable Diffusion, Latent Diffusion
├── gan/ Original, DCGAN, CycleGAN, WGAN, WGAN-GP, StyleGAN2
├── optimizers/ Adam, AMSGrad, RAdam, AdaBelief, Sophia, Noam, AdamWarmup
├── normalization/ BatchNorm, LayerNorm, InstanceNorm, GroupNorm, WeightStd, DeepNorm
├── sampling/ Greedy, Temperature, Top-k, Nucleus
├── rl/ PPO (with GAE), DQN (Dueling + Prioritized Replay)
├── neox/ GPT-NeoX 20B inference, fine-tuning, int8 quantization
├── lora/ Low-Rank Adaptation with GPT-2
├── rwkv/ RWKV recurrence-based language model
├── graphs/ GAT, GATv2
├── cfr/ Counterfactual Regret Minimization (Kuhn Poker)
├── resnet/ ResNet with bottleneck blocks
├── conv_mixer/ ConvMixer (patch-based convolution)
├── unet/ U-Net segmentation
├── capsule_networks/ Capsule Networks with dynamic routing
├── lstm/ LSTM cell and multi-layer
├── recurrent_highway_networks/ RHN cell
├── hypernetworks/ HyperLSTM
├── sketch_rnn/ Sketch RNN (stroke generation)
├── distillation/ Knowledge distillation
├── adaptive_computation/ PonderNet
├── uncertainty/ Evidential deep learning
├── activations/ Fuzzy Tiling Activations, Swish
├── scaling/ Zero3 memory optimization
├── helpers/ Datasets, training loops, metrics, schedules
├── experiments/ Shared experiment configs (CIFAR-10, MNIST, NLP autoregression)
└── utils/ Tokenizer configs, map-style datasets
Note
The
labml_nnpackage has a flat hierarchy where each research area is a top-level subpackage. There is no shared base class beyond PyTorch'snn.Module— implementations are intentionally independent so readers can study one paper without understanding others.
Technology Stack
| Layer | Technology |
|---|---|
| Language | Python 3.7+ |
| Deep learning framework | PyTorch ≥1.10 |
| Experiment tracking | labml (custom, same authors) |
| Configuration | labml.configs (declarative BaseConfigs) |
| Training infrastructure | labml-helpers (training loops, data loaders, metrics) |
| Tensor operations | einops, numpy |
| Distributed training | fairscale (pipeline parallelism) |
| Documentation rendering | Custom literate-programming pipeline → HTML |
| Package distribution | PyPI (labml-nn v0.5.1) |
| License | MIT |
Data Flow
The typical workflow for using labml_nn:
1. User imports nn.Module subclass from labml_nn.*
2. Module is instantiated with paper-specific hyperparameters
3. Module is composed into a larger model or used standalone
4. Experiment configs (BaseConfigs subclasses) wire together:
- Model architecture
- Dataset loaders (MNIST, CIFAR-10, text, etc.)
- Optimizer selection
- Training loop (via TrainValidConfigs)
5. labml tracks metrics, saves checkpoints, provides dashboard
2. System Requirements
| Component | Minimum | Recommended |
|---|---|---|
| Python | 3.7 | 3.10+ |
| PyTorch | 1.10 | Latest stable |
| CUDA | Not required | 11.x+ for GPU training |
| RAM | 4 GB | 16+ GB |
| GPU VRAM | — | 8 GB (most experiments), 48 GB (GPT-NeoX) |
| Disk | 200 MB (package) | 50+ GB (GPT-NeoX checkpoints) |
Required Dependencies
From setup.py:
install_requires=[
'labml',
'torch',
'torchtext',
'torchvision',
'einops',
'numpy',
'fairscale',
]
From requirements.txt (pinned versions for development):
torch>=1.10
torchvision>=0.11
torchtext>=0.11
labml>=0.4.147
labml-helpers>=0.4.84
numpy>=1.19
matplotlib>=3.0.3
einops>=0.3.0
gym[atari]
opencv-python
Pillow>=6.2.1
faiss
Important
setup.pyandrequirements.txtdiverge:setup.pyomitslabml-helpers,matplotlib,gym,opencv-python,Pillow, andfaiss. These are needed for specific experiments but not for core library usage. When deploying for full experiment reproduction, userequirements.txt.
3. Configuration Reference
The labml Configuration System
labml_nn uses the labml.configs system for experiment configuration. This is a declarative system where:
- Configuration classes inherit from
BaseConfigs - Parameters are declared as class attributes with type annotations and optional defaults
- Alternative implementations are registered via
@optiondecorators - Configurations are composed via
aggregate()to define named presets
Pattern:
from labml.configs import BaseConfigs, option, aggregate
class MyConfigs(BaseConfigs):
d_model: int = 512
dropout: float = 0.1
model: nn.Module # computed from other configs
@option(MyConfigs.model, 'transformer')
def _model_transformer(c: MyConfigs):
return TransformerModel(d_model=c.d_model, dropout=c.dropout)
Key Configuration Classes
| Class | Location | Purpose |
|---|---|---|
TransformerConfigs |
labml_nn/transformers/configs.py |
Transformer model assembly |
FeedForwardConfigs |
labml_nn/transformers/configs.py |
FFN layer with GLU variant support |
OptimizerConfigs |
labml_nn/optimizers/configs.py |
Optimizer selection and hyperparameters |
OptimizerConfigs |
labml_nn/helpers/optimizer.py |
Legacy optimizer config |
DeviceConfigs |
labml_nn/helpers/device.py |
CPU/GPU device selection |
MNISTConfigs |
labml_nn/helpers/datasets.py |
MNIST data loading |
CIFAR10Configs |
labml_nn/helpers/datasets.py |
CIFAR-10 data loading |
TrainValidConfigs |
labml_nn/helpers/trainer.py |
Training loop orchestration |
TrainingLoopConfigs |
labml_nn/helpers/trainer.py |
Low-level loop control |
NLPAutoRegressionConfigs |
labml_nn/experiments/nlp_autoregression.py |
Autoregressive text experiments |
NLPClassificationConfigs |
labml_nn/experiments/nlp_classification.py |
Text classification experiments |
CFRConfigs |
labml_nn/cfr/__init__.py |
CFR game solver |
RWKVConfigs |
labml_nn/rwkv/configs.py |
RWKV model configuration |
PipelineParallelTrainerConf |
labml_nn/neox/utils/trainer.py |
Multi-GPU pipeline training |
TransformerConfigs Reference
| Parameter | Type | Default | Description |
|---|---|---|---|
d_model |
int |
— | Embedding dimension |
heads |
int |
— | Attention heads |
d_ff |
int |
2048 | FFN hidden size |
dropout |
float |
0.1 | Dropout rate |
n_layers |
int |
— | Number of layers |
n_src_vocab |
int |
— | Source vocabulary size |
n_tgt_vocab |
int |
— | Target vocabulary size |
FeedForwardConfigs Reference
| Parameter | Type | Default | Description |
|---|---|---|---|
d_model |
int |
— | Input features |
d_ff |
int |
2048 | Hidden layer size |
dropout |
float |
0.1 | Dropout rate |
activation |
nn.Module |
ReLU | Activation (ReLU or GELU via @option) |
is_gated |
bool |
False |
Enable gated FFN |
bias1 |
bool |
True |
First layer bias |
bias2 |
bool |
True |
Second layer bias |
bias_gate |
bool |
False |
Gate layer bias |
glu_variant |
str |
'none' |
GLU preset |
MNISTConfigs Reference
| Parameter | Type | Default | Description |
|---|---|---|---|
dataset_name |
str |
'MNIST' |
Dataset identifier |
train_batch_size |
int |
64 | Training batch size |
valid_batch_size |
int |
1024 | Validation batch size |
train_loader_shuffle |
bool |
True |
Shuffle training data |
valid_loader_shuffle |
bool |
False |
Shuffle validation data |
CIFAR10Configs Reference
| Parameter | Type | Default | Description |
|---|---|---|---|
dataset_name |
str |
'CIFAR10' |
Dataset identifier |
train_batch_size |
int |
64 | Training batch size |
valid_batch_size |
int |
1024 | Validation batch size |
4. Deployment & Scaling
PyPI Package
The package is published to PyPI as labml-nn version 0.5.1.
Package metadata from setup.py:
| Field | Value |
|---|---|
| Package name | labml_nn |
| Version | 0.5.1 |
| Authors | Varuna Jayasiri, Nipun Wijerathne |
| License | MIT |
| Python classifiers | Python 3, Scientific/Engineering, AI |
| Excluded packages | labml, labml.*, labml_samples, labml_helpers, test |
Documentation Website
The documentation site at nn.labml.ai is generated from the annotated Python source:
- Python files contain docstrings with markdown + LaTeX
- A build pipeline (in
utils/) processes these into HTML - HTML files live in the
docs/directory (2000+ files across English + translations) - The
translate_cache/directory contains cached translations (Chinese, Japanese, Sinhala)
Site generation utilities:
| Script | Location | Purpose |
|---|---|---|
diagrams.py |
utils/diagrams.py |
Processes SVG diagrams, adds CSS classes |
papers_list.py |
utils/papers_list.py |
Collects paper titles from module docstrings |
sitemap.py |
utils/sitemap.py |
Generates sitemap.xml from docs/ tree |
Tip
The
utils/diagrams.pyscript recursively processes SVG files in thedocs/directory, applying consistent styling classes for backgrounds, strokes, and fills. Run it after updating any diagram.
Multi-GPU Training
The GPT-NeoX implementation includes pipeline-parallel training via PipelineParallelTrainerConf:
from labml_nn.neox.utils.trainer import PipelineParallelTrainerConf
conf = PipelineParallelTrainerConf()
# Splits model layers across available GPUs
The fairscale dependency provides the underlying distributed primitives.
5. Operations
Experiment Tracking with labml
All experiments use labml for tracking. The labml library:
- Records metrics via
tracker.save() - Manages experiment artifacts and checkpoints
- Provides a web dashboard for monitoring
- Stores data in
lab.get_data_path()(configurable)
Training Loop Architecture
The training infrastructure centers on TrainValidConfigs in labml_nn/helpers/trainer.py:
TrainingLoopConfigs
└── TrainValidConfigs
├── init() — create model, optimizer, data loaders
├── step() — single train/valid step (abstract)
├── run_step() — handles forward, loss, backward, optimizer step
├── run() — main training loop
└── sample() — generate samples (optional)
Note
The
TrainingLoopclass inlabml_nn/helpers/trainer.pysupports graceful interruption: catchingSIGINT(Ctrl+C) raisesStopIteration('SIGINT'), allowing the training loop to save state before exiting.
Tip
To add a new experiment, subclass
TrainValidConfigs(or one of its domain-specific children likeNLPAutoRegressionConfigs) and implementinit()andstep(). The training loop, metric tracking, and checkpoint management come for free.
GPT-NeoX Checkpoint Management
GPT-NeoX model weights are downloaded from https://mystic.the-eye.eu/public/AI/models/GPT-NeoX-20B/slim_weights/ via labml_nn/neox/checkpoint.py:
- Checkpoints are stored at
lab.get_data_path() / 'neox' / 'slim_weights'(orneox_fast/) - The model has 44 transformer layers by default
- Each layer's weights are split across 2 checkpoint files that get merged
- Merging handles dimension-0 concatenation (attention weights), dimension-1 concatenation (FFN), and duplicate parameters (layer norms)
Fine-Tuning Infrastructure
The FineTuner class in labml_nn/neox/utils/finetune.py provides a parameter-freezing abstraction:
class FineTuner:
def get_trainable_params(self) # parameters to train
def set_trainable_params(self) # freeze everything else
def state_dict(self) # save only trainable params
def load_state_dict(self, state) # restore trainable params
FineTuneBiases is the provided concrete implementation that trains only bias parameters.
6. Performance
Memory Optimization
The labml_nn.scaling.zero3 module implements Zero-3 style memory optimization for training large models. This partitions optimizer states, gradients, and parameters across data-parallel workers.
LLM.int8() Quantization
For GPT-NeoX inference on consumer GPUs, labml_nn.neox.utils.llm_int8 provides 8-bit quantization:
- Requires the
bitsandbytespackage - Significantly reduces GPU memory requirements
- Trades slight accuracy for dramatically lower VRAM usage
Adam FP16
The labml_nn.optimizers.adam_fp16 module provides an FP16-aware Adam variant:
AdamFP16maintains master weights in FP32 while training in FP16GradScalerFP16extends PyTorch'sGradScalerfor mixed-precision training
7. Security
Supply Chain
The package depends on PyTorch ecosystem packages (torch, torchvision, torchtext), the labml ecosystem, and standard scientific Python (numpy, einops). All dependencies are sourced from PyPI.
Checkpoint Downloads
The GPT-NeoX implementation downloads model weights from https://mystic.the-eye.eu/public/AI/models/GPT-NeoX-20B/slim_weights/. These are loaded via torch.load() with pickle deserialization.
Warning
torch.load()uses Python'spicklemodule by default, which can execute arbitrary code during deserialization. Only load checkpoints from trusted sources. The GPT-NeoX checkpoints are hosted by Eleuther AI.
No Authentication or Network Services
The labml_nn package does not expose any network services, APIs, or authentication mechanisms. It is a pure computation library. The only network activity is:
- Downloading datasets (via torchvision/labml, on first use)
- Downloading GPT-NeoX checkpoints (on first use)
- labml experiment tracking (optional, to labml.ai dashboard)
8. Developer Internals
Repository Structure
annotated_deep_learning_paper_implementations/
├── setup.py Package definition (v0.5.1)
├── requirements.txt Full dev/experiment dependencies
├── readme.md GitHub README
├── labml_nn/ Main package (all implementations)
│ ├── __init__.py Package docstring = implementation catalog
│ ├── transformers/ Transformer implementations (24 variants)
│ │ ├── __init__.py Module catalog + re-exports
│ │ ├── configs.py TransformerConfigs, FeedForwardConfigs
│ │ ├── mha.py Multi-Head Attention
│ │ ├── models.py Encoder, Decoder, EncoderDecoder, Generator
│ │ ├── feed_forward.py Position-wise FFN
│ │ ├── positional_encoding.py Sinusoidal positional encoding
│ │ ├── label_smoothing_loss.py Label smoothing cross-entropy
│ │ ├── xl/ Transformer-XL + relative MHA
│ │ ├── rope/ Rotary Positional Embeddings
│ │ ├── alibi/ ALiBi attention bias
│ │ ├── retro/ RETRO retrieval-augmented
│ │ ├── compressive/ Compressive Transformer
│ │ ├── gpt/ GPT-2 architecture
│ │ ├── glu_variants/ GLU feed-forward variants
│ │ ├── knn/ kNN-LM
│ │ ├── feedback/ Feedback Transformer
│ │ ├── switch/ Switch Transformer (MoE)
│ │ ├── fast_weights/ Fast Weights Transformer
│ │ ├── fnet/ FNet (Fourier mixing)
│ │ ├── aft/ Attention Free Transformer
│ │ ├── mlm/ Masked Language Model
│ │ ├── mlp_mixer/ MLP-Mixer
│ │ ├── gmlp/ gMLP
│ │ ├── vit/ Vision Transformer
│ │ ├── primer_ez/ Primer EZ
│ │ ├── hour_glass/ Hourglass Transformer
│ │ ├── flash/ Triton Flash Attention
│ │ └── jax_transformer/ JAX transformer implementation
│ ├── diffusion/ Diffusion models
│ │ ├── ddpm/ DDPM
│ │ └── stable_diffusion/ Stable Diffusion + DDIM + Latent Diffusion
│ │ ├── model/ UNet, autoencoder, CLIP
│ │ ├── sampler/ DDPM and DDIM samplers
│ │ └── scripts/ Generation scripts
│ ├── gan/ GAN implementations
│ │ ├── original/ Original GAN
│ │ ├── dcgan/ DCGAN
│ │ ├── cycle_gan/ CycleGAN
│ │ ├── wasserstein/ WGAN + gradient penalty
│ │ └── stylegan/ StyleGAN 2
│ ├── optimizers/ Optimizer implementations
│ │ ├── __init__.py GenericAdaptiveOptimizer base + WeightDecay
│ │ ├── adam.py Adam
│ │ ├── amsgrad.py AMSGrad
│ │ ├── adam_warmup.py Adam with warmup
│ │ ├── adam_warmup_cosine_decay.py Adam warmup + cosine decay
│ │ ├── adam_fp16.py Mixed-precision Adam
│ │ ├── noam.py Noam scheduler
│ │ ├── radam.py Rectified Adam
│ │ ├── ada_belief.py AdaBelief
│ │ ├── sophia.py Sophia-G
│ │ ├── configs.py OptimizerConfigs
│ │ └── mnist_experiment.py MNIST training example
│ ├── normalization/ Normalization layers (7 types)
│ ├── sampling/ Sampling techniques (4 types)
│ ├── rl/ Reinforcement learning (PPO, DQN)
│ ├── neox/ GPT-NeoX (model, checkpoint, evaluation)
│ ├── lora/ LoRA fine-tuning
│ ├── rwkv/ RWKV language model
│ ├── graphs/ Graph neural networks (GAT, GATv2)
│ ├── cfr/ Counterfactual Regret Minimization
│ ├── resnet/ ResNet
│ ├── conv_mixer/ ConvMixer
│ ├── unet/ U-Net
│ ├── capsule_networks/ Capsule Networks
│ ├── lstm/ LSTM
│ ├── recurrent_highway_networks/ Recurrent Highway Networks
│ ├── hypernetworks/ HyperLSTM
│ ├── sketch_rnn/ Sketch RNN
│ ├── distillation/ Knowledge distillation
│ ├── adaptive_computation/ PonderNet
│ ├── uncertainty/ Evidential deep learning
│ ├── activations/ Fuzzy Tiling Activations, Swish
│ ├── scaling/ Zero3 memory optimization
│ ├── helpers/ Shared infrastructure
│ │ ├── datasets.py MNIST, CIFAR-10, text dataset loaders
│ │ ├── trainer.py Training loops, TrainValidConfigs
│ │ ├── metrics.py Accuracy tracking
│ │ ├── device.py Device management
│ │ ├── optimizer.py Legacy optimizer configs
│ │ └── schedule.py Learning rate schedules
│ ├── experiments/ Experiment base configs
│ │ ├── cifar10.py CIFAR-10 experiment configs
│ │ ├── mnist.py MNIST experiment configs
│ │ ├── nlp_autoregression.py Text generation base config
│ │ ├── nlp_classification.py Text classification base config
│ │ └── arithmetic_dataset.py Arithmetic problem dataset
│ └── utils/ Utilities
│ ├── __init__.py MapStyleDataset
│ └── tokenizer.py TokenizerConfigs
├── docs/ Pre-rendered HTML documentation (2000+ files)
│ ├── *.html English documentation
│ ├── zh/ Chinese translations
│ ├── ja/ Japanese translations
│ └── si/ Sinhala translations
├── translate_cache/ Translation cache files
├── utils/ Build utilities
│ ├── diagrams.py SVG diagram processor
│ ├── papers_list.py Paper title collector
│ └── sitemap.py Sitemap generator
└── papers/ Paper metadata
Class Hierarchy
The optimizer hierarchy demonstrates the project's inheritance pattern:
torch.optim.Optimizer
└── GenericAdaptiveOptimizer
├── Adam
│ ├── AdamFP16
│ └── AMSGrad
│ ├── AdamWarmup
│ ├── AdamWarmupCosineDecay
│ ├── Noam
│ └── RAdam
│ └── AdaBelief
└── Sophia
The GPT-NeoX module hierarchy:
nn.Module
├── NeoXModule (custom load_state protocol)
│ ├── Embedding
│ ├── TransformerLayer
│ ├── FinalNorm
│ └── ReadoutLayer
├── RoPE
├── AttentionLayer
└── FFNLayer
The training infrastructure hierarchy:
BaseConfigs
└── TrainingLoopConfigs
└── TrainValidConfigs
├── SimpleTrainValidConfigs
├── NLPAutoRegressionConfigs
│ └── ArithmeticAutoregression
└── NLPClassificationConfigs
Key Design Patterns
1. Literate Programming Style
Every Python file is simultaneously executable code and documentation. Docstrings use a custom format:
"""
---
title: Multi-Head Attention
summary: >
Implementation of multi-head attention mechanism.
---
# Multi-Head Attention
This implements multi-headed attention from
[Attention Is All You Need](https://arxiv.org/abs/1706.03762).
"""
The YAML frontmatter (title, summary) is consumed by the documentation renderer. The markdown body becomes the side-by-side explanation.
2. Configuration via BaseConfigs
Instead of command-line arguments or YAML files, experiments use Python class-based configuration:
class Configs(CIFAR10Configs):
model: nn.Module
learning_rate: float = 0.001
@option(Configs.model, 'resnet')
def _model(c: Configs):
return ResNetBase(...)
The @option decorator registers named alternatives. The aggregate() function creates preset bundles.
Note
The configuration system uses Python's descriptor protocol under the hood. When you access
c.model, it lazily evaluates the registered@optionfunction. This means configuration objects are not plain data — they are evaluation graphs.
3. Self-Contained Modules
Each paper implementation is designed to be understood in isolation. There is minimal cross-referencing between implementations. The __init__.py of each subpackage acts as a catalog pointing to its children.
4. Experiment + Module Separation
Most subpackages separate the model (__init__.py or named module) from the experiment (experiment.py). The model defines nn.Module subclasses; the experiment wires them into a training pipeline via Configs subclasses.
Module Reference
Core Transformer Modules (labml_nn/transformers/)
| Class | File | Methods | Purpose |
|---|---|---|---|
MultiHeadAttention |
mha.py:69 |
__init__, get_scores, prepare_mask, forward |
Multi-head scaled dot-product attention |
PrepareForMultiHeadAttention |
mha.py:33 |
__init__, forward |
Linear projection for Q/K/V |
FeedForward |
feed_forward.py:43 |
__init__, forward |
Position-wise FFN with optional gating |
TransformerLayer |
models.py:60 |
__init__, forward |
Single transformer layer (self-attn + optional cross-attn + FFN) |
Encoder |
models.py:131 |
__init__, forward |
Stack of N transformer encoder layers |
Decoder |
models.py:153 |
__init__, forward |
Stack of N transformer decoder layers |
EncoderDecoder |
models.py:193 |
__init__, forward, encode, decode |
Full encoder-decoder transformer |
Generator |
models.py:175 |
__init__, forward |
Linear + log-softmax output layer |
PositionalEncoding |
positional_encoding.py:30 |
__init__, forward |
Sinusoidal positional encoding |
EmbeddingsWithPositionalEncoding |
models.py:24 |
__init__, forward |
Token embedding + sinusoidal PE |
EmbeddingsWithLearnedPositionalEncoding |
models.py:42 |
__init__, forward |
Token embedding + learned PE |
LabelSmoothingLoss |
label_smoothing_loss.py:18 |
__init__, forward |
KL-divergence based label smoothing |
TransformerConfigs |
configs.py:143 |
— | Declarative transformer assembly |
FeedForwardConfigs |
configs.py:20 |
— | Declarative FFN assembly |
Optimizer Modules (labml_nn/optimizers/)
| Class | File | Parents | Key Methods |
|---|---|---|---|
GenericAdaptiveOptimizer |
__init__.py:70 |
Optimizer |
init_state, step_param, step |
WeightDecay |
__init__.py:167 |
— | __init__, defaults, __call__ |
Adam |
adam.py:50 |
GenericAdaptiveOptimizer |
init_state, get_mv, get_lr, adam_update, step_param |
AMSGrad |
amsgrad.py:27 |
Adam |
init_state, get_mv |
RAdam |
radam.py:148 |
AMSGrad |
step_param, calc_rectification_term, r_adam_update |
AdaBelief |
ada_belief.py:45 |
RAdam |
init_state, get_ms, step_param |
AdamWarmup |
adam_warmup.py:18 |
AMSGrad |
get_lr |
Noam |
noam.py:20 |
AMSGrad |
get_lr |
Sophia |
sophia.py:62 |
GenericAdaptiveOptimizer |
init_state, update_hessian, step_param |
AdamFP16 |
adam_fp16.py:22 |
Adam |
init_state, step_param |
The optimizer base class validates hyperparameters at construction:
lrmust be ≥ 0epsmust be ≥ 0betas[0]andbetas[1]must be in [0, 1)weight_decaymust be ≥ 0- Sparse gradients are not supported (raises
RuntimeError)
GPT-NeoX Modules (labml_nn/neox/)
| Class | File | Purpose |
|---|---|---|
NeoXModule |
model.py:30 |
Base class with load_state protocol |
Embedding |
model.py:35 |
Token embeddings |
RoPE |
model.py:65 |
Rotary positional encoding |
AttentionLayer |
model.py:168 |
Multi-head attention (flash + standard paths) |
FFNLayer |
model.py:346 |
Feed-forward network |
TransformerLayer |
model.py:378 |
Complete transformer block |
FinalNorm |
model.py:447 |
Final layer normalization |
ReadoutLayer |
model.py:475 |
LM head (vocabulary projection) |
LayerGenerator |
model.py:503 |
Lazy layer loading for memory efficiency |
Cache |
utils/cache.py:18 |
Key-value cache for autoregressive generation |
FineTuner |
utils/finetune.py:9 |
Parameter freezing abstraction |
FineTuneBiases |
utils/finetune.py:43 |
Bias-only fine-tuning |
NeoXDataset |
utils/text_dataset.py:55 |
Text dataset for NeoX training |
TrainerConf |
utils/trainer.py:31 |
Training configuration |
PipelineParallelTrainerConf |
utils/trainer.py:178 |
Multi-GPU pipeline parallel training |
Training Infrastructure (labml_nn/helpers/)
| Class | File | Purpose |
|---|---|---|
TrainValidConfigs |
trainer.py:358 |
Main training loop with train/validate phases |
SimpleTrainValidConfigs |
trainer.py:448 |
Simplified training (no validation) |
TrainingLoop |
trainer.py:60 |
Iterator-based training with SIGINT handling |
Trainer |
trainer.py:254 |
Epoch-based trainer with data loader |
BatchIndex |
trainer.py:310 |
Batch progress tracking |
Mode |
trainer.py:237 |
Context manager for train/eval mode |
Accuracy |
metrics.py:43 |
Accuracy metric tracking |
DeviceConfigs |
device.py:34 |
CPU/GPU device selection |
Schedule |
schedule.py:4 |
Learning rate schedule base |
Piecewise |
schedule.py:34 |
Piecewise linear schedule |
MNISTConfigs |
datasets.py:24 |
MNIST data loader configs |
CIFAR10Configs |
datasets.py:106 |
CIFAR-10 data loader configs |
TextDataset |
datasets.py:180 |
Character-level text dataset |
SequentialDataLoader |
datasets.py:232 |
Sequential text data loader |
Error Messages Reference
| Error | Location | Trigger |
|---|---|---|
ValueError: Invalid learning rate: {lr} |
optimizers/__init__.py:88 |
lr < 0 |
ValueError: Invalid epsilon value: {eps} |
optimizers/__init__.py:90 |
eps < 0 |
ValueError: Invalid beta parameter at index 0: {betas[0]} |
optimizers/__init__.py:92 |
beta1 < 0 or beta1 >= 1 |
ValueError: Invalid beta parameter at index 1: {betas[1]} |
optimizers/__init__.py:94 |
beta2 < 0 or beta2 >= 1 |
ValueError: Invalid weight_decay value: {weight_decay} |
optimizers/__init__.py:186 |
weight_decay < 0 |
RuntimeError: GenericAdaptiveOptimizer does not support sparse gradients |
optimizers/__init__.py:150 |
Sparse gradient tensor |
ValueError: Head size {d_k} too large for flash attention |
neox/model.py:308 |
Per-head dim exceeds flash attn limit |
ImportError: Please install bitsandbytes |
neox/utils/llm_int8.py:37 |
Missing bitsandbytes package |
FileNotFoundError |
neox/utils/text_dataset.py:39 |
Dataset file not found |
FileNotFoundError |
helpers/datasets.py:300 |
Text file not found |
StopIteration: SIGINT |
helpers/trainer.py:119 |
Ctrl+C during training |
Code Patterns and Conventions
Module Structure Pattern:
labml_nn/{topic}/
├── __init__.py Module catalog (docstring) + core implementation
├── experiment.py Training experiment using Configs
└── {variant}/ Sub-implementations
├── __init__.py Variant implementation
└── experiment.py Variant experiment
Naming Conventions:
- Module classes: PascalCase matching the paper name (e.g.,
MultiHeadAttention,ConvMixer,RWKV) - Config classes: Always named
Configs, disambiguated by module path - Experiment entry points:
main()function inexperiment.py - Constants: UPPER_SNAKE_CASE (e.g.,
CHECKPOINTS_URL,PREV_X_TIME)
Docstring Style:
- YAML frontmatter for title/summary (consumed by doc renderer)
- Markdown with LaTeX math in
$...$and$$...$$ - Inline comments explain every non-obvious line
- HTML anchor tags (
<a id="...">) for cross-referencing
Note
The codebase uses a mix of
labml.configsoptions and direct class inheritance. Newer implementations tend toward simpler direct inheritance; older ones use the full@option/aggregatesystem. Both patterns are valid.
Testing
No dedicated test suite is included in the repository. The primary verification is that each experiment script runs successfully end-to-end. The Capsule Networks implementation includes a Jupyter notebook that serves as an integration test.
Warning
There is no automated test suite. When modifying implementations, verify correctness by running the corresponding experiment and checking that loss curves match expected behavior.
Known Issues (from Community)
| Issue | Status | Impact |
|---|---|---|
| #107 StyleGAN2 ignores latent vector | Open | StyleGAN output is not properly conditioned |
| #135 RETRO tensor size mismatch | Open | Batch processing crashes with variable-length inputs |
| #165 Missing activation in DDPM ResidualBlock | Open | Potential accuracy impact on diffusion models |
| #177 Classifier-free guidance error | Open | Incorrect diffusion sampling behavior |
| #185 Transformer-XL shift method bug | Open | Incorrect relative position encoding |
| #216 Potential errors in MHA | Open | Attention computation may be incorrect |
| #238 DDPM interpolation formula error | Open | Noise schedule calculation error |
| #245 PPO running error | Open | Gym version incompatibility |
| #255 GAE formula bug | Closed | Fixed in current version |
| #270 UNet error in DDPM | Open | Shape mismatch in skip connections |
| #285 TransformerXLLayer issues | Open | Code snippet problems |
| #293 Nucleus sampling doc corrections | Open | Documentation inaccuracies |
Potential Improvements
Based on source analysis:
-
Add automated tests. No test suite exists — each implementation relies on end-to-end experiment execution for verification. Unit tests for core modules (attention, optimizers, normalization) would catch regressions.
-
Pin dependency versions more tightly.
setup.pyspecifies no version bounds for most dependencies, whilerequirements.txthas minimum bounds. Thefairscaledependency has no version constraint at all. -
Address open bugs. Multiple community-reported issues (StyleGAN latent vector, DDPM formula errors, Transformer-XL shift) remain open. These affect correctness of the educational implementations.
-
Standardize experiment entry points. Some experiments use
main()functions, others useif __name__ == '__main__'blocks. A consistent CLI pattern would improve discoverability. -
Add type hints to remaining modules. Many modules have partial type annotations. Full typing would improve IDE support and catch errors.
-
Update deprecated gym API. The RL experiments use the legacy
gymAPI (pre-Gymnasium). Migrating togymnasiumwould fix version compatibility issues (#245).
Contributing
The project follows a literate-programming style. When adding a new paper implementation:
- Create a new subpackage under
labml_nn/ - Write the implementation with extensive inline docstrings containing:
- YAML frontmatter (
title,summary) - Markdown explanation with LaTeX math
- Line-by-line comments for non-obvious operations
- YAML frontmatter (
- Create an
experiment.pywith aConfigsclass andmain()entry point - Add the implementation to the catalog in
labml_nn/__init__.py
See community discussion #275 for contribution guidelines.
9. Troubleshooting
Training hangs or produces NaN loss
Cause: Learning rate too high, or numerical instability in FP16 training.
Solution:
- Reduce learning rate
- If using
AdamFP16, ensureGradScalerFP16is properly scaling gradients - Check for division by zero in normalization layers with very small epsilon
Warning
The custom optimizer implementations do not include gradient clipping by default. For unstable training, add
torch.nn.utils.clip_grad_norm_()beforeoptimizer.step().
GPT-NeoX checkpoint download fails
Cause: Network issues downloading from mystic.the-eye.eu.
Solution:
- Check network connectivity to
https://mystic.the-eye.eu/public/AI/models/GPT-NeoX-20B/slim_weights/ - Manually download checkpoint files to
lab.get_data_path() / 'neox' / 'slim_weights' - Ensure sufficient disk space (~40 GB)
Tip
If the default download path doesn't work, the checkpoint code checks for both
neox_fast/slim_weightsandneox/slim_weightsdirectories underlab.get_data_path().
labml experiment tracking not working
Cause: Missing or misconfigured labml setup.
Solution:
- Ensure
labmlis installed:pip install labml>=0.4.147 - Run
labml initto create a.labml.yamlconfiguration file - Check that
lab.get_data_path()points to a writable directory