# Baichuan2 ## 模型描述 Baichuan2 是由百川智能开发的开源可商用的大规模预训练语言模型,基于 Transformer 结构,支持中英双语,上下文窗口长度为 4096。目前支持Baichuan2-7B和Baichuan2-13B模型,参数量分别为70亿和130亿。 本仓库提供了Baichuan2-7B和Baichuan2-13B预训练模型。 ## 代码结构介绍 `Baichuan2` 基于 `mindformers` 实现,主要涉及的文件有: 1. 模型具体实现:`research/baichuan2` ```bash baichuan2 ├── baichuan2_tokenizer.py # tokenizer ├── baichuan2_7b.py # 7B模型实现 └── baichuan2_13b.py # 13B模型实现 ``` 2. 模型配置:`research/baichuan2` ```bash baichuan2 ├── run_baichuan2_7b.yaml # 7B全量微调910a启动配置 ├── run_baichuan2_13b.yaml # 13B全量微调910a启动配置 ├── run_baichuan2_7b_910b.yaml # 7B全量微调910b启动配置 └── run_baichuan2_13b_910b.yaml # 13B全量微调910b启动配置 ``` 3. 数据处理脚本和任务启动脚本:`research/baichuan2` ```bash baichuan2 ├── belle_preprocess.py # belle数据集预处理脚本 └── run_baichuan2.py # baichuan2高阶接口使用脚本 ``` ## 环境要求 - 硬件:Ascend 910A - MindSpore:2.0.0 / 1.10.1 - MindFormers版本:dev 注:Baichuan2-7B推理可在单机单卡上完成部署,全量微调至少需要16卡。Baichuan2-13B推理至少需要4卡,全量微调至少需要16卡。 ## 权重准备 本仓库提供已经转换完成的预训练权重用于训练/微调/推理,用户可自行从下方链接拉取后直接使用,Base用于微调,Chat用于推理。 - [Baichuan2-7B-Base](https://ascend-repo-modelzoo.obs.cn-east-2.myhuaweicloud.com/MindFormers/baichuan2/Baichuan2_7B_Base.ckpt) - [Baichuan2-7B-Chat](https://ascend-repo-modelzoo.obs.cn-east-2.myhuaweicloud.com/MindFormers/baichuan2/Baichuan2_7B_Chat.ckpt) - [Baichuan2-13B-Base](https://ascend-repo-modelzoo.obs.cn-east-2.myhuaweicloud.com/MindFormers/baichuan2/Baichuan2_13B_Base.ckpt) - [Baichuan2-13B-Chat](https://ascend-repo-modelzoo.obs.cn-east-2.myhuaweicloud.com/MindFormers/baichuan2/Baichuan2-13B-Chat.ckpt) 也可选择从huggingface下载预训练权重后根据以下步骤进行权重转换,需要下载整个工程,huffingface权重的链接如下: - [Baichuan2-7B-Base](https://huggingface.co/baichuan-inc/Baichuan2-7B-Base) - [Baichuan2-7B-Chat](https://huggingface.co/baichuan-inc/Baichuan2-7B-Chat) - [Baichuan2-13B-Base](https://huggingface.co/baichuan-inc/Baichuan2-13B-Base) - [Baichuan2-13B-Chat](https://huggingface.co/baichuan-inc/Baichuan2-13B-Chat) **注**: 请安装torch=2.0.0和transformers=4.29.2版本 ```shell pip install torch==2.0.0 -i https://pypi.tuna.tsinghua.edu.cn/simple pip install transformers==4.29.2 -i https://pypi.tuna.tsinghua.edu.cn/simple ``` 下载完成后,运行`/research/baichuan/convert_weight.py`转换脚本,将huggingface的权重转换为完整的ckpt权重。 ```shell python ./research/baichuan/convert_weight.py --torch_ckpt_dir TORCH_CKPT_DIR --mindspore_ckpt_path MS_CKPT_NAME ``` ```text # 参数说明 TORCH_CKPT_DIR: huggingface权重保存目录路径 mindspore_ckpt_path: 权重保存文件名,保存为TORCH_CKPT_DIR/OUTPUT_NAME, 也可以指定为自定义保存路径 ``` ## SFT数据集准备 当前提供belle_chat_ramdon数据集的预处理和微调样例,用于对Baichuan2-7B-Base,Baichuan2-13B-Base模型进行微调。数据集下载链接如下: - [belle_chat_ramdon_10k](https://github.com/baichuan-inc/Baichuan2/blob/main/fine-tune/data/belle_chat_ramdon_10k.json) 执行`belle_preprocess.py`,进行数据预处理、Mindrecord数据生成,将带有prompt模板的数据转换为mindrecord格式。 ```bash # 脚本路径:research/baichuan2/belle_preprocess.py python belle_preprocess.py \ --input_glob /{path}/belle_chat_ramdon_10k.json \ --model_file /{path}/tokenizer.model \ --output_file /{path}/belle_512.mindrecord \ --seq_length 512 ``` ## Baichuan2-7B ### 快速推理 #### 基于高阶接口的推理 1. 配置文件设置,添加tokenizer路径`vocab_file`,并设置`batch_size`值为`1` 在使用Trainer接口进行推理时,若用户自行下载Baichuan2-7B权重,请在启动前先在配置文件中将tokenizer.model的路径自行配置,配置项为vocab_file。 ```python # research/baichuan2/run_baichuan2_7b.yaml # runner config runner_config: epochs: 1 batch_size: 1 # batch_size设为1 sink_mode: True sink_size: 2 ... processor: return_tensors: ms tokenizer: unk_token: '' bos_token: '' eos_token: '' pad_token: '' vocab_file: '/path/Baichuan2-7b/tokenizer.model' # 添加tokenizer路径 type: Baichuan2Tokenizer ``` 2. Trainer接口启动推理 Baichuan2-7B的高阶接口使用脚本已集成在run_baichuan2.py脚本中,运行此脚本命令示例: ```shell python run_baichuan2.py \ --config "run_baichuan2_7b.yaml" \ --run_mode predict \ --use_parallel False \ --load_checkpoint ckpt_path_or_dir \ --predict_data '将以下内容翻译成英文:你今天真好看。' \ --device_id 0 # output: [{'text_generation_text': ['将以下内容翻译成英文:你今天真好看。 \nYou look really nice today.']}] ``` #### Pipeline推理 ```python from mindspore import context from mindformers.pipeline import pipeline from mindformers.models import LlamaConfig from baichuan2_7b import Baichuan7BV2ForCausalLM from baichuan2_tokenizer import Baichuan2Tokenizer context.set_context(device_id=0, mode=0) # init model baichuan2_model_path = "/path/Baichuan2-7B/baichuan2_7b.ckpt" # Baichuan2-7B ckpt path baichuan2_config = LlamaConfig( vocab_size=125696, pad_token_id=0, rms_norm_eps=1.0e-6, checkpoint_name_or_path=baichuan2_model_path, use_past=True ) baichuan2_model = Baichuan7BV2ForCausalLM( config=baichuan2_config ) # init tokenizer tokenizer_path = "/path/Baichuan2-7B/tokenizer.model" # Baichuan2-7B tokenizer.model path tokenizer = Baichuan2Tokenizer( vocab_file=tokenizer_path ) pipeline_task = pipeline(task="text_generation", model=baichuan2_model, tokenizer=tokenizer) pipeline_result = pipeline_task("诗词接龙:白日依山尽的下一句是什么?", do_sample=False, repetition_penalty=1.05, max_length=64) print(pipeline_result) # output: [{'text_generation_text': ['诗词接龙:白日依山尽的下一句是什么? \n答:黄河入海流。']}] ``` ### 全参微调 全参微调需要多卡启动,以`belle_chat_ramdon_10k.json`数据集为例,给出了默认配置文件`run_baichuan2_7b.yaml`。 1. 权重准备 权重支持在线/离线切分方式。在线切分则会在启动微调任务后自动按照分布式策略进行权重切分,离线切分需要在任务前手动进行切分。 若使用在线切分,则需要将完整权重文件按如下路径放置,并将启动配置参数`auto_trans_ckpt`置为`True`。 ```text └── path of ckpt └── rank_0 └── baichuan2_7b.ckpt ``` 若使用离线切分,配置参数`auto_trans_ckpt`置为`False`,`load_checkpoint`传入权重路径文件夹即可。 2. 修改`run_baichuan2_7b.yaml`中相关配置 ```python output_dir: './output' load_checkpoint: '{path}/' # 添加预训练权重路径 auto_trans_ckpt: True only_save_strategy: False resume_training: False use_parallel: True run_mode: 'finetune' # dataset train_dataset: &train_dataset data_loader: type: MindDataset dataset_dir: "{path}/belle512.mindrecord" # 修改训练数据集路径 shuffle: True input_columns: ["input_ids", "labels"] # 指令微调时(如belle数据集),input_columns: ["input_ids", "labels"] # 继续预训练时(如wikitext2数据集),input_columns: ["input_ids"] ``` 3. 启动微调任务,以默认配置2机16卡为例,按照以下步骤启动: - step 1. 首先参考在每台机器上运行`mindformers/tools/hccl_tools.py`生成`RANK_TABLE_FILE`的json文件。 ```shell # 在每个机器上运行如下命令,生成各自的RANK_TABLE_FILE的json文件。 python ./mindformers/tools/hccl_tools.py --device_num [0,8] ``` - step 2. 合并每台机器上生成的`RANK_TABLE_FILE`。 将不同机器上生成的`RANK_TABLE_FILE`文件拷贝到一起,执行`merge_hccl.py`脚本进行合并,包括server_list合并,`server_count`设为机器数,`rank_id`顺序增加。 ```shell # 运行如下命令,合并每个机器上的RANK_TABLE_FILE文件。 python ./mindformers/tools/merge_hccl.py hccl*.json ``` - step 3. 将合并后的`RANK_TABLE_FILE`文件拷贝到所有机器中,保证不同机器上的`RANK_TABLE_FILE`相同。 - step 4. 根据服务器节点数等信息,修改相应的配置。 ```shell # 以baichuan2-7B模型两机训练为例,默认配置2机16卡,如果节点数有变,需要修改相应的配置。 # 配置文件路径:./research/baichuan2/run_baichuan2_7b.yaml parallel_config: data_parallel: 2 model_parallel: 4 pipeline_stage: 2 optimizer_shard: True micro_batch_num: 8 vocab_emb_dp: True gradient_aggregation_group: 4 ``` - step 5. 执行运行脚本。 在多机上同时拉起任务,每台机器拉起方式如下。 ```shell # node 1 cd mindformers/research bash run_multinode.sh \ "python baichuan2/run_baichuan2.py \ --config baichuan2/run_baichuan2_7b.yaml \ --load_checkpoint path/to/baichuan2_7b_ckpt \ --auto_trans_ckpt True \ --use_parallel True \ --run_mode finetune \ --train_data path/to/mindrecord_dir" \ path/to/rank_table_file [0,8] 16 # node 2 cd mindformers/research bash run_multinode.sh \ "python baichuan2/run_baichuan2.py \ --config baichuan2/run_baichuan2_7b.yaml \ --load_checkpoint path/to/baichuan2_7b_ckpt \ --auto_trans_ckpt True \ --use_parallel True \ --run_mode finetune \ --train_data path/to/mindrecord_dir" \ path/to/rank_table_file [8,16] 16 ``` ```text # 参数说明 config: 配置文件路径 load_checkpoint: 权重文件夹路径 auto_trans_ckpt: 是否进行权重自动切分 run_mode: 运行模式,微调时设置为finetune train_data: 训练数据集路径 ``` ## baichuan2-13B > 需开发者提前pip安装。具体接口说明请参考[API接口](https://mindformers.readthedocs.io/zh_CN/latest/docs/api_python/README.html)。 请根据[权重准备](#jump)章节获取baichuan2_13B的完整权重。 ### 快速使用 `Baichuan2-13B`的高阶接口使用脚本已集成在`run_baichuan2.py`脚本中 ### 910A **注1**:Baichuan2-13B-Chat用于推理,seq_length默认为512,推理需要2卡,不支持单卡推理。 **注2**: 由于baichuan2-13B基于高阶接口的形式开发,存放于research文件夹下,使用时需要将mindformers安装为python的包,才能直接进入research目录下执行相关命令。 **注3**: 当前`run_baichuan2_13b.yaml`文件默认为train配置,用于eval和predict时需要修改并行策略。 - **单机多卡运行推理**:2卡为例 1. 主要参数配置参考 ```shell load_checkpoint: 'model_dir' # 完整模型存放格式为"model_dir/rank_0/xxx.ckpt" auto_trans_ckpt: True # 打开权重自动转换 use_past: True # 打开增量推理 vocab_file: 'path/to/tokenizer.model' # 分布式配置 parallel_config: data_parallel: 1 model_parallel: 2 pipeline_stage: 1 optimizer_shard: True micro_batch_num: 1 vocab_emb_dp: True gradient_aggregation_group: 4 # when model parallel is greater than 1, we can set micro_batch_interleave_num=2, that may accelerate the train process. micro_batch_interleave_num: 1 ``` 2. 生成2卡的rank_table_file ```shell python mindformers/tools/hccl_tools.py --device_num [0,2] ``` 3. 启动推理 ```shell cd research # 推理命令中参数会覆盖yaml文件中的相同参数 bash ./run_singlenode.sh \ "python baichuan2/run_baichuan2.py \ --config baichuan2/run_baichuan2_13b.yaml \ --run_mode predict \ --use_parallel True \ --load_checkpoint model_dir \ --auto_trans_ckpt True \ --predict_data 你是谁?" rank_table_file [0,2] 2 # output: [{'text_generation_text': ['你是谁? \n我是百川大模型,是由百川智能的工程师们创造的大语言模型,我可以和人类进行自然交流、解答问题、协助创作,帮助大众轻松、普惠的获得世界知识和专业服务。如果你有任何问题,可以随时向我提问']}] ``` - 注:推理结束后,保存`output/transformed_checkpoint`到自定义文件夹下,后续分布式推理可以直接加载`transformed_checkpoint`里面的4卡分布式权重,配置修改如下: ```shell load_checkpoint: 'transformed_checkpoint' # 完整模型存放格式为"transformed_checkpoint/rank_x/xxx.ckpt" auto_trans_ckpt: False # 关闭权重自动转换 ``` - **多机多卡运行微调训练**:2节点为例 Baichuan2-13B-Base用于微调,seq_length默认为512,分布式训练需要2节点。 1. 主要参数配置参考 ```shell load_checkpoint: 'model_dir' # 完整模型存放格式为"model_dir/rank_0/xxx.ckpt" auto_trans_ckpt: True # 打开权重自动转换 input_columns: ["inputs", "labels"] # 如果是预训练,请改为["inputs"] learning_rate: 2.e-5 # 预训练建议用3.e-4 lr_end: 1.e-6 # 预训练建议用3.e-5 # 分布式配置 parallel_config: data_parallel: 1 model_parallel: 8 pipeline_stage: 2 optimizer_shard: True micro_batch_num: 16 vocab_emb_dp: True gradient_aggregation_group: 4 # when model parallel is greater than 1, we can set micro_batch_interleave_num=2, that may accelerate the train process. micro_batch_interleave_num: 1 ``` 2. 生成合并后的rank_table_file ```shell # step1: 先为每个节点生成rank_table_file python ./mindformers/tools/hccl_tools.py --device_num "[0,8)" # step2:拷贝所有节点的rank_table_file到同一节点,进行合并 python ./mindformers/tools/merge_hccl.py hccl*.json # step3:将合并后的rank_table_file复制到所有节点 ``` 3. 拉起分布式训练 ```shell # node 1 cd mindformers/research bash run_multinode.sh \ "python baichuan2/run_baichuan2.py \ --config baichuan2/run_baichuan2_13b.yaml \ --load_checkpoint path/to/baichuan2_13b_ckpt \ --run_mode train \ --use_parallel True \ --train_data path/to/mindrecord_dir" \ path/to/rank_table_file [0,8] 16 # node 2 cd mindformers/research bash run_multinode.sh \ "python baichuan2/run_baichuan2.py \ --config baichuan2/run_baichuan2_13b.yaml \ --load_checkpoint path/to/baichuan2_13b_ckpt \ --run_mode train \ --use_parallel True \ --train_data path/to/mindrecord_dir" \ path/to/rank_table_file [8,16] 16 ``` ### 910B **注1**:Baichuan2-13B-Chat用于推理,seq_length默认为512,支持单卡推理。 **注2**: 由于baichuan2-13B基于高阶接口的形式开发,存放于research文件夹下,使用时需要将mindformers安装为python的包,才能直接进入research目录下执行相关命令。 **注3**: 当前`run_baichuan2_13b.yaml`文件默认为train配置,用于eval和predict时需要修改并行策略。 - **单机单卡运行推理** 1. 主要参数配置参考 ```shell auto_trans_ckpt: False # 关闭权重自动转换 use_past: True # 打开增量推理 vocab_file: 'path/to/tokenizer.model' # 分布式配置 parallel_config: data_parallel: 1 model_parallel: 1 pipeline_stage: 1 optimizer_shard: True micro_batch_num: 1 vocab_emb_dp: True gradient_aggregation_group: 4 # when model parallel is greater than 1, we can set micro_batch_interleave_num=2, that may accelerate the train process. micro_batch_interleave_num: 1 ``` 2. 启动推理 ```shell cd research # 推理命令中参数会覆盖yaml文件中的相同参数 python baichuan2/run_baichuan2.py \ --config baichuan2/run_baichuan2_13b.yaml \ --run_mode predict \ --use_parallel False \ --load_checkpoint path/to/baichuan2-13b-chat.ckpt \ --predict_data 你是谁? # output: [{'text_generation_text': ['你是谁? \n我是百川大模型,是由百川智能的工程师们创造的大语言模型,我可以和人类进行自然交流、解答问题、协助创作,帮助大众轻松、普惠的获得世界知识和专业服务。如果你有任何问题,可以随时向我提问']}] ``` - **单机多卡运行微调训练**:8卡为例 1. 主要参数配置参考 ```shell load_checkpoint: 'model_dir' # 完整模型存放格式为"model_dir/rank_0/xxx.ckpt" auto_trans_ckpt: True # 打开权重自动转换 input_columns: ["inputs", "labels"] # 如果是预训练,请改为["inputs"] learning_rate: 2.e-5 # 预训练建议用3.e-4 lr_end: 1.e-6 # 预训练建议用3.e-5 # 分布式配置 parallel_config: data_parallel: 1 model_parallel: 2 pipeline_stage: 4 optimizer_shard: True micro_batch_num: 16 vocab_emb_dp: True gradient_aggregation_group: 4 # when model parallel is greater than 1, we can set micro_batch_interleave_num=2, that may accelerate the train process. micro_batch_interleave_num: 1 ``` 2. 生成8卡的rank_table_file ```shell python mindformers/tools/hccl_tools.py --device_num [0,8] ``` 3. 拉起分布式训练 ```shell cd mindformers/research bash run_singlenode.sh \ "python baichuan2/run_baichuan2.py \ --config baichuan2/run_baichuan2_13b.yaml \ --load_checkpoint model_dir \ --auto_trans_ckpt True \ --run_mode train \ --use_parallel True \ --train_data path/to/mindrecord_dir" \ path/to/rank_table_file [0,8] 8 ```