关于我训练了1B大小的LLM这件事
ViperEkura Lv1

1. 为什么我要做这个项目?

现在市面上有很多大模型,比如GPT、LLaMA这些,动不动就是几十亿甚至上千亿参数。但说实话,这些模型对硬件要求太高了,普通开发者根本玩不起。我就想:能不能做一个既好用又能在普通电脑上跑起来的模型呢? 这其实也是目前大部分人的期望, 能有一个可以本地部署的ai小型项目,实现完全私有化并且有一定的智能能力。

于是就有了这个KHAOSZ项目,1B参数,中英双语,支持对话、文本生成、RAG检索,而且训练代码都是开源的!

2. 模型是怎么工作的?

1. Transformer基础

我们的模型基于Transformer架构,堆叠了24层。每层都包含:

  • 注意力机制:让模型关注重要信息
  • 前馈神经网络:处理信息
  • 归一化层:稳定训练过程

自回归模型:像猜谜语一样

想象一下,你在和朋友玩猜谜语游戏。朋友说:”今天天气真…”,你猜下一个词可能是”好”、”晴朗”、”糟糕”等等。

我们的模型也是这样的!它会把一句话拆成很多小片段(token),然后根据前面已经出现的词,猜下一个词可能是什么。

举个例子:

1
2
输入:"今天天气真"
模型猜:"不错"(概率40%),"晴朗"(概率20%),"糟糕"(概率10%)...

然后我们通过一些参数(temperature、top_k、top_p)来控制猜词的随机性,最后选一个词出来,加到句子后面继续猜,直到遇到结束符号。

注意力机制:让模型”专注”

模型内部有一个很重要的机制叫注意力。简单说就是,当模型在猜下一个词的时候,它会关注前面哪些词更重要。

比如在句子”小明去超市买了苹果和香蕉”中,当模型要猜”买了”后面是什么时,它会特别关注”超市”这个词,因为超市里卖的东西通常都是食物。

因果掩码:不能偷看未来

这里有个很重要的规则:模型在猜当前词的时候,不能偷看后面的词。就像考试时不能看后面的答案一样。

我们用一个特殊的”掩码”来实现这个功能:

1
2
3
4
[0, -inf, -inf, -inf]   # 只能看到第一个词
[0, 0, -inf, -inf] # 只能看到前两个词
[0, 0, 0, -inf] # 只能看到前三个词
[0, 0, 0, 0] # 能看到所有词

其中-inf代表无限小,经过softmax处理后变成0,这样模型就”看不到”未来的词了。

2. GQA:省内存的注意力

传统的注意力机制每个头都有独立的Key和Value,这样很占内存。我们用了GQA(分组查询注意力)

  • 24个查询头(Query Heads)
  • 但只有4个键值头(Key-Value Heads)

相当于24个人共用4个笔记本,大大节省了内存!

3. RoPE:让模型理解位置

模型需要知道词在句子中的位置。我们用了旋转位置编码(RoPE),这是一种很巧妙的方法,让模型能理解”第一个词”、”第二个词”这样的位置关系。

4. 权重绑定:省参数的技巧

我们让输入层和输出层共用权重,这样能节省大约0.1B参数!相当于输入和输出用同一本词典,不用准备两本。

3. 训练过程

三种训练模式

我们支持三种训练方式:

  1. 预训练(seq):让模型学会基本的语言规律
  2. 监督微调(sft):教模型按照指令回答问题
  3. 直接偏好优化(dpo):让模型学会选择更好的回答

训练优化技巧

为了在有限硬件上训练,我们用了很多技巧:

  • 梯度累积:小batch多次累积,模拟大batch效果
  • 混合精度:用bfloat16节省显存
  • 分布式训练:多GPU并行训练
  • 检查点保存:支持断点续训

4. 怎么用这个模型?

简单对话

1
2
3
4
5
6
7
8
9
10
11
12
from khaosz import Khaosz

model = Khaosz("模型路径").to('cuda')
history = []

while True:
query = input("你:")
if query == "退出":
break

response = model.generate(query=query, history=history)
print(f"AI:{response}")

流式输出(打字机效果)

1
2
3
4
response_size = 0
for response, history in model.stream_generate(query=query, history=history):
print(response[response_size:], end="", flush=True)
response_size = len(response)

检索增强(RAG)

如果你想让模型回答特定领域的问题,可以用RAG功能:

1
2
3
4
5
# 模型会先检索相关知识,再生成回答
answer = model.retrieve_generate(
query="什么是人工智能?",
retrieve_top_k=5 # 检索前5个相关文档
)

5. 怎么训练自己的模型?

准备数据

把你的文本数据整理好,可以是中文、英文或混合文本。建议先用分词器处理一下,保存成token格式。

安装依赖

1
2
pip install -r requirements.txt
pip install .

开始训练

1
2
3
4
5
6
python tools/train.py \
--train_type=seq \
--data_root_path=你的数据路径 \
--param_path=参数配置路径 \
--n_epoch=5 \
--batch_size=8

6. 项目特色

优点

  1. 轻量高效:1B参数,普通显卡就能跑
  2. 双语支持:中英文都表现不错
  3. 完整流程:从预训练到微调都有
  4. 易于使用:API设计得很简单

局限性

  1. 规模限制:相比大模型,复杂任务能力有限
  2. 过拟合风险:数据少时容易记住训练数据
  3. 多语言支持:主要针对中英文

7. 未来计划

接下来我打算:

  • 尝试更大的模型规模(7B、13B)
  • 加入多模态能力(图像理解)
  • 优化长文本处理
  • 提供更便捷的微调接口

8. 欢迎参与!

这个项目已经开源在HuggingFace上,欢迎大家:

  • 下载模型试用
  • 提出改进建议
  • 贡献代码
  • 分享使用经验

项目地址
HuggingFace
Github

9. 最后想说

训练一个LLM真的挺有成就感的,虽然过程很辛苦,但看到模型能理解你的问题并给出回答时,那种感觉真的很棒!

如果你也对AI感兴趣,不妨从这个小项目开始,亲手体验一下训练模型的乐趣。记住,重要的不是模型有多大,而是你能用它做什么

希望我的分享对你有帮助!如果有任何问题,欢迎在评论区交流~


写于 2026年1月4日
一个热爱AI的开发者

 REWARD AUTHOR