赞
踩
LLMs之Baichuan2:Baichuan 2的简介、安装、使用方法之详细攻略
目录
LLMs之Baichuan:Baichuan-7B/13B模型的简介、安装、使用方法之详细攻略
LLMs之Baichuan 2:Baichuan 2的简介、安装、使用方法之详细攻略
LLMs之Baichuan 2:《Baichuan 2: Open Large-scale Language Models》翻译与解读
6、对 Baichuan 1 的推理优化迁移到 Baichuan 2
LLMs之Baichuan:Baichuan-13B模型的简介(包括Baichuan-7B)、安装、使用方法之详细攻略_一个处女座的程序猿的博客-CSDN博客
https://yunyaniu.blog.csdn.net/article/details/132748260
LLMs之Baichuan 2:《Baichuan 2: Open Large-scale Language Models》翻译与解读_一个处女座的程序猿的博客-CSDN博客
Baichuan 2 是百川智能推出的新一代开源大语言模型,采用 2.6 万亿 Tokens 的高质量语料训练。Baichuan 2 在多个权威的中文、英文和多语言的通用、领域 benchmark 上取得同尺寸最佳的效果。本次发布包含有 7B、13B 的 Base 和 Chat 版本,并提供了 Chat 版本的 4bits 量化。所有版本对学术研究完全开放。同时,开发者通过邮件申请并获得官方商用许可后,即可免费商用,请参考协议章节。
地址 | 技术报告:https://cdn.baichuan-ai.com/paper/Baichuan2-technical-report.pdf |
时间 | 2023年9月6日 |
作者 | 百川智能 |
在通用领域我们在以下数据集上进行了 5-shot 测试。
C-Eval | MMLU | CMMLU | Gaokao | AGIEval | BBH | |
---|---|---|---|---|---|---|
5-shot | 5-shot | 5-shot | 5-shot | 5-shot | 3-shot | |
GPT-4 | 68.40 | 83.93 | 70.33 | 66.15 | 63.27 | 75.12 |
GPT-3.5 Turbo | 51.10 | 68.54 | 54.06 | 47.07 | 46.13 | 61.59 |
LLaMA-7B | 27.10 | 35.10 | 26.75 | 27.81 | 28.17 | 32.38 |
LLaMA2-7B | 28.90 | 45.73 | 31.38 | 25.97 | 26.53 | 39.16 |
MPT-7B | 27.15 | 27.93 | 26.00 | 26.54 | 24.83 | 35.20 |
Falcon-7B | 24.23 | 26.03 | 25.66 | 24.24 | 24.10 | 28.77 |
ChatGLM2-6B | 50.20 | 45.90 | 49.00 | 49.44 | 45.28 | 31.65 |
Baichuan-7B | 42.80 | 42.30 | 44.02 | 36.34 | 34.44 | 32.48 |
Baichuan2-7B-Base | 54.00 | 54.16 | 57.07 | 47.47 | 42.73 | 41.56 |
C-Eval | MMLU | CMMLU | Gaokao | AGIEval | BBH | |
---|---|---|---|---|---|---|
5-shot | 5-shot | 5-shot | 5-shot | 5-shot | 3-shot | |
GPT-4 | 68.40 | 83.93 | 70.33 | 66.15 | 63.27 | 75.12 |
GPT-3.5 Turbo | 51.10 | 68.54 | 54.06 | 47.07 | 46.13 | 61.59 |
LLaMA-13B | 28.50 | 46.30 | 31.15 | 28.23 | 28.22 | 37.89 |
LLaMA2-13B | 35.80 | 55.09 | 37.99 | 30.83 | 32.29 | 46.98 |
Vicuna-13B | 32.80 | 52.00 | 36.28 | 30.11 | 31.55 | 43.04 |
Chinese-Alpaca-Plus-13B | 38.80 | 43.90 | 33.43 | 34.78 | 35.46 | 28.94 |
XVERSE-13B | 53.70 | 55.21 | 58.44 | 44.69 | 42.54 | 38.06 |
Baichuan-13B-Base | 52.40 | 51.60 | 55.30 | 49.69 | 43.20 | 43.01 |
Baichuan2-13B-Base | 58.10 | 59.17 | 61.97 | 54.33 | 48.17 | 48.78 |
法律领域我们使用了 JEC-QA 数据集。JEC-QA 数据集来源于中国国家司法考试。我们只保留了其中的单选题。我们采用了与 C-Eval 类似的评测方案。
医疗领域则使用通用领域数据集(C-Eval、MMLU、CMMLU)中的医学相关学科、MedQA 和 MedMCQA。我们采用了与 C-Eval 类似的评测方案。
我们对以上数据集进行了 5-shot 测试。
JEC-QA | CEval-MMLU-CMMLU | MedQA-USMLE | MedQA-MCMLE | MedMCQA | |
---|---|---|---|---|---|
5-shot | 5-shot | 5-shot | 5-shot | 5-shot | |
GPT-4 | 59.32 | 77.16 | 80.28 | 74.58 | 72.51 |
GPT-3.5 Turbo | 42.31 | 61.17 | 53.81 | 52.92 | 56.25 |
LLaMA-7B | 27.45 | 33.34 | 24.12 | 21.72 | 27.45 |
LLaMA2-7B | 29.20 | 36.75 | 27.49 | 24.78 | 37.93 |
MPT-7B | 27.45 | 26.67 | 16.97 | 19.79 | 31.96 |
Falcon-7B | 23.66 | 25.33 | 21.29 | 18.07 | 33.88 |
ChatGLM2-6B | 40.76 | 44.54 | 26.24 | 45.53 | 30.22 |
Baichuan-7B | 34.64 | 42.37 | 27.42 | 39.46 | 31.39 |
Baichuan2-7B-Base | 44.46 | 56.39 | 32.68 | 54.93 | 41.73 |
JEC-QA | CEval-MMLU-CMMLU | MedQA-USMLE | MedQA-MCMLE | MedMCQA | |
---|---|---|---|---|---|
5-shot | 5-shot | 5-shot | 5-shot | 5-shot | |
GPT-4 | 59.32 | 77.16 | 80.28 | 74.58 | 72.51 |
GPT-3.5 Turbo | 42.31 | 61.17 | 53.81 | 52.92 | 56.25 |
LLaMA-13B | 27.54 | 35.14 | 28.83 | 23.38 | 39.52 |
LLaMA2-13B | 34.08 | 47.42 | 35.04 | 29.74 | 42.12 |
Vicuna-13B | 28.38 | 40.99 | 34.80 | 27.67 | 40.66 |
Chinese-Alpaca-Plus-13B | 35.32 | 46.31 | 27.49 | 32.66 | 35.87 |
XVERSE-13B | 46.42 | 58.08 | 32.99 | 58.76 | 41.34 |
Baichuan-13B-Base | 41.34 | 51.77 | 29.07 | 43.67 | 39.60 |
Baichuan2-13B-Base | 47.40 | 59.33 | 40.38 | 61.62 | 42.86 |
数学领域我们使用 OpenCompass 评估框架,对 GSM8K 和 MATH 数据集进行了 4-shot 测试。
代码领域则采用了 HumanEval 和 MBPP 数据集。我们使用 OpenCompass,对 HumanEval 进行了 0-shot 测试,MBPP 数据集进行了 3-shot 测试。
GSM8K | MATH | HumanEval | MBPP | |
---|---|---|---|---|
4-shot | 4-shot | 0-shot | 3-shot | |
GPT-4 | 89.99 | 40.20 | 69.51 | 63.60 |
GPT-3.5 Turbo | 57.77 | 13.96 | 52.44 | 61.40 |
LLaMA-7B | 9.78 | 3.02 | 11.59 | 14.00 |
LLaMA2-7B | 16.22 | 3.24 | 12.80 | 14.80 |
MPT-7B | 8.64 | 2.90 | 14.02 | 23.40 |
Falcon-7B | 5.46 | 1.68 | - | 10.20 |
ChatGLM2-6B | 28.89 | 6.40 | 9.15 | 9.00 |
Baichuan-7B | 9.17 | 2.54 | 9.20 | 6.60 |
Baichuan2-7B-Base | 24.49 | 5.58 | 18.29 | 24.20 |
GSM8K | MATH | HumanEval | MBPP | |
---|---|---|---|---|
4-shot | 4-shot | 0-shot | 3-shot | |
GPT-4 | 89.99 | 40.20 | 69.51 | 63.60 |
GPT-3.5 Turbo | 57.77 | 13.96 | 52.44 | 61.40 |
LLaMA-13B | 20.55 | 3.68 | 15.24 | 21.40 |
LLaMA2-13B | 28.89 | 4.96 | 15.24 | 27.00 |
Vicuna-13B | 28.13 | 4.36 | 16.46 | 15.00 |
Chinese-Alpaca-Plus-13B | 11.98 | 2.50 | 16.46 | 20.00 |
XVERSE-13B | 18.20 | 2.18 | 15.85 | 16.80 |
Baichuan-13B-Base | 26.76 | 4.84 | 11.59 | 22.80 |
Baichuan2-13B-Base | 52.77 | 10.08 | 17.07 | 30.20 |
我们采用了 Flores-101 数据集来评估模型的多语言能力。Flores-101 涵盖了世界各地的 101 种语言。它的数据来源于新闻、旅游指南和书籍等多个不同领域。我们选择了联合国官方语言(阿拉伯文、中文、英文、法文、俄文和西班牙文)以及德文和日文作为测试语种。我们使用 OpenCompass 对 Flores-101 中的中-英、中-法、中-西班牙、中-阿拉伯、中-俄、中-日、中-德等七个子任务分别进行了 8-shot 测试。
CN-EN | CN-FR | CN-ES | CN-AR | CN-RU | CN-JP | CN-DE | Average | |
---|---|---|---|---|---|---|---|---|
GPT-4 | 29.94 | 29.56 | 20.01 | 10.76 | 18.62 | 13.26 | 20.83 | 20.43 |
GPT-3.5 Turbo | 27.67 | 26.15 | 19.58 | 10.73 | 17.45 | 1.82 | 19.70 | 17.59 |
LLaMA-7B | 17.27 | 12.02 | 9.54 | 0.00 | 4.47 | 1.41 | 8.73 | 7.63 |
LLaMA2-7B | 25.76 | 15.14 | 11.92 | 0.79 | 4.99 | 2.20 | 10.15 | 10.14 |
MPT-7B | 20.77 | 9.53 | 8.96 | 0.10 | 3.54 | 2.91 | 6.54 | 7.48 |
Falcon-7B | 22.13 | 15.67 | 9.28 | 0.11 | 1.35 | 0.41 | 6.41 | 7.91 |
ChatGLM2-6B | 22.28 | 9.42 | 7.77 | 0.64 | 1.78 | 0.26 | 4.61 | 6.68 |
Baichuan-7B | 25.07 | 16.51 | 12.72 | 0.41 | 6.66 | 2.24 | 9.86 | 10.50 |
Baichuan2-7B-Base | 27.27 | 20.87 | 16.17 | 1.39 | 11.21 | 3.11 | 12.76 | 13.25 |
CN-EN | CN-FR | CN-ES | CN-AR | CN-RU | CN-JP | CN-DE | Average | |
---|---|---|---|---|---|---|---|---|
GPT-4 | 29.94 | 29.56 | 20.01 | 10.76 | 18.62 | 13.26 | 20.83 | 20.43 |
GPT-3.5 Turbo | 27.67 | 26.15 | 19.58 | 10.73 | 17.45 | 1.82 | 19.70 | 17.59 |
LLaMA-13B | 21.75 | 16.16 | 13.29 | 0.58 | 7.61 | 0.41 | 10.66 | 10.07 |
LLaMA2-13B | 25.44 | 19.25 | 17.49 | 1.38 | 10.34 | 0.13 | 11.13 | 12.17 |
Vicuna-13B | 22.63 | 18.04 | 14.67 | 0.70 | 9.27 | 3.59 | 10.25 | 11.31 |
Chinese-Alpaca-Plus-13B | 22.53 | 13.82 | 11.29 | 0.28 | 1.52 | 0.31 | 8.13 | 8.27 |
XVERSE-13B | 29.26 | 24.03 | 16.67 | 2.78 | 11.61 | 3.08 | 14.26 | 14.53 |
Baichuan-13B-Base | 30.24 | 20.90 | 15.92 | 0.98 | 9.65 | 2.64 | 12.00 | 13.19 |
Baichuan2-13B-Base | 30.61 | 22.11 | 17.27 | 2.39 | 14.17 | 11.58 | 14.53 | 16.09 |
推理所需的模型权重、源码、配置已发布在 Hugging Face,下载链接见本文档最开始的表格。我们在此示范多种推理方式。程序会自动从 Hugging Face 下载所需资源。
pip install -r requirements.txt
- >>> import torch
- >>> from transformers import AutoModelForCausalLM, AutoTokenizer
- >>> from transformers.generation.utils import GenerationConfig
- >>> tokenizer = AutoTokenizer.from_pretrained("baichuan-inc/Baichuan2-13B-Chat", use_fast=False, trust_remote_code=True)
- >>> model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan2-13B-Chat", device_map="auto", torch_dtype=torch.bfloat16, trust_remote_code=True)
- >>> model.generation_config = GenerationConfig.from_pretrained("baichuan-inc/Baichuan2-13B-Chat")
- >>> messages = []
- >>> messages.append({"role": "user", "content": "解释一下“温故而知新”"})
- >>> response = model.chat(tokenizer, messages)
- >>> print(response)
- "温故而知新"是一句中国古代的成语,出自《论语·为政》篇。这句话的意思是:通过回顾过去,我们可以发现新的知识和理解。换句话说,学习历史和经验可以让我们更好地理解现在和未来。
这句话鼓励我们在学习和生活中不断地回顾和反思过去的经验,从而获得新的启示和成长。通过重温旧的知识和经历,我们可以发现新的观点和理解,从而更好地应对不断变化的世界和挑战。
- >>> from transformers import AutoModelForCausalLM, AutoTokenizer
- >>> tokenizer = AutoTokenizer.from_pretrained("baichuan-inc/Baichuan2-13B-Base", trust_remote_code=True)
- >>> model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan2-13B-Base", device_map="auto", trust_remote_code=True)
- >>> inputs = tokenizer('登鹳雀楼->王之涣\n夜雨寄北->', return_tensors='pt')
- >>> inputs = inputs.to('cuda:0')
- >>> pred = model.generate(**inputs, max_new_tokens=64, repetition_penalty=1.1)
- >>> print(tokenizer.decode(pred.cpu()[0], skip_special_tokens=True))
- 登鹳雀楼->王之涣
- 夜雨寄北->李商隐
在上述两段代码中,模型加载指定 device_map='auto'
,会使用所有可用显卡。如需指定使用的设备,可以使用类似 export CUDA_VISIBLE_DEVICES=0,1
(使用了0、1号显卡)的方式控制。
python cli_demo.py
本命令行工具是为 Chat 场景设计,因此我们不支持使用该工具调用 Base 模型。
streamlit run web_demo.py
依靠 streamlit 运行以下命令,会在本地启动一个 web 服务,把控制台给出的地址放入浏览器即可访问。本网页 demo 工具是为 Chat 场景设计,因此我们不支持使用该工具调用 Base 模型。
为了让不同的用户以及不同的平台都能运行 Baichuan 2 模型,我们针对 Baichuan 2 模型做了相应地量化工作(包括 Baichuan2-7B-Chat 和 Baichuan2-13B-Chat),方便用户快速高效地在自己的平台部署 Baichuan 2 模型。
Baichuan 2 的采用社区主流的量化方法:BitsAndBytes。该方法可以保证量化后的效果基本不掉点,目前已经集成到 transformers 库里,并在社区得到了广泛应用。BitsAndBytes 支持 8bits 和 4bits 两种量化,其中 4bits 支持 FP4 和 NF4 两种格式,Baichuan 2 选用 NF4 作为 4bits 量化的数据类型。
基于该量化方法,Baichuan 2 支持在线量化和离线量化两种模式。
对于在线量化,我们支持 8bits 和 4bits 量化,使用方式和 Baichuan-13B 项目中的方式类似,只需要先加载模型到 CPU 的内存里,再调用quantize()
接口量化,最后调用 cuda()
函数,将量化后的权重拷贝到 GPU 显存中。实现整个模型加载的代码非常简单,我们以 Baichuan2-7B-Chat 为例:
8bits 在线量化:
- model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan2-7B-Chat", torch_dtype=torch.float16, trust_remote_code=True)
- model = model.quantize(8).cuda()
4bits 在线量化:
- model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan2-7B-Chat", torch_dtype=torch.float16, trust_remote_code=True)
- model = model.quantize(4).cuda()
需要注意的是,在用 from_pretrained
接口的时候,用户一般会加上 device_map="auto"
,在使用在线量化时,需要去掉这个参数,否则会报错。
为了方便用户的使用,我们提供了离线量化好的 4bits 的版本 Baichuan2-7B-Chat-4bits,供用户下载。 用户加载 Baichuan2-7B-Chat-4bits 模型很简单,只需要执行:
model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan2-7B-Chat-4bits", device_map="auto", trust_remote_code=True)
对于 8bits 离线量化,我们没有提供相应的版本,因为 Hugging Face transformers 库提供了相应的 API 接口,可以很方便的实现 8bits 量化模型的保存和加载。用户可以自行按照如下方式实现 8bits 的模型保存和加载:
- # Model saving: model_id is the original model directory, and quant8_saved_dir is the directory where the 8bits quantized model is saved.
- model = AutoModelForCausalLM.from_pretrained(model_id, load_in_8bit=True, device_map="auto", trust_remote_code=True)
- model.save_pretrained(quant8_saved_dir)
- model = AutoModelForCausalLM.from_pretrained(quant8_saved_dir, device_map="auto", trust_remote_code=True)
如果硬件采用RTX 4090-24GB的话,最佳的应该是Baichuan2-13B的8bits版本。但是官方只提供了fp16和4bits两个版本,唯独没有8bits量化版本。
量化前后显存占用对比 (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 个百分点左右。
Baichuan 2 模型支持 CPU 推理,但需要强调的是,CPU 的推理速度相对较慢。需按如下方式修改模型加载的方式:
# Taking Baichuan2-7B-Chat as an example model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan2-7B-Chat", torch_dtype=torch.float32, trust_remote_code=True)
由于很多用户在 Baichuan 1 (Baichuan-7B, Baichuan-13B)上做了很多优化的工作,例如编译优化、量化等,为了将这些工作零成本地应用于 Baichuan 2,用户可以对 Baichuan 2 模型做一个离线转换,转换后就可以当做 Baichuan 1 模型来使用。具体来说,用户只需要利用以下脚本离线对 Baichuan 2 模型的最后一层 lm_head 做归一化,并替换掉lm_head.weight
即可。替换完后,就可以像对 Baichuan 1 模型一样对转换后的模型做编译优化等工作了。
- import torch
- import os
- ori_model_dir = 'your Baichuan 2 model directory'
- # To avoid overwriting the original model, it's best to save the converted model to another directory before replacing it
- new_model_dir = 'your normalized lm_head weight Baichuan 2 model directory'
- model = torch.load(os.path.join(ori_model_dir, 'pytorch_model.bin'))
- lm_head_w = model['lm_head.weight']
- lm_head_w = torch.nn.functional.normalize(lm_head_w)
- model['lm_head.weight'] = lm_head_w
- torch.save(model, os.path.join(new_model_dir, 'pytorch_model.bin'))
- git clone https://github.com/baichuan-inc/Baichuan2.git
- cd Baichuan2/fine-tune
- pip install -r requirements.txt
下面我们给一个微调 Baichuan2-7B-Base 的单机训练例子。
训练数据:data/belle_chat_ramdon_10k.json
,该样例数据是从 multiturn_chat_0.8M 采样出 1 万条,并且做了格式转换。主要是展示多轮数据怎么训练,不保证效果。
- hostfile=""
- deepspeed --hostfile=$hostfile fine-tune.py \
- --report_to "none" \
- --data_path "data/belle_chat_ramdon_10k.json" \
- --model_name_or_path "baichuan-inc/Baichuan2-7B-Base" \
- --output_dir "output" \
- --model_max_length 512 \
- --num_train_epochs 4 \
- --per_device_train_batch_size 16 \
- --gradient_accumulation_steps 1 \
- --save_strategy epoch \
- --learning_rate 2e-5 \
- --lr_scheduler_type constant \
- --adam_beta1 0.9 \
- --adam_beta2 0.98 \
- --adam_epsilon 1e-8 \
- --max_grad_norm 1.0 \
- --weight_decay 1e-4 \
- --warmup_ratio 0.0 \
- --logging_steps 1 \
- --gradient_checkpointing True \
- --deepspeed ds_config.json \
- --bf16 True \
- --tf32 True
https://yunyaniu.blog.csdn.net/article/details/132867299
多机训练只需要给一下 hostfile ,内容类似如下:
- ip1 slots=8
- ip2 slots=8
- ip3 slots=8
- ip4 slots=8
- ....
同时在训练脚本里面指定 hosftfile 的路径:
- hostfile="/path/to/hostfile"
- deepspeed --hostfile=$hostfile fine-tune.py \
- --report_to "none" \
- --data_path "data/belle_chat_ramdon_10k.json" \
- --model_name_or_path "baichuan-inc/Baichuan2-7B-Base" \
- --output_dir "output" \
- --model_max_length 512 \
- --num_train_epochs 4 \
- --per_device_train_batch_size 16 \
- --gradient_accumulation_steps 1 \
- --save_strategy epoch \
- --learning_rate 2e-5 \
- --lr_scheduler_type constant \
- --adam_beta1 0.9 \
- --adam_beta2 0.98 \
- --adam_epsilon 1e-8 \
- --max_grad_norm 1.0 \
- --weight_decay 1e-4 \
- --warmup_ratio 0.0 \
- --logging_steps 1 \
- --gradient_checkpointing True \
- --deepspeed ds_config.json \
- --bf16 True \
- --tf32 True
代码已经支持轻量化微调如 LoRA,如需使用仅需在上面的脚本中加入以下参数:
--use_lora True
LoRA 具体的配置可见 fine-tune.py
脚本。
使用 LoRA 微调后可以使用下面的命令加载模型:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。