梳理百川智能的 Baichuan 系列:基于 Transformer 结构、在约 1.2 万亿 token 上训练的 70 亿参数中英双语模型,在 C-Eval 与 MMLU 等基准上达到同尺寸最好效果,并给出数据处理方法、推理与量化部署方式。
🤗 Hugging Face • 🤖 ModelScope • 💬 WeChat
Baichuan-7B
简介
Baichuan-7B 是由百川智能开发的一个开源可商用的大规模预训练语言模型。基于 Transformer 结构,在大约 1.2 万亿 tokens 上训练的 70 亿参数模型,支持中英双语,上下文窗口长度为 4096。在标准的中文和英文 benchmark(C-Eval/MMLU)上均取得同尺寸最好的效果。
技术细节
数据
- 原始数据包括开源的中英文数据和自行抓取的中文互联网数据,以及部分高质量知识性数据。
- 参考相关数据工作,频率和质量是数据处理环节重点考虑的两个维度。 我们基于启发式规则和质量模型打分,对原始数据集进行篇章和句子粒度的过滤。在全量数据上,利用局部敏感哈希方法,对篇章和句子粒度做滤重。
整体流程如下所示:

- 经过不断的调整和多轮测试,最终确认了一个在下游任务上表现最好的中英文配比。
- 我们使用了一个基于自动学习的数据权重策略,对不同类别的数据进行配比。
分词
我们参考学术界方案使用 SentencePiece 中的 Byte-Pair Encoding (BPE) 作为分词算法,并且进行了以下的优化:
- 目前大部分开源模型主要基于英文优化,因此对中文语料存在效率较低的问题。我们使用 2000 万条以中英为主的多语言语料训练分词模型,显著提升对于中文的压缩率。
- 对于数学领域,我们参考了 LLaMA 和 Galactica 中的方案,对数字的每一位单独分开,避免出现数字不一致的问题,对于提升数学能力有重要帮助。
- 对于罕见字词(如特殊符号等),支持 UTF-8 characters 的 byte 编码,因此做到未知字词的全覆盖。
- 我们分析了不同分词器对语料的压缩率,如下表,可见我们的分词器明显优于 LLaMA, Falcon 等开源模型,并且对比其他中文分词器在压缩率相当的情况下,训练和推理效率更高。
比较结果
| Model | Baichuan-7B | LLaMA | Falcon | mpt-7B | ChatGLM | moss-moon-003 |
| — | — | — | — | — | — | — |
| Compress Rate | 0.737 | 1.312 | 1.049 | 1.206 | 0.631 | 0.659 |
| Vocab Size | 64,000 | 32,000 | 65,024 | 50,254 | 130,344 | 106,029 |
模型结构
整体模型基于标准的 Transformer 结构,我们采用了和 LLaMA 一样的模型设计
位置编码:rotary-embedding 是现阶段被大多模型采用的位置编码方案,具有更好的外延效果。虽然训练过程中最大长度为4096,但是实际测试中模型可以很好的扩展到 5000 tokens 以上,如下图:

激活层:SwiGLU, Feedforward 变化为 8/3 倍的隐含层大小,即 11,008
Layer-Normalization: 基于 RMSNorm 的 Pre-Normalization
训练稳定性和吞吐
我们在原本的 LLaMA 框架上进行诸多修改以提升训练时的吞吐,具体包括:
- 算子优化技术:采用更高效算子,如 Flash-Attention,NVIDIA apex 的 RMSNorm 等。
- 算子切分技术:将部分计算算子进行切分,减小内存峰值。
- 混合精度技术:降低在不损失模型精度的情况下加速计算过程。
- 训练容灾技术:训练平台和训练框架联合优化,IaaS + PaaS 实现分钟级的故障定位和任务恢复。
- 通信优化技术,具体包括:
基于上述的几个优化技术,我们在千卡 A800 显卡上达到了 7B 模型 182 TFLOPS 的吞吐,GPU 峰值算力利用率高达 58.3%。
最终的loss如下图:

推理方法
推理代码已经在官方 Huggingface 库
1 | from transformers import AutoModelForCausalLM, AutoTokenizer |
训练方法
安装依赖
pip install -r requirements.txt
deepspeed==0.9.2
numpy==1.23.5
sentencepiece==0.1.97
torch==2.0.0
transformers==4.29.1
xformers==0.0.20
准备数据
用户将训练语料按总rank数的倍数均匀切分成多个 UTF-8 文本文件,放置在语料目录(默认为 data_dir )下。各个rank进程将会读取语料目录下的不同文件,全部加载到内存后,开始后续训练过程。以上是简化的示范流程,建议用户在正式训练任务中,根据需求调整数据生产逻辑。
下载 tokenizer 模型
下载 tokenizer 模型文件 tokenizer.model ,放置在项目目录下。
配置 DeepSpeed
本示范代码采用 DeepSpeed 框架进行训练。用户需根据集群情况,修改 config/hostfile ,如果是多机多卡,需要修改 ssh 中各个节点的 IP 配置。具体可以参见 DeepSpeed 官方说明 。
执行训练
scripts/train.sh
#!/bin/bash
deepspeed –hostfile config/hostfile
–force_multi
train.py
–deepspeed
–deepspeed_config config/deepspeed.json
Baichuan-13B
Baichuan-13B 是由百川智能继 Baichuan-7B 之后开发的包含 130 亿参数的开源可商用的大规模语言模型,在权威的中文和英文 benchmark 上均取得同尺寸最好的效果。本次发布包含有预训练 (Baichuan-13B-Base) 和对齐 (Baichuan-13B-Chat) 两个版本。Baichuan-13B 有如下几个特点:
- 更大尺寸、更多数据:Baichuan-13B 在 Baichuan-7B 的基础上进一步扩大参数量到 130 亿,并且在高质量的语料上训练了 1.4 万亿 tokens,超过 LLaMA-13B 40%,是当前开源 13B 尺寸下训练数据量最多的模型。支持中英双语,使用 ALiBi 位置编码,上下文窗口长度为 4096。
- 同时开源预训练和对齐模型:预训练模型是适用开发者的『 基座 』,而广大普通用户对有对话功能的对齐模型具有更强的需求。因此本次开源我们同时发布了对齐模型(Baichuan-13B-Chat),具有很强的对话能力,开箱即用,几行代码即可简单的部署。
- 更高效的推理:为了支持更广大用户的使用,我们本次同时开源了 int8 和 int4 的量化版本,相对非量化版本在几乎没有效果损失的情况下大大降低了部署的机器资源门槛,可以部署在如 Nvidia 3090 这样的消费级显卡上。
- 开源免费可商用:Baichuan-13B 不仅对学术研究完全开放,开发者也仅需邮件申请并获得官方商用许可后,即可以免费商用。
模型推理
1 | import torch |
Baichuan-13B 使用了 ALiBi 线性偏置技术,相对于 Rotary Embedding 计算量更小,对推理性能有显著提升;与标准的 LLaMA-13B 相比,平均推理速度 (tokens/s) 实测提升 31.6%:
| Model | tokens/s |
|---|---|
| LLaMA-13B | 19.4 |
| Baichuan-13B | 25.4 |
测试环境和参数:GPU A100-SXM4-80G, PyTorch 2.0.0+cu117, transformers 4.29.1, batch size = 1, 生成长度 = 2048, 精度 fp16, 基于 Baichuan-13B-Base
量化部署
如需使用 int8 量化:
1 | model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan-13B-Chat", torch_dtype=torch.float16, trust_remote_code=True) |
同样的,如需使用 int4 量化:
1 | model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan-13B-Chat", torch_dtype=torch.float16, trust_remote_code=True) |
量化前后占用显存情况如下:
| Precision | GPU Mem (GB) |
|---|---|
| bf16 / fp16 | 26.0 |
| int8 | 15.8 |
| int4 | 9.7 |
量化后在各个 benchmark 上的结果和原始版本对比如下:
| Model 5-shot | C-Eval | MMLU | CMMLU |
|---|---|---|---|
| Baichuan-13B-Base | 52.4 | 51.6 | 55.3 |
| Baichuan-13B-Base-int8 | 51.2 | 49.9 | 54.5 |
| Baichuan-13B-Base-int4 | 47.6 | 46.0 | 51.0 |
模型微调
可以对 Baichuan-13B-Base 或 Baichuan-13B-Chat 进行微调使用。在此我们测试了与 Baichuan-13B 兼容的微调工具 LLaMA Efficient Tuning,并给出全量微调和 LoRA微调的两种示范。
在开始之前,开发者需下载 LLaMA Efficient Tuning 项目并按其要求安装依赖。
输入数据为放置在项目data目录下的 json 文件,用--dataset选项指定(参考下面示例),多个输入文件用,分隔。json 文件示例格式和字段说明如下:
1 | [ |
json 文件中存储一个列表,列表的每个元素是一个 sample。其中instruction代表用户输入,input是可选项,如果开发者同时指定了instruction和input,会把二者用\n连接起来代表用户输入;output代表期望的模型输出。
下面我们给出两种微调场景下测试跑通的示范脚本。
全量微调
我们在 8 * Nvidia A100 80 GB + deepspeed 的环境下进行了全量微调测试。
训练启动脚本示例:
1 | deepspeed --num_gpus=8 src/train_bash.py \ |
deep_speed.json 配置示例:
1 | { |
LoRA微调
我们在单张 Nvidia A100 80G 显卡上进行了 LoRA 微调测试。
训练启动脚本示例:
1 | CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ |
关于使用 LLaMA Efficient Tuning 的更详细的用法,请参阅其项目主页说明。
Baichuan2
- Baichuan 2 是百川智能推出的新一代开源大语言模型,采用 2.6 万亿 Tokens 的高质量语料训练。
- Baichuan 2 在多个权威的中文、英文和多语言的通用、领域 benchmark 上取得同尺寸最佳的效果。
- 本次发布包含有 7B、13B 的 Base 和 Chat 版本,并提供了 Chat 版本的 4bits 量化。
安装依赖
pip install -r requirements.txt
accelerate
colorama
bitsandbytes
sentencepiece
streamlit
transformers_stream_generator
cpm_kernels
xformers
scipy
文本生成
Chat 模型推理方法(文本生成)
1 | import torch |
文本补全
Base 模型推理方法(文本补全)
1 | from transformers import AutoModelForCausalLM, AutoTokenizer |
在上述两段代码中,模型加载指定 device_map='auto',会使用所有可用显卡。如需指定使用的设备,可以使用类似 export CUDA_VISIBLE_DEVICES=0,1(使用了0、1号显卡)的方式控制。
模型量化
8bits 在线量化:
1 | model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan2-7B-Chat", torch_dtype=torch.float16, trust_remote_code=True) |
4bits 在线量化:
1 | model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan2-7B-Chat", torch_dtype=torch.float16, trust_remote_code=True) |
需要注意的是,在用 from_pretrained 接口的时候,用户一般会加上 device_map="auto",在使用在线量化时,需要去掉这个参数,否则会报错。
量化前后显存占用对比 (GPU Mem in GB):
| Precision | Baichuan2-7B | Baichuan2-13B |
|---|---|---|
| bf16 / fp16 | 15.3 | 27.5 |
| 8bits | 8.0 | 16.1 |
| 4bits | 5.1 | 8.6 |
量化后在各个 benchmark 上的结果和原始版本对比如下:
| Model 5-shot | C-Eval | MMLU | CMMLU |
|---|---|---|---|
| Baichuan2-13B-Chat | 56.74 | 57.32 | 59.68 |
| Baichuan2-13B-Chat-4bits | 56.05 | 56.24 | 58.82 |
| Baichuan2-7B-Chat | 54.35 | 52.93 | 54.99 |
| Baichuan2-7B-Chat-4bits | 53.04 | 51.72 | 52.84 |
C-Eval 是在其 val set 上进行的评测
可以看到,4bits 相对 bfloat16 精度损失在 1 - 2 个百分点左右。
CPU 部署
Baichuan 2 模型支持 CPU 推理,但需要强调的是,CPU 的推理速度相对较慢。需按如下方式修改模型加载的方式:
1 | # Taking Baichuan2-7B-Chat as an example |
Baichuan2模型微调
依赖安装
1 | git clone https://github.com/baichuan-inc/Baichuan2.git |
下面我们给一个微调 Baichuan2-7B-Base 的单机训练例子。
训练数据:data/belle_chat_ramdon_10k.json,该样例数据是从 multiturn_chat_0.8M 采样出 1 万条,并且做了格式转换。主要是展示多轮数据怎么训练,不保证效果。
1 | hostfile="" |
多机训练
多机训练只需要给一下 hostfile ,内容类似如下:
1 | ip1 slots=8 |
同时在训练脚本里面指定 hosftfile 的路径:
1 | hostfile="/path/to/hostfile" |
轻量化微调
代码已经支持轻量化微调如 LoRA,如需使用仅需在上面的脚本中加入以下参数:
1 | --use_lora True |
LoRA 具体的配置可见 fine-tune.py 脚本。
使用 LoRA 微调后可以使用下面的命令加载模型:
1 | from peft import AutoPeftModelForCausalLM |
中间 Checkpoints
除了训练了 2.6 万亿 Tokens 的 Baichuan2-7B-Base 模型,我们还提供了在此之前的另外 11 个中间 checkpoints(分别对应训练了约 0.2 ~ 2.4 万亿 Tokens)供社区研究使用(下载地址)。下图给出了这些 checkpoints 在 C-Eval、MMLU、CMMLU 三个 benchmark 上的效果变化:

openai方式调用
1 | from flask import Flask, request, jsonify |

