openi平台 Ascend 910 微调大语言模型速通指南
本篇文章中,我将基于 openi 的 华为昇腾Ascend 910 机器来为你讲解如何微调 llama 以及 chatGLM模型。
资料
华为官方资料llama
https://openi.pcl.ac.cn/MindSpore/mindformers/src/branch/master/docs/model_cards/llama.md
llama模型文件下载
https://openi.pcl.ac.cn/liuzx/alpaca-lora/datasets
注意:如果你不想折腾,可以弄成2.0.0的镜像环境,比默认的镜像环境(1.11坑多)应该好一些
当然,在开始之前,你需要先clone一下初始文件(我们会基于这个库做所有事情,需要安装)
git clone https://openi.pcl.ac.cn/MindSpore/mindformers.git
llama
步骤
首先无脑创建一个调试任务,无需挂载数据集和模型。(直接在内部下载)
然后我们需要准备对应的模型和数据集,此处直接参考这位老哥的:https://openi.pcl.ac.cn/liuzx/alpaca-lora/datasets
注意,这里你可以跳过下载llama模型部分!!!!因为实际上微调的时候若模型缺省他会自动下载。。。(只要你的 load_checkpoint: yaml 参数保持原来的就行,网速很快)
终端进入后直接去/home/ma-user/work
下载:
wget -O alpaca_dataset.zip "https://s3.openi.org.cn/opendata/attachment/b/1/b1d99d71-181f-4494-9492-2b3327828d84?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=1fa9e58b6899afd26dd3%2F20231024%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20231024T013008Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3D%22alpaca-cleaned.zip%22&X-Amz-Signature=f9fc91e3c59bd1f62d8d008652f8c0c5b8d60fd560253d132e802affa29cdfc0"
git clone https://openi.pcl.ac.cn/MindSpore/mindformers.git\
# 这里出问题了 不推荐,你可以自己找方式下载hf的模型
wget -O llama-7b-hf.zip "https://s3.openi.org.cn/opendata/attachment/8/1/81e7cc23-a65c-4925-a7d6-3d3c2c45e304?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=1fa9e58b6899afd26dd3%2F20231024%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20231024T013008Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3D%22llama-7b-hf.zip%22&X-Amz-Signature=6a80242aa1cda1e4eb01f587b05de27668f25933ae466f75ba6931d88ef705dd"
解压的时候可以开个新的终端进行环境依赖的安装:
pip install transformers
pip install "fschat[model_worker,webui]"
预训练权重转换
注意,这里你可以跳过该部分!!!!因为实际上微调的时候若模型缺省他会自动下载。。。(只要你的 load_checkpoint: yaml 参数保持原来的就行,网速很快)
转换权重,目录根据你的来改,先加环境变量防错。
export LD_PRELOAD=$LD_PRELOAD:/home/ma-user/anaconda3/envs/MindSpore/lib/python3.7/site-packages/torch/lib/libgomp-d22c30c5.so.1
python mindformers/mindformers/models/llama/convert_weight.py \
--torch_ckpt_dir llama-7b-hf \
--mindspore_ckpt_path open_llama_7b_v2.ckpt
数据集转换
把alpaca的单轮对话转成多轮对话。
python mindformers/mindformers/tools/dataset_preprocess/llama/alpaca_converter.py \
--data_path alpaca-cleaned/alpaca_data_cleaned.json \
--output_path alpaca-data-conversation.json
接下来把格式变mindspore支持,由于依赖fschat工具包解析prompt模板,请提前安装fschat >= 0.2.13 python = 3.9
如果你一直在 solve env ,可以试试 conda config --remove-key channels 再继续
然后切换环境安装
pip install "fschat[model_worker,webui]"
pip uninstall opencv-python
pip install mindspore decorator opencv-python-headless
pip install tk
# 你还要记得安装下列环境
cd mindformers && pip install -r requirements.txt && python3 setup.py install
执行下列转换代码(可能至少等待10min)
# 脚本路径:tools/dataset_preprocess/llama/llama_preprocess.py
# 由于此工具依赖fschat工具包解析prompt模板,请提前安装fschat >= 0.2.13 python = 3.9
python mindformers/mindformers/tools/dataset_preprocess/llama/llama_preprocess.py \
--dataset_type qa \
--input_glob /home/ma-user/work/alpaca-data-conversation.json \
--model_file /home/ma-user/work/llama-7b-hf/llama-7b-hf/tokenizer.model \
--seq_length 2048 \
--output_file ./alpaca-fastchat2048.mindrecord
微调
lora微调 目前lora微调适配了llama_7b模型,并给出了默认配置文件config/llama/run_llama_7b_lora.yaml
step 1. 修改配置文件,参考全参微调修改训练数据集路径与预训练权重路径。 step 2. 启动lora微调任务。 注:llama_7b_lora模型支持单卡启动,需将配置文件中的use_parallel参数置为False。
# 首先切换回原环境
conda activate MindSpore
# 别忘了安装环境
cd mindformers && pip install -r requirements.txt && python3 setup.py install
# 如果运行发现错误再安装下列环境,否则无需安装。
pip install jieba nltk rouge_chinese
如果环境挂了,可以重启机器恢复原来的环境然后再试试看。
最后运行就可以成功跑通!
python ./mindformers/run_mindformer.py --config=./configs/llama/run_llama_7b_lora.yaml --use_parallel=False --run_mode=finetune
随后你会看到类似Model Compiling,please wait a Moment
的则表示开始编译,等待十多分钟即可开始运行。
mindformers[callback.py:305] - INFO - { Epoch:[ 1/ 1], step:[ 92/25880], loss: 9.902, per_step_time: 2068ms, lr: 9.92268e-06, overflow cond: False, loss_scale: 262144.0
参考
感谢以下作者的文章帮助复现
https://blog.csdn.net/yichao_ding/article/details/133810561
https://openi.pcl.ac.cn/zhutianci/MindSporeChatGLM2/src/branch/master/LORAllama.md
chatglm
通过上面的文章,我们已经很清楚我们需要 1、下载模型转换模型 2、准备数据集 3、修改配置 4、run!
所以我们按照这个顺序进行操作
模型下载
注意,由于我的存储空间不够用,这里我直接利用共享内存的挂载点进行模型的下载和使用。(如果你的硬盘存储足够可以直接在 /home
相关目录下操作)
对于模型下载我们需要注意几个点,
1:我们需要从 https://huggingface.co/THUDM/chatglm-6b/tree/main 获取配置信息,你可以把所有除了 .bin 的文件都下载打包放到一个模型文件夹,然后我们还要从魔搭社区获取模型权重的大部分,这些都把他们放在同一个文件夹(非常重要)。./git-lfs clone clone https://www.modelscope.cn/ZhipuAI/ChatGLM-6B.git
这里为什么用 git-lfs,后面会说
2:我们需要利用git-lfs下载才能获得仓库的大型文件,否则git clone是错误的。但是这里没法直接apt安装,但没关系,这个文件我们可以直接获取编译好的二进制文件:
https://github.com/git-lfs/git-lfs/releases/download/v3.4.0/git-lfs-linux-arm64-v3.4.0.tar.gz
然后我们把 gitlfs的命令替换掉git的命令即可,如:./git-lfs clone 仓库地址
就可以成功获取仓库的文件
模型转换
拿到模型后我们需要把模型转换成mindspore的格式,首先对模型进行合并操作:
首先别忘了 pip install transformers
from transformers import AutoModel
import torch as pt
pt_ckpt_path="./ChatGLM-6B"
model = AutoModel.from_pretrained(pt_ckpt_path, trust_remote_code=True, local_files_only=True).half()
pt_pth_path = "./pt_glm_6b.pth"
pt.save(model.state_dict(), pt_pth_path)
到这一步还没完,得到pt合成文件后,我们还需要把他转换成mindspore:
python mindformers/mindformers/models/glm/convert_weight.py --pt_ckpt_path /dev/shm/pt_glm_6b.pth --ms_ckpt_path /dev/shm/ms_glm_6b.ckpt
最后一个ms_glm_6b.ckpt的模型则是我们进行微调的模型,我们需要记录这个地址。
至此你已经完成了最麻烦的一部分,接下来我们只需要简单拿入数据即可。
数据准备
这一步非常简单,不需要做额外的转换,我们只需要下载对应的广告数据即可。
wget -O data.tar.xz 'https://cloud.tsinghua.edu.cn/f/b3f119a008264b1cabd1/?dl=1'
解压记录地址即可。
微调
接下来我们进入激动人心的微调环节,只要环境没问题其实你已经成功了,我们只需要修改5个地方:一处模型的地址,两处数据集的加载地址以及对应的 ice_text model,具体类似:(修改部分节选)
seed: 0
run_mode: 'finetune'
load_checkpoint: "/dev/shm/ms_glm_6b.ckpt"
src_strategy_path_or_dir: ''
auto_trans_ckpt: False # If true, auto transform load_checkpoint to load in distributed model
only_save_strategy: False
resume_training: False
output_dir: './output' # 当前不支持自定义修改,请勿修改该默认值
#####################
# ==== dataset config ====
train_dataset: &train_dataset
data_loader:
type: ADGenDataLoader
dataset_dir: "/home/ma-user/work/AdvertiseGen/train.json"
shuffle: True
phase: "train"
origin_columns: ["content", "summary"]
tokenizer:
type: ChatGLMTokenizer
vocab_file: "/dev/shm/ChatGLM-6B/ice_text.model"
input_columns: ["input_ids", "labels", "position_ids", "attention_mask"]
max_source_length: 64
max_target_length: 64
ignore_pad_token_for_loss: True
num_parallel_workers: 8
python_multiprocessing: False
drop_remainder: True
batch_size: 1
repeat: 1
numa_enable: False
prefetch_size: 1
seed: 0
train_dataset_task:
type: KeyWordGenDataset
dataset_config: *train_dataset
eval_dataset: &eval_dataset
data_loader:
type: ADGenDataLoader
dataset_dir: "/home/ma-user/work/AdvertiseGen/dev.json"
shuffle: False
phase: "eval"
origin_columns: ["content", "summary"]
tokenizer:
type: ChatGLMTokenizer
vocab_file: "/dev/shm/ChatGLM-6B/ice_text.model"
max_source_length: 256
max_target_length: 256
ignore_pad_token_for_loss: True
input_columns: ["input_ids", "labels"]
num_parallel_workers: 8
python_multiprocessing: False
drop_remainder: True
batch_size: 1
repeat: 1
numa_enable: False
prefetch_size: 1
seed: 0
随后直接运行对应的微调配置即可,祝你跑通愉快。
python ./mindformers/run_mindformer.py --config=./configs/glm/run_glm_6b_lora.yaml --use_parallel=False --run_mode=finetune
参考
感谢以下作者的文章帮助复现