Skip to content

百川智能 baichuan 7B、13B、53B、baichuan2 总结篇

来源:AiGC面试宝典 作者:宁静致远 日期:2023年09月29日


一、baichuan-7B 篇

项目地址:https://github.com/baichuan-inc/baichuan-7B 预训练模型:https://huggingface.co/baichuan-inc/baichuan-7B ModelScope:https://modelscope.cn/models/baichuan-inc/baichuan-7B/

1.1 baichuan-7B 模型简介

baichuan-7B 基于 Transformer 结构,在大约 1.2 万亿 tokens 上训练的 70 亿参数模型,支持中英双语,上下文窗口长度为 4096。

📝通俗解释:baichuan-7B 是一个拥有 70 亿参数的大型语言模型,"tokens" 可以理解为模型学习用的"单词"或"文字片段"。1.2 万亿 tokens 意味着模型学习了非常大量的文本数据。上下文窗口长度为 4096 表示模型一次最多能处理约 4096 个词的内容。


1.2 baichuan-7B 如何收集原始数据并构建训练数据?

原始数据收集

  • 开源的中英文数据和自行抓取的中文互联网数据,以及部分高质量知识性数据

数据预处理

  • 频率和质量是数据处理环节重点考虑的两个维度。baichuan-7B 基于启发式规则和质量模型打分,对原始数据集进行篇章和句子粒度的过滤
  • 在全量数据上,利用局部敏感哈希方法,对篇章和句子粒度做滤重

📝通俗解释:数据预处理就像"淘金"——从大量原始数据中筛选出高质量的内容。"启发式规则"类似于人工总结的筛选经验,"质量模型打分"是用 AI 来判断数据质量好不好,"局部敏感哈希"是一种快速找出重复内容的技术。

数据处理流程图

Raw Data → Heuristic Rules → Intermediate Data

                    ┌─────────┴─────────┐
                    ↓                   ↓
            Deduplication        Quality Scoring
                    ↓                   ↓
            Intermediate Data    Data with Scores
                    └─────────┬─────────┘

                         Select

                         Final Dataset

数据配比

  • 使用了一个基于自动学习的数据权重策略,对不同类别的数据进行配比

📝通俗解释:不同的训练数据(如科技文章、新闻、小说等)对模型能力的影响不同。"数据权重策略"就是自动学习怎样分配不同类型数据的比例,让模型学习效果最好。


1.3 baichuan-7B 如何提高训练稳定性和吞吐?

在原本的 LLaMA 框架上进行诸多修改以提升训练时的吞吐,具体包括:

1. 算子优化技术

  • 采用更高效算子,如 Flash-Attention、NVIDIA Apex 的 RMSNorm 等

📝通俗解释:算子就像计算过程中的"工具",Flash-Attention 是一种高效的注意力计算方法,能让模型训练更快、更省内存。

2. 算子切分技术

  • 将部分计算算子进行切分,减小内存峰值

📝通俗解释:就像搬运重物时分成小份搬运一样,把大计算任务拆分成小任务,可以减少内存占用。

3. 混合精度技术

  • 降低在不损失模型精度的情况下加速计算过程

📝通俗解释:类似于用"半精确"但更快的计算方式,就像用大概的数字做心算比精确计算更快,且最终结果差不多。

4. 训练容灾技术

  • 训练平台和训练框架联合优化,IaaS + PaaS 实现分钟级的故障定位和任务恢复

📝通俗解释:训练大模型时可能遇到机器故障,"容灾技术"就是确保即使某台机器出问题,也能快速恢复,不至于从头开始训练。

5. 通信优化技术

  • a. 采用拓扑感知的集合通信算法,避免网络拥塞问题,提高通信效率
  • b. 根据卡数自适应设置 bucket size,提高带宽利用率
  • c. 根据模型和集群环境,调优通信原语的触发时机,从而将计算和通信重叠

📝通俗解释:训练时多台 GPU 卡需要相互交换数据,"通信优化"就是让数据传输更快、不堵塞,充分利用网络带宽。

效果

  • 基于上述优化技术,在千卡 A800 显卡上达到了 7B 模型 182 TFLOPS 的吞吐,GPU 峰值算力利用率高达 58.3%

📝通俗解释:TFLOPS 是计算速度的单位,182 TFLOPS 表示每秒能进行 182 万亿次浮点运算。58.3% 的利用率在分布式训练中是比较高的水平。

训练 Loss 曲线

  • Loss 随着 token 数量的增加而迅速下降,初期下降非常快,随后趋于平缓,最终稳定在 1.75 左右

📝通俗解释:Loss(损失)是衡量模型学习效果的指标,越低越好。曲线显示模型在初期学习很快,后期逐渐稳定。


二、baichuan-13B 篇

项目地址:https://github.com/Baichuan-inc/Baichuan-13B 预训练模型:https://huggingface.co/baichuan-inc/Baichuan-13B-Base 对话模型:https://huggingface.co/baichuan-inc/Baichuan-13B-Chat ModelScope:https://modelscope.cn/models/Baichuan-inc/Baichuan-13B-Chat/summary

2.1 baichuan-13B 的特点

相比于 baichuan-7B,baichuan-13B 的特点体现在:

  1. 更大尺寸、更多数据

    • Baichuan-13B 在 Baichuan-7B 的基础上进一步扩大参数量到 130 亿,并且在高质量的语料上训练了 1.4 万亿 tokens,超过 LLaMA-13B 40%,是当前开源 13B 尺寸下训练数据量最多的模型
    • 支持中英双语,使用 ALiBi 位置编码,上下文窗口长度为 4096

    📝通俗解释:ALiBi 是一种位置编码技术,能帮助模型更好地理解文本中词语的位置关系,特别有利于处理长文本。

  2. 同时开源预训练和对齐模型

    • 预训练模型是适用开发者的『基座』,而广大普通用户对有对话功能的对齐模型具有更强的需求
    • 本次开源同时发布了对齐模型(Baichuan-13B-Chat),具有很强的对话能力,开箱即用

    📝通俗解释:"预训练模型"像是一个"通才",什么都会一点;"对齐模型"像是经过专门调教的"专家",更擅长聊天对话。

  3. 更高效的推理

    • 开源了 int8 和 int4 的量化版本,相对非量化版本在几乎没有效果损失的情况下大大降低了部署的机器资源门槛
    • 可以部署在如 Nvidia 3090 这样的消费级显卡上

    📝通俗解释:量化就像把"高清照片"压缩成"小体积图片",虽然略有损失但大大节省存储空间和计算资源,让普通电脑也能运行大模型。


2.2 如何对 baichuan-13B 进行推理和部署?

环境安装

bash
pip install -r requirements.txt

2.2.1 GPU 直接部署

方法一:Python 代码方式

python
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers.generation.utils import GenerationConfig

tokenizer = AutoTokenizer.from_pretrained("baichuan-inc/Baichuan-13B-Chat", 
                                          use_fast=False, 
                                          trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan-13B-Chat", 
                                              device_map="auto", 
                                              torch_dtype=torch.float16, 
                                              trust_remote_code=True)
model.generation_config = GenerationConfig.from_pretrained("baichuan-inc/Baichuan-13B-Chat")

messages = []
messages.append({"role": "user", "content": "世界上第二高的山峰是哪座"})
response = model.chat(tokenizer, messages)
print(response)
# 输出:乔戈里峰。世界第二高峰———乔戈里峰西方登山者称其为K2峰,海拔高度是8611米,位于喀喇昆仑山脉的中巴边境上

📝通俗解释:这段代码加载了预训练好的对话模型,然后向它提问"世界上第二高的山峰是哪座",模型会给出回答。

方法二:命令行方式

bash
python cli_demo.py

2.2.2 量化部署

Baichuan-13B 支持 int8 和 int4 量化,用户只需在推理代码中简单修改两行即可实现。

📝通俗解释:量化版本可以大幅减少显存占用,但可能会有轻微的效果下降。根据硬件条件选择合适的版本。

int8 量化

python
model = AutoModelForCausalLM.from_pretrained(
    "baichuan-inc/Baichuan-13B-Chat",
    torch_dtype=torch.float16,
    trust_remote_code=True
)
model = model.quantize(8).cuda()

int4 量化

python
model = AutoModelForCausalLM.from_pretrained(
    "baichuan-inc/Baichuan-13B-Chat",
    torch_dtype=torch.float16,
    trust_remote_code=True
)
model = model.quantize(4).cuda()

量化前后占用显存情况

精度GPU 显存 (GB)
bf16 / fp1626.0
int815.8
int49.7

📝通俗解释:int4 量化后只需要 9.7GB 显存,普通游戏显卡(如 RTX 3090/4090)就能跑,而原始版本需要 26GB,需要专业显卡。

量化后在各个 benchmark 上的结果

模型 (5-shot)C-EvalMMLUCMMLU
Baichuan-13B-Base52.451.655.3
Baichuan-13B-Base-int851.249.954.5
Baichuan-13B-Base-int447.646.051.0

📝通俗解释:benchmark 是标准测试集,用来评估模型能力。int8 量化后性能下降很小,int4 下降稍多但在可接受范围内。

2.2.3 CPU 部署

使用 CPU 进行推理大概需要 60GB 内存:

python
model = AutoModelForCausalLM.from_pretrained(
    "baichuan-inc/Baichuan-13B-Chat",
    torch_dtype=torch.float32,
    trust_remote_code=True
)

📝通俗解释:CPU 部署不需要显卡,但速度较慢,且需要很大内存(60GB),适合没有显卡的服务器场景。


2.3 如何对 baichuan-13B 进行微调?

开发者可以对 Baichuan-13B-Base 或 Baichuan-13B-Chat 进行微调使用。团队测试了与 Baichuan-13B 兼容的微调工具 LLaMA Efficient Tuning,并给出全量微调和 LoRA 微调的两种示范。

📝通俗解释:微调就是在预训练模型基础上,用特定数据再训练一下,让模型更擅长某个特定任务。"全量微调"是调整所有参数,"LoRA微调"只调整少量参数,更省资源。

数据格式

输入数据为放置在项目 data 目录下的 json 文件,用 --dataset 选项指定。json 文件示例格式和字段说明如下:

json
[
    {
        "instruction": "What are the three primary colors?",
        "input": "",
        "output": "The three primary colors are red, blue, and yellow."
    },
    ...
]

📝通俗解释:数据格式中,instruction 是用户问题,input 是可选的补充背景信息,output 是期望模型给出的回答。

2.3.1 全量微调

微调环境:8 * Nvidia A100 80GB + DeepSpeed

bash
deepspeed --num_gpus=8 src/train_bash.py \
--stage sft \
--model_name_or_path baichuan-inc/Baichuan-13B-Base \
--do_train \
--dataset alpaca_gpt4_en,alpaca_gpt4_zh \
--finetuning_type full \
--output_dir path_to_your_sft_checkpoint \
--overwrite_cache \
--per_device_train_batch_size 4 \
--per_device_eval_batch_size 4 \
--gradient_accumulation_steps 8 \
--preprocessing_num_workers 16 \
--lr_scheduler_type cosine \
--logging_steps 10 \
--save_steps 100 \
--eval_steps 100 \
--learning_rate 5e-5 \
--max_grad_norm 0.5 \
--num_train_epochs 2.0 \
--dev_ratio 0.01 \
--evaluation_strategy steps \
--load_best_model_at_end \
--plot_loss \
--fp16 \
--deepspeed deepspeed.json

DeepSpeed 配置示例

json
{
    "train_micro_batch_size_per_gpu": "auto",
    "zero_allow_untested_optimizer": true,
    "fp16": {
        "enabled": "auto",
        "loss_scale": 0,
        "initial_scale_power": 16,
        "loss_scale_window": 1000,
        "hysteresis": 2,
        "min_loss_scale": 1
    },
    "zero_optimization": {
        "stage": 2,
        "allgather_partitions": true,
        "allgather_bucket_size": 5e8,
        "overlap_comm": false,
        "reduce_scatter": true,
        "reduce_bucket_size": 5e8,
        "contiguous_gradients": true
    }
}

📝通俗解释:DeepSpeed 是微软开发的分布式训练工具,能高效利用多张 GPU 进行训练。配置中的 zero_optimization 是零冗余优化技术,可以大幅减少显存占用。

2.3.2 LoRA 微调

微调环境:1 * Nvidia A100 80GB

bash
CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \
--stage sft \
--model_name_or_path baichuan-inc/Baichuan-13B-Base \
--do_train \
--dataset alpaca_gpt4_en,alpaca_gpt4_zh \
--finetuning_type lora \
--lora_rank 8 \
--lora_target W_pack \
--output_dir path_to_your_sft_checkpoint \
--overwrite_cache \
--per_device_train_batch_size 4 \
--per_device_eval_batch_size 4 \
--gradient_accumulation_steps 8 \
--preprocessing_num_workers 16 \
--lr_scheduler_type cosine \
--logging_steps 10 \
--save_steps 100 \
--eval_steps 100 \
--learning_rate 5e-5 \
--max_grad_norm 0.5 \
--num_train_epochs 2.0 \
--dev_ratio 0.01 \
--evaluation_strategy steps \
--load_best_model_at_end \
--plot_loss \
--fp16

📝通俗解释:LoRA 是一种高效的微调技术,只训练少量额外参数(lora_rank=8),大大减少显存需求和训练时间,单卡即可完成。


三、baichuan-53B 篇

3.1 baichuan-53B 的优势

Baichuan-53B 的三个技术优势:预训练数据、搜索增强和对齐能力,其中前两者与百川团队中丰富的搜索引擎经验有较强相关性。

📝通俗解释:53B 就是 530 亿参数,比 13B 大了约 4 倍。"搜索增强"是让模型能联网搜索最新信息,解决知识截止日期的问题。


3.2 baichuan-53B 如何对预训练数据做处理?

  • 百川希望构建一个全面的世界知识体系,覆盖各个领域和学科的知识,通过整合各类信息源,确保文化、科学、技术等方面广泛的知识覆盖
  • 目前百川已经建立了一套系统的数据质量体系,包括低质、优质、类别等,确保整个预训练过程中维持高标准的数据质量
  • 为保证数据的多样性并有效处理重复信息,百川设计了一个多粒度的大规模聚类系统,通过使用先进的聚类算法和方法,识别和整合相似或相关的数据
  • 百川还开发了一种细粒度的自动化匹配算法,自动配比各类任务,例如课程学习,从而实现个性化的模型学习

📝通俗解释:数据处理就像"料理食材"——要挑选好的材料、去掉杂质、分类整理。"聚类系统"把相似的内容归类,方便后续去重和选择;"自动化匹配算法"根据学习目标自动调整不同内容的学习权重。


3.3 baichuan-53B 如何进行搜索增强?

  1. 动态响应策略:依赖 Prompt,将指令任务细化为 16 个独立类别,覆盖各种用户指令的场景

  2. 智能化搜索词生成:通过对问答样本进行精细化的人工标注,捕捉和理解用户多元化的知识需求

📝通俗解释:原文"志林需求"应为"知识需求",指用户想要获取的具体信息。

  1. 高质量搜索结果筛选:百川构建了一个搜索结果相关性模型,对从搜索内容和知识库中获取的信息进行相关性评分,从而筛选出高质量的搜索引用内容

  2. 回答结果的搜索增强:通过 RLHF(人类反馈强化学习),让 Baichuan 大模型参照搜索结果,针对用户请求生成高价值且具有实时性的回答

📝通俗解释:搜索增强就是让模型"上网查资料"来回答问题,而不是只靠记忆里的知识。这样能回答最新、最准确的信息。


四、baichuan2 篇

Baichuan 2 大模型开源链接:https://github.com/baichuan-inc/Baichuan2 技术报告:https://cdn.baichuan-ai.com/paper/Baichuan2-technical-report.pdf

4.1 baichuan2 与其他大模型对比

Baichuan2-13B-Base 相比上一代 13B 模型:

  • 数学能力提升 49%
  • 代码能力提升 46%
  • 安全能力提升 37%
  • 逻辑推理能力提升 25%
  • 语义理解能力提升 15%

7B 模型对比

模型名称英文通用 (MMLU)中文通用 (CMMLU)数学 (GSM8K)数学 (MATH)代码 (HumanEval)代码 (MBPP)
LLaMA-7B35.1026.759.782.9011.5914.00
LLaMA2-7B45.7331.3816.223.3012.8014.80
ChatGLM2-6B45.9049.0028.896.309.159.00
Baichuan-7B42.3044.029.172.509.206.60
Baichuan2-7B54.1657.0724.495.5818.2024.20

13B 模型对比

模型名称英文通用 (MMLU)中文通用 (CMMLU)数学 (GSM8K)数学 (MATH)代码 (HumanEval)代码 (MBPP)
LLaMA-13B46.3031.1520.553.6815.2421.40
LLaMA2-13B55.0937.9928.894.9615.2427.00
Vicuna-13B52.0036.2828.135.2116.4615.00
Chinese-Alpaca-Plus-13B43.9033.4311.982.5016.4620.00
ChatGLM-12B*56.18-40.94---
Baichuan-13B51.6055.2626.764.8012.8022.80
Baichuan2-13B59.1761.9752.7710.0817.0730.20

📝通俗解释:这些是标准测试集的成绩,数值越高越好。Baichuan2-7B 和 Baichuan2-13B 在各项测试中表现都很优秀,特别是中文能力(CMMLU)明显领先。


五、baichuan 数据构建篇

5.1 baichuan 进行微调时,领域数据:通用数据配比?

基于 base 预训练模型,发现领域数据:通用数据配比是 1:5 的时候效果最好

基于 Base 模型的 SFT 数据配比实验

Base ModelPreTrain Data-ratioC-EvalCMMLU
Baichuan-13B-Base56.9955.83
Baichuan-13B-Base1:048.1748.57
Baichuan-13B-Base1:151.2651.69
Baichuan-13B-Base1:246.1247.75
Baichuan-13B-Base1:554.4252.75
Baichuan-13B-Base1:1049.2648.59

📝通俗解释:表格中"1:5"表示一份领域数据配五份通用数据。实验表明这个比例在 C-Eval 和 CMMLU 测试上效果最好。

基于不同 Base 模型的 SFT 数据配比实验

Base Model for SFTSFT Data RatioEvalHomeC-EvalCMMLU
Baichuan-13B-Chat30.9747.3750.68
Baichuan-13B-Base1:047.7946.0243.88
Baichuan-13B-Base1:150.4438.8840.18
Baichuan-13B-Base1:244.2436.8439.89
Baichuan-13B-Base1:536.2834.4336.84
Baichuan-13B-Base1:1053.9838.5237.15
Baichuan-13B-Base-DAPT(1:0)1:047.7943.3743.84
Baichuan-13B-Base-DAPT(1:0)1:146.0141.1439.03
Baichuan-13B-Base-DAPT(1:0)1:247.7940.8139.92
Baichuan-13B-Base-DAPT(1:0)1:559.2939.9035.00
Baichuan-13B-Base-DAPT(1:0)1:1050.4435.0135.83
Baichuan-13B-Base-DAPT(1:5)1:046.0144.1544.44
Baichuan-13B-Base-DAPT(1:5)1:147.7942.0741.33
Baichuan-13B-Base-DAPT(1:5)1:248.6742.0839.60
Baichuan-13B-Base-DAPT(1:5)1:555.7538.0835.46
Baichuan-13B-Base-DAPT(1:5)1:1048.6737.7937.49
Baichuan-13B-Chat1:037.1637.1334.62
Baichuan-13B-Chat1:151.2142.0137.87
Baichuan-13B-Chat1:244.2441.1239.72
Baichuan-13B-Chat1:560.1738.8837.26
Baichuan-13B-Chat1:1045.1335.5636.99
Base Model for MIPMIP Data RatioEvalHomeC-EvalCMMLU
Baichuan-13B-Base1:069.0349.0749.12

📝通俗解释:

  • DAPT = Domain Adaptive Pre-Training,在特定领域继续预训练
  • MIP = Multi-Instruction Pre-training,多指令预训练
  • "-" 表示不更新模型参数(直接用原始模型)

从表格中得出的结论

  1. 基于 baichuan-13B base 预训练模型做 fine-tune 时,领域数据:通用数据配比是 1:10 时在领域指标(EvalHome)上最好

  2. 基于 baichuan-13B base 上继续做预训练(DAPT,不用通用领域数据)时,领域数据:通用数据配比是 1:5 时在领域指标上最好

  3. 基于 baichuan-13B base 上继续做预训练(领域数据:通用数据配比是 1:5)时,领域数据:通用数据配比是 1:5 时在领域指标上最好

  4. 基于 baichuan-13B chat(做过多轮对话和指令微调),领域数据:通用数据配比是 1:5 时在领域指标上最好

  5. 基于 baichuan-13B base 上做预训练和 SFT fine-tune 时(无通用数据),效果最好

📝通俗解释:不同场景下的最优配比不同,需要根据具体任务和基础模型来选择。总体来说,1:5 是一个比较常用的平衡点。


参考资料

基于 MIT 许可发布