从零开始训练大型语言模型(LLM)的完整指南
从零开始训练大型语言模型(LLM)的完整流程,涵盖基座选择、数据收集与清洗、Tokenizers 训练、预训练、指令微调、RLHF 及模型部署等核心环节。内容包含基于 Hugging Face 和 PyTorch 的代码示例,解释了数据预处理、训练参数配置、评估指标(如困惑度)以及模型压缩与量化技术。文章旨在为开发者提供一套可落地的技术指南,帮助理解大模型训练的关键步骤与资源需求。

从零开始训练大型语言模型(LLM)的完整流程,涵盖基座选择、数据收集与清洗、Tokenizers 训练、预训练、指令微调、RLHF 及模型部署等核心环节。内容包含基于 Hugging Face 和 PyTorch 的代码示例,解释了数据预处理、训练参数配置、评估指标(如困惑度)以及模型压缩与量化技术。文章旨在为开发者提供一套可落地的技术指南,帮助理解大模型训练的关键步骤与资源需求。

训练一个大型语言模型(Large Language Model, LLM)是一个复杂且资源消耗巨大的过程,涉及数据工程、模型架构设计、分布式训练、评估与部署等多个关键阶段。本文详细拆解了从预训练基座选择到最终服务部署的全流程,并提供基于 Python 和 Hugging Face Transformers 库的代码示例。
在开始训练之前,需要根据业务需求、计算资源和目标语言选择合适的模型架构。
目前主流的大模型架构基于 Transformer 结构。对于生成式任务,通常采用 Decoder-only 架构(如 GPT 系列);对于理解类任务,Encoder-Decoder 架构(如 T5)可能更合适。本指南以 Decoder-only 架构为例。
模型规模直接决定了训练成本和效果上限。主要参数包括:
例如,GPT-2 Small 配置如下:
from transformers import GPT2Config
config = GPT2Config(
vocab_size=50257, # 词汇表大小
n_positions=1024, # 最大序列长度
n_ctx=1024, # 上下文窗口
n_embd=768, # 隐藏层维度
n_layer=12, # 网络层数
n_head=12 # 注意力头数
)
数据是训练大模型的燃料。高质量的数据集能显著提升模型性能。
数据来源应尽可能广泛且多样,常见的包括:
使用 datasets 库加载数据:
from datasets import load_dataset
# 加载英文维基百科数据集
dataset = load_dataset('wikipedia', '20200501.en')
print(dataset['train'][0]['text'][:100])
原始文本包含大量噪声,必须进行清洗:
import re
def preprocess_text(text):
"""清理文本:去除非字母数字字符,转换为小写"""
text = re.sub(r'[^a-zA-Z0-9\s]', ' ', text)
text = text.lower()
return text
# 应用预处理函数
dataset = dataset.map(lambda examples: {'text': [preprocess_text(t) for t in examples['text']]})
如果目标语言不是英语,或者领域术语较多,建议自定义 Tokenizer。
from transformers import AutoTokenizer
# 使用 BPE 算法训练分词器
tokenizer = AutoTokenizer.from_pretrained('gpt2')
# 如果需要自定义词表,可使用 SentencePiece 或 HuggingFace 的 Trainer 自动处理
预训练的核心任务是让模型学习语言的统计规律,最常用的是 Next Token Prediction(下一个词预测)。
使用 PyTorch 和 Hugging Face Trainer API 可以简化训练流程。
from transformers import Trainer, TrainingArguments
import torch
training_args = TrainingArguments(
output_dir='./results', # 保存路径
num_train_epochs=3, # 训练轮数
per_device_train_batch_size=4, # 单卡批次大小
gradient_accumulation_steps=16, # 梯度累积,模拟大 Batch
learning_rate=5e-5, # 学习率
warmup_steps=500, # 预热步数
weight_decay=0.01, # 权重衰减
logging_dir='./logs', # 日志目录
logging_steps=10, # 日志记录频率
fp16=True, # 混合精度训练
report_to='none' # 关闭外部报告工具
)
from transformers import DataCollatorForLanguageModeling
model = GPT2LMHeadModel(config)
data_collator = DataCollatorForLanguageModeling(
tokenizer=tokenizer,
mlm=False # 语言建模任务不需要 MLM
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset['train'],
data_collator=data_collator,
)
# 启动训练
trainer.train()
预训练模型具备通用语言能力,但缺乏遵循指令的能力。通过 SFT(Supervised Fine-Tuning)可以让模型学会回答用户问题。
数据格式通常为 {instruction, input, output}。
from datasets import Dataset
# 示例数据
data = {
'instruction': ['翻译为中文', '解释什么是 AI'],
'input': ['', '人工智能'],
'output': ['Hello World', 'AI is a branch of computer science']
}
dataset_sft = Dataset.from_dict(data)
使用相同的 Trainer 接口,只需更换数据集即可。
为了对齐人类价值观,可以使用 RLHF(Reinforcement Learning from Human Feedback)。
此步骤需要额外的 GPU 资源和复杂的工程实现,通常用于生产级模型。
训练完成后,必须严格评估模型表现。
衡量模型预测不确定性的指标,越低越好。
from transformers import evaluate
eval_results = trainer.evaluate(eval_dataset=dataset['validation'])
print(f"Perplexity: {eval_results['eval_ppl']}")
针对特定任务(如问答、写作),邀请专家进行主观评分。
为了降低推理成本,可采用以下技术:
将模型封装为 API 服务。
from transformers import pipeline
# 加载训练好的模型
pipe = pipeline("text-generation", model="./results")
result = pipe("Hello, I am a large language model.", max_length=50)
print(result[0]['generated_text'])
从零训练 LLM 是一项系统工程。关键在于:
虽然门槛较高,但随着开源生态的成熟,越来越多的团队能够构建自己的垂直领域大模型。希望本文提供的流程和代码能为您的研究或项目提供参考。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online