Перейти к содержимому

Модели и конфиги

КлассИмпортЧто отличает архитектуруГлава пособия
GPTfrom llm.models.gpt import GPTобучаемые позиции, MHA, post-LN, GELU-FFNGPT-1
GPT2from llm.models.gpt import GPT2то же + pre-LN, финальный LayerNormGPT-2
Llamafrom llm.models.llama import LlamaRoPE, RMSNorm, SwiGLU, MHALLaMA
Mistralfrom llm.models.mistral import Mistral+ GQA и скользящее окноMistral
Mixtralfrom llm.models.mixtral import MixtralMistral + Mixture-of-ExpertsMixtral
Gemmafrom llm.models.gemma import GemmaMQA (или GQA/MHA), GeGLU, масштаб эмбеддинговGemma

Все шесть — наследники BaseModel (llm.core.base_model) и torch.nn.Module с одинаковым интерфейсом: forward, generate, save, load, auxiliary_loss, свойство max_seq_len.

Модель создаётся из обычного dict:

from llm.models.mistral import Mistral
model = Mistral({
"vocab_size": 1000, # размер словаря — из токенизатора: tokenizer.get_vocab_size()
"embed_dim": 256, # d — размерность модели
"num_q_heads": 4, # головы запросов
"num_kv_heads": 2, # головы ключей и значений (GQA)
"num_layers": 4,
"max_position_embeddings": 128, # максимальная длина контекста
"window_size": 16, # скользящее окно; без ключа окна нет
"dropout": 0.1,
})
print(sum(p.numel() for p in model.parameters())) # число параметров

✅ — ключ обязательный, «необяз.» — есть значение по умолчанию, пусто — ключ модели не нужен (лишние ключи игнорируются).

КлючGPT, GPT-2LLaMAMistralMixtralGemma
vocab_size, embed_dim, num_layers, max_position_embeddings, dropout✅✅✅✅✅
num_heads✅✅
num_q_heads✅✅✅
num_kv_heads✅✅необяз., 1 (MQA)
num_experts, top_k_experts✅
head_sizeнеобяз.необяз.необяз.необяз.необяз.
window_sizeнеобяз., без окнанеобяз., без окна
rms_norm_eps1e-61e-61e-61e-6
rope_theta10000100001000010000
intermediate_size4 · embed_dim4 · embed_dim4 · embed_dim4 · embed_dim
biastruetruetruetrue
tie_word_embeddingsfalsefalse
scale_embeddingsfalse
activationтолько GPT-1: "gelu_tanh" или "gelu" (точный)
attention_dropout0.0
router_aux_loss_coef0.0
initializer_range0.020.020.020.020.02

Смысл ключей:

  • head_size — размер одной головы; без ключа embed_dim // <число голов>. В моделях с RoPE должен быть чётным.
  • intermediate_size, bias — по умолчанию сохранена прежняя структура (4 · embed_dim, bias во всех Linear), чтобы загружались старые чекпоинты. У оригинальных LLaMA, Mistral, Mixtral и Gemma bias нет и скрытый размер FFN другой — эти ключи нужны для загрузки весов HF.
  • tie_word_embeddings — общая матрица эмбеддингов и выходной проекции, как в оригинальных GPT и Gemma.
  • scale_embeddings — умножение эмбеддингов на √embed_dim, как в Gemma.
  • router_aux_loss_coef — коэффициент load-balancing loss роутера Mixtral; 0 — выключен (в HF — 0.001). Подробнее — в Обучении.
  • initializer_range — стандартное отклонение начальных весов Linear и Embedding, как в HF. Важно только для обучения с нуля.

Проверки. Неверный конфиг даёт ValueError уже в конструкторе: embed_dim не делится на число голов (без явного head_size), num_q_heads не делится на num_kv_heads, нечётный head_size в моделях с RoPE, top_k_experts вне 1 … num_experts, intermediate_size ≤ 0, rms_norm_eps ≤ 0.

Параметры оригинальных моделей (размеры 7B, 8x7B и т. п.) и что меняет каждый ключ — в главах пособия, раздел «Конфигурация» в главе нужной архитектуры.

import torch
x = torch.randint(0, 1000, (2, 16)) # [batch, seq_len]
logits, cache = model(x) # logits: [2, 16, vocab_size]; cache = None
logits, cache = model(x, use_cache=True) # cache — список по слоям для продолжения
next_logits, cache = model(x[:, -1:], use_cache=True, cache=cache)
  • forward всегда возвращает кортеж (logits, cache); кэш — только при use_cache=True.
  • Аргументы передавайте по имени. Порядок позиционных аргументов разный: у GPT — (x, attention_mask, use_cache, cache), у остальных — (x, use_cache, cache, attention_mask).
  • attention_mask [batch, seq_len] (1 — токен, 0 — паддинг): паддинг допускается в любом месте строки. С кэшем маска должна покрывать и кэш: [batch, cache_len + seq_len]. Как это устроено — в главе Маски.
  • Длина с учётом кэша не больше max_position_embeddings, иначе ValueError. generate сам обрезает контекст — см. Генерацию.
  • Формат кэша: у GPT, GPT-2 и LLaMA — пара (K, V) на слой, у Mistral, Mixtral и Gemma — тройка (K, V, next_pos) (кэш со скользящим окном обрезается, и позиция хранится отдельно). Разбирать его вручную обычно не нужно: передавайте кэш из одного вызова в следующий как есть.

Логиты — не вероятности: для вероятностей нужен softmax(logits, dim=-1), а cross_entropy принимает логиты напрямую.