我看网上的教程,都基本上可能他们自己都能调通,但是,很多细节都没有给出,包括决定成败的因素:机器之间的免密连接。
如果之前做过分布式集群搭建的,这肯定是难不倒他们的,但是对于一个普通的小白,如何从0到1去搭建多机多卡训练是个很大的难题,我也走了不少的坑,如果对大家有帮助请给一个小小的关注。
首先,实验环境,我选择的是阿里云的两台服务器,选择ECS服务器。
服务器的话,可以选择抢占式和按量付费,只是做做实验的话,建议是抢占式,费用要低很多,但是抢占式会有资源被挤掉的风险。网络和地区:在选择2台服务器的时候,我们要选择同一个地区,最好在同一个网段。
只是做实验的话,我们选择的是显存24g的入门基本的A10,同时不要确定使用的时长和设置单台机器的最高价格(资源价高者得)
我们选择ubuntu20.04的镜像,同时让阿里帮我们把cuda和cudnn装上,我装的是cuda12,一般是可以向下兼容,比如装pytorch1.1x- cuda11.7这种,但是如果cuda版本是11.7那就装不了,pytorch2.x -cuda12的版本。
血泪教训,有几次因为系统盘满了,然后没地方写入了,40g很不够用的如果是6B的模型,建议把40改到60-80。
这里的公网IP一定得勾上,不然本地没办法远程连接到阿里服务器上,把网速调快一点;
安全组就是你的阿里服务器给外界开的访问端口,ssh端口肯定得开,后续如果有什么端口需要使的话,也需要开(比如web应用)。我们将实例的名字改为node1(可以随便改),主机名改成node1(这个很重要)
最后随便给个资源组就行了,点击确认下单,就可以了。创建好后,我们来到这样的界面阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
ok第一步完成
以下的所有操作,两台机器都得做一遍,且,目录结构必须一致!!!!,我只写一台机器的操作。
由于我的conda环境已经搭好了,所以我不着重去讲,
只介绍一下大致的步骤,
第一步:将Anaconda3-2019.03-Linux-x86_64.sh下载到阿里云服务器上,然后chmod + x Anaconda3-2019.03-Linux-x86_64.sh,然后运行./Anaconda3-2019.03-Linux-x86_64.sh安装程序,Anaconda3-2019.03-Linux-x86_64.sh会默认安装在/root/anaconda3目录下
第二步:将miniconda3的bin目录配置到环境变量中,
vim /etc/profile.d/my_env.sh
#! /bin/bash
CONDA_HOME=/root/anaconda3
PATH=$CONDA_HOME/bin:$PAHT
source /etc/profile.d/my_env.sh
conda create -n llama_factory1 python=3.8.13
conda activate llama_factory1
然后安装pytorch
torch环境是torch1.13.1
pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116
pip install deepspeed
deepspeed使用的是pdsh进行的两天机器通信连接
所以我们还需要安装
apt install pdsh
使用的开源项目地址:GitHub - hiyouga/LLaMA-Factory: Easy-to-use LLM fine-tuning framework (LLaMA-2, BLOOM, Falcon, Baichuan, Qwen, ChatGLM2)
最后到项目目录
把requirments.txt里面的torch注释
然后
pip install -r requirements.txt
免密的原理,大概就是,你的电脑有我的公钥,那你的电脑访问我的电脑的时候,我的私钥就会判断你是否携带我的公钥,如果有,那就不需要密码了
因为我之前配过,所以存在公私钥
ssh-keygen
我们切换目录到
cd ~/.ssh 会发现有四个文件(第一次是三个)
我们将生成的钥匙拷贝到本机和另外的一台主机,为什么拷贝到本机,因为不拷贝到本机也是没办法免密登录本机的。
ssh-copy-id 120.24.71.136 #node1公网ip,私网ip也可以
ssh-copy-id 120.24.70.177 #node2公网ip,私网ip也可以
vim /etc/hosts
添加两行,红色的箭头是私网ip,写公网也可以。
环境准备完毕了。
首先创建deepspeed.json文件,并写入训练参数
"train_batch_size": "auto",
"train_micro_batch_size_per_gpu": "auto",
"gradient_accumulation_steps": "auto",
"gradient_clipping": "auto",
"zero_allow_untested_optimizer": true,
"fp16": {
"enabled": "auto",
"loss_scale": 0,
"initial_scale_power": 16,
"loss_scale_window": 1000,
"hysteresis": 2,
"min_loss_scale": 1
},
"zero_optimization": {
"stage": 2,
"allgather_partitions": true,
"allgather_bucket_size": 5e8,
"reduce_scatter": true,
"reduce_bucket_size": 5e8,
"overlap_comm": false,
"contiguous_gradients": true
}
}
然后创建一个myhostfile,写入主机的地址和每台机器用几张卡
vim myhostfile
node1 slots=1
node2 slots=1
最后运行muti_deepspeed_wt.sh文件,文件内容为
deepspeed --num_nodes=2 \ #有几台主机
--hostfile=myhostfile \ #所有主机的地址和卡的数量
src/train_bash.py \ #训练脚本
--deepspeed deepspeed.json \ #deepspeed的训练参数
--stage sft \
--model_name_or_path /root/workspace/LLaMA-Factory-main/model/chatglm2-6b-20230828 \ #预训练模型的权重路径
--do_train \
--dataset data1 \ #自己的数据集
--template chatglm2 \
--finetuning_type lora \
--lora_target query_key_value \
--output_dir /root/workspace/LLaMA-Factory-main/output-sft-1017 \ #保存路径
--overwrite_cache \
--per_device_train_batch_size 4 \
--gradient_accumulation_steps 4 \
--lr_scheduler_type cosine \
--logging_steps 10 \
--save_steps 10 \
--learning_rate 5e-5 \
--num_train_epochs 3.0 \
--plot_loss \
--fp16
可以看的已经有损失下降了。
修改defalut_config.yaml文件
compute_environment: LOCAL_MACHINE
downcast_bf16: 'no'
dynamo_config:
dynamo_backend: EAGER
dynamo_mode: default
dynamo_use_dynamic: true
dynamo_use_fullgraph: true
machine_rank: 0
main_process_ip: 172.16.1.69
main_process_port: 8011
main_training_function: main
num_machines: 2
num_processes: 2
rdzv_backend: static
same_network: true
tpu_env: []
tpu_use_cluster: false
tpu_use_sudo: false
use_cpu: false
修改mutil_test_wt.sh
accelerate launch --config_file /root/workspace/LLaMA-Factory-main/default_config.yaml src/train_bash.py \
--stage sft \
--model_name_or_path /root/workspace/LLaMA-Factory-main/model/chatglm2-6b-20230828 \
--do_train \
--dataset data1 \ #自己的数据集
--template chatglm2 \
--finetuning_type lora \
--lora_target query_key_value \
--output_dir ./output/chatglm2-6b-sft-accelerate-1018\
--overwrite_cache \
--per_device_train_batch_size 4 \
--gradient_accumulation_steps 1 \
--lr_scheduler_type cosine \
--logging_steps 10 \
--save_steps 10 \
--overwrite_output_dir True \
--learning_rate 5e-5 \
--num_train_epochs 3.0 \
--plot_loss \
--fp16
需要注意的是,我们需要同时在node1和node2运行mutil_test_wt.sh这个脚本。
有什么问题可以直接评论哦,看到会解答。