模型介绍
ChatGLM3 是智谱AI和清华大学 KEG 实验室联合发布的新一代对话预训练模型。ChatGLM3-6B 是 ChatGLM3 系列中的开源模型,在保留了前两代模型对话流畅、部署门槛低等众多优秀特性的基础上,ChatGLM3-6B 引入了如下特性:更强大的基础模型,更完整的功能支持,更全面的开源序列
一、环境背景
- 昇腾910b
- 驱动版本,23.0.1
- cann: 7.0.0
- mindspore:2.2.11
- mindformers:dev
- mindpet:1.0.4
二、生成RANK_TABLE_FILE
运行mindformers/tools/hccl_tools.py生成RANK_TABLE_FILE的json文件
# 运行如下命令,生成当前机器的RANK_TABLE_FILE的json文件
python ./mindformers/tools/hccl_tools.py --device_num "[4,8)"
RANK_TABLE_FILE 单机8卡参考样例:
{"version": "1.0","server_count": "1","server_list": [{"server_id": "192.168.0.225","device": [{"device_id": "4","device_ip": "29.147.146.80","rank_id": "0"},{"device_id": "5","device_ip": "29.147.10.62","rank_id": "1"},{"device_id": "6","device_ip": "29.147.158.139","rank_id": "2"},{"device_id": "7","device_ip": "29.147.47.244","rank_id": "3"}],"host_nic_ip": "reserve"}],"status": "completed"
}
三、权重下载
本仓库提供已经转换完成的预训练权重用于微调/推理,用户可自行从下方链接拉取后直接使用。
下载链接:
权重:https://ascend-repo-modelzoo.obs.cn-east-2.myhuaweicloud.com/MindFormers/glm32k/glm32k.ckpt
词表:https://ascend-repo-modelzoo.obs.cn-east-2.myhuaweicloud.com/MindFormers/glm32k/tokenizer.model
linux可用如下命令下载:
#!/bin/bash
mkdir -p ckpt/rank_0
cd ./ckpt/rank_0
wget https://ascend-repo-modelzoo.obs.cn-east-2.myhuaweicloud.com/MindFormers/glm32k/glm32k.ckpt
wget https://huggingface.co/THUDM/chatglm3-6b-32k/tree/main/tokenizer.model
cd ../..
四、数据集处理
将LongBench数据集格式转换为AdGen数据集格式,以便复用mindformers的ADGenDataLoader来转换为微调使用的数据样式。启动命令:
cd research/glm32k
python glm32k_preprocess.py \
--data_path INPUT_DATA_PATH \
--output_path OUTPUT_PATH \
--prompt_config_file PROMPT_PATH
根据我们的文件路径,执行下面的转换命令
python glm32k_preprocess.py --data_path /data/datasets/Longbench/data --output_path /data/datasets/Longbench/new_data --prompt_config_file /data/datasets/Longbench/dataset2prompt.json
# 参数说明
INPUT_DATA_PATH: 原始longbench数据所处的文件夹路径
OUTPUT_PATH:转换格式后的数据存储路径
PROMPT_PATH:longbench中不同数据对应的prompt
注意:
- Longbench数据集链接:Longbench
- prompt_config_file链接:prompt_config_file
- 具体Longbench数据集介绍请参见官网地址
五、全参微调
全参微调需要多卡启动,以LongBench
数据集为例,给出了默认配置文件research/glm32k/run_glm32k.yaml
。
当前模型已支持使用Flash Attention算法进行全参微调,请参考 Flash Attention使用文档
- step 1. 修改
research/glm32k/run_glm32k.yaml
中相关配置
output_dir: './output' # path to save checkpoint/strategy
load_checkpoint: './output/transformed_checkpoint/' # 添加预训练权重路径
auto_trans_ckpt: False
only_save_strategy: False
resume_training: False
use_parallel: True
run_mode: 'finetune'
# dataset
train_dataset: &train_datasetdata_loader:type: ADGenDataLoaderdataset_dir: "/path/to/AdvertiseGen/train.json"shuffle: Truephase: "train"version: 3origin_columns: ["content", "summary"]tokenizer:type: ChatGLM3Tokenizervocab_file: "/path/to/tokenizer.model" # 添加字典文件max_source_length: 30720 # 长序列源数据长度max_target_length: 2047 # 长序列目标数据长度
注意:长序列模型的训练,max_source_length和max_target_length数值较大,需要根据实际业务数据设置对应数值
- step 2. 启动微调任务,按照以下步骤启动:
-[x] 1: 根据服务器节点数等信息,修改相应的配置。
# 以glm-6b-32k模型为例,默认配置单机8卡,如果节点数有变,需要修改相应的配置。
# 配置文件路径:./research/glm32k/run_glm32k.yaml
parallel_config:data_parallel: 2model_parallel: 1pipeline_stage: 4micro_batch_num: 8vocab_emb_dp: Truegradient_aggregation_group: 4
-[x] 2: 执行运行脚本。
cd research
bash run_singlenode.sh \
"python glm32k/run_glm32k.py \
--config glm32k/run_glm32k.yaml \
--run_mode finetune \
--train_dataset /path/to/train.json \
--use_parallel True" \
path/to/rank_table_file [0,8] 8
六、微调性能
1、昇腾910bnpu 内存及AIcore占用:
2、内存占用
内存占用稳定在250G左右, 下面是运行微调和微调后的内存对比:
微调中,占用294G左右:
微调后, 系统及其他内存占用40G左右:
3、耗时
我们进行了一轮微调,耗时10个小时左右。
七、glm3模型推理及验证
1、修改配置文件
注意:
- 目前可以根据实际业务调整yaml文件中的
seq_length
参数以降低推理时延(如设置seq_length=4096
,最高到4096), 需要修改默认参数值,改为4096, 默认为32768。
在启动前,请先行在配置文件run_glm32k.yaml中将processor.tokenizer.vocab_file的路径配置为实际路径;如果使用增量推理,需要在配置文件中将model.model_config.use_past值设置为True。例如:
processor:return_tensors: mstokenizer:...vocab_file: '/path/tokenizer.model' # 修改为实际路径...
model:model_config:...use_past: True...
注意:目前长序列的增量推理所需的IFA算子还未适配,等待海思算子版本上新后再适配使用,所以use_past
目前需设置为False
2、 基于generate接口的推理
- 代码见
research/glm32k/infer_generate.py
- 启动命令:
python infer_generate.py --checkpoint_path CKPT_PATH --device_id DEVICE_ID --user_query "晚上睡不着应该怎么办"# 参数说明
checkpoint_path: 权重文件夹路径
device_id: NPU卡号
user_query: 用户输入问题输出结果:
output:
[gMASK]sop<|user|>晚上睡不着应该怎么办<|assistant|>晚上睡不着,可以参考下述建议:
1. 建立规律的睡眠时间表:每天在相同的时间上床和起床,有助于身体建立规律的睡眠时间表,更容易入睡。
2. 创造舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗,凉爽,有助于入睡。
3. 避免刺激性物质:避免饮用咖啡因和酒精等刺激性物质,这些物质会影响睡眠。
4. 放松身心:在睡前放松身心,例如泡个热水澡,听些轻柔的音乐,读本书等,有助于入睡。
5. 避免使用电子设备:在睡前避免使用电子设备,例如手机,平板电脑等,这些设备发出的蓝光会抑制睡眠激素的分泌,影响睡眠。
6. 锻炼身体:适度的锻炼身体有助于睡眠,但避免在睡前进行剧烈运动。
如果以上方法都无法解决问题,建议咨询医生或专业睡眠专家,获得更具体的建议和治疗方案。