赞
踩
本次实验旨在参考MindFormers的官方套件运行GLM2的Lora微调,为此,我们首先需要准备以下资源和环境:
MindFormers官方套件:这包括针对GLM2的Lora微调的相关代码、模型和工具。可以直接访问MindFormers的官网
硬件资源:为了运行GLM2的Lora微调,我们需要具备以下硬件资源:
软件环境:除了硬件资源外,我们还需要准备以下软件环境
全量模型下载地址:https://ascend-repo-modelzoo.obs.cn-east-2.myhuaweicloud.com/XFormer_for_mindspore/glm2/glm2_6b.ckpt
tokenizer:https://ascend-repo-modelzoo.obs.cn-east-2.myhuaweicloud.com/XFormer_for_mindspore/glm2/tokenizer.model
数据集:https://cloud.tsinghua.edu.cn/seafhttp/files/e5c9a5f1-54fb-4d7c-99ce-88f82ce25d33/AdvertiseGen.tar.gz
BMS(AICC)镜像: docker pull swr.cn-central-221.ovaijisuan.com/wuh-aicc_dxy/baichuan_mindformers:mindformers1.0.0dev-mindspore2.0.0-cann6.3rc1-py_3.9-euler_2.8
说明:底层驱动和固件需的版本需要大于等于C84的版本。(目前各地的计算中心的底层驱动大多数为C81–2023-10-31)
# --device用于控制指定容器的运行NPU卡号和范围 # -v 用于映射容器外的目录 # --name 用于自定义容器名称 docker run -itd --ipc=host \ --network host \ --entrypoint=/bin/bash \ --device=/dev/davinci0 \ --device=/dev/davinci1 \ --device=/dev/davinci2 \ --device=/dev/davinci3 \ --device=/dev/davinci4 \ --device=/dev/davinci5 \ --device=/dev/davinci6 \ --device=/dev/davinci7 \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ -v /work:/work \ -v /etc/localtime:/etc/localtime \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \ -v /usr/local/sbin/:/usr/local/sbin/ \ -v /usr/bin/hccn_tool:/usr/bin/hccn_tool \ -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \ -v /var/log/npu/conf/slog/slog.conf:/var/log/npu/conf/slog/slog.conf \ -v /var/log/npu/slog/:/var/log/npu/slog \ -v /var/log/npu/profiling/:/var/log/npu/profiling \ -v /var/log/npu/dump/:/var/log/npu/dump \ -v /var/log/npu/:/usr/slog \ IMAGE_ID # 镜像的id
使用docker exec -it -u 0 容器ID /bin/bash 进入容器中
。
全参微调能够在微调数据集上取得良好效果,但存在遗忘预训练知识的现象。
因此推荐使用低参微调算法,冻结原模型权重,仅在小规模参数量上进行训练,在微调数据集上取得良好效果的同时,缓解模型遗忘现象
使用LoRA算法进行低参微调时,使用 configs/glm2/run_glm2_6b_lora.yaml
配置文件,该配置文件包含了lora低参微调算法所需的配置项
修改数据集/模型权重配置路径:
数据集:修改 mindformers/configs/glm2/run_glm2_6b_lora.yaml
脚本中train_dataset
的 dataset_dir
为前文生成的数据集路径。
加载预训练模型权重:修改 mindformers/configs/glm2/run_glm2_6b_lora.yaml
脚本中的 load_checkpoint
为预训练模型权重路径。
如图:
所有的参数都需要修改,比如load_checkpoint、dataset_dir、vocab_file
等路径都需要修改。
首先BMS需要导入环境RANK_ID、RANK_TABLE_FILE这两个环境变量才能使用npu资源进行微调/训练;
export RANK_ID=0
export RANK_TABLE_FILE=xxx/hccl_8p.json # 其中hccl_8p.json代表的是使用python ./mindformers/tools/hccl_tools.py --device_num "[0,8)" 生成的文件。
修改configs/glm2/run_glm2_6b_lora.yaml
配置文件,将use_parallel 设置成False
cd scripts
# Usage Help: bash run_stanalone.sh [CONFIG_PATH] [DEVICE_ID] [RUN_STATUS]
bash run_standalone.sh ../configs/glm2/run_glm2_6b_lora.yaml 0 finetune
训练的log日志路径:mindformers/scripts/mf_standalone/
checkpoint存储路径:mindformers/scripts/mf_standalone/output/checkpoint
或者运行如下命令:
python run_mindformer.py --config configs/glm2/run_glm2_6b_lora.yaml --run_mode finetune --device_id 0
如下是生成的模型文件:
首先需要修改修改configs/glm2/run_glm2_6b_lora.yaml
配置文件,将use_parallel 设置成True。同时,修改如下配置:
use_parallel: True parallel: parallel_mode: 1 # 0-dataset, 1-semi, 2-auto, 3-hybrid gradients_mean: False loss_repeated_mean: True enable_alltoall: False full_batch: True search_mode: "sharding_propagation" enable_parallel_optimizer: True # optimizer shard strategy_ckpt_config: save_file: "./ckpt_strategy.ckpt" only_trainable_params: False # 设置成 False,才能在策略文件中保存所有参数 parallel_config: data_parallel: 8 # 八个设备(NPU卡),不配的并行策略配置下面相关的数据 model_parallel: 1 pipeline_stage: 1 expert_parallel: 1 micro_batch_num: 1 vocab_emb_dp: True gradient_aggregation_group: 4 micro_batch_interleave_num: 1
在机器上进入mindformers进入scripts目录,执行如下命令,进行多卡微调。
bash run_distribute.sh /work/mindformers/mindformers/hccl_8p.json ../configs/glm2/run_glm2_6b_lora.yaml [0,8] finetune 8
其中/work/mindformers/mindformers/hccl_8p.json
是RANK_TABLE_FILE
为上一步汇总并分发的总rank table文件;
import mindspore from mindformers import AutoConfig, AutoModel, AutoTokenizer # 指定图模式,指定使用训练卡id mindspore.set_context(mode=0, device_id=0) tokenizer = AutoTokenizer.from_pretrained('glm2_6b') # model的实例化有以下两种方式,选择其中一种进行实例化即可 # 1. 直接根据默认配置实例化 model = AutoModel.from_pretrained('glm2_6b') # 2. 自定义修改配置后实例化 config = AutoConfig.from_pretrained('glm2_6b') config.use_past = True # 此处修改默认配置,开启增量推理能够加速推理性能 # config.xxx = xxx # 根据需求自定义修改其余模型配置 model = AutoModel.from_config(config) # 从自定义配置项中实例化模型 inputs = tokenizer("你好")["input_ids"] # 首次调用model.generate()进行推理将包含图编译时间,推理性能显示不准确,多次重复调用以获取准确的推理性能 outputs = model.generate(inputs, max_new_tokens=20, do_sample=True, top_k=3) response = tokenizer.decode(outputs) print(response) # ['你好,作为一名人工智能助手,我欢迎您随时向我提问。']
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。