code-llm-1b (base) β€” a 1.1B Python code-completion model trained from scratch on one RTX 5090

A 1,095,845,888-parameter decoder-only Transformer for Python code completion. Data pipeline, tokenizer, architecture, training loop, checkpoint merging and evaluation were all written and run by one person on one consumer GPU. This folder holds the weights; the code, design record, ablation report and failure log live at https://github.com/TightXu/Simple_Code_LLM.

This folder is the pretrained base. Its weights are the merged (weight-averaged) product of the pretraining run: under this training scheme the merged checkpoint, not the last optimizer step, is the finished pretrained model β€” hence the name. The instruction-tuned variant is in ../sft.

Architecture

Parameters 1,095,845,888 (bf16), 143 tensors
Layers 20
d_model / heads 2048 / 16 (head_dim 128)
FFN SwiGLU, d_ff 5120 (gate / up / down)
Position RoPE, theta 500000
Norm RMSNorm, learned scale, eps 1e-6 (pre-norm)
Attention causal SDPA, fused QKV projection, no biases anywhere
Embeddings untied (input embed + output lm_head)
Vocabulary 32,000 byte-level BPE (same tokenizer as the 435M release, not retrained)
Context 1024 tokens
Precision bf16 (released file; trained with FP8 matmuls on fp32 master weights)

Parameter count is the sum of the 143 released tensors, and equals the count of the instantiated CodeLLM class. It is deliberately not the value of ModelConfig.num_params, whose closed form double-counts the two per-block norms and omits final_norm (that property returns 1,095,925,760).

Training

  • Data: the filtered Python corpus (data/all/train.bin), one continuous token stream with no dataset boundaries. This checkpoint stopped at 30,977,679,360 tokens (31.0 B) after 630,000 steps.
  • Schedule: WSM β€” constant learning rate, then a cooldown; the released weights are the equal-weight average of the last 21 checkpoints (saved every 500 steps, a 10,500-step window) (merge_checkpoints_weighted.py), not the last step.
  • Hardware: a single RTX 5090, 32 GB, Blackwell sm_120.
  • SFT: the instruction-tuned release starts from exactly these weights.

What it can and cannot do

Can: complete short Python functions when given a signature and the opening indentation. On a human-graded benchmark β€” 11 tasks, five seeds, scored 0/1/2, maximum 110 β€” this model scores 83/110 on the natural-language prompt column and 61/110 on the signature-only column. Same ruler, same fine-tuned sibling (../sft): 97/110 and 91/110, i.e. the SFT pass is worth +14 on the prose column and +30 on the signature-only column, mostly on multi-step tasks.

Cannot: follow instructions β€” this is a completion model, not a chat model. Use ../sft for the instruction-tuned variant. Failure modes are structural rather than random: recursive sorting (mergesort, and quicksort on the prose column) and primality testing never pass, several tasks produce a correct skeleton with one wrong operator, and name/edge-case discipline is weak. It is also blind to docstrings: at this scale a from-scratch model reads a docstring as the end of the function, so standard HumanEval docstring prompts score near zero and docstring-free prompts are used instead.

Files

File What
model.safetensors bf16 weights, 143 tensors, 2,191,706,272 bytes β€” verified bit-identical to checkpoints_wsm_1b/merged/checkpoint.pt after the fp32β†’bf16 cast
config.json architecture config taken from the checkpoint itself, plus torch_dtype: bf16
tokenizer.json byte-level BPE, 32,000 tokens
SHA256SUMS.txt 6b89f4eebe5bb79bd3f98c5dfaae303d80661c8a3498336ae2dcbf2920184081 model.safetensors
arch_facts.json provenance: source checkpoint, step, token count, source config

Verification artifacts (the hash, key/shape, bitwise-equality, strict-load and CPU-forward logs) stay in the training workspace and are not part of this release; SHA256SUMS.txt is what lets anyone re-check the weights independently.

config.json carries use_fp8: false. The training config said true, but that selects FP8 training kernels (FP8Linear); it is not a property of these weights, and leaving it set makes ModelConfig(**config) build layers that cannot run outside CUDA.

Loading requires the model class from the training repository (pretrain_train_wsm.py, class CodeLLM, ModelConfig(**config.json)): embed β†’ scaled by sqrt(d_model) β†’ 20 pre-norm blocks β†’ final_norm β†’ lm_head. This is not a transformers architecture and has no AutoModel mapping.

One loading gotcha, verified the hard way on this folder: RMSNorm computes its mean of squares in fp32, so its output is fp32 even when the weights are bf16, and a bare bf16 CPU forward raises expected m1 and m2 to have the same dtype inside nn.Linear. Training never saw this because it ran under CUDA autocast. Run inference under torch.autocast("cpu", dtype=torch.bfloat16) (what the verification used, 0.1 s for a 13-token prompt) or load the model in fp32.

Intended use and limits

Research and education: what a 1.1B model actually learns when trained end to end on real data with one GPU. Not for production code generation, not for instruction following, not a substitute for a competent developer. Trained only on code; no personal data. Outputs may reproduce patterns (and The evaluation is 11 tasks Γ— 5 seeds per checkpoint, every sample graded 0/1/2 by hand (110 points per column); treat differences smaller than the per-seed spread as noise.

Links

Everything else β€” DESIGN.md (decisions and why), CHALLENGES.md (every bug and contaminant), the ablation report, the fine-tuning log with corrections, and every evaluated generation β€” is at https://github.com/TightXu/Simple_Code_LLM. MIT licensed.

Downloads last month
26
Safetensors
Model size
1B params
Tensor type
BF16
Β·
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support