Skip to content

GPT (language model)

OpenAI's original GPT (Radford et al. 2018, "openai-gpt") in pure Keras 3: a decoder-only language model with learned token + absolute-position embeddings and post-LayerNorm causal transformer blocks (no final norm). One implementation runs unmodified on TensorFlow / Torch / JAX, with bit-close parity to Hugging Face. Weights load from the kerasformers GitHub release (from_weights("hf:...") also works for on-the-fly conversion).

Paper: Improving Language Understanding by Generative Pre-Training

Class Module Output
GptModel kerasformers.models.gpt {"last_hidden_state": (B, L, embed_dim)}
GptGenerate kerasformers.models.gpt {"logits": (B, L, vocab), "last_hidden_state": ...} + .generate()
GptTokenizer kerasformers.models.gpt byte-pair encoder → input_ids / attention_mask

Same machinery as GPT-2 (Conv1D (in, out) weights copied without transpose, gelu_new activation, tied LM head) with two differences: the blocks are post-LayerNorm (ln_1(x + attn(x)), ln_2(n + mlp(n))) and there is no final LayerNorm.

Loading

from kerasformers.models.gpt import GptGenerate, GptTokenizer

model = GptGenerate.from_weights("gpt")          # openai-community/openai-gpt
tok = GptTokenizer()
ids = model.generate(tok("the meaning of life is")["input_ids"], max_new_tokens=40)
print(tok.decode(ids[0]))

Available variant

Variant layers embed_dim heads vocab
gpt 12 768 12 40478

Verified parity

GptGenerate logits vs the real openai-community/openai-gpt (HF): max |Δ| 1.2e-5, argmax 100% agree. Build + forward + .generate() pass on TF / Torch / JAX.