> 技术文档 > LLama factory 单机多卡-简易版-教程

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

LLama factory 单机多卡-简易版-教程
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
LLama factory 单机多卡-简易版-教程

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/bashCUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.run --nproc_per_node=2 src/train.py\\ {复制网页端的配置}

就像这样

#!/bin/bashCUDA_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 

运行即可,运行时可以看到两个卡都被占用
LLama factory 单机多卡-简易版-教程

用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,能够支持更大的模型训练,适应不同的硬件条件和需求。