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/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
运行即可,运行时可以看到两个卡都被占用
用deepspeed的情况下报错处理:
-
可能会提示没有deepspeed这个库,pip install 一下即可
-
–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 Offload 和 Parameters 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. 优缺点总结
6. 典型应用场景
- 研究机构或公司:需要训练超大规模模型,但硬件预算有限。
- 超大模型训练:例如 GPT-3、BLOOM 等需要数十或上百亿参数的模型。
- 多用户环境:在资源共享场景下优化显存使用效率。
总结来说,DeepSpeed Offload 是一种灵活、高效的显存优化技术,通过卸载计算任务和数据到 CPU 或 NVMe,能够支持更大的模型训练,适应不同的硬件条件和需求。