名称: implementing-llms-litgpt 描述: 使用 Lightning AI 的 LitGPT 实现和训练大型语言模型,包含 20 多种预训练架构(如 Llama、Gemma、Phi、Qwen、Mistral)。适用于需要干净的模型实现、教育理解架构,或使用 LoRA/QLoRA 进行生产级微调的场景。单文件实现,无抽象层。 版本: 1.0.0 作者: Orchestra Research 许可证: MIT 标签: [模型架构, LitGPT, Lightning AI, LLM 实现, LoRA, QLoRA, 微调, Llama, Gemma, Phi, Mistral, 教育] 依赖项: [litgpt, torch, transformers]
LitGPT - 干净的 LLM 实现
快速开始
LitGPT 提供了 20 多种预训练 LLM 实现,代码干净、可读,并包含生产就绪的训练工作流。
安装:
pip install 'litgpt[extra]'
加载和使用任何模型:
from litgpt import LLM
# 加载预训练模型
llm = LLM.load("microsoft/phi-2")
# 生成文本
result = llm.generate(
"法国的首都是什么?",
max_new_tokens=50,
temperature=0.7
)
print(result)
列出可用模型:
litgpt download list
常见工作流
工作流 1: 在自定义数据集上微调
复制此清单:
微调设置:
- [ ] 步骤 1: 下载预训练模型
- [ ] 步骤 2: 准备数据集
- [ ] 步骤 3: 配置训练
- [ ] 步骤 4: 运行微调
步骤 1: 下载预训练模型
# 下载 Llama 3 8B
litgpt download meta-llama/Meta-Llama-3-8B
# 下载 Phi-2(更小、更快)
litgpt download microsoft/phi-2
# 下载 Gemma 2B
litgpt download google/gemma-2b
模型保存到 checkpoints/ 目录。
步骤 2: 准备数据集
LitGPT 支持多种格式:
Alpaca 格式(指令-响应):
[
{
"instruction": "法国的首都是什么?",
"input": "",
"output": "法国的首都是巴黎。"
},
{
"instruction": "翻译成西班牙语:你好,你好吗?",
"input": "",
"output": "Hola, ¿cómo estás?"
}
]
保存为 data/my_dataset.json。
步骤 3: 配置训练
# 完整微调(7B 模型需要 40GB+ GPU)
litgpt finetune \
meta-llama/Meta-Llama-3-8B \
--data JSON \
--data.json_path data/my_dataset.json \
--train.max_steps 1000 \
--train.learning_rate 2e-5 \
--train.micro_batch_size 1 \
--train.global_batch_size 16
# LoRA 微调(高效,16GB GPU)
litgpt finetune_lora \
microsoft/phi-2 \
--data JSON \
--data.json_path data/my_dataset.json \
--lora_r 16 \
--lora_alpha 32 \
--lora_dropout 0.05 \
--train.max_steps 1000 \
--train.learning_rate 1e-4
步骤 4: 运行微调
训练自动保存检查点到 out/finetune/。
监控训练:
# 查看日志
tail -f out/finetune/logs.txt
# TensorBoard(如果使用 --train.logger_name tensorboard)
tensorboard --logdir out/finetune/lightning_logs
工作流 2: 在单 GPU 上进行 LoRA 微调
最内存高效的选项。
LoRA 训练:
- [ ] 步骤 1: 选择基础模型
- [ ] 步骤 2: 配置 LoRA 参数
- [ ] 步骤 3: 使用 LoRA 训练
- [ ] 步骤 4: 合并 LoRA 权重(可选)
步骤 1: 选择基础模型
对于有限 GPU 内存(12-16GB):
- Phi-2(2.7B) - 最佳质量/尺寸权衡
- Llama 3 1B - 最小、最快
- Gemma 2B - 良好推理能力
步骤 2: 配置 LoRA 参数
litgpt finetune_lora \
microsoft/phi-2 \
--data JSON \
--data.json_path data/my_dataset.json \
--lora_r 16 \ # LoRA 秩(8-64,越高容量越大)
--lora_alpha 32 \ # LoRA 缩放(通常为 2×r)
--lora_dropout 0.05 \ # 防止过拟合
--lora_query true \ # 对查询投影应用 LoRA
--lora_key false \ # 通常不需要
--lora_value true \ # 对值投影应用 LoRA
--lora_projection true \ # 对输出投影应用 LoRA
--lora_mlp false \ # 通常不需要
--lora_head false # 通常不需要
LoRA 秩指南:
r=8: 轻量级,2-4MB 适配器r=16: 标准,良好质量r=32: 高容量,适用于复杂任务r=64: 最大质量,适配器大 4 倍
步骤 3: 使用 LoRA 训练
litgpt finetune_lora \
microsoft/phi-2 \
--data JSON \
--data.json_path data/my_dataset.json \
--lora_r 16 \
--train.epochs 3 \
--train.learning_rate 1e-4 \
--train.micro_batch_size 4 \
--train.global_batch_size 32 \
--out_dir out/phi2-lora
# 内存使用:Phi-2 与 LoRA 约 8-12GB
步骤 4: 合并 LoRA 权重(可选)
将 LoRA 适配器合并到基础模型中以进行部署:
litgpt merge_lora \
out/phi2-lora/final \
--out_dir out/phi2-merged
现在使用合并后的模型:
from litgpt import LLM
llm = LLM.load("out/phi2-merged")
工作流 3: 从头开始预训练
在您的领域数据上训练新模型。
预训练:
- [ ] 步骤 1: 准备预训练数据集
- [ ] 步骤 2: 配置模型架构
- [ ] 步骤 3: 设置多 GPU 训练
- [ ] 步骤 4: 启动预训练
步骤 1: 准备预训练数据集
LitGPT 期望标记化数据。使用 prepare_dataset.py:
python scripts/prepare_dataset.py \
--source_path data/my_corpus.txt \
--checkpoint_dir checkpoints/tokenizer \
--destination_path data/pretrain \
--split train,val
步骤 2: 配置模型架构
编辑配置文件或使用现有:
# config/pythia-160m.yaml
model_name: pythia-160m
block_size: 2048
vocab_size: 50304
n_layer: 12
n_head: 12
n_embd: 768
rotary_percentage: 0.25
parallel_residual: true
bias: true
步骤 3: 设置多 GPU 训练
# 单 GPU
litgpt pretrain \
--config config/pythia-160m.yaml \
--data.data_dir data/pretrain \
--train.max_tokens 10_000_000_000
# 多 GPU 与 FSDP
litgpt pretrain \
--config config/pythia-1b.yaml \
--data.data_dir data/pretrain \
--devices 8 \
--train.max_tokens 100_000_000_000
步骤 4: 启动预训练
对于集群上的大规模预训练:
# 使用 SLURM
sbatch --nodes=8 --gpus-per-node=8 \
pretrain_script.sh
# pretrain_script.sh 内容:
litgpt pretrain \
--config config/pythia-1b.yaml \
--data.data_dir /shared/data/pretrain \
--devices 8 \
--num_nodes 8 \
--train.global_batch_size 512 \
--train.max_tokens 300_000_000_000
工作流 4: 转换和部署模型
导出 LitGPT 模型用于生产。
模型部署:
- [ ] 步骤 1: 本地测试推理
- [ ] 步骤 2: 量化模型(可选)
- [ ] 步骤 3: 转换为 GGUF(用于 llama.cpp)
- [ ] 步骤 4: 使用 API 部署
步骤 1: 本地测试推理
from litgpt import LLM
llm = LLM.load("out/phi2-lora/final")
# 单次生成
print(llm.generate("什么是机器学习?"))
# 流式生成
for token in llm.generate("解释量子计算", stream=True):
print(token, end="", flush=True)
# 批量推理
prompts = ["你好", "再见", "谢谢"]
results = [llm.generate(p) for p in prompts]
步骤 2: 量化模型(可选)
以最小质量损失减少模型大小:
# 8 位量化(尺寸减少 50%)
litgpt convert_lit_checkpoint \
out/phi2-lora/final \
--dtype bfloat16 \
--quantize bnb.nf4
# 4 位量化(尺寸减少 75%)
litgpt convert_lit_checkpoint \
out/phi2-lora/final \
--quantize bnb.nf4-dq # 双量化
步骤 3: 转换为 GGUF(用于 llama.cpp)
python scripts/convert_lit_checkpoint.py \
--checkpoint_path out/phi2-lora/final \
--output_path models/phi2.gguf \
--model_name microsoft/phi-2
步骤 4: 使用 API 部署
from fastapi import FastAPI
from litgpt import LLM
app = FastAPI()
llm = LLM.load("out/phi2-lora/final")
@app.post("/generate")
def generate(prompt: str, max_tokens: int = 100):
result = llm.generate(
prompt,
max_new_tokens=max_tokens,
temperature=0.7
)
return {"response": result}
# 运行:uvicorn api:app --host 0.0.0.0 --port 8000
何时使用 vs 替代方案
使用 LitGPT 当:
- 想理解 LLM 架构(干净、可读的代码)
- 需要生产就绪的训练配方
- 教育目的或研究
- 原型新模型想法
- Lightning 生态系统用户
使用替代方案代替:
- Axolotl/TRL: 更多微调功能,YAML 配置
- Megatron-Core: 对于 >70B 模型的最大性能
- HuggingFace Transformers: 最广泛的模型支持
- vLLM: 仅推理(无训练)
常见问题
问题:微调时内存不足
使用 LoRA 代替完整微调:
# 代替 litgpt finetune(需要 40GB+)
litgpt finetune_lora # 仅需要 12-16GB
或启用梯度检查点:
litgpt finetune_lora \
... \
--train.gradient_accumulation_iters 4 # 累积梯度
问题:训练太慢
启用 Flash Attention(内置,在兼容硬件上自动):
# 在 Ampere+ GPU(A100、RTX 30/40 系列)上默认已启用
# 无需配置
使用较小的微批次并累积:
--train.micro_batch_size 1 \
--train.global_batch_size 32 \
--train.gradient_accumulation_iters 32 # 有效批次=32
问题:模型无法加载
检查模型名称:
# 列出所有可用模型
litgpt download list
# 如果不存在则下载
litgpt download meta-llama/Meta-Llama-3-8B
验证检查点目录:
ls checkpoints/
# 应该看到:meta-llama/Meta-Llama-3-8B/
问题:LoRA 适配器太大
降低 LoRA 秩:
--lora_r 8 # 代替 16 或 32
对更少的层应用 LoRA:
--lora_query true \
--lora_value true \
--lora_projection false \ # 禁用此
--lora_mlp false # 和此
高级主题
支持的架构: 参见 references/supported-models.md 获取 20 多种模型系列、大小和能力的完整列表。
训练配方: 参见 references/training-recipes.md 获取预训练和微调的已验证超参数配置。
FSDP 配置: 参见 references/distributed-training.md 获取使用 Fully Sharded Data Parallel 进行多 GPU 训练。
自定义架构: 参见 references/custom-models.md 获取以 LitGPT 风格实现新模型架构。
硬件要求
- GPU: NVIDIA(CUDA 11.8+)、AMD(ROCm)、Apple Silicon(MPS)
- 内存:
- 推理(Phi-2):6GB
- LoRA 微调(7B):16GB
- 完整微调(7B):40GB+
- 预训练(1B):24GB
- 存储: 每个模型 5-50GB(取决于大小)
资源
- GitHub: https://github.com/Lightning-AI/litgpt
- 文档: https://lightning.ai/docs/litgpt
- 教程: https://lightning.ai/docs/litgpt/tutorials
- 模型库: 20 多种预训练架构(Llama、Gemma、Phi、Qwen、Mistral、Mixtral、Falcon 等)