yuccaaa commited on
Commit
32838f6
·
verified ·
1 Parent(s): 2748525

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(这可以节约内存)。