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

打印 上一主题 下一主题

主题 970|帖子 970|积分 2912



老规矩先贴官网代码:

   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服务起起来

  1. CUDA_VISIBLE_DEVICES=0 GRADIO_SHARE=1 llamafactory-cli webui
复制代码

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

声明llama3-8b-instruct不支持deepspeed不要轻易实验不然debug就是一整天,这个deepspeed不消选!!!
deepspeed stage

   offload操作同理
  此时预览训练下令行不在这里运行,网页端无法实现单机多卡!
  1. llamafactory-cli train \
  2.     --stage sft \
  3.     --do_train True \
  4.     --model_name_or_path {模型地址} \
  5.     --preprocessing_num_workers 16 \
  6.     --finetuning_type lora \
  7.     --template llama3 \
  8.     --flash_attn auto \
  9.     --dataset_dir data \
  10.     --dataset {训练集} \
  11.     --cutoff_len 1024 \
  12.     --learning_rate 5e-05 \
  13.     --num_train_epochs 3.0 \
  14.     --max_samples 100000 \
  15.     --per_device_train_batch_size 2 \
  16.     --gradient_accumulation_steps 8 \
  17.     --lr_scheduler_type cosine \
  18.     --max_grad_norm 1.0 \
  19.     --logging_steps 5 \
  20.     --save_steps 100 \
  21.     --warmup_steps 0 \
  22.     --optim adamw_torch \
  23.     --packing False \
  24.     --report_to all \
  25.     --output_dir {输出路径} \
  26.     --bf16 True \
  27.     --plot_loss True \
  28.     --ddp_timeout 180000000 \
  29.     --include_num_input_tokens_seen True \
  30.     --lora_rank 8 \
  31.     --lora_alpha 16 \
  32.     --lora_dropout 0 \
  33.     --lora_target all \
  34.     --deepspeed cache/ds_z3_config.json
复制代码
Step3:打开bash,启动虚拟环境,粘贴以下下令

  1. #!/bin/bash
  2. CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.run --nproc_per_node=2 src/train.py\
  3.     {复制网页端的配置}
复制代码
就像这样
  1. #!/bin/bash
  2. CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.run --nproc_per_node=2 src/train.py\
  3.     --stage sft \
  4.     --do_train True \
  5.     --model_name_or_path {模型路径} \
  6.     --preprocessing_num_workers 16 \
  7.     --finetuning_type lora \
  8.     --template llama3 \
  9.     --flash_attn auto \
  10.     --dataset_dir data \
  11.     --dataset {数据集} \
  12.     --cutoff_len 1024 \
  13.     --learning_rate 5e-05 \
  14.     --num_train_epochs 3.0 \
  15.     --max_samples 100000 \
  16.     --per_device_train_batch_size 2 \
  17.     --gradient_accumulation_steps 8 \
  18.     --lr_scheduler_type cosine \
  19.     --max_grad_norm 1.0 \
  20.     --logging_steps 5 \
  21.     --save_steps 100 \
  22.     --warmup_steps 0 \
  23.     --optim adamw_torch \
  24.     --packing False \
  25.     --report_to all \
  26.     --output_dir {输出路径} \
  27.     --bf16 True \
  28.     --plot_loss True \
  29.     --ddp_timeout 180000000 \
  30.     --include_num_input_tokens_seen True \
  31.     --lora_rank 8 \
  32.     --lora_alpha 16 \
  33.     --lora_dropout 0 \
  34.     --lora_target all
复制代码
运行即可,运行时可以看到两个卡都被占用

用deepspeed的环境下报错处理:


  • 可能会提示没有deepspeed这个库,pip install 一下即可
  • –deepspeed cache/ds_z3_config.json 这句话很可能会引起报错


  • 不是全部的模子都支持deepspeed3!!
    报错
  1. 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替换成整数值
  1. {
  2.   "train_batch_size": "auto",
  3.   "train_micro_batch_size_per_gpu": "auto",
  4.   "gradient_accumulation_steps": "auto",
  5.   "gradient_clipping": "auto",
  6.   "zero_allow_untested_optimizer": true,
  7.   "fp16": {
  8.     "enabled": "auto",
  9.     "loss_scale": 0,
  10.     "loss_scale_window": 1000,
  11.     "initial_scale_power": 16,
  12.     "hysteresis": 2,
  13.     "min_loss_scale": 1
  14.   },
  15.   "bf16": {
  16.     "enabled": "auto"
  17.   },
  18.   "zero_optimization": {
  19.     "stage": 3,
  20.     "overlap_comm": true,
  21.     "contiguous_gradients": true,
  22.     "sub_group_size": 1e9,
  23.     "reduce_bucket_size": "auto",
  24.     "stage3_prefetch_bucket_size": "auto",
  25.     "stage3_param_persistence_threshold": "auto",
  26.     "stage3_max_live_parameters": 1e9,
  27.     "stage3_max_reuse_distance": 1e9,
  28.     "stage3_gather_16bit_weights_on_model_save": true
  29.   }
  30. }
复制代码
错误日记
  1. [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]
复制代码
要任意改成整数
  1. {
  2.   "train_batch_size": "auto",
  3.   "train_micro_batch_size_per_gpu": "auto",
  4.   "gradient_accumulation_steps": "auto",
  5.   "gradient_clipping": "auto",
  6.   "zero_allow_untested_optimizer": true,
  7.   "fp16": {
  8.     "enabled": "auto",
  9.     "loss_scale": 0,
  10.     "loss_scale_window": 1000,
  11.     "initial_scale_power": 16,
  12.     "hysteresis": 2,
  13.     "min_loss_scale": 1
  14.   },
  15.   "bf16": {
  16.     "enabled": "auto"
  17.   },
  18.   "zero_optimization": {
  19.     "stage": 3,
  20.     "overlap_comm": true,
  21.     "contiguous_gradients": true,
  22.     "sub_group_size": 1000000000,
  23.     "reduce_bucket_size": 500000000,
  24.     "stage3_prefetch_bucket_size": 500000000,
  25.     "stage3_param_persistence_threshold": 1000000,
  26.     "stage3_max_live_parameters": 1000000000,
  27.     "stage3_max_reuse_distance": 1000000000,
  28.     "stage3_gather_16bit_weights_on_model_save": true
  29.   }
  30.   }
  31. }
复制代码
  增补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 示例

  1. "zero_optimization": {
  2.     "stage": 2,
  3.     "offload_optimizer": {
  4.         "device": "cpu",  // 将优化器状态卸载到 CPU
  5.         "pin_memory": true  // 启用内存锁定以提高效率
  6.     },
  7.     "overlap_comm": true,
  8.     "reduce_bucket_size": 5e8
  9. }
复制代码
Parameters Offload 示例

  1. "zero_optimization": {
  2.     "stage": 3,
  3.     "offload_param": {
  4.         "device": "nvme",  // 将模型参数卸载到 NVMe
  5.         "pin_memory": true,
  6.         "buffer_count": 4,  // 用于缓冲的内存块数
  7.         "buffer_size": 1e8  // 每个缓冲区的大小
  8.     },
  9.     "stage3_param_persistence_threshold": 1e6
  10. }
复制代码

5. 优缺点总结

功能优点缺点Optimizer Offload减少显存占用,适合较大的模子训练增加 CPU 盘算负载,I/O 速率可能成为瓶颈Parameters Offload能训练超大模子,突破显存限制NVMe 的访问速率较 GPU 慢,可能增加训练延长
6. 典型应用场景



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

总结来说,DeepSpeed Offload 是一种机动、高效的显存优化技术,通过卸载盘算任务和数据到 CPU 或 NVMe,可以或许支持更大的模子训练,顺应不同的硬件条件和需求。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

拉不拉稀肚拉稀

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表