从零训练大语言模型:环境与代码实战指南
详细讲解如何从零开始预训练一个大语言模型,涵盖环境配置、数据清洗、分词器训练、模型训练及推理测试全流程。通过基于《三国演义》文本的实战案例,演示如何使用 Python 生态中的 Transformers 和 Tokenizers 库构建自定义模型,帮助开发者深入理解大模型底层原理与训练细节。内容包括依赖安装、BPE 分词器构建、GPT2 架构模型训练循环编写以及简单的文本生成测试,并提供常见问题排查建议。

详细讲解如何从零开始预训练一个大语言模型,涵盖环境配置、数据清洗、分词器训练、模型训练及推理测试全流程。通过基于《三国演义》文本的实战案例,演示如何使用 Python 生态中的 Transformers 和 Tokenizers 库构建自定义模型,帮助开发者深入理解大模型底层原理与训练细节。内容包括依赖安装、BPE 分词器构建、GPT2 架构模型训练循环编写以及简单的文本生成测试,并提供常见问题排查建议。

本文并非基于微调训练模型,而是从头开始训练出一个全新的大语言模型的硬核教程。看完本篇,你将了解训练出一个大模型的环境准备、数据准备、生成分词、模型训练、测试模型等环节分别需要做什么。AI 小白友好~文中代码可以直接实操运行。
全新训练的好处是训练的数据、训练的参数都是可修改的,通过调试运行我们可以更好的理解大模型训练过程。我们可以用特定类型数据的训练,来完成特定类型数据的输出。关于大模型已经有很多文章,微调模型的文章比较多,全新预训练全新模型的文章很少。个人觉得有的也讲的很复杂,代码也很难跑通。本文不会讲的很复杂,代码也很容易运行。
运行代码需要 Python 环境。建议使用支持 CUDA 的 GPU 机器进行加速,因为大模型训练对显存和计算能力要求较高。
首先安装必要的 Python 库。可以使用 pip 进行安装:
pip install transformers datasets torch tokenizers accelerate
确保已安装 PyTorch 并正确识别 GPU。可以通过以下命令检查:
import torch
print(torch.cuda.is_available())
如果返回 True,说明 GPU 环境配置成功。
首先我们要为训练准备数据。例如基于《三国演义》训练一个模型。数据质量直接影响模型效果,建议尽量使用纯净的文本数据。
下载数据文件(示例):
wget https://raw.githubusercontent.com/xinzhanguo/hellollm/main/text/sanguoyanyi.txt -O text/sanguoyanyi.txt
将下载的文件放入 text 文件夹中。在实际生产中,可能需要对数据进行清洗,去除特殊符号、HTML 标签或无关字符,以确保分词器的准确性。
分词(tokenization)是把输入文本切分成有意义的子单元(tokens)。通过以下代码,根据我们的数据生成一个新的分词器。这里使用 BPE(Byte Pair Encoding)算法,这是 GPT 系列模型常用的分词方式。
from tokenizers import Tokenizer
from tokenizers.models import BPE
from tokenizers.trainers import BpeTrainer
from tokenizers.normalizers import NFKC, Sequence
from tokenizers.pre_tokenizers import ByteLevel
from tokenizers.decoders import ByteLevel as ByteLevelDecoder
from transformers import GPT2TokenizerFast
# 构建分词器 GPT2 基于 BPE 算法实现
tokenizer = Tokenizer(BPE(unk_token="<unk>"))
tokenizer.normalizer = Sequence([NFKC()])
tokenizer.pre_tokenizer = ByteLevel()
tokenizer.decoder = ByteLevelDecoder()
special_tokens = ["<s>","<pad>","</s>","<unk>","<mask>"]
trainer = BpeTrainer(vocab_size=50000, show_progress=True, initial_alphabet=ByteLevel.alphabet(), special_tokens=special_tokens)
# 创建 text 文件夹,并把 sanguoyanyi.txt 下载,放到目录里
files = ["text/sanguoyanyi.txt"]
# 开始训练了
tokenizer.train(files, trainer)
# 把训练的分词通过 GPT2 保存起来,以方便后续使用
newtokenizer = GPT2TokenizerFast(tokenizer_object=tokenizer)
newtokenizer.save_pretrained("./sanguo")
成功运行代码后,我们在 sanguo 目录生成如下文件:vocab.json, merges.txt, tokenizer.json 等。现在我们已经成功训练了一个大语言模型的分词器。Vocab size 设置为 50000 是一个经验值,可根据数据量大小调整。
利用下面代码进行模型训练。这里使用 Hugging Face 的 Trainer API 简化流程,它封装了训练循环、日志记录和模型保存的逻辑。
import torch
from transformers import GPT2LMHeadModel, GPT2Config, Trainer, TrainingArguments
from datasets import Dataset
# 加载分词器
tokenizer = GPT2TokenizerFast.from_pretrained("./sanguo")
config = GPT2Config.from_pretrained("./sanguo")
model = GPT2LMHeadModel(config)
# 准备数据集
with open("text/sanguoyanyi.txt", "r", encoding="utf-8") as f:
text = f.read()
dataset = Dataset.from_dict({"text": [text]})
tokenized_dataset = dataset.map(lambda x: tokenizer(x["text"], truncation=True, max_length=512), batched=True)
training_args = TrainingArguments(
output_dir="./results",
num_train_epochs=3,
per_device_train_batch_size=4,
save_steps=10_000,
save_total_limit=2,
learning_rate=2e-5,
weight_decay=0.01,
fp16=True, # 开启混合精度加速
logging_steps=10,
)
# 初始化 Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset,
)
# 开始训练
trainer.train()
trainer.save_model("./sanguo_trained")
运行比较耗时,显示训练数据如下图(此处省略日志输出)。成功运行代码,我们发现 sanguo 目录下面多了三个文件:pytorch_model.bin, config.json, tokenizer_config.json。现在我们就成功生成训练出基于《三国演义》的一个大语言模型。
我们用文本生成,对模型进行测试代码如下:
from transformers import pipeline
generator = pipeline("text-generation", model="./sanguo_trained", tokenizer="./sanguo")
result = generator("吕布", max_length=50, num_return_sequences=1)
print(result[0]['generated_text'])
运行显示模型输出了三国相关的文本:'吕布十二回 张翼德 张翼德时曹操 武侯计计计'。 再测试一条:
result = generator("却说曹操引军因二人", max_length=50, num_return_sequences=1)
print(result[0]['generated_text'])
'接着奏乐 却说曹操引军因二人'。这内容不忍直视,如果想优化,我们也可以基于全新的模型进行微调训练;我们也可以适当地调整下训练参数,以达到较好的效果。
以上代码展示了从环境到测试的完整闭环。代码去除注释空行总共约 61 行核心逻辑。 本文代码模型是基于 GPT2 的,当然你也可以基于 Llama 或者 Bert 等模型去实现全新的大语言模型。 代码虽然不是很多,但是如果初次尝试运行的话你也许会遇到很多问题,比如环境搭建。为了避免其他烦恼,建议用 docker 方式运行代码,确保依赖版本一致。 更多代码可以参考官方文档或开源社区项目 Hello LLM!。
训练完成后,你可以尝试微调(Fine-tuning)来优化特定任务的表现。也可以结合检索增强生成(RAG)技术扩展模型的知识边界。掌握这些技术后,你将能够独立开发垂直领域的大模型应用。学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。如果你能完成所有任务,那你堪称天才。然而,如果你能完成大部分的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。
per_device_train_batch_size 或使用梯度累积。initial_alphabet 是否匹配数据编码。learning_rate 或增加 num_train_epochs。以上就是本篇文章的全部内容。我们完成了一个全新的模型训练。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 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