LLama factory 单机多卡-简易版-教程

在这里插入图片描述
在这里插入图片描述

老规矩先贴官网代码:

https://github.com/hiyouga/LLaMA-Factory/blob/main/examples/README_zh.md

但是我还是没有根据这个命令跑出来,所以还是上其他方法把,有简单的就用

背景知识补充:

LLama factory 多卡 ZeRO-3 、ZeRO-2、 ZeRO-0什么意思?以及为什么没有ZeRO1

【深度学习】多卡训练__单机多GPU方法详解(torch.nn.DataParallel、torch.distributed)


Step1:先把webUI服务起起来

CUDA_VISIBLE_DEVICES=0 GRADIO_SHARE=1 llamafactory-cli webui

Step2:在webUI上配置好你的模型、数据集、输出文件夹、(可选wandb见之前的帖子)

声明llama3-8b-instruct不支持deepspeed不要轻易尝试不然debug就是一整天,这个deepspeed不用选!!!
deepspeed stage
在这里插入图片描述

offload操作同理

此时预览训练命令行不在这里运行,网页端无法实现单机多卡!

llamafactory-cli train \
    --stage sft \
    --do_train True \
    --model_name_or_path {模型地址} \
    --preprocessing_num_workers 16 \
    --finetuning_type lora \
    --template llama3 \
    --flash_attn auto \
    --dataset_dir data \
    --dataset {训练集} \
    --cutoff_len 1024 \
    --learning_rate 5e-05 \
    --num_train_epochs 3.0 \
    --max_samples 100000 \
    --per_device_train_batch_size 2 \
    --gradient_accumulation_steps 8 \
    --lr_scheduler_type cosine \
    --max_grad_norm 1.0 \
    --logging_steps 5 \
    --save_steps 100 \
    --warmup_steps 0 \
    --optim adamw_torch \
    --packing False \
    --report_to all \
    --output_dir {输出路径} \
    --bf16 True \
    --plot_loss True \
    --ddp_timeout 180000000 \
    --include_num_input_tokens_seen True \
    --lora_rank 8 \
    --lora_alpha 16 \
    --lora_dropout 0 \
    --lora_target all \
    --deepspeed cache/ds_z3_config.json

Step3:打开bash,启动虚拟环境,粘贴以下命令

#!/bin/bash
CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.run --nproc_per_node=2 src/train.py\
    {复制网页端的配置}

就像这样

#!/bin/bash
CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.run --nproc_per_node=2 src/train.py\
    --stage sft \
    --do_train True \
    --model_name_or_path {模型路径} \
    --preprocessing_num_workers 16 \
    --finetuning_type lora \
    --template llama3 \
    --flash_attn auto \
    --dataset_dir data \
    --dataset {数据集} \
    --cutoff_len 1024 \
    --learning_rate 5e-05 \
    --num_train_epochs 3.0 \
    --max_samples 100000 \
    --per_device_train_batch_size 2 \
    --gradient_accumulation_steps 8 \
    --lr_scheduler_type cosine \
    --max_grad_norm 1.0 \
    --logging_steps 5 \
    --save_steps 100 \
    --warmup_steps 0 \
    --optim adamw_torch \
    --packing False \
    --report_to all \
    --output_dir {输出路径} \
    --bf16 True \
    --plot_loss True \
    --ddp_timeout 180000000 \
    --include_num_input_tokens_seen True \
    --lora_rank 8 \
    --lora_alpha 16 \
    --lora_dropout 0 \
    --lora_target all 

运行即可,运行时可以看到两个卡都被占用
在这里插入图片描述

用deepspeed的情况下报错处理:

  1. 可能会提示没有deepspeed这个库,pip install 一下即可

  2. –deepspeed cache/ds_z3_config.json 这句话很可能会引起报错

  • 不是所有的模型都支持deepspeed3!!
    报错
AssertionError: no_sync context manager is incompatible with gradient partitioning logic of ZeRO stage 3

这个错误表明你当前的配置存在冲突:
你正在使用 DeepSpeed ZeRO stage 3 优化
同时代码尝试使用 no_sync context manager 进行梯度累积
这两个功能是不兼容的,因为:
ZeRO stage 3 会对梯度进行分区处理
而 no_sync 管理器试图阻止梯度同步,这与 ZeRO stage 3 的工作方式冲突
解决方案:
1.修改 DeepSpeed 配置,使用较低的 ZeRO stage (比如 stage 2 或 1)
2.或者调整训练参数,避免使用梯度累积(gradient accumulation):

  • examples/deepspeed/ds_z3_config.json这个文件的配置坑很多,有时候需要把auto替换成整数值
{
  "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,
    "loss_scale_window": 1000,
    "initial_scale_power": 16,
    "hysteresis": 2,
    "min_loss_scale": 1
  },
  "bf16": {
    "enabled": "auto"
  },
  "zero_optimization": {
    "stage": 3,
    "overlap_comm": true,
    "contiguous_gradients": true,
    "sub_group_size": 1e9,
    "reduce_bucket_size": "auto",
    "stage3_prefetch_bucket_size": "auto",
    "stage3_param_persistence_threshold": "auto",
    "stage3_max_live_parameters": 1e9,
    "stage3_max_reuse_distance": 1e9,
    "stage3_gather_16bit_weights_on_model_save": true
  }
}

错误日志

[rank0]:   Input should be a valid integer, got a number with a fractional part [type=int_from_float, input_value=15099494.4, input_type=float]

要随便改成整数

{
  "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,
    "loss_scale_window": 1000,
    "initial_scale_power": 16,
    "hysteresis": 2,
    "min_loss_scale": 1
  },
  "bf16": {
    "enabled": "auto"
  },
  "zero_optimization": {
    "stage": 3,
    "overlap_comm": true,
    "contiguous_gradients": true,
    "sub_group_size": 1000000000,
    "reduce_bucket_size": 500000000,
    "stage3_prefetch_bucket_size": 500000000,
    "stage3_param_persistence_threshold": 1000000,
    "stage3_max_live_parameters": 1000000000,
    "stage3_max_reuse_distance": 1000000000,
    "stage3_gather_16bit_weights_on_model_save": true
  }
  }
}

补充offload是干嘛的:

DeepSpeed Offload 是一种技术,用于在训练大规模深度学习模型时,将部分计算任务或数据从 GPU 卸载到 CPU 或 NVMe 存储设备,从而缓解显存压力,优化资源利用。它主要包含两种类型:Optimizer OffloadParameters Offload

以下是详细说明:


1. 为什么需要 Offload?

训练大型模型(如 GPT-3 或其他数十亿参数的模型)时,显存可能成为瓶颈。即使使用分布式策略,显存需求仍可能超出硬件的限制。

Offload 技术通过将部分模型的状态或计算从显存转移到更大的主机内存(CPU RAM)或高速存储设备(NVMe),有效降低 GPU 显存占用,同时兼顾性能。


2. DeepSpeed Offload 的两种类型

(1) Optimizer Offload
  • 功能:将优化器的状态(如动量、二阶动量等)和梯度计算任务从 GPU 卸载到 CPU。
  • 优点
    • 显著减少 GPU 显存占用。
    • 适用于需要训练超大模型但 GPU 显存不足的情况。
  • 缺点
    • 由于 CPU 的内存带宽和计算能力低于 GPU,性能可能受到影响,尤其是在高算力需求的任务中。
  • 适用场景:显存有限但有足够的 CPU 计算能力和内存。
(2) Parameters Offload
  • 功能:将模型的参数从 GPU 显存卸载到 CPU 或 NVMe。
  • 优点
    • 大幅减少显存占用,使得更大的模型可以被加载和训练。
    • 在 NVMe 的支持下,理论上可以训练任意大小的模型。
  • 缺点
    • 依赖 CPU 内存或 NVMe 的访问速度,可能会增加训练的延迟。
    • 需要高性能 NVMe 和 I/O 设计,才能确保不会显著降低训练效率。
  • 适用场景:极大模型(如 100B+ 参数模型)训练,GPU 显存远远不足。

3. DeepSpeed Offload 的实际工作原理

数据转移
  • 优化器状态或参数被拆分后,根据配置,在 GPU 和 CPU 或 NVMe 之间进行动态转移。
  • I/O 操作和计算任务通过异步方式进行,以减少训练过程中的等待时间。
性能优化
  • DeepSpeed 使用高效的通信技术和内存管理策略(如 pipelining 和分块处理)来最小化数据传输的开销。

4. 配置示例

以下是典型的 DeepSpeed Offload 配置文件:

Optimizer Offload 示例
"zero_optimization": {
    "stage": 2,
    "offload_optimizer": {
        "device": "cpu",  // 将优化器状态卸载到 CPU
        "pin_memory": true  // 启用内存锁定以提高效率
    },
    "overlap_comm": true,
    "reduce_bucket_size": 5e8
}
Parameters Offload 示例
"zero_optimization": {
    "stage": 3,
    "offload_param": {
        "device": "nvme",  // 将模型参数卸载到 NVMe
        "pin_memory": true,
        "buffer_count": 4,  // 用于缓冲的内存块数
        "buffer_size": 1e8  // 每个缓冲区的大小
    },
    "stage3_param_persistence_threshold": 1e6
}

5. 优缺点总结

功能优点缺点
Optimizer Offload减少显存占用,适合较大的模型训练增加 CPU 计算负载,I/O 速度可能成为瓶颈
Parameters Offload能训练超大模型,突破显存限制NVMe 的访问速度较 GPU 慢,可能增加训练延迟

6. 典型应用场景

  • 研究机构或公司:需要训练超大规模模型,但硬件预算有限。
  • 超大模型训练:例如 GPT-3、BLOOM 等需要数十或上百亿参数的模型。
  • 多用户环境:在资源共享场景下优化显存使用效率。

总结来说,DeepSpeed Offload 是一种灵活、高效的显存优化技术,通过卸载计算任务和数据到 CPU 或 NVMe,能够支持更大的模型训练,适应不同的硬件条件和需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值