DeepSpeed-Chat训练整理
核心参考:七月大模型线上营的《第3课补充文档:如何把微软DSC项目的代码给run起来》1
下述内容中所提及的/mnt/workspace/xxx
皆为自定义的路径,请注意甄别并自行替换为相关路径,切莫直接照抄使用。
1.环境准备阶段
1.1硬件环境
- Linux系统
- 显存24G2
1.2准备软件环境
- 创建虚拟环境
# 创建conda虚拟环境
conda create -n dsc python=3.10 pip
# 激活虚拟环境
conda activate dsc
- 拉取仓库
# 进入用于存储源码的目录
cd /mnt/workspace/sources_dir
# 拉取DeepSpeed-Chat仓库(gitcode国内加速)
git clone https://gitcode.com/microsoft/DeepSpeedExamples.git -b master
# 进入DeepSpeedExamples目录
cd DeepSpeedExamples
# 检出指定版本 代码版本时间为2023-12-12,防止因代码改动导致无法部署的情况
git reset --hard dd0f181bad814e5c8cb57e38620e766eccba79bf
- 安装依赖3
# 进入仓库目录
cd applications/DeepSpeed-Chat/
# 单独安装torch和deepspeed,使用requirements.txt安装可能会因为源问题导致安装失败
# pip install torch torchvision torchaudio
# pip install deepspeed
# 安装其他必要库
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 对整体进行setup
pip install -e .
2.获取模型文件及数据集
- 安装huggingface_hub
# 安装huggingface_hub
pip install -U huggingface_hub -i https://pypi.tuna.tsinghua.edu.cn/simple
# 配置全局环境变量,需要root权限
# sudo sh -c "echo 'HF_ENDPOINT=https://hf-mirror.com' >> /etc/environment"
# source /etc/environment
# 环境变量(当前shell会话或子shell进程的环境变量)
export HF_ENDPOINT=https://hf-mirror.com
- 下载模型
# 进入用于存储模型文件的目录
cd /mnt/workspace/models_dir
# 获取opt-350m
huggingface-cli download --resume-download facebook/opt-350m --local-dir opt-350m
# 获取opt-125m
huggingface-cli download --resume-download facebook/opt-125m --local-dir opt-125m
## 进入opt-350m模型和opt-125m的目录,以opt-350为例
cd opt-350m
## 手动将config.json文件中的_name_or_path属性由opt-350m改为/mnt/workspace/models_dir/opt-350m(模型绝对路径)
- 下载数据集
# 进入用于存储数据集的目录
cd /mnt/workspace/datasets_dir
# 下载rm-static数据集
huggingface-cli download --repo-type dataset --resume-download Dahoas/rm-static --local-dir rm-static
- 数据集格式处理(需要写一个简单的程序处理一下数据集)
pip install datasets -i https://pypi.tuna.tsinghua.edu.cn/simple
# 导入datasets库,这是一个用于处理和分析数据的库
import datasets
# 定义训练数据集的文件路径
train_file = "/mnt/workspace/datasets_dir/rm-static/data/train-00000-of-00001-2a1df75c6bce91ab.parquet"
# 定义测试数据集的文件路径
test_file = "/mnt/workspace/datasets_dir/rm-static/data/test-00000-of-00001-8c7c51afc6d45980.parquet"
# 将训练和测试数据集的文件路径存储在一个字典中
data_files = {
"train": train_file,
"test": test_file
}
# 使用datasets库的load_dataset函数,将Parquet格式的数据集加载到内存中
dataset = datasets.load_dataset("parquet", data_files=data_files)
# 将加载的数据集保存到指定的磁盘路径中,数据集的格式为Arrow
dataset.save_to_disk("/mnt/workspace/datasets_dir/Dahoas/rm-static-data")
3.运行训练
3.1 step1训练 基于opt-350m训练SFT Model
- 进入step1目录
cd /mnt/workspace/sources_dir/DeepSpeedExamples/applications/DeepSpeed-Chat/training/step1_supervised_finetuning
- 编写bash文件以启动第1阶段训练(run_sft.sh)4
#!/bin/bash
# Copyright (c) Microsoft Corporation.
# SPDX-License-Identifier: Apache-2.0
# DeepSpeed Team
# 定义并创建checkpoint等文件的输出目录
OUTPUT_PATH=/mnt/workspace/output/step1
mkdir -p $OUTPUT_PATH
# 执行训练
deepspeed --num_gpus 1 main.py \
--data_path /mnt/workspace/datasets_dir/Dahoas/rm-static-data \
--model_name_or_path /mnt/workspace/models_dir/opt-350m \
--per_device_train_batch_size 4 \
--per_device_eval_batch_size 4 \
--max_seq_len 512 \
--learning_rate 1e-3 \
--weight_decay 0. \
--num_train_epochs 3 \
--gradient_accumulation_steps 16 \
--lr_scheduler_type cosine \
--num_warmup_steps 0 \
--seed 42 \
--zero_stage 0 \
--lora_dim 64 \
--lora_module_name decoder.layers. \
--deepspeed \
--output_dir $OUTPUT_PATH
- 开始训练
bash run_sft.sh
3.2 step2训练 基于opt-125m训练Reward Model
- 进入step2目录
cd /mnt/workspace/sources_dir/DeepSpeedExamples/applications/DeepSpeed-Chat/training/step2_reward_model_finetuning
- 编写bash文件以启动第2阶段训练(run_rm.sh)4
#!/bin/bash
# Copyright (c) Microsoft Corporation
# SPDX-License-Identifier: Apache-2.0
# 定义并创建checkpoint等文件的输出目录
OUTPUT_PATH=/mnt/workspace/output/step2
mkdir -p $OUTPUT_PATH
# 执行训练
deepspeed --num_gpus 1 main.py \
--data_path /mnt/workspace/datasets_dir/Dahoas/rm-static-data \
--model_name_or_path /mnt/workspace/models_dir/opt-125m \
--weight_decay 0.1 \
--dropout 0.0 \
--gradient_accumulation_steps 4 \
--zero_stage 0 \
--deepspeed \
--output_dir $OUTPUT_PATH
- 开始训练
bash run_rm.sh
3.3 step3训练
- 进入step3目录
cd /mnt/workspace/sources_dir/DeepSpeedExamples/applications/DeepSpeed-Chat/training/step3_rlhf_finetuning
- 编写bash文件以启动第3阶段训练(run_ppo.sh)4
基于已经微调过的opt-350m(actor)与opt-125m(critic)进行PPO训练。
#!/bin/bash
# Copyright (c) Microsoft Corporation.
# SPDX-License-Identifier: Apache-2.0
# DeepSpeed Team
# 定义并创建checkpoint等文件的输出目录
OUTPUT_PATH=/mnt/workspace/output/step3
mkdir -p $OUTPUT_PATH
# 执行训练
deepspeed --num_gpus 1 main.py \
--data_path /mnt/workspace/datasets_dir/Dahoas/rm-static-data \
--actor_model_name_or_path /mnt/workspace/output/step1 \
--critic_model_name_or_path /mnt/workspace/output/step2 \
--per_device_generation_batch_size 4 \
--per_device_training_batch_size 4 \
--generation_batches 1 \
--ppo_epochs 1 \
--max_answer_seq_len 256 \
--max_prompt_seq_len 256 \
--actor_learning_rate 5e-4 \
--critic_learning_rate 5e-6 \
--num_train_epochs 1 \
--lr_scheduler_type cosine \
--gradient_accumulation_steps 16 \
--num_warmup_steps 100 \
--deepspeed \
--seed 42 \
--actor_zero_stage 0 \
--critic_zero_stage 0 \
--actor_lora_dim 64 \
--actor_dropout 0.0 \
--enable_hybrid_engine \
--output_dir $OUTPUT_PATH
- 开始训练 (预计需要训练3个小时左右)
bash run_ppo.sh
对话测试5
以上训练结束后,就可以导入各阶段的模型进行对话了,比如用step 3保存的模型进行对话。
cd DeepSpeedExamples/applications/DeepSpeed-Chat
python chat.py --path /mnt/workspace/output/step3 --max_new_tokens 512
常见问题
报错提示带有tokenizer、hub等词⼤致原因是DSC的源码中有提及从本地加载tokenizer可能会存在⼀些问题,特意定义了从 huggingface hub上加载tokenizer而非从本地的模型⽂件中加载,但由于访问限制等网络原因, 未能成功从huggingface hub中获取到tokenizer,因此出现相关报错,可尝试如下3种解决方法。
-
查看是否开启代理,必要时在相应的main.py⽂件中写⼊如下述代码显式设置proxy来声明代理
# 代理地址形如 http://127.0.0.1:xxxx os.environ["http_proxy"] = {代理地址} os.environ["https_proxy"] = {代理地址}
-
直接修改源码,实现从本地模型⽂件中获取tokenizer。
# /mnt/workspace/DeepSpeedExamples/applications/DeepSpeed-Chat/dschat/utils/utils.py
def load_hf_tokenizer(model_name_or_path,
fast_tokenizer=True,
add_special_tokens=None):
if os.path.exists(model_name_or_path):
# Locally tokenizer loading has some issue, so we need to force download
...
if os.path.exists(model_json):
...
tokenizer = get_tokenizer(model_name_or_path,
fast_tokenizer=fast_tokenizer)
else:
...
if add_special_tokens is not None:
...
return tokenizer
- 教程中使用的方法,修改模型的config.json文件中的将config.json文件中的_name_or_path属性由opt-350m改为/mnt/workspace/models_dir/opt-350m(模型绝对路径)