基于MindFormers的GLM2 Lora微调

本次实验旨在参考MindFormers的官方套件运行GLM2的Lora微调,为此,我们首先需要准备以下资源和环境:
MindFormers官方套件:这包括针对GLM2的Lora微调的相关代码、模型和工具。可以直接访问MindFormers的官网

硬件资源:为了运行GLM2的Lora微调,我们需要具备以下硬件资源:

  • Atlas800-9000训练服务器
  • 各地计算中心(昇腾)
  • 有昇腾训练卡的服务器

软件环境:除了硬件资源外,我们还需要准备以下软件环境

  • 全量模型下载地址: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微调

全参微调能够在微调数据集上取得良好效果,但存在遗忘预训练知识的现象。
因此推荐使用低参微调算法,冻结原模型权重,仅在小规模参数量上进行训练,在微调数据集上取得良好效果的同时,缓解模型遗忘现象
使用LoRA算法进行低参微调时,使用 configs/glm2/run_glm2_6b_lora.yaml 配置文件,该配置文件包含了lora低参微调算法所需的配置项

修改数据集/模型权重配置路径:

  • 数据集:修改 mindformers/configs/glm2/run_glm2_6b_lora.yaml 脚本中train_datasetdataset_dir 为前文生成的数据集路径。

  • 加载预训练模型权重:修改 mindformers/configs/glm2/run_glm2_6b_lora.yaml 脚本中的 load_checkpoint 为预训练模型权重路径。
    如图:
    在这里插入图片描述
    在这里插入图片描述
    所有的参数都需要修改,比如load_checkpoint、dataset_dir、vocab_file等路径都需要修改。

单卡微调

首先BMS需要导入环境RANK_IDRANK_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.jsonRANK_TABLE_FILE为上一步汇总并分发的总rank table文件;

模型推理

基于Pipeline的快速推理

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)
# ['你好,作为一名人工智能助手,我欢迎您随时向我提问。']
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值