LLM Model PyTorch

May 18, 2026 · View on GitHub

这是一个灵活、轻量且高效的 PyTorch 大语言模型(LLM)和视觉语言模型(VLM)构建库。该项目旨在提供一个简洁的代码库,用于训练和推理现代 Transformer 模型,支持 Mixture of Experts (MoE)RoPE (YaRN/Dynamic)GQA/MQA 以及 Block Attention Residuals 等前沿技术。

✨ 核心特性 (Key Features)

本项目包含以下核心功能:

  • 先进的注意力机制:
    • 支持 GQA (Grouped Query Attention)MQA (Multi-Query Attention),由 num_key_value_heads 参数精确控制。
    • 原生支持 PyTorch 的 F.scaled_dot_product_attention (Flash Attention) 以加速前向与反向计算,节省显存。
    • 支持跨层 Block Attention Residuals (块残差注意力)
  • 位置编码 (Positional Embeddings):
    • 实现 Rotary Position Embeddings (RoPE),支持部分维度旋转 (partial_rotary_factor)。
    • 支持 YaRN (Yet another RoPE extension) 及温度缩放 (mscale) 用于长上下文无损外推。
    • 支持 Dynamic NTK 动态缩放。
  • 混合专家模型 (Sparse MoE):
    • 支持 Shared Experts(共享专家)与 Routed Experts(路由专家)相结合的混合架构。
    • 完善的路由机制:支持 Top-K 路由、权重归一化 (norm_topk_prob)、Router Jitter 噪声注入。
    • 内置高级训练损失:支持 Auxiliary Loss(负载均衡辅助损失)和 Z-Loss(缓解 Logits 数值溢出)。
    • 支持限制专家容量 (capacity_factor) 及 Token 丢弃策略 (drop_tokens)。
  • 多模态能力 (VLM):
    • 提供 VlmModel,支持挂载自定义视觉提取塔 (Vision Tower)。
    • 内置 Multi-Modal Projector,支持 Patch Pooling 压缩图像 Token 数量。
  • 推理优化:
    • 完整的 KV Cache 实现,支持预分配与动态扩容,加速自回归解码。
    • 支持 Gradient Checkpointing (梯度检查点) 以极大节省训练显存。
  • 配套训练和推理框架:

🛠️ 安装 (Installation)

你可以通过 pip 直接安装:

pip3 install project_llm_model

或者从源码安装:

git clone https://github.com/qibin0506/llm_model.git
cd llm_model
python3 setup.py install

🚀 快速开始 (Quick Start)

1. 初始化 LLM 模型 (含 MoE 与 YaRN)

import torch
from llm_model import LlmModel, ModelConfig, RoPEConfig, MoEConfig, AttnResConfig

# 配置一个现代架构的 LLM
config = ModelConfig(
    vocab_size=32000,
    hidden_size=4096,
    intermediate_size=11008,
    num_hidden_layers=32,
    num_attention_heads=32,
    num_key_value_heads=8,  # 使用 GQA (32/8 = 4 groups)
    max_position_embeddings=4096,
    use_qk_norm=True,       # 开启 QK Norm 提升训练稳定性
    rope_config=RoPEConfig(
        rope_type='yarn',   # 使用 YaRN 支持长文本外推
        rope_theta=10000.0,
        factor=8.0          # 上下文扩展系数
    ),
    moe_config=MoEConfig(
        n_dense_layer=2,          # 前 2 层保持 Dense
        n_routed_experts=8,       # 8 个路由专家
        num_experts_per_tok=2,    # 激活 Top-2
        n_shared_experts=1,       # 1 个共享专家
        intermediate_size=2048    # MoE 专家维度
    ),
    attn_res_config=AttnResConfig(num_blocks=8) # 开启块残差注意力
)

model = LlmModel(config)
print(model)

# 前向传播示例
input_ids = torch.randint(0, 32000, (1, 128))
output = model(input_ids)
print(f"Logits shape: {output['logits'].shape}") # (1, 128, 32000)

2. 初始化 VLM 模型 (多模态)

from llm_model import VlmModel, VLMConfig

def dummy_vision_tower(images):
    # 模拟视觉编码器输出: (batch, num_patches, vision_hidden_size)
    return torch.randn(images.shape[0], 256, 1024)

# VLMConfig 继承自 ModelConfig,包含所有 LLM 参数
vlm_config = VLMConfig(
    vocab_size=32000,
    hidden_size=4096,
    intermediate_size=11008,
    num_hidden_layers=32,
    num_attention_heads=32,
    max_position_embeddings=2048,
    
    # --- 视觉模态专属配置 ---
    image_tok=32001,        # 特殊 Image Token 的 ID (<image>)
    image_size=336,         # 输入图像分辨率
    patch_size=14,          # 图像切片大小 (336/14 = 24*24 = 576 patches)
    tokens_per_image=144,   # 经过 AvgPool 投影后送入 LLM 的最终 Token 数量
    vision_hidden_size=1024,# 视觉塔特征维度
    vision_tower=dummy_vision_tower
)

vlm_model = VlmModel(vlm_config)

⚙️ 配置字典详细说明 (Configuration)

ModelConfig (核心 LLM 配置)

基础的 Transformer 模型架构配置。包含所有标准 Dense 模型所需的参数。

参数类型默认值说明
vocab_sizeint-模型的词表大小。
hidden_sizeint-模型的隐藏层特征维度(d_model)。
intermediate_sizeint-密集前馈神经网络(MLP)的中间层维度。
num_hidden_layersint-解码层(Decoder Layer)总数。
num_attention_headsint-QKV 注意力机制的 Query 头数量。
num_key_value_headsOptional[int]NoneKV 头数量。等于 Q头数为 MHA,等于 1 为 MQA,否则为 GQA。None 表示等同于 Q头数。
max_position_embeddingsint-模型的最大位置嵌入长度,通常为当前上下文窗口大小。
original_max_position_embeddingsOptional[int]None预训练时的原始最大上下文长度,常被 RoPE 扩展算法(如 YaRN)用来计算精确倍率。
attention_dropoutfloat0.1注意力权重概率矩阵上的 Dropout 比例。
attention_implementationstr'auto'算子实现:auto (自动选择), sdpa (强制 Flash Attention), default (原生实现)。
initializer_rangefloat0.02权重初始化的正态分布标准差参数。
use_qk_normboolTrue是否在计算注意力前对 Q 和 K 执行 RMSNorm,可显著提升训练稳定性。
tie_word_embeddingsboolFalse是否将 Input Embedding 与 LM Head 输出权重矩阵绑定(权重共享)。
rope_configRoPEConfig实例化旋转位置编码详细配置实例。
moe_configOptional[MoEConfig]NoneMoE(混合专家)配置实例,不传入时默认是纯 Dense 稠密模型。
attn_res_configOptional[...]None块残差注意力的细粒度控制配置。

RoPEConfig (旋转位置编码)

控制 RoPE 及其长上下文扩展策略(NTK/YaRN)。

参数类型默认值说明
rope_typestr'default'可选: default (标准实现), dynamic (动态 NTK), yarn (YaRN 缩放)。
rope_thetafloat10000.0RoPE 的基础频率(theta)参数,常用 10000、500000 等。
factorfloat1.0线性缩放因子。用于外推扩展序列长度。
partial_rotary_factorfloat1.0旋转位置编码应用的维度比例(如 0.5 表示仅对一半维度旋转)。
beta_fastfloat32.0YaRN 专用的外推(extrapolation)线性渐变边界参数。
beta_slowfloat1.0YaRN 专用的内插(interpolation)线性渐变边界参数。
mscaleOptional[float]NoneYaRN 专用的注意力温度缩放乘数。
mscale_all_dimOptional[float]NoneYaRN 专用,针对全部维度的额外缩放配置。
attention_factorOptional[float]NoneYaRN 专用,应用在注意力计算时的缩放因子,未指定时会自动推断。

MoEConfig (混合专家配置)

配置传入 ModelConfig.moe_config 即可将 MLP 转为稀疏混合专家网络。

参数类型默认值说明
intermediate_sizeOptional[int]None单个 MoE 专家的内部隐藏层(FFN)维度大小。
n_dense_layerOptional[int]None前 N 层保持为 Dense(密集)层,从第 N+1 层起才转换为 MoE 层。
num_experts_per_tokOptional[int]None每个 Token 激活的路由专家数量(Top-K 路由)。
n_shared_expertsOptional[int]None共享专家数量(在所有 token 上强制激活计算)。
n_routed_expertsOptional[int]None参与动态路由决策的独立专家总数。
routed_scaling_factorfloat1.0路由专家输出信号的统一标量放大系数。
seq_auxboolTrue决定辅助损失计算层级:True 在序列级进行统计,False 整个 batch 打平计算。
norm_topk_probboolFalse是否将选出的 Top-K 专家的路由权重进行归一化(使得求和等于 1)。
aux_loss_coeffloat1e-3负载均衡辅助损失(Load Balancing Loss)乘以的系数因子。
z_loss_coeffloat1e-4Z-Loss 系数,用于惩罚过大的 Router Logits 避免数值溢出。
router_jitter_noisefloat0.01训练时注入到路由 Logits 中的均匀噪声幅度,提升分发均衡性。
capacity_factorfloat1.25专家容量因子。专家最大容纳量为 ceil(capacity_factor * tokens / experts)
drop_tokensboolFalse当某专家接收的 Token 数量超过容量上限时,是否直接丢弃超载的 Token。

VLMConfig (视觉语言模型配置)

多模态扩展配置,继承自 ModelConfig,用于初始化 VlmModel

参数类型说明
image_tokint特殊 Token ID,代表文本序列中图像被安放的占位符位置(如 <image>)。
image_sizeint视觉模型的输入图像分辨率尺寸(如 336 代表 336x336)。
patch_sizeint视觉模型将图像切分为块 (Patch) 的大小(如 14)。
tokens_per_imageint经过投影和池化后,单张图片实际转换为多少个进入 LLM 的 Token。
vision_hidden_sizeint视觉塔最后一层的隐藏特征维度。
vision_towerCallable视觉处理网络本身实例,输入为 Pixel Values,输出视觉表征 Tensor。

AttnResConfig (注意力残差块配置)

参数类型默认值说明
num_blocksint8划分模型的 block 块总数,模型按照 num_hidden_layers // num_blocks 为一组按块执行残差聚合。

📂 项目结构

llm_model/
├── llm_model.py       # 核心模型实现 (LlmModel, DecoderLayer, Attention)
├── vlm_model.py       # 视觉语言模型扩展 (VlmModel, MultiModalProjector)
├── sparse_moe.py      # MoE 路由计算、损失统筹与专家组实现
├── rope.py            # 旋转位置编码 (包含 YaRN, Dynamic NTK 算法推导)
├── kv_cache.py        # 预分配与动态更新的推理 KV Cache
├── attention_masks.py # Causal Mask 与 Padding 处理逻辑
└── model_config.py    # 包含详细注释的数据类定义 (Config)