ChatGLM3
模型描述
ChatGLM3 是智谱AI和清华大学 KEG 实验室联合发布的新一代对话预训练模型。ChatGLM3-6B 是 ChatGLM3 系列中的开源模型,在保留了前两代模型对话流畅、部署门槛低等众多优秀特性的基础上,ChatGLM3-6B 引入了如下特性:更强大的基础模型,更完整的功能支持,更全面的开源序列
@article{zeng2022glm,
title={Glm-130b: An open bilingual pre-trained model},
author={Zeng, Aohan and Liu, Xiao and Du, Zhengxiao and Wang, Zihan and Lai, Hanyu and Ding, Ming and Yang, Zhuoyi and Xu, Yifan and Zheng, Wendi and Xia, Xiao and others},
journal={arXiv preprint arXiv:2210.02414},
year={2022}
}
模型性能
以下模型性能均由Atlas 800T A2硬件环境下测试得出。
| Config | Task | SeqLength | Datasets | Performance | Phase |
|---|---|---|---|---|---|
| glm3_6b | text_generation | 2048 | ADGEN | 3450 tokens/s/p | Finetune |
| glm3_6b | text_generation | 2048 | / | 627 tokens/s | Predict |
模型文件
chatGLM3-6B 基于 mindformers 实现,主要涉及的文件有:
-
模型具体实现:
mindformers/models/glm2 # glm3模型继承glm2的代码 ├── __init__.py ├── convert_weight.py # huggingface权重转ckpt实现 ├── glm2.py # 模型实现 ├── glm2_config.py # 模型配置项 ├── glm2_modules.py # 模组实现 ├── glm3_tokenizer.py # tokenizer └── glm2_transformer.py # transformer层实现 -
模型配置:
configs/glm3 ├── predict_glm3_6b.yaml # 在线推理配置文件 ├── run_glm3_6b_finetune_2k_800T_A2_64G.yaml # Atlas 800T A2 最佳性能全量微调启动配置 ├── run_glm3_6b_finetune_800T_A2_64G.yaml # Atlas 800T A2 ADGEN 全量微调启动配置 ├── run_glm3_6b_multiturn_finetune_800T_A2_64G.yaml # Atlas 800T A2 多轮对话全量微调启动配置 └── run_glm3_6b.yaml # ChatGLM3配置模板
环境及数据准备
安装环境
MindFormers软硬件配套关系以及安装参考环境安装指南和版本匹配关系。
数据及权重准备
数据集下载
MindFormers提供ADGEN (广告生成) 数据集和作为ToolAlpaca数据集作为微调数据集,ADGEN数据集无需处理即可使用。
| 数据集名称 | 适用模型 | 适用阶段 | 下载链接 |
|---|---|---|---|
| ADGEN | ChatGLM3-6b | Finetune | Link |
| ToolAlpaca | ChatGLM3-6b | Finetune | Source |
- ToolAlpaca 数据预处理
用户可通过Source下载原始数据,通过如下处理后使用:
-
下载数据处理脚本format_tool_alpaca.py
-
执行数据处理脚本,在执行路径生成处理好的数据
tool_alpaca.jsonlpython format_tool_alpaca.py --path ToolAlpaca/data/train_data.json
模型权重下载
MindFormers提供已经转换完成的预训练权重、词表文件用于微调和推理,用户也可以下载HuggingFace官方权重经过模型权重转换后进行使用。
词表下载链接:tokenizer.model
| 模型名称 | MindSpore权重 | HuggingFace权重 |
|---|---|---|
| ChatGLM3-6b | / | Link |
模型权重转换
执行convert_weight.py转换脚本,将HuggingFace的权重转换为完整的ckpt权重。
python convert_weight.py --model glm-n --input_path TORCH_CKPT_DIR --output_path {path}/MS_CKPT_NAME
# 参数说明
model: 模型名称
input_path: 下载HuggingFace权重的文件夹路径
output_path: 转换后的MindSpore权重文件保存路径
微调
MindFormers提供ChatGLM3-6B的微调示例, 过程中使用ADGEN数据集对模型进行微调,数据集可以参考数据集下载获得。
全参微调
单机训练
注:微调时模型的
seq_length需要等于微调数据集的max_source_length + max_target_length + 1。 在配置文件中默认的seq_length: 192以及max_source_length: 256和max_target_length: 256适用于ADGEN数据集, 对于其他数据集,可以将数据集转换为token_id,使seq_length等于token_id的最大长度,seq_length太大影响训练性能,太小影响训练精度,需要做出权衡。
-
修改
configs/glm3/run_glm3_6b_finetune_2k_800T_A2_64G.yaml配置文件:train_dataset: &train_dataset tokenizer: type: ChatGLM3Tokenizer vocab_file: "/path/to/tokenizer.model" -
执行分布式训练命令
bash scripts/msrun_launcher.sh "run_mindformer.py \ --config configs/glm3/run_glm3_6b_finetune_2k_800T_A2_64G.yaml \ --load_checkpoint {path}/glm3_6b.ckpt \ --train_dataset_dir {path}/AdvertiseGen/train.json \ --use_parallel True \ --run_mode finetune"
多机训练
ChatGLM3-6B多机多卡训练可以参考多机多卡启动方式。
分布式训练权重合并
分布式训练(微调)后所得到的权重文件为根据策略切分后的权重,可以手动将切分权重合一,以用于评估和推理。
MindFormers提供自动权重转换和离线权重转换功能,可参考自动转换案例和离线权重转换进行分布式模型权重转换。
推理
MindFormers提供GLM3-6b的快速推理脚本,脚本主要通过generate高阶接口实现,支持单卡推理以及多角色推理。
# 脚本使用
bash bash scripts/examples/glm3/run_glm3_predict.sh PARALLEL CONFIG_PATH CKPT_PATH
# 参数说明
PARALLEL: 推理模式选择, 'single'表示单卡推理, 'multirole'表示多角色推理
CONFIG_PATH: 模型配置文件路径
CKPT_PATH: 模型权重文件路径
单卡推理
运行如下命令进行单卡推理:
bash scripts/examples/glm3/run_glm3_predict.sh single \
configs/glm3/predict_glm3_6b.yaml \
path/to/glm3_6b.ckpt
# 输出推理结果
# 你好:
# 你好👋!我是人工智能助手 ChatGLM3-6B,很高兴见到你,欢迎问我任何问题。
# 请介绍一下华为:
# 华为是一家总部位于中国深圳的多元化科技公司,成立于1987年,是全球最大的电信设备制造商之一。该公司也在智能手机、电脑、平板电脑、
# 云计算等领域开展业务,其产品和服务覆盖全球170多个国家和地区。
# ...
多角色推理
运行如下命令进行多角色推理:
bash scripts/examples/glm3/run_glm3_predict.sh multirole \
configs/glm3/predict_glm3_6b.yaml \
path/to/glm3_6b.ckpt
# 输入prompt: 假设你现在是一个导游,请尽可能贴近这个角色回答问题。
# 输出推理结果
# 您好,我是您的人工智能助手,也可以是你的导游。请问有什么问题我可以帮您解答呢?
# 我打算1月份去海南玩,可以介绍一下海南有哪些好玩的,好吃的么?
# 当然可以!海南是一个风景优美、气候宜人的热带海洋省份,拥有丰富的旅游资源和美食。以下是一些您可能会感兴趣的景点和美食:
# ...
常见问题
网络训练 loss 不下降、网络训练溢出、overflow_cond=True
执行训练前设置环境变量:
export MS_ASCEND_CHECK_OVERFLOW_MODE="INFNAN_MODE"
重新启动训练。
推理速度非常慢、Mindspore只能跑在CPU上、报错中含有 te、tbe、tvm等字样
一般是 Mindspore + Ascend 环境安装问题,确认环境安装过程参照安装指南并且成功设置了环境变量。执行:
python -c "import mindspore;mindspore.set_context(device_target='Ascend');mindspore.run_check()"
假如执行输出:
MindSpore version: 版本号
The result of multiplication calculation is correct, MindSpore has been installed on platform [Ascend] successfully!
并且没有报错,则说明成功安装了环境。
或许你想问,有没有更方便的环境安装方式?恭喜你,有的,我们还提供现成的 docker镜像,可以依据需求自行取用。
微调报错:Sync stream Failed、exec graph xxx failed
这类报错较为宽泛,可以打开昇腾host日志进一步定位。
export ASCEND_GLOBAL_EVENT_ENABLE=0
export ASCEND_GLOBAL_LOG_LEVEL=2
export ASCEND_SLOG_PRINT_TO_STDOUT=1
打开昇腾host日志后模型性能将明显下降,定位问题结束后需要取消昇腾日志:
unset ASCEND_GLOBAL_EVENT_ENABLE ASCEND_GLOBAL_LOG_LEVEL ASCEND_SLOG_PRINT_TO_STDOUT
微调报错:the strategy is xxxxxx, shape xxxx cannot be divisible by value x
检查模型句长是否满足 max_source_length + max_target_length + 1 = seq_length 的要求。