LLama factory 单机多卡-浅易版-教程
https://i-blog.csdnimg.cn/direct/59b9abf677ec42b9b3970497e96f6ec8.pnghttps://i-blog.csdnimg.cn/direct/c7a902d99c41467f8dcb526fd8427c8c.png
老规矩先贴官网代码:
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
https://i-blog.csdnimg.cn/direct/f0212a3e53db4107bd323093e5358dcf.png
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
运行即可,运行时可以看到两个卡都被占用
https://i-blog.csdnimg.cn/direct/45a0b74a0315417ba67805489c518f08.png
用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
}
}
错误日记
: Input should be a valid integer, got a number with a fractional part
要任意改成整数
{
"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. 优缺点总结
功能优点缺点Optimizer Offload减少显存占用,适合较大的模子训练增加 CPU 盘算负载,I/O 速率可能成为瓶颈Parameters Offload能训练超大模子,突破显存限制NVMe 的访问速率较 GPU 慢,可能增加训练延长 6. 典型应用场景
[*]研究机构或公司:需要训练超大规模模子,但硬件预算有限。
[*]超大模子训练:例如 GPT-3、BLOOM 等需要数十或上百亿参数的模子。
[*]多用户环境:在资源共享场景下优化显存使用服从。
总结来说,DeepSpeed Offload 是一种机动、高效的显存优化技术,通过卸载盘算任务和数据到 CPU 或 NVMe,可以或许支持更大的模子训练,顺应不同的硬件条件和需求。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]