Dolly是一个基于GPT-J的微调模型,使用了GPT-J-6B作为预训练模型。
Github上公开的源代码是notebook代码,需要做一些修改才能在本地的服务器上运行。
环境配置
可以使用conda来管理自己的虚拟环境。如果没有conda,可以根据这篇文章来进行安装。
创建环境:
conda create --name dolly
训练过程中,需要用到gcc编译ninja,gcc版本要求至少5以上,否则会报错。
!! WARNING !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Your compiler (c++ 4.8.5) may be ABI-incompatible with PyTorch!
Please use a compiler that is ABI-compatible with GCC 5.0 and above.
See https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html.
See https://gist.github.com/goldsborough/d466f43e8ffc948ff92de7486c5216d6
for instructions on how to install GCC 5 or higher.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! WARNING !!
warnings.warn(ABI_INCOMPATIBILITY_WARNING.format(compiler))
Emitting ninja build file /home/haida_yangyongquan/.cache/torch_extensions/py39_cu117/utils/build.ninja...
Building extension module utils...
Allowing ninja to set a default number of workers... (overridable by setting the environment variable MAX_JOBS=N)
[1/2] c++ -MMD -MF flatten_unflatten.o.d -DTORCH_EXTENSION_NAME=utils -DTORCH_API_INCLUDE_EXTENSION_H -DPYBIND11_COMPILER_TYPE=\"_gcc\" -DPYBIND11_STDLIB=\"_libstdcpp\" -DPYBIND11_BUILD_ABI=\"_cxxabi1011\" -isystem /home/haida_yangyongquan/dolly/dolly-master/.venv/lib/python3.9/site-packages/torch/include -isystem /home/haida_yangyongquan/dolly/dolly-master/.venv/lib/python3.9/site-packages/torch/include/torch/csrc/api/include -isystem /home/haida_yangyongquan/dolly/dolly-master/.venv/lib/python3.9/site-packages/torch/include/TH -isystem /home/haida_yangyongquan/dolly/dolly-master/.venv/lib/python3.9/site-packages/torch/include/THC -isystem /home/haida_yangyongquan/.pyenv/versions/3.9.7/include/python3.9 -D_GLIBCXX_USE_CXX11_ABI=0 -fPIC -std=c++14 -c /home/haida_yangyongquan/dolly/dolly-master/.venv/lib/python3.9/site-packages/deepspeed/ops/csrc/utils/flatten_unflatten.cpp -o flatten_unflatten.o
FAILED: flatten_unflatten.o
c++ -MMD -MF flatten_unflatten.o.d -DTORCH_EXTENSION_NAME=utils -DTORCH_API_INCLUDE_EXTENSION_H -DPYBIND11_COMPILER_TYPE=\"_gcc\" -DPYBIND11_STDLIB=\"_libstdcpp\" -DPYBIND11_BUILD_ABI=\"_cxxabi1011\" -isystem /home/haida_yangyongquan/dolly/dolly-master/.venv/lib/python3.9/site-packages/torch/include -isystem /home/haida_yangyongquan/dolly/dolly-master/.venv/lib/python3.9/site-packages/torch/include/torch/csrc/api/include -isystem /home/haida_yangyongquan/dolly/dolly-master/.venv/lib/python3.9/site-packages/torch/include/TH -isystem /home/haida_yangyongquan/dolly/dolly-master/.venv/lib/python3.9/site-packages/torch/include/THC -isystem /home/haida_yangyongquan/.pyenv/versions/3.9.7/include/python3.9 -D_GLIBCXX_USE_CXX11_ABI=0 -fPIC -std=c++14 -c /home/haida_yangyongquan/dolly/dolly-master/.venv/lib/python3.9/site-packages/deepspeed/ops/csrc/utils/flatten_unflatten.cpp -o flatten_unflatten.o
c++: error: unrecognized command line option ‘-std=c++14’
ninja: build stopped: subcommand failed.
2023-03-28 23:58:27 ERROR [__main__] main failed
Traceback (most recent call last):
File "/home/haida_yangyongquan/dolly/dolly-master/.venv/lib/python3.9/site-packages/torch/utils/cpp_extension.py", line 1900, in _run_ninja_build
subprocess.run(
File "/home/haida_yangyongquan/.pyenv/versions/3.9.7/lib/python3.9/subprocess.py", line 528, in run
raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['ninja', '-v']' returned non-zero exit status 1.
The above exception was the direct cause of the following exception:
安装依赖
从github上下载源代码并上传到服务器,如果可以远程clone,可以直接clone。
进入虚拟环境后,安装依赖。
conda activate dolly
cd dolly
pip install -r requirements_dev.txt
./run_pytest.sh
测试通过后,就可以进行下一步了。
训练
源代码中train_dolly.py没有用,因为是一个notebook脚本,核心目的是调用deepspeed进行训练。因此,直接在dolly根目录执行:
deepspeed --num_gpus 8 --module training.trainer --deepspeed //cdn.yangyq.net/home/yourhomedir/dolly/config/ds_z3_bf16_config.json --epochs 1 --local-output-dir /home/yourhomedir/dolly/output/ --dbfs-output-dir /home/yourhomedir/dolly/dbfs/ --per-device-train-batch-size 1 --per-device-eval-batch-size 1 --lr 1e-5
其中--num_gpus
指的是显卡数量,--module training.trainer
表示要训练training文件夹下的trainer.py文件, --deepspeed /home/yourhomedir/dolly/config/ds_z3_bf16_config.json
是指定配置文件,--local-output-dir
是模型输出目录, 其他参数不再赘述。
记得把yourhomedir
改为自己的用户名。
当然也可以写一个sh文件来执行,
module load CUDA/cuda-11.7
export CUDA_VISIBLE_DEVICES=0,1,2,3
deepspeed --module training.trainer --deepspeed //cdn.yangyq.net/home/yourhomedir/dolly/config/ds_z3_bf16_config.json --epochs 1 --local-output-dir /home/yourhomedir/dolly/output/ --dbfs-output-dir /home/yourhomedir/dolly/dbfs/ --per-device-train-batch-size 1 --per-device-eval-batch-size 1 --lr 1e-5
注意,export设置了显卡的索引号以后,--num_gpus
这个参数可以省略。这里用到了4块显卡。
给它执行权限。
chmod +x train.sh
然后后台执行:
nohup ./train.sh &
如果要查看执行情况:
tailf nohup.out
一些坑
Torch用的Cuda一般是11.7版本,如果不是,需要安装。同时,在执行命令前,使用module load CUDA/cuda-11.7
设置自己的环境变量。
你可以使用下面的代码查看自己的Torch用的cuda版本:
python
import torch
print(torch.__version__)
print(torch.cuda.is_available())
print(torch.cuda.device_count())
torch.version.cuda
某些GPU不支持BF16数据精度,需要使用FP16。
需要修改代码dolly/training/trainer.py
,将182行和183行改为:
fp16=True,
bf16=False,
第250行,改为:
@click.option("--bf16", type=bool, default=False, help="Whether to use bf16 (preferred on A100's).")
如果显卡的显存不够(通常来说至少需要单卡32G),则需要使用主存来优化,修改dolly/config/ds_z3_bf16_config.json
文件,在"zero_optimization",加入
"offload_optimizer": {
"device": "cpu",
"pin_memory": true
},
大佬的教程好详细啊
老师你好,第一张图中gcc问题,我使用gcc -v查看是8.3,但是运行时候还是会出现如第一张图的错误,请问如何处理啊?
@mmyin 是一模一样的错误吗?错误代码贴出来看看。
老师出视频吗
@啊啊啊 没考虑过出视频。
老师,我运行这个60亿的模型,使用了offload,但是节点的内存满了,以致于训练中止。
@deemo 是最后保存模型的时候终止的吗?还是训练过程中终止了?
@老杨 训练过程中终止的,在卸载参数时,内存炸了
@deemo 如果是使用了cpu的offload,那么gpu卡数越好,应该越不容易崩溃,因为占用内存会少一些。
减少gpu卡数,减少batch size会有所帮助。
@老杨 好的谢谢老师
老师,为什么我安装了依赖项 测试不通过呢
@deemo 报什么错?
@老杨 python 3.7的好像不行 升到3.8测试成功了
@deemo 好的。