老规矩先贴官网代码:
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的环境下报错处理:
- 可能会提示没有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. 优缺点总结
功能优点缺点Optimizer Offload减少显存占用,适合较大的模子训练增加 CPU 盘算负载,I/O 速率可能成为瓶颈Parameters Offload能训练超大模子,突破显存限制NVMe 的访问速率较 GPU 慢,可能增加训练延长 6. 典型应用场景
- 研究机构或公司:需要训练超大规模模子,但硬件预算有限。
- 超大模子训练:例如 GPT-3、BLOOM 等需要数十或上百亿参数的模子。
- 多用户环境:在资源共享场景下优化显存使用服从。
总结来说,DeepSpeed Offload 是一种机动、高效的显存优化技术,通过卸载盘算任务和数据到 CPU 或 NVMe,可以或许支持更大的模子训练,顺应不同的硬件条件和需求。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |