×

签到

分享到微信

打开微信,使用扫一扫进入页面后,点击右上角菜单,

点击“发送给朋友”或“分享到朋友圈”完成分享

【PyTorch LLM】如何用MLU370跑起FastChat的Finetune HelloAI2024-01-24 15:28:50 回复 1 查看 经验交流
【PyTorch LLM】如何用MLU370跑起FastChat的Finetune
分享到:

一、环境搭建

用寒武纪官网发布的pytorch1.13 docker image搭建,发布地址:https://sdk.cambricon.com/download?sdk_version=V1.15.0&component_name=PyTorch

wget 
https://sdk.cambricon.com/static/PyTorch/MLU370_1.13_v1.17.0_X86_ubuntu18.04_python3.10_docker/pytorch-v1.17.0-torch1.13.1-ubuntu18.04-py310.tar.gz


参考示例导入docker镜像并启动容器。


二、准备模型

这里我们用LLaMA-2-7B作为 Model,下载链接:

https://huggingface.co/ -llama/Llama-2-7b-hf


三、安装依赖包:

(1)安装deepspeed

寒武纪基于官方的deepspeed做了二次开发,增加了MLU的后端,发布地址:https://sdk.cambricon.com/download?sdk_version=V1.15.0&component_name=Basis

wget 
https://sdk.cambricon.com/static/Basis/MLU370_X86_ubuntu18.04/deepspeed_mlu-0.9.0-py3-none-any.whl


但是寒武纪的deepspeed安装以后显示的Package Name并不是deepspeed,而是deepspeed-mlu,且版本号也不是deepspeed的版本,而是寒武纪的版本。这里我们需要修改Package的Name,避免transformer在检查deepspeed的时候找不到而报错:

mv /torch/venv3/pytorch/lib/python3.10/site-packages/deepspeed-mlu-0.9.0.dist-info/ /torch/venv3/pytorch/lib/python3.10/site-packages/deepspeed-0.10.2.dist-info/
vim /torch/venv3/pytorch/lib/python3.10/site-packages/deepspeed-0.10.2.dist-info/ DATA


Name: deepspeed-mlu
Version: 0.9.0

改为

Name: deepspeed
Version: 0.10.2


完成后,pip list | grep deepspeed检查是否修改成功。

(2)用代码本地安装transformers和accelerate的MLU版本

HuggingFace的transformers和accelerate,默认都把CUDA作为后端,所以这里我们不能直接用pip安装transformers和accelerate,这里需要用Cambricon PyTorch镜像中自带的torch_gpu2mlu.py工具将默认后端转为MLU,并用源码本地安装:

git clone https://github.com/huggingface/transformers.git -b v4.31.0
python /torch/src/catch/tools/torch_gpu2mlu/torch_gpu2mlu.py -i transformers
cd transformers_mlu && pip install -e . && cd -
git clone https://github.com/huggingface/accelerate.git -b v0.21.0
python /torch/src/catch/tools/torch_gpu2mlu/torch_gpu2mlu.py -i accelerate
cd accelerate_mlu && pip install -e . && cd -


torch_gpu2mlu.py工具主要包含如下3个功能:

  a) 将代码中的CUDA/GPU等关键字都替换为MLU

  b) 将NCCL替换为CNCL

  c) 在import torch的后边添加import torch_mlu,并在同级目录生成一个带"_mlu"后缀的目录。

如果你想查看torch_gpu2mlu.py到底改了什么,新的以_mlu为后缀的新目录中会包含一个report.md。

四、转换FastChat的源码,并启动训练


git clone https://github.com/lm-sys/FastChat.git
python /torch/src/catch/tools/torch_gpu2mlu/torch_gpu2mlu.py -i FastChat
cd FastChat_mlu
torchrun --nproc_per_node=4 \
        --master_port=20001 \
        fastchat/train/train.py  \
        --model_name_or_path /datasets/Llama-2-7b-hf/  \
        --data_path data/dummy_conversation.json \
        --output_dir output_vicuna \
        --num_train_epochs 3 \
        --per_device_train_batch_size 2 \
        --per_device_eval_batch_size 2 \
        --gradient_accumulation_steps 16 \
        --evaluation_strategy no \
        --save_strategy steps \
        --save_steps 1200 \
        --save_total_limit 10 \
        --learning_rate 2e-5 \
        --weight_decay 0. \
        --warmup_ratio 0.03 \
        --lr_scheduler_type cosine \
        --logging_steps 1 \
        --model_max_length 2048 \
        --gradient_checkpointing True \
        --lazy_preprocess True \
        --fp16 True \
        --no_mlu False \
        --deepspeed playground/deepspeed_config_s3.json

注:

(1)原生给出的Sample使用的是--bf16 True,由于MLU370对BF16支持还不完善,这里我们用--fp16 True替换。

(2)原生的例子使用的--no_gpu Faslse,由于这里我们已经把代码转为MLU,所以这里用--no_mlu False替换。

(3)原生的例子使用的脚本为fastchat/train/train_mem.py,但是train_mem.py需要flash-attention的支持,我们这里没有安装falsh-attention,所以我们替换为fastchat/train/train.py。

(4)原生的例子没有启动deepspeed,这里我们启用了deepspeed。

(5)这里有4张卡,所以指定了--nproc_per_node=4。

版权所有 © 2024 寒武纪 Cambricon.com 备案/许可证号:京ICP备17003415号-1
关闭