保姆级LLM训练教程:阿里云平台使用accelerate,deepspeed多机多卡训练Chatglm2-6B

本文详细描述了如何在阿里云ECS上搭建多机多卡训练环境,涉及选择服务器、配置环境变量、安装conda、创建conda环境、配置SSH免密连接以及使用deepspeed进行分布式训练的过程,对小白用户非常实用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我看网上的教程,都基本上可能他们自己都能调通,但是,很多细节都没有给出,包括决定成败的因素:机器之间的免密连接。

如果之前做过分布式集群搭建的,这肯定是难不倒他们的,但是对于一个普通的小白,如何从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(这个很重要)

最后随便给个资源组就行了,点击确认下单,就可以了。创建好后,我们来到这样的界面阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

我们通过公网ip远程连接到服务器

ok第一步完成

第二步,配置本地的conda环境

以下的所有操作,两台机器都得做一遍,且,目录结构必须一致!!!!,我只写一台机器的操作。

安装conda,配置环境变量

由于我的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的虚拟环境

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免密连接

免密的原理,大概就是,你的电脑有我的公钥,那你的电脑访问我的电脑的时候,我的私钥就会判断你是否携带我的公钥,如果有,那就不需要密码了

因为我之前配过,所以存在公私钥

ssh-keygen 

 我们切换目录到

cd ~/.ssh 会发现有四个文件(第一次是三个)

我们将生成的钥匙拷贝到本机和另外的一台主机,为什么拷贝到本机,因为不拷贝到本机也是没办法免密登录本机的。

ssh-copy-id  120.24.71.136 #node1公网ip,私网ip也可以

ssh-copy-id  120.24.70.177 #node2公网ip,私网ip也可以

配置主机名和ip的映射

vim /etc/hosts

 

添加两行,红色的箭头是私网ip,写公网也可以。

环境准备完毕了。

deepspeed的多机多卡的分布式训练

首先创建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
 

 

可以看的已经有损失下降了。

 使用accelerate分布式多机多卡

修改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这个脚本。

有什么问题可以直接评论哦,看到会解答。

### 使用 DeepSpeed 进行单训练 ChatGLM 模型 #### 配置文件设置 对于使用 DeepSpeed 训练大型语言模型LLMs),配置文件至关重要。通常情况下,DeepSpeed 的配置通过 JSON 文件指定。下面是一个适用于 ChatGLM 模型的典型 DeepSpeed 配置文件 `ds_config.json`: ```json { "fp16": { "enabled": true, "loss_scale": 0, "initial_scale_power": 32, "loss_scale_window": 1000, "hysteresis": 2, "min_loss_scale": 1 }, "optimizer": { "type": "AdamW", "params": { "lr": 5e-5, "betas": [0.9, 0.999], "eps": 1e-8, "weight_decay": 0.01 } }, "scheduler": { "type": "WarmupLR", "params": { "warmup_min_lr": 0, "warmup_max_lr": 5e-5, "warmup_num_steps": 500 } }, "zero_optimization": { "stage": 2, "allgather_partitions": true, "allgather_bucket_size": 2e8, "reduce_scatter": true, "reduce_bucket_size": 2e8, "overlap_comm": true, "load_from_fp32_weights": true, "cpu_offload": false }, "gradient_accumulation_steps": 1, "steps_per_print": 2000, "wall_clock_breakdown": false } ``` 此配置启用了 FP16 和 ZeRO stage 2 来优化内存效率和加速训练过程[^1]。 #### 启动命令 要利用 DeepSpeed 执行单训练,可以采用如下 bash 脚本启动训练任务。假设已经准备好了上述提到的 `ds_config.json` 文件以及必要的 Python 环境,则可以通过以下方式启动训练: ```bash #!/bin/bash set -ex export PYTHONPATH=$PYTHONPATH:/path/to/your/project/ export DEEPSPEED=1 torchrun \ --nnodes=1 \ --nproc_per_node=4 \ # 假设每台器有四个 GPU 可用 /path/to/fine_tune.py \ --deepspeed \ --deepspeed_config=/path/to/ds_config.json \ --model_name_or_path=chatglm-model-path \ --output_dir=output_directory \ --train_file=train_data_path \ --validation_file=val_data_path \ --do_train \ --per_device_train_batch_size=4 \ --learning_rate=5e-5 \ --num_train_epochs=3 \ --save_strategy="epoch" ``` 这段脚本同样遵循了良好的实践习惯,在遇到错误时会自动终止,并且显示执行过的每一行命令以便于调试[^3]。 #### 常见问题解决方法 当尝试使用 DeepSpeedLLMChatGLM 进行微调时可能会碰到一些挑战或障碍。以下是几个常见的解决方案: - **显存不足**:如果发现显存在训练过程中耗尽,考虑调整 batch size 或者启用更高别的 Zero Redundancy Optimizer (ZeRO),即增加 `"zero_optimization.stage"` 参数至更高的数值。 - **性能瓶颈**:若观察到 I/O 成为性能瓶颈,可探索异步加载数据集的方法或是提高读取速度的数据预处理技术;另外也可以适当减少日志记录频率以减轻磁盘压力。 - **通信延迟过高**:针对跨个 GPU 协同工作的场景下可能出现较高的网络通讯开销问题,建议检查集群内部网路状况确保其稳定高效运作的同时合理规划节点间连接拓扑结构。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值