Upload ms-swift/docs/source/Instruction/Megatron-SWIFT训练.md with huggingface_hub
Browse files
ms-swift/docs/source/Instruction/Megatron-SWIFT训练.md
ADDED
|
@@ -0,0 +1,245 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
# Megatron-SWIFT训练
|
| 3 |
+
|
| 4 |
+
SWIFT引入了Megatron的并行技术来加速大模型的训练,包括数据并行、张量并行、流水线并行、序列并行,上下文并行。支持Megatron训练的模型可以参考[支持的模型与数据集文档](./支持的模型和数据集.md)。
|
| 5 |
+
|
| 6 |
+
## 环境准备
|
| 7 |
+
使用Megatron-SWIFT,除了安装swift依赖外,还需要安装以下内容:
|
| 8 |
+
|
| 9 |
+
```shell
|
| 10 |
+
pip install pybind11
|
| 11 |
+
# transformer_engine
|
| 12 |
+
# 若出现安装错误,可以参考该issue解决: https://github.com/modelscope/ms-swift/issues/3793
|
| 13 |
+
pip install git+https://github.com/NVIDIA/TransformerEngine.git@stable
|
| 14 |
+
|
| 15 |
+
# apex
|
| 16 |
+
git clone https://github.com/NVIDIA/apex
|
| 17 |
+
cd apex
|
| 18 |
+
pip install -v --disable-pip-version-check --no-cache-dir --no-build-isolation --config-settings "--build-option=--cpp_ext" --config-settings "--build-option=--cuda_ext" ./
|
| 19 |
+
```
|
| 20 |
+
|
| 21 |
+
或者你也可以使用镜像:
|
| 22 |
+
```
|
| 23 |
+
modelscope-registry.cn-hangzhou.cr.aliyuncs.com/modelscope-repo/modelscope:ubuntu22.04-cuda12.4.0-py311-torch2.6.0-vllm0.8.3-modelscope1.25.0-swift3.3.0.post1
|
| 24 |
+
modelscope-registry.us-west-1.cr.aliyuncs.com/modelscope-repo/modelscope:ubuntu22.04-cuda12.4.0-py311-torch2.6.0-vllm0.8.3-modelscope1.25.0-swift3.3.0.post1
|
| 25 |
+
```
|
| 26 |
+
|
| 27 |
+
依赖库Megatron-LM将会由swift进行git clone并安装,不需要用户手动安装。你也可以通过环境变量`MEGATRON_LM_PATH`指向已经下载好的repo路径(断网环境,[core_r0.11.0分支](https://github.com/NVIDIA/Megatron-LM/tree/core_r0.11.0))。
|
| 28 |
+
|
| 29 |
+
|
| 30 |
+
## 快速入门案例
|
| 31 |
+
|
| 32 |
+
这里介绍使用2卡80GiB A100对Qwen2.5-7B-Instruct模型进行自我认知微调的快速入门案例,以下最佳实践可以在10分钟内完成。
|
| 33 |
+
|
| 34 |
+
首先,我们需要将HF格式的权重转为Megatron格式:
|
| 35 |
+
```shell
|
| 36 |
+
CUDA_VISIBLE_DEVICES=0 \
|
| 37 |
+
swift export \
|
| 38 |
+
--model Qwen/Qwen2.5-7B-Instruct \
|
| 39 |
+
--to_mcore true \
|
| 40 |
+
--torch_dtype bfloat16 \
|
| 41 |
+
--test_convert_precision true \
|
| 42 |
+
--output_dir Qwen2.5-7B-Instruct-mcore
|
| 43 |
+
```
|
| 44 |
+
- 注意:若出现OOM,请将`--test_convert_precision true`参数去除
|
| 45 |
+
|
| 46 |
+
然后,使用以下脚本进行训练,训练所需显存资源为2*80GiB:
|
| 47 |
+
```shell
|
| 48 |
+
NPROC_PER_NODE=2 \
|
| 49 |
+
CUDA_VISIBLE_DEVICES=0,1 \
|
| 50 |
+
megatron sft \
|
| 51 |
+
--load Qwen2.5-7B-Instruct-mcore \
|
| 52 |
+
--dataset 'AI-ModelScope/alpaca-gpt4-data-zh#500' \
|
| 53 |
+
'AI-ModelScope/alpaca-gpt4-data-en#500' \
|
| 54 |
+
'swift/self-cognition#500' \
|
| 55 |
+
--tensor_model_parallel_size 2 \
|
| 56 |
+
--micro_batch_size 4 \
|
| 57 |
+
--global_batch_size 16 \
|
| 58 |
+
--recompute_granularity selective \
|
| 59 |
+
--train_iters 100 \
|
| 60 |
+
--eval_iters 5 \
|
| 61 |
+
--finetune true \
|
| 62 |
+
--cross_entropy_loss_fusion true \
|
| 63 |
+
--lr 1e-5 \
|
| 64 |
+
--lr_warmup_iters 10 \
|
| 65 |
+
--min_lr 1e-6 \
|
| 66 |
+
--save megatron_output/Qwen2.5-7B-Instruct \
|
| 67 |
+
--save_interval 100 \
|
| 68 |
+
--max_length 2048 \
|
| 69 |
+
--system 'You are a helpful assistant.' \
|
| 70 |
+
--num_workers 4 \
|
| 71 |
+
--no_save_optim true \
|
| 72 |
+
--no_save_rng true \
|
| 73 |
+
--dataset_num_proc 4 \
|
| 74 |
+
--model_author swift \
|
| 75 |
+
--model_name swift-robot
|
| 76 |
+
```
|
| 77 |
+
|
| 78 |
+
最后,将Megatron格式权重转为HF格式:
|
| 79 |
+
```shell
|
| 80 |
+
CUDA_VISIBLE_DEVICES=0 \
|
| 81 |
+
swift export \
|
| 82 |
+
--mcore_model megatron_output/Qwen2.5-7B-Instruct/vx-xxx \
|
| 83 |
+
--to_hf true \
|
| 84 |
+
--torch_dtype bfloat16 \
|
| 85 |
+
--test_convert_precision true \
|
| 86 |
+
--output_dir megatron_output/Qwen2.5-7B-Instruct/vx-xxx-hf
|
| 87 |
+
```
|
| 88 |
+
|
| 89 |
+
我们对生成的HF格式权重进行推理:
|
| 90 |
+
```shell
|
| 91 |
+
CUDA_VISIBLE_DEVICES=0 \
|
| 92 |
+
swift infer \
|
| 93 |
+
--model megatron_output/Qwen2.5-7B-Instruct/vx-xxx-hf \
|
| 94 |
+
--stream true \
|
| 95 |
+
--temperature 0 \
|
| 96 |
+
--max_new_tokens 2048
|
| 97 |
+
```
|
| 98 |
+
|
| 99 |
+
推理结果如下:
|
| 100 |
+
```
|
| 101 |
+
<<< who are you?
|
| 102 |
+
I am a language model developed by swift, you can call me swift-robot. How can I assist you?
|
| 103 |
+
```
|
| 104 |
+
|
| 105 |
+
- 更多案例:例如packing、多机,可以查看[这里](https://github.com/modelscope/ms-swift/tree/main/examples/train/megatron)。
|
| 106 |
+
- 若要进行预训练,你可以使用`megatron pt`替代`megatron sft`,这将会使用生成式的template进行训练。
|
| 107 |
+
|
| 108 |
+
## Benchmark
|
| 109 |
+
|
| 110 |
+
使用`megatron sft`和`swift sft`在单机八卡A800环境下进行14B模型全参数训练的速度对比如下,对应脚本参考[这里](https://github.com/modelscope/ms-swift/tree/main/examples/train/megatron/benchmark)。
|
| 111 |
+
|
| 112 |
+
| | Megatron-LM | Deepspeed-ZeRO2 | Deepspeed-ZeRO3 |
|
| 113 |
+
| -------- | ----------- | ---------- | ---------- |
|
| 114 |
+
| 训练速度 | 9.04s/it | 10.32s/it | 10.56s/it |
|
| 115 |
+
| 显存占用 | 8\*64GB | 8\*80GB | 8\*58GB |
|
| 116 |
+
|
| 117 |
+
|
| 118 |
+
## 命令行参数
|
| 119 |
+
|
| 120 |
+
### Megatron参数
|
| 121 |
+
|
| 122 |
+
|
| 123 |
+
**训练参数**:
|
| 124 |
+
- 🔥micro_batch_size: 每个device的批次大小,默认为1。
|
| 125 |
+
- 🔥global_batch_size: 总批次大小,等价于`micro_batch_size*数据并行大小*梯度累加步数`。默认为16。
|
| 126 |
+
- 🔥recompute_granularity: 重新计算激活的粒度,可选项为'full', 'selective'。其中full代表重新计算整个transformer layer,selective代表只计算transformer layer中的核心注意力部分。通常'selective'是推荐的。默认为'selective'。
|
| 127 |
+
- recompute_method: 该参数需将recompute_granularity设置为'full'才生效,可选项为'uniform', 'block'。默认为None。
|
| 128 |
+
- recompute_num_layers: 该参数需将recompute_granularity设置为'full'才生效,默认为None。若`recompute_method`设置为uniform,该参数含义为每个均匀划分的重新计算单元的transformer layers数量。例如你可以指定为`--recompute_granularity full --recompute_method uniform --recompute_num_layers 4`。recompute_num_layers越大,显存占用越小,计算成本越大。默认为None。
|
| 129 |
+
- deterministic_mode: 确定性模式,这会导致训练速度下降,默认为False。
|
| 130 |
+
- 🔥train_iters: 训练的总迭代次数,默认为None。
|
| 131 |
+
- 🔥log_interval: log的时间间隔(单位:iters),默认为5。
|
| 132 |
+
- tensorboard_dir: tensorboard日志写入的目录。默认None,即存储在`f'{save}/runs'`目录下。
|
| 133 |
+
- no_masked_softmax_fusion: 默认为False。用于禁用query_key_value的scaling, masking, and softmax融合。
|
| 134 |
+
- no_bias_dropout_fusion: 默认为False。用于禁用bias和dropout的融合。
|
| 135 |
+
- no_bias_swiglu_fusion: 默认为False。指定`--no_bias_dropout_fusion true`,用于禁止bias和swiglu融合。
|
| 136 |
+
- no_rope_fusion: 默认为False。指定`--no_rope_fusion true`用于禁止rope融合。
|
| 137 |
+
- no_gradient_accumulation_fusion: 默认为False。指定`--no_gradient_accumulation_fusion true`用于禁用梯度累加融合。
|
| 138 |
+
- 🔥cross_entropy_loss_fusion: 启动交叉熵损失计算融合。默认为False。
|
| 139 |
+
- 🔥use_flash_attn: 使用 FlashAttention 注意力机制实现,默认为False。
|
| 140 |
+
- optimizer: 优化器类型,可选为'adam'、'sgd'。默认为adam。
|
| 141 |
+
- dataloader_type: 默认为'cyclic',可选为'single', 'cyclic', 'external'。若开启`--streaming`,则设置为`external`。
|
| 142 |
+
- manual_gc: 禁用默认垃圾回收器,手动触发垃圾回收。默认为False。
|
| 143 |
+
- manual_gc_interval: 触发垃圾回收的间隔。默认为0。
|
| 144 |
+
- seed: python、numpy、pytorch和cuda的随机种子,默认为42。
|
| 145 |
+
- 🔥num_workers: dataloder的workers数量,默认为4。
|
| 146 |
+
- seq_length: 默认为None,即设置为`max_length`。对数据集长度进行限制请使用基本参数中的`--max_length`控制,无需设置此参数。
|
| 147 |
+
- use_cpu_initialization: 在cpu上初始化权重,默认为False。在进行HF和MCore权重转换时会被使用。
|
| 148 |
+
- no_create_attention_mask_in_dataloader: 在dataloader中不创建attention mask,默认为True。
|
| 149 |
+
|
| 150 |
+
|
| 151 |
+
**学习率参数**:
|
| 152 |
+
- 🔥lr: 初始学习率,最终会根据学习率预热策略和衰减策略决定每个迭代的学习率,默认为1e-5。
|
| 153 |
+
- lr_decay_style: 学习率衰减策略,默认为'cosine'。通常设置为'cosine', 'linear', 'constant'。
|
| 154 |
+
- 🔥lr_decay_iters: 学习率衰减的迭代次数。默认为None,则设置为`--train_iters`。
|
| 155 |
+
- 🔥lr_warmup_iters: 线性学习率预热的迭代次数,默认为0。
|
| 156 |
+
- 🔥min_lr: 学习率的最小值,将低于改阈值的学习率裁剪为该值,默认为0。
|
| 157 |
+
|
| 158 |
+
**正则化参数**:
|
| 159 |
+
- 🔥weight_decay: 默认为0.1。
|
| 160 |
+
- 🔥clip_grad: l2梯度裁剪,默认为1.0。
|
| 161 |
+
- adam_beta1: 默认0.9。
|
| 162 |
+
- adam_beta2: 默认0.95。
|
| 163 |
+
- adam_eps: 默认1e-8。
|
| 164 |
+
- sgd_momentum: 默认为0.9。
|
| 165 |
+
|
| 166 |
+
**checkpoint参数**:
|
| 167 |
+
- 🔥save: checkpoint的输出目录,默认None。在训练中,若未设置该参数,则默认为`f'megatron_output/{model_suffix}'`,例如`'megatron_output/Qwen2.5-7B-Instruct'`。
|
| 168 |
+
- 🔥save_interval: checkpoint保存的间隔(steps),默认为500。
|
| 169 |
+
- 注意:训练结束时一定会保存权重。
|
| 170 |
+
- 🔥no_save_optim: 不保存optimizer,默认为False。
|
| 171 |
+
- 🔥no_save_rng: 不保存rng,默认为False。
|
| 172 |
+
- 🔥load: 加载的checkpoint目录,默认None。
|
| 173 |
+
- 🔥no_load_optim: 不载入optimizer,默认为False。
|
| 174 |
+
- 🔥no_load_rng: 不载入rng,默认为False。
|
| 175 |
+
- 🔥finetune: 将模型加载并微调。不加载检查点的优化器和随机种子状态,并将迭代数设置为0。默认为False。
|
| 176 |
+
- ckpt_format: checkpoint的格式。可选为'torch', 'torch_dist', 'zarr'。默认为'torch_dist'。
|
| 177 |
+
- no_initialization: 不对权重进行初始化,默认为True。
|
| 178 |
+
- auto_detect_ckpt_format: 自动检测ckpt format为legacy还是distributed格式。默认为True。
|
| 179 |
+
- exit_on_missing_checkpoint: 如果设置了`–-load`,但找不到检查点,则直接退出,而不是初始化。默认为True。
|
| 180 |
+
|
| 181 |
+
**分布式参数**:
|
| 182 |
+
- distributed_backend: 分布式后端,可选为'nccl', 'gloo'。默认为nccl。
|
| 183 |
+
- 🔥use_distributed_optimizer: 使用分布式优化器。默认为True。
|
| 184 |
+
- 🔥tensor_model_parallel_size: tp数,默认为1。
|
| 185 |
+
- 🔥pipeline_model_parallel_size: pp数,默认为1。
|
| 186 |
+
- 🔥sequence_parallel: 启动序列并行的优化器。默认为False。
|
| 187 |
+
- 🔥context_parallel_size: cp数,默认为1。
|
| 188 |
+
- tp_comm_overlap: 启用张量并行通信与GEMM(通用矩阵乘法)内核的重叠(降低通信耗时)。默认为False。
|
| 189 |
+
- overlap_grad_reduce: 启用DDP中grad reduce操作的重叠(降低DP通信耗时)。默认为False���
|
| 190 |
+
- overlap_param_gather: 启用分布式优化器中参数all-gather的重叠(降低DP通信耗时)。默认为False。
|
| 191 |
+
- distributed_timeout_minutes: torch.distributed的timeout时间(单位为分钟),默认为60分钟。
|
| 192 |
+
|
| 193 |
+
**日志参数**
|
| 194 |
+
- log_params_norm: 记录参数的norm。默认为True。
|
| 195 |
+
- log_throughput: 记录每个GPU的吞吐量。默认为True。
|
| 196 |
+
- 注意:在非packing情况下,log_throughput并不准确,因为`seq_length`并不等于真实序列长度。
|
| 197 |
+
- tensorboard_log_interval: 记录到tensorboard的间隔(steps),默认为1。
|
| 198 |
+
- tensorboard_queue_size: 队列长度(与磁盘IO相关),类似于写入的间隔。默认为50。
|
| 199 |
+
- log_timers_to_tensorboard: 记录timers到tensorboard。默认为True。
|
| 200 |
+
- no_log_learning_rate_to_tensorboard: 不记录学习率到tensorboard。默认为False。
|
| 201 |
+
- log_validation_ppl_to_tensorboard: 将验证困惑度写入tensorboard。默认为True。
|
| 202 |
+
- log_memory_to_tensorboard: 将内存日志写入tensorboard。默认为True。
|
| 203 |
+
- logging_leval: 日志级别。默认为None。
|
| 204 |
+
|
| 205 |
+
**评估参数**
|
| 206 |
+
- 🔥eval_iters: 评估的迭代次数,默认为100。
|
| 207 |
+
- 🔥eval_interval: 评估的间隔(steps),默认为None,即设置为save_interval。
|
| 208 |
+
|
| 209 |
+
**混合精度参数**
|
| 210 |
+
- fp16: fp16模式。默认为False。会根据模型的torch_dtype进行设置。请使用`--torch_dtype`进行设置,默认读取config.json。
|
| 211 |
+
- bf16: bf16模式。默认为False。会根据模型的torch_dtype进行设置。
|
| 212 |
+
- apply_query_key_layer_scaling: 将`Q * K^T` 缩放为 `1 / 层数`(例如:第layer_num层则除以layer_num)。这对fp16训练很有帮助。默认为None,即若使用`--fp16`,则设置为True。
|
| 213 |
+
- attention_softmax_in_fp32: 在attention_mask和softmax中使用fp32进行计算。默认为True。
|
| 214 |
+
|
| 215 |
+
**模型参数**: (以下参数通常不需要进行设置,会根据HF模型的config.json进行配置,用户无需关心)
|
| 216 |
+
- num_layers: transformer layers的层数,默认为None。
|
| 217 |
+
- hidden_size: transformer hidden size,默认为None。
|
| 218 |
+
- ffn_hidden_size: transformer FFN层的hidden size。默认为None,设置为`4*hidden_size`。
|
| 219 |
+
- num_attention_heads: transformer attention heads的个数,默认为None。
|
| 220 |
+
- group_query_attention: 默认为None。若`num_query_groups>1`,group_query_attention设置为True,否则为False。
|
| 221 |
+
- num_query_groups: 默认为1。
|
| 222 |
+
- max_position_embeddings: 位置编码的最大长度,默认为None。
|
| 223 |
+
- position_embedding_type: 位置编码的类型,可选为'learned_absolute'、'rope'、'relative'和'none',默认为'rope'。
|
| 224 |
+
- rotary_base: 默认为10000。
|
| 225 |
+
- rotary_percent: 默认为1.。
|
| 226 |
+
- normalization: 可选为'LayerNorm', 'RMSNorm',默认为RMSNorm。
|
| 227 |
+
- norm_epsilon: 默认为1e-5。
|
| 228 |
+
- swiglu: 使用swiglu替代默认的gelu。默认为True。
|
| 229 |
+
- untie_embeddings_and_output_weights: 解开embedding和输出权重的绑定,默认为True。
|
| 230 |
+
- disable_bias_linear: 禁用linear层的bias。默认为True。
|
| 231 |
+
- add_qkv_bias: 仅在QKV的linear中增加bias,默认为True。
|
| 232 |
+
- attention_dropout: 默认为0.。
|
| 233 |
+
- hidden_dropout: 默认为0.。
|
| 234 |
+
- transformer_impl: 使用哪种transformer实现,可选项为'local'和'transformer_engine'。默认为transformer_engine。
|
| 235 |
+
- padded_vocab_size: 完整词表大小,默认为None。
|
| 236 |
+
- rope_scaling: rope_scaling相关参数,默认为None。格式参考[llama3.1 config.json](https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-8B-Instruct/file/view/master?fileName=config.json&status=1),传入json字符串。
|
| 237 |
+
|
| 238 |
+
### Megatron训练参数
|
| 239 |
+
|
| 240 |
+
Megatron训练参数继承自Megatron参数和基本参数。基本参数的内容可以参考[这里](./命令行参数.md#基本参数)。此外还包括以下参数:
|
| 241 |
+
|
| 242 |
+
- add_version: 在`save`上额外增加目录`'<版本号>-<时间戳>'`防止权重覆盖,默认为True。
|
| 243 |
+
- 🔥packing: 是否使用序列packing,默认为False。
|
| 244 |
+
- 🔥streaming: 流式读取并处理数据集,默认False。通常在处理大型数据集时,设置为True。更多流式的参数查看命令行参数文档。
|
| 245 |
+
- lazy_tokenize: 默认为False。若该参数设置为False,则在训练之前对所有的数据集样本进行tokenize(这可以避免在训练中出现报错);设置为True,则在训练中对数据集进行tokenize(这可以节约内存)。
|