diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/FAQ.md b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/FAQ.md new file mode 100755 index 0000000000000000000000000000000000000000..32cce9075d6bdc38f5389e97b109b8163e31b622 --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/FAQ.md @@ -0,0 +1 @@ +# FAQ \ No newline at end of file diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/adapt_procedure.md b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/adapt_procedure.md new file mode 100755 index 0000000000000000000000000000000000000000..0e2a21a526522743df2009727ce04ad2bf98e5f9 --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/adapt_procedure.md @@ -0,0 +1,107 @@ +# 适配步骤 + +本文提供将用户的Megatron+PyTorch代码仓适配至MindSpeed+MSAdapter的步骤。内容涉及用户Megatron适配至MindSpeed,用户额外开发的PyTorch代码适配至MSAdapter,用户使用的涉及PyTorch第三方库的适配。 + +## 1. Megatron代码仓适配至MindSpeed + +按照如下步骤操作,即可实现Megatron-LM在昇腾设备上的高效运行,且无缝集成并充分发挥MindSpeed所提供的丰富加速与优化技术。 + +在Megatron-LM目录下修改`pretrain_gpt.py`文件,在`import torch`下新增一行`import mindspeed.megatron_adaptor`代码。 + +```python +import os +import torch +import mindspeed.megatron_adaptor # 新增 +from functools import partial +from typing import Union +``` + +在Megatron-LM目录下修改`pretrain_gpt.py`文件,在`model_provider`函数中删除`assert(args.context_parallel_size == 1), "Context parallelism is only supported with Megatron Core!"`代码。 + +```python +else: + assert(args.context_parallel_size == 1), "Context parallelism is only supported with Megatron Core!" # 新增 + model = megatron.legacy.model.GPTModel( + config, + num_tokentypes=0, + parallel_output=True, + pre_process=pre_process, + post_process=post_process + ) +``` + +配置环境变量,当前以root用户安装后的默认路径为例,请用户根据set_env.sh的实际路径执行如下命令。 + +```bash +source /usr/local/Ascend/ascend-toolkit/set_env.sh +``` + +配置路径。请编辑示例脚本“examples/pretrain_gpt_distributed.sh”,并设置如下环境变量以指定必要的路径。包括模型checkpoint读取路径,tokenizer相关路径,数据集路径。 + +```bash +CHECKPOINT_PATH=./ckpt +VOCAB_FILE=./gpt-tokenizer/vocab.json +MERGE_FILE=./gpt-tokenizer/merges.txt +DATA_PATH=./gpt_pretrain_data/alpaca_text_document +``` + +执行如下命令启动预训练。 + +```bash +bash examples/pretrain_gpt_distributed.sh +``` + +### 数据集相关适配 + +若在昇腾设备上使用preprocess_data.py脚本处理数据,须在“Megatron-LM”目录下修改“tools/preprocess_data.py”脚本,在“import torch”下新增一行“import mindspeed.megatron_adaptor”代码。 + +```python +import torch +import mindspeed.megatron_adaptor # 新增 +import numpy as np +``` + +新建“Megatron-LM/gpt_pretrain_data”目录,通过运行preprocess_data.py脚本,可以将转换后的JSON文件进一步处理为适合Megatron-LM预训练的二进制格式。 + +```bash +python tools/preprocess_data.py \ + --input alpaca_json.json \ + --output-prefix ./gpt_pretrain_data/alpaca \ + --tokenizer-type GPT2BPETokenizer \ + --vocab-file ./gpt-tokenizer/vocab.json \ + --merge-file ./gpt-tokenizer/merges.txt \ + --append-eod \ + --log-interval 1000 \ + --workers 8 +``` + +### MindSpeed + MSAdapter联合使用 + +常规的torchrun启动脚本是使用了PyTorch Ascend。用户希望使用MindSpore作为深度学习框架,可以通过msrun作为启动方式,并增加参数 `--ai-framework mindspore`启用MindSpore的相关适配,即直接运行MindSpeed+MindSpore+MSAdapter。MindSpore适配已经和MindSpeed共仓,这个MindSpore适配的作用是保证Megatron原始代码中的PyTorch代码已经可以无缝迁移至MSAdapter+MindSpore。 + +共仓代码参见https://gitee.com/ascend/MindSpeed/tree/master/mindspeed/mindspore + +适配方案同样使用和MindSpeed一样的patch方式,即修改Megatron/MindSpeed的实际调用。替代调用的入口在mindspore_adaptor.py中。 + +## 2. MSAdapter适配 + +原始的Megatron中PyTorch适配已由上方的MindSpore共仓代码保障。若用户使用了(在Megatron额外添加了PyTorch代码,而非直接使用)如下的PyTorch的很多机制而非Megatron,请参见MSAdapter使用指南的[机制性约束](../msadapter_user_guide/constraints.md)。 + +MindSpore和PyTorch有以下主要几个不同的机制: + +- PyTorch 微分机制 +- PyTorch Dispatch机制 +- PyTorch Storage机制 +- PyTorch 静态编译机制 + +除了受限的机制外,另外查看[API](https://gitee.com/mindspore/docs/tree/master/docs/msadapter/docs/source_zh_cn/note)对应的PyTorch API是否支持。 + +## 3. 三方库依赖 + +已经支持的三方库tools请参考[MindSpeed-core-MS](https://gitee.com/ascend/MindSpeed-Core-MS/tree/feature-0.2/)。 + +MindSpeed-core-MS中的`test_convert_llm_ds.sh`的文件中已经说明支持了`megatron core_r0.8.0`和`transformers v4.47.0`版本。 + +### 一些未支持的第三方库 + +由于MSAdapter对于PyTorch API尚未全部支持,参见MSAdapter使用指南的[机制性约束](../msadapter_user_guide/constraints.md)和[API](https://gitee.com/mindspore/docs/tree/master/docs/msadapter/docs/source_zh_cn/note)查看是否可用。 diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/case/deepseek3.md b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/case/deepseek3.md new file mode 100755 index 0000000000000000000000000000000000000000..14c3df5eaa77e4a9971ff030bd5c5f4c2e041e7a --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/case/deepseek3.md @@ -0,0 +1,200 @@ +# DeepSeek3 + +Deepseek3属于当前主流大模型,用户可以直接使用MindSpeed-core-MS(MindSpeed-LLM)便能在NPU上使用MindSpore进行预训练和微调。 + +本文提供单机八卡运行的运行脚本。多机运行请直接参考MindSpeed-LLM的文档说明。 + +## 预训练 + +环境安装参考[安装](../install.md)也可以直接参考[MindSpeed-LLM的MindSpore共仓安装方法](https://gitee.com/ascend/MindSpeed-LLM/blob/master/docs/mindspore/features/install_guide.md)使用多机。 + +我们基于单机八卡的环境,直接在MindSpeed-Core-MS/MindSpeed-LLM目录增加以下脚本进行预训练。 + +注意配置好tokenizer目录,数据集目录,以及自定义的checkpoint目录(基于随机初始化)。 + +用户也可修改脚本路径,确保`MindSpeed_Core_MS_PATH`设置正确。 + +```shell +MindSpeed_Core_MS_PATH=`dirname "$PWD"` +echo $MindSpeed_Core_MS_PATH +export PYTHONPATH=${MindSpeed_Core_MS_PATH}/MSAdapter/mindtorch:${MindSpeed_Core_MS_PATH}/Megatron-LM:${MindSpeed_Core_MS_PATH}/MindSpeed:${MindSpeed_Core_MS_PATH}/MindSpeed-LLM:${MindSpeed_Core_MS_PATH}/transformers/src/:$PYTHONPATH + +#!/bin/bash +export CUDA_DEVICE_MAX_CONNECTIONS=1 +export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True +export HCCL_CONNECT_TIMEOUT=3600 + +# export HCCL_DETERMINISTIC=true # HCCL确定性 +# export ASCEND_LAUNCH_BLOCKING=1 # 硬件确定性 +# export NCCL_DETERMINISTIC=1 + +GPUS_PER_NODE=8 +MASTER_ADDR=localhost +MASTER_PORT=6000 +NNODES=1 +NODE_RANK=0 +WORLD_SIZE=$(($GPUS_PER_NODE*$NNODES)) + +basepath=$(cd `dirname $0`; cd ../../../; pwd) + + +# CKPT_SAVE_DIR="" # 模型保存目录 +DATA_PATH="" # 数据集目录 +TOKENIZER_PATH="" # tokenizer目录 +CKPT_LOAD_DIR="" # 模型checkpoint,读取或者随机初始化,但是需要指定目录 + +TP=1 +PP=2 +EP=4 +CP=1 +CP_TYPE='ulysses_cp_algo' +NUM_LAYERS=4 +SEQ_LEN=4096 +MBS=1 +GBS=8 + +DISTRIBUTED_ARGS=" + --local_worker_num $GPUS_PER_NODE \ + --master_port $MASTER_PORT \ + --node_rank $NODE_RANK \ + --master_addr $MASTER_ADDR \ + --master_port $MASTER_PORT \ + --log_dir=msrun_log_pretrain +" +MLA_ARGS=" + --multi-head-latent-attention \ + --qk-rope-head-dim 64 \ + --qk-nope-head-dim 128 \ + --q-lora-rank 1536 \ + --kv-lora-rank 512 \ + --v-head-dim 128 \ + --qk-layernorm +" +MOE_ARGS=" + --moe-alltoall-overlap-comm \ + --n-group 4 \ + --seq-aux \ + --moe-grouped-gemm \ + --moe-permutation-async-comm \ + --use-fused-moe-token-permute-and-unpermute \ + --moe-token-dispatcher-type alltoall \ + --first-k-dense-replace 1 \ + --moe-layer-freq 1 \ + --n-shared-experts 1 \ + --num-experts 32 \ + --moe-router-topk 8 \ + --moe-intermediate-size 2048 \ + --moe-router-load-balancing-type noaux_tc \ + --topk-group 4 \ + --routed-scaling-factor 2.5 \ + --norm-topk-prob \ + --moe-router-score-function sigmoid \ + --moe-router-enable-expert-bias +" +MTP_ARGS=" + --num-nextn-predict-layers 1 \ + --share-mtp-embedding-and-output-weight \ + --recompute-mtp-norm +" +ROPE_ARGS=" + --rope-scaling-beta-fast 32 \ + --rope-scaling-beta-slow 1 \ + --rope-scaling-factor 40 \ + --rope-scaling-mscale 1.0 \ + --rope-scaling-mscale-all-dim 1.0 \ + --rope-scaling-original-max-position-embeddings 4096 \ + --rope-scaling-type yarn +" +GPT_ARGS=" + --finetune \ + --spec mindspeed_llm.tasks.models.spec.deepseek_spec layer_spec \ + --recompute-granularity full \ + --recompute-method uniform \ + --recompute-num-layers 1 \ + --no-shared-storage \ + --use-distributed-optimizer \ + --reuse-fp32-param \ + --use-flash-attn \ + --shape-order BNSD \ + --use-mcore-models \ + --tensor-model-parallel-size ${TP} \ + --pipeline-model-parallel-size ${PP} \ + --expert-model-parallel-size ${EP} \ + --sequence-parallel \ + --context-parallel-size ${CP} \ + --context-parallel-algo ${CP_TYPE} \ + --num-layers ${NUM_LAYERS} \ + --hidden-size 7168 \ + --ffn-hidden-size 18432 \ + --num-attention-heads 128 \ + --tokenizer-type PretrainedFromHF \ + --tokenizer-name-or-path ${TOKENIZER_PATH} \ + --seq-length ${SEQ_LEN} \ + --max-position-embeddings 163840 \ + --micro-batch-size ${MBS} \ + --global-batch-size ${GBS} \ + --make-vocab-size-divisible-by 1 \ + --lr 1.0e-5 \ + --train-iters 15 \ + --lr-decay-style cosine \ + --untie-embeddings-and-output-weights \ + --disable-bias-linear \ + --attention-dropout 0.0 \ + --init-method-std 0.02 \ + --hidden-dropout 0.0 \ + --position-embedding-type rope \ + --normalization RMSNorm \ + --use-fused-rotary-pos-emb \ + --use-rotary-position-embeddings \ + --use-fused-swiglu \ + --use-fused-rmsnorm \ + --swiglu \ + --no-masked-softmax-fusion \ + --attention-softmax-in-fp32 \ + --min-lr 1.0e-7 \ + --weight-decay 1e-2 \ + --clip-grad 1.0 \ + --adam-beta1 0.9 \ + --adam-beta2 0.999 \ + --initial-loss-scale 65536 \ + --vocab-size 129280 \ + --padded-vocab-size 129280 \ + --rotary-base 10000 \ + --norm-epsilon 1e-6 \ + --no-load-optim \ + --no-load-rng \ + --bf16 \ + --no-gradient-accumulation-fusion +" +DATA_ARGS=" + --data-path $DATA_PATH \ + --split 100,0,0 +" +OUTPUT_ARGS=" + --log-throughput \ + --log-interval 1 \ + --save-interval 10 \ + --eval-interval 2000 \ + --eval-iters 0 \ + --no-save-optim \ + --no-save-rng +" +msrun $DISTRIBUTED_ARGS pretrain_gpt.py \ + $GPT_ARGS \ + $DATA_ARGS \ + $OUTPUT_ARGS \ + $MLA_ARGS \ + $ROPE_ARGS \ + $MOE_ARGS \ + $MTP_ARGS \ + --ai-framework mindspore \ + --load $CKPT_LOAD_DIR \ + --distributed-backend nccl +``` + +跨机参考 + +https://gitee.com/ascend/MindSpeed-LLM/blob/master/docs/mindspore/features/pretrain.md + + + diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/constraints.md b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/constraints.md new file mode 100755 index 0000000000000000000000000000000000000000..4f404f216152be51e5d65fcb3e38c8bd47105c46 --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/constraints.md @@ -0,0 +1,29 @@ +# 适配约束说明 + +用户使用Megatron+PyTorch在GPU上开发的大模型可能无法适配至MindSpeed+MSAdapter所在NPU的环境。需要用户按照下方描述判断可行性。 + +## 硬件适配约束说明 + +在进行模型代码仓适配之前,需充分了解目标硬件平台的兼容性约束,评估适配可行性,并完成必要的环境准备工作: + +- 在正式开始适配前,应确保所选模型能够在第三方平台(如GPU)上正常运行,并能够输出精度与性能的基准指标,作为后续适配效果的参考依据。 + +### 当前已知的不支持场景: + +以下场景都涉及硬件支持问题,只要用户未使用这些场景或者第三方库就可以规避。 + +- **Data Parallel(DP)模式暂不支持**:当前不支持使用 PyTorch 中的 `torch.nn.parallel.DataParallel` 接口进行多卡训练。 +- **APEX 库中的 FusedAdam 优化器暂不支持自动适配**:对于使用了 APEX 提供的融合优化器 FusedAdam 的模型,目前无法通过 GPU2Ascend 工具或自动适配流程完成迁移,需用户自行完成适配工作。具体修改方法可参考 [APEX Optimizers 适配文档](https://gitee.com/ascend/apex#apexoptimizers)。 +- **bmtrain 框架的大模型适配暂不支持**:目前尚未支持基于 bmtrain 框架的大模型训练脚本迁移到昇腾平台。 +- **bitsandbytes 支持情况说明**:bitsandbytes 已可在昇腾设备上安装,详细信息请参考其官方文档中的 [Supported Backends](https://github.com/bitsandbytes-foundation/bitsandbytes/blob/main/docs/source/installation.mdx#supported-backendsmulti-backend-supported-backends) 部分。当前仅支持 NF4 量化与反量化功能,适用于 LLM 的 QLoRA 微调任务,其余特性尚不支持。 +- **ColossalAI 中的 HybridAdam 优化器暂不支持适配**:目前昇腾平台尚未支持 ColossalAI 第三方库中与 HybridAdam 相关的接口适配。 +- **xFormers 训练功能暂未原生支持**:当前昇腾平台尚未原生支持 xFormers 的完整训练功能。如果需要使用其中的 FlashAttentionScore 融合算子,用户可参考昇腾开发文档中关于 FlashAttentionScore 的章节,进行手动替换和适配。 +- **grouped_gemm 暂不支持安装**:目前 NPU 平台不支持 grouped_gemm 第三方库的安装与使用。 +- **composer 第三方库支持但未完成适配**:虽然 composer 可在昇腾平台上安装,但由于尚未完成适配工作,因此目前无法正常使用。 + +## 软件(MindSpore)约束说明 + +目前我们使用MSAdapter和Mindspore进行PyTorch的前端脚本的切换。由于MindSpore与PyTorch的设计不同且仍在不断开发演进中,部分功能(即PyTorch API)尚未补全或者不支持。 + +参见MSAdapter使用指南的[机制性约束](../msadapter_user_guide/constraints.md)和[API](https://gitee.com/mindspore/docs/tree/master/docs/msadapter/docs/source_zh_cn/note)查看是否可用。 + diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/0loss.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/0loss.png new file mode 100755 index 0000000000000000000000000000000000000000..6f04772901102f82db528b994c231ab7f7d3eb2b Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/0loss.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/4card_ops.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/4card_ops.png new file mode 100755 index 0000000000000000000000000000000000000000..587e3c6183ab901264738a3a17203892a4a7f0a8 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/4card_ops.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/5crad_ops.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/5crad_ops.png new file mode 100755 index 0000000000000000000000000000000000000000..1d9b208882e5677a7c1d8c465815a5cf53ddc502 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/5crad_ops.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/Communication-Duration-Analysis.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/Communication-Duration-Analysis.png new file mode 100755 index 0000000000000000000000000000000000000000..085093efe07cdcecad871016c404964f8de2a03b Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/Communication-Duration-Analysis.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/Communication_interface.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/Communication_interface.png new file mode 100755 index 0000000000000000000000000000000000000000..d2391ffd38b66af66a9d348b3943772ed6007943 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/Communication_interface.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/Host-bound_Device-bound.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/Host-bound_Device-bound.png new file mode 100755 index 0000000000000000000000000000000000000000..6207adb72710ddc6bbf9ba53af90549b1b12f01d Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/Host-bound_Device-bound.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/JD-1new.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/JD-1new.png new file mode 100755 index 0000000000000000000000000000000000000000..68021a1914a05e77658845529ee01a6cd0abea8a Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/JD-1new.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/JD-6new3.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/JD-6new3.png new file mode 100755 index 0000000000000000000000000000000000000000..bceb5dfd465b5418ab1e94a5d830162329d96d2f Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/JD-6new3.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/MMLU.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/MMLU.png new file mode 100755 index 0000000000000000000000000000000000000000..05c97292a5fe2b0c5303b975dce4572d0472198f Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/MMLU.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/Qwen_loss.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/Qwen_loss.png new file mode 100755 index 0000000000000000000000000000000000000000..b59fb8fac8383b88220d8d1ad02fce761da95c73 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/Qwen_loss.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/comm_1.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/comm_1.png new file mode 100755 index 0000000000000000000000000000000000000000..f7f3a1722c5a7983f4b77f0f6338484733cd6912 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/comm_1.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/comm_2.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/comm_2.png new file mode 100755 index 0000000000000000000000000000000000000000..d479ffc3ba185fa140c87c72120717d8bb5d127a Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/comm_2.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/comm_3.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/comm_3.png new file mode 100755 index 0000000000000000000000000000000000000000..3c108b0193cbaac377fbf0f9de611600f7290605 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/comm_3.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/comm_field.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/comm_field.png new file mode 100755 index 0000000000000000000000000000000000000000..304cd1460c829591e134221fdb161ee92fa60343 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/comm_field.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/compute_diff.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/compute_diff.png new file mode 100755 index 0000000000000000000000000000000000000000..bdbfd0947ac3fb3278e11f3ec384fc1c847bb477 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/compute_diff.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/decomposition.jpg b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/decomposition.jpg new file mode 100755 index 0000000000000000000000000000000000000000..28f6b2a8d143d33577ae2f2b3ebc5884e71621b2 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/decomposition.jpg differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/exp1_npu_loss.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/exp1_npu_loss.png new file mode 100755 index 0000000000000000000000000000000000000000..8ff7c12a716a54c79bf2021539e761c5f1323618 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/exp1_npu_loss.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/exp2.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/exp2.png new file mode 100755 index 0000000000000000000000000000000000000000..c1abfed5a38794b6b40731adda73ea836a5c0e78 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/exp2.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/intro_flow.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/intro_flow.png new file mode 100755 index 0000000000000000000000000000000000000000..a0ee4cf6b254c021f480fc24a77380ba9e2b9647 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/intro_flow.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/msprobe-1.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/msprobe-1.png new file mode 100755 index 0000000000000000000000000000000000000000..fac0644b0fe771eaeaa20deedd492850f5537c98 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/msprobe-1.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/msprobe-2.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/msprobe-2.png new file mode 100755 index 0000000000000000000000000000000000000000..fac0644b0fe771eaeaa20deedd492850f5537c98 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/msprobe-2.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/msprobe-3.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/msprobe-3.png new file mode 100755 index 0000000000000000000000000000000000000000..f15b666cec9e28d6d9aedf24d8c7241ff64ad726 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/msprobe-3.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/msprobe-4.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/msprobe-4.png new file mode 100755 index 0000000000000000000000000000000000000000..018e337020f66c4f0365f767ad0ba19245aa5de7 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/msprobe-4.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/msprobe-5.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/msprobe-5.png new file mode 100755 index 0000000000000000000000000000000000000000..7a6de63e8df19d58c3fd1c94ce8b3e44811a80bf Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/msprobe-5.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/msprobe-md5.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/msprobe-md5.png new file mode 100755 index 0000000000000000000000000000000000000000..ef95f296c75a12b8a03e11f34ea419c9480de276 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/msprobe-md5.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/performance_base.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/performance_base.png new file mode 100755 index 0000000000000000000000000000000000000000..7a9b05a5ea3ca9f3174084329a1a811e31348444 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/performance_base.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/performance_flow.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/performance_flow.png new file mode 100755 index 0000000000000000000000000000000000000000..2b95998f982b7036d2c4fcd69346ce200eaf54a2 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/performance_flow.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/precision-flow1.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/precision-flow1.png new file mode 100755 index 0000000000000000000000000000000000000000..0278f23a023b806e5c8ea521e5eab6d2fdab3f49 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/precision-flow1.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/precision-flow2.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/precision-flow2.png new file mode 100755 index 0000000000000000000000000000000000000000..2b333ab2cad1ecafd956e35933bf554553ec5894 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/precision-flow2.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/precision_flow.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/precision_flow.png new file mode 100755 index 0000000000000000000000000000000000000000..e44f27fb3204feb6e23e15c1a8a6751154fda4a2 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/precision_flow.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/problem_trace.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/problem_trace.png new file mode 100755 index 0000000000000000000000000000000000000000..5929bf6c6f1eb410c385bbccc92f16f54d73d8b3 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/problem_trace.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/timeline_interface.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/timeline_interface.png new file mode 100755 index 0000000000000000000000000000000000000000..bd567b2a3d0c8a07558a820b7da1058b124cd733 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/timeline_interface.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/tp.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/tp.png new file mode 100755 index 0000000000000000000000000000000000000000..16753d55cd44f197a53854aa979cceb384a48c63 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/tp.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/weight_migration.png b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/weight_migration.png new file mode 100755 index 0000000000000000000000000000000000000000..8d3fc080898cd4230d0b968928734464cb5c4bb1 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/figures/weight_migration.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/install.md b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/install.md new file mode 100755 index 0000000000000000000000000000000000000000..c8cceb76ccd80d340688159523b3e04cdc4a470d --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/install.md @@ -0,0 +1,19 @@ +# 安装 + +两种使用场景安装方式不同。若用户已使用Megatron开发了大模型,参考**第三方库兼容的环境安装**。若用户想直接基于MindSpeed进行大模型开发,参考**直接使用MindSpeed-LLM的环境安装**。 + +## 第三方库兼容的环境安装 + +1. [昇腾固件与CANN安装](https://www.hiascend.com/document/detail/zh/canncommercial/80RC3/softwareinst/instg/instg_0003.html?Mode=PmIns&OS=Ubuntu&Software=cannToolKit) +2. [MindSpeed安装](https://gitee.com/ascend/MindSpeed) 或者直接 `pip install mindspeed` +3. 安装MindSpore `pip install mindspore==2.6.0` +4. 安装MSAdapter `pip install msadapter` (不推荐) 或者源代码安装 `git clone https://gitee.com/mindspore/msadapter`(推荐) +5. 配置环境变量 `export $PYTHONPATH=your_workspace/msadapter/mindtorch` + +## 直接使用MindSpeed-LLM的环境安装 + +1. [昇腾固件与CANN安装](https://www.hiascend.com/document/detail/zh/canncommercial/80RC3/softwareinst/instg/instg_0003.html?Mode=PmIns&OS=Ubuntu&Software=cannToolKit) +2. 安装[MindSpeed-core-MS](https://gitee.com/ascend/MindSpeed-Core-MS) + 1. `git clone https://gitee.com/ascend/MindSpeed-Core-MS`可选feature-0.2分支 + 2. 按照MindSpeed-core-MS文档执行相应脚本,例如`sh test_convert_llm.sh` +3. 进入MindSpeed-core-MS/MindSpeed-LLM目录进行使用 \ No newline at end of file diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/intro.md b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/intro.md new file mode 100755 index 0000000000000000000000000000000000000000..d20a09ffb9ecba08b2db63bddd82e48a633c2a05 --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/intro.md @@ -0,0 +1,44 @@ +# Torch大模型适配MSAdapter + +本文档主要说明如何使用MSAdapter和MindSpeed进行大模型开发。使用场景分为两种: + +1. 直接使用MSAdapter和MindSpeed/MindSpeed-core-MS进行大模型开发。可以直接查看[安装](install.md#直接使用mindspeed-llm的环境安装)与[用例](case/deepseek3.md),无需查看完整适配流程。 +2. 将原有的Megatron代码仓适配至MindSpeed,然后再适配MSAdapter在NPU上运行(文档核心场景)。 + +![](figures/intro_flow.png) + +## 概述 + +PyTorch作为当前深度学习领域中广泛采用的框架之一,现已支持在昇腾平台上使用PyTorch前端脚本通过MSAdapter在MindSpore后端上高效运行。 + +本手册的主要目标是指导具有一定PyTorch模型训练基础的用户将原本在其他硬件平台(GPU)训练的模型适配到MindSpore昇思框架后端与昇腾平台(NPU),或者PyTorch Ascend的代码直接适配至MindSpore昇思框架。 + +手册内容涵盖大模型全流程的使用和适配方法,目前主要针对大模型提供了相关的指导。主要关注点是如何有效地将Megatron+PyTorch训练模型适配至昇思框架后端与昇腾计算平台上,并在零误差或者合理精度误差范围内高性能运行。 + +## MindSpeed简介 + +MindSpeed是昇腾开发团队提供的Megatron修改版本,可以直接在昇腾NPU上高效地运行大模型并行算法。基于MindSpeed开发的MindSpeed-LLM和MindSpeed-MM提供了主流大模型如DeepSeek,Qwen的直接使用。 + +## MSAdapter简介 + +MSAdapter是鹏城实验室开发的兼容PyTorch生态的兼容层,经过MSAdapter与MindSpore对昇腾平台的兼容性适配,现已支持在昇腾平台上使用PyTorch前端脚本在MindSpore后端上高效运行。 + +## 适配流程 + +1. [适配约束说明](constraints.md) + - 判断硬件约束,软件约束;部分代码可能无法完成适配 +2. [安装](install.md) +3. [适配步骤](adapt_procedure.md) + 1. MindSpeed适配Megatron需要修改的代码 + 2. MSAdapter适配PyTorch需要修改的代码 +3. [MindSpeed+MSAdapter适配说明](mindspeed_config.md) + 1. MindSpeed+MSAdapter与Megatron+PyTorch的运行配置区别 + 2. MindSpeed暂不支持的Megatron特性 +5. [精度分析概述](precision/intro.md) + - 跨硬件:非确定性计算的收敛验证 + - 同硬件:确定性计算的零误差验证 +6. [性能分析概述](performance/intro.md) + - 通用性能分析流程 + - 大模型性能分析 +7. [模型存取](model_save/intro.md) + diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/mindspeed_config.md b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/mindspeed_config.md new file mode 100755 index 0000000000000000000000000000000000000000..947abf98bc3a0db72d079323cecef15dc2c046fa --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/mindspeed_config.md @@ -0,0 +1,580 @@ +# MindSpeed+MSAdapter适配说明 + +本文的适配说明是帮助用户将Megatron+PyTorch开发的代码仓,适配至MindSpeed+MSAdapter。实际适配完成后任然需要注意启动脚本的修改,和一些MindSpeed暂未支持的Megatron特性。 + +## MindSpeed+MSAdapter参数修改 + +主要改动如下: + +其余参数名称用法均与megatron对齐,支持情况见下方特性支持。 + +PyTorch的megatron/mindspeed脚本 + +```bash +DISTRIBUTED_ARGS=" + --nproc_per_node $GPUS_PER_NODE \ + --nnodes $NNODES \ + --node_rank $NODE_RANK \ + --master_addr $MASTER_ADDR \ + --master_port $MASTER_PORT +" +torchrun $DISTRIBUTED_ARGS pretrain_gpt.py \ + $GPT_ARGS \ + $DATA_ARGS \ + $OUTPUT_ARGS \ + $MLA_ARGS \ + $ROPE_ARGS \ + $MOE_ARGS \ + $MTP_ARGS \ + --load $CKPT_LOAD_DIR \ + --distributed-backend nccl +``` + +MSAdapter的MindSpeed脚本 + +```bash +DISTRIBUTED_ARGS=" + --local_worker_num $GPUS_PER_NODE \ + --master_port $MASTER_PORT \ + --node_rank $NODE_RANK \ + --master_addr $MASTER_ADDR \ + --master_port $MASTER_PORT \ + --log_dir=msrun_log_pretrain +" + +msrun $DISTRIBUTED_ARGS pretrain_gpt.py \ + $GPT_ARGS \ + $DATA_ARGS \ + $OUTPUT_ARGS \ + $MLA_ARGS \ + $ROPE_ARGS \ + $MOE_ARGS \ + $MTP_ARGS \ + --ai-framework mindspore \ + --load $CKPT_LOAD_DIR \ + --distributed-backend nccl +``` + +主要修改就是部分分布式参数有区别,torchrun修改为msrun + +## MindSpeed特性问题 + +目前MindSpeed支持的Megatron特性可以参考下表。尚未支持的特性说明用户咱不能使用该参数配置,如果使用了请考虑特性的代替方案。 + +## Megatron特性支持 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
特性名称介绍Released
Megatron 数据并行link
Megatron 张量并行link
Megatron 流水并行link
Megatron 虚拟流水并行link
Megatron 分布式优化器link
Megatron 序列并行link
Megatron 异步DDPlink
Megatron 权重更新通信隐藏 link
Megatron 重计算link
+ +## 并行策略特性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
特性名称介绍Released
Ascend Ulysses 长序列并行link
Ascend Ring Attention 长序列并行link
Ascend Double Ring Attention 长序列并行link
Ascend 混合长序列并行link
Ascend 自定义空操作层link
+ +## 内存优化特性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
特性名称介绍Released
Ascend 激活函数重计算 link
Ascend 重计算流水线独立调度 link
Ascend Mask归一link
Ascend BF16 参数副本复用link
Ascend swap_attentionlink
Ascend Norm重计算link
Ascend Hccl Buffer 自适应link
+ +## 亲和计算特性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
特性名称介绍Released
Ascend rms_norm 融合算子 link
Ascend swiglu 融合算子 link
Ascend rotary_embedding 融合算子 link
Ascend flash attentionlink
Ascend npu_matmul_add_fp32 梯度累加融合算子link
Ascend 计算通信并行优化link
Ascend MC2(存在已知问题⚠️)link
Ascend fusion_attention_v2 link
+ +## 通信优化特性 + + + + + + + + + + + + + + + + + + + +
特性名称介绍Released
Ascend Gloo 存档落盘优化 link
Ascend 高维张量并行 link
+ +## Mcore MoE特性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
特性名称介绍Released
Ascend Megatron MoE GMM link
Ascend Megatron MoE Allgather Dispatcher 性能优化 link
Ascend Megatron MoE Alltoall Dispatcher 性能优化 link
Ascend Megatron MoE TP拓展EP link
Ascend 共享专家 link
+ +## 关键场景特性 + + + + + + + + + + + + + + + + + + + +
特性名称介绍Released
Ascend EOD Reset训练场景 link
Ascend alibi link
+ +## 多模态特性 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
特性名称介绍Released
Ascend fused ema adamw优化器 link
Ascend PP支持动态形状link
Ascend PP支持多参数传递link
Ascend PP支持多参数传递和动态形状link
Ascend 非对齐线性层link
Ascend 非对齐Ulysses长序列并行link
+ +## 其它特性 + + + + + + + + + + + + + + + + + + + + + + + + + +
特性名称介绍Released
Ascend TFLOPS计算 link
Ascend Auto Settings 并行策略自动搜索系统 link
Ascend 确定性计算 link
+ +## 自定义算子 + +昇腾训练自定义算子统一由torch_npu提供API,以下API预计2025年q4起不维护,请优先使用torch_npu提供的自定义算子,如有新需求或问题可提issue反馈,我们会尽快回复。 + +部分自定义算子设置为公开接口,具体对外接口细节参照以下算子对应的手册链接。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
自定义算子名称介绍Released
npu_dropout_add_layer_norm link
npu_rotary_position_embedding link
fusion_attention link
rms_norm link
swiglu link
npu_mm_all_reduce_add_rms_norm link
npu_mm_all_reduce_add_rms_norm_ link
npu_gmm link
npu_grouped_mat_mul_all_reduce link
npu_fused_moe_token_permute link
npu_fused_moe_token_unpermute link
npu_ring_attention_update link
npu_matmul_add_fp32 link
npu_groupmatmul_add_fp32 link
npu_apply_fused_ema_adamw link
lcal_coc link
ffn link
npu_all_to_all_all_gather_bmm link
npu_bmm_reduce_scatter_all_to_all link
quant_gmm link
+ +--- + + + + + + diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/model_save/intro.md b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/model_save/intro.md new file mode 100755 index 0000000000000000000000000000000000000000..c762242d3d472bfbe05a81980a55fcaa0da2a58d --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/model_save/intro.md @@ -0,0 +1,13 @@ +# 模型存取 + +本文介绍MindSpeed+MSAdapter如何存储与读取Megatron+PyTorch的模型。 + +## MindSpeed & MSAdapter读取第三方模型 + +![](../figures/weight_migration.png) + +MSAdapter已经完全支持了torch.load接口,但是针对大模型的权重仍然需要上层并行库的支持。我们选择MindSpeed-LLM作为大模型库的使用入口,上图为MindSpeed-LLM能支持的模型权重。详情请参考[MindSpeed-LLM权重转化](https://gitee.com/ascend/MindSpeed-LLM#/ascend/MindSpeed-LLM/blob/master/docs/pytorch/solutions/checkpoint_convert.md) + +## 第三方读取MindSpeed & MSAdapter模型 + +torch.storage 特性MSAdapter尚未支持,需等待MindSpore 2.7.0 \ No newline at end of file diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/performance/analysis.md b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/performance/analysis.md new file mode 100755 index 0000000000000000000000000000000000000000..944c2924ba3c1366d5a017d2176f9f0e8c7bf717 --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/performance/analysis.md @@ -0,0 +1,190 @@ +# 基础性能优化流程 + +本文提供一个深度学习性能优化的常用流程,帮助用户熟悉性能优化。其次,给出了深度学习模型优化的一些可行方向,为用户提供一些优化思路。 + +## 基础流程 + +一个模型性能优化涉及包括算法在内的多个模块,因此模型性能的优化的关键在于找到当前性能瓶颈,找到关键问题后再针对性优化,模型训练性能优化遵循以下流程: + +**图 1** 模型训练性能优化流程 +![](../figures/performance_base.png "模型训练性能优化流程") + +1. 我们依据性能问题所发生的场景,将其划分为单机与集群两大类,通过归类明确具体的问题类型,从而掌握性能问题的背景情况,为后续的问题排查和定位打下基础; +2. 在清晰了解问题背景之后,可参考[性能调优工具介绍](tools.md)文档中的相关内容,选择合适的性能分析工具,采集关键性能数据,并对性能表现进行拆解分析,识别出影响整体性能的关键模块; +3. 当确定了性能瓶颈所在的模块后,进一步将问题细化至下发、计算或通信等具体功能模块,并可通过本文目录查找相应章节,获取对应的优化策略与算法建议。 + +## 工具分析 + +单机优化分析并不局限于仅对单一设备进行优化,而是关注于解决那些非依赖于大规模扩展的性能挑战。所采用的优化策略同样适用于集群环境,但在集群环境下,我们需要更加高效和全面的方法来定位问题。一旦确定了集群中的具体瓶颈,例如某个慢节点或一条慢链路,那么就可以回归到单机优化的思路来进行深入分析。 + +优化分析的基本原则是集中精力处理主要矛盾,依据具体的使用场景实施针对性的改进措施。在典型的单机环境中,通常会有一个竞争产品作为参考标准,这样就可以通过性能评估找出表现不佳的部分。当执行性能对比时,会自动进行组件性能的分解与比较,具体的步骤可以参照性能对比工具([compare_tools](https://gitee.com/ascend/mstt/tree/master/profiler/msprof_analyze/compare_tools))提供的指南,如图1所示的结果展示。 + +**图 1** 性能差异对比结果 +[](../figures/decomposition.jpg "性能差异对比结果") + +从图1最右侧的“Diff Ratio”列中,我们可以识别出潜在的问题区域,这可能涉及到计算过程(比如Flash Attention、卷积操作Conv、矩阵乘法Matmul)、任务调度(空闲时间Free Time),或是更为复杂的通信环节(未覆盖的通信时间Uncovered Communication Time)。此外,我们还利用专家建议系统(advisor),它能够给出基于最佳实践的性能提升指导,详情参见[advisor](https://gitee.com/ascend/mstt/tree/master/profiler/msprof_analyze/advisor)。该系统持续积累性能调优的知识,能够快速诊断并解决大部分常见的性能障碍。 + +### 深入排查思路 + +深入排查的思路核心在于抓住优化的对象和重点。 + +首先,我们要能明确当前性能问题所出现的位置,如[工具分析](tools.md)中提及的,可以分为计算、通信和下发(调度)。需要注意的是,这三块是相互交织的,要结合观察的性能问题现象和对应的实验来准确判断问题。本章节介绍深入排查的通用方法。首先获取性能数据,通过MindStudio Insight工具打开数据,以下操作以8卡的性能数据为例。 + +1. 算子是模型性能的基石。在打开性能数据后,优先排查“Operator“,看是否存在算子耗时的波动问题(这里注意保证每张卡的shape在当前step是否相同),若存在,找到对应算子,进行算子性能分析。 +2. 选择“Communication(通信)”,查看相关通信信息,如下图所示: + + **图 1** “Communication“界面 + ![](../figures/Communication_interface.png "Communication界面") + + - 图中“1”处,选择“Communication Matrix(通信矩阵)“,直接看总体通信情况。 + - 图中“2”处,选择具体的通信行为(如allreduce,reduce scatter等),查看带宽是否正常。 + - 对于异常的地方,可以通过图中“3”处的“Communication Matrix Type(通信矩阵类型)“选择“Transit Size(传输大小)”,查看当前通信算子的总通信量,从而可以估计出当前通信所占的总时间。 + +3. 图2中“1”处,选择“Communication Duration Analysis(通信耗时分析)“,如下图所示: + + **图 2** “Communication Duration Analysis“界面 + ![](../figures/Communication-Duration-Analysis.png "Communication-Duration-Analysis界面") + + - 图中“1”处,表示每个通信域中各个卡在通信上所花费的时间。 + - 图中“2”处,蓝色部分代表端到端的总时间。通信是双工的,但通信总花费时间是通信时间+等待时间(即notify wait)。因此,蓝色部分越高的卡,代表通信等待的时间越高,而蓝色越矮的卡,代表通信等待的时间越低,而等待最少的卡,说明是最慢的卡,其他快卡已经进入到通信的准备阶段,而此慢卡依然在进行通信之前的工作,造成了其他卡漫长的等待。等待的原因很多,在RDMA场景,通信等待还会造成RDMA带宽计算错误。 + - 为了确定慢卡慢的原因,从“3”处,结合“1”处,找到某个差异较大的时间节点,然后回到timeline(时间线),找到慢卡慢的原因。对于本示例中,可以选取最慢卡5卡和相邻的快卡4进行对比,同时结合“1”,选择最后一个通信行为进行分析。 + +4. 选择“timeline(时间线)“,如下图所示: + + **图 3** “timeline“界面 + ![](../figures/timeline_interface.png "timeline界面") + + 从图中可以看出,需要对比的种子选手4卡和5卡,每张卡从上至下(在标准L1模式的性能采集的情况下),可以分为Python(CPU)、CANN(CPU)、Ascend Hardware(NPU)、AI Core Freq、HCCL和Overlap Analysis几个栏目。其中我们将Python(CPU)、CANN(CPU)称为一级流水和二级流水(当然,在其内部,依然可以采用流水线并行的方法继续产生新的流水,这里以组件的维度简化描述),代表着模型PyTorch侧的操作和在CANN侧的操作,一般将这两级流水称为下发。在这里,介绍下Host bound和Device bound两个概念,如下图所示: + + **图 4** Host bound和Device bound + ![](../figures/Host-bound_Device-bound.png "Host-bound和Device-bound") + + 图中的连线是host侧api和device侧执行算子之间的连线,异构算力之间时钟差异可以忽略时(一般在100us量级,绝大多数场景均无需考虑)。当连线为竖直线时,代表此时api下发算子无需等待device,下发即计算,代表着device在空转等着host下发,性能的瓶颈在host,即Host bound,反之,连线为斜线,代表为Device bound。 + +5. Ascend Hardware即为用于计算的设备,会显示具体运算的算子,AI Core Freq则代表设备频率,一般而言,恒定而不会发生变化。HCCL则代表模型的通信情况。最后,Overlap Analysis代表计算和通信相互的掩盖情况,可以分为掩盖通信、未掩盖通信和Free,其中Free代表此时设备既没有在通信也没有在计算。回到快慢卡分析,对于4卡和5卡,首先通过HCCL找到差异较大的通信域,如下图所示: + + **图 5** 通信域 + ![](../figures/comm_field.png "通信域") + +6. 从此通信操作,在同一时间线,竖直向上找到Ascend Hardware,查看计算差异,如下图所示: + + **图 6** 计算差异 + ![](../figures/compute_diff.png "计算差异") + +7. 从红色方块算子(aclnnFlashAttention)可以发现,两者的差距不在计算本身,而在于这个算子的开始时间不一致。而之所以开始时间不一致,是因为5卡前序算子的计算尚未完成。因此,沿着水平向左的方向,继续寻找,找到最左边的aclnnFlashAttention,如下图所示: + + **图 7** 问题定位 + ![](../figures/problem_trace.png "问题定位") + +8. 可以发现,上面的aclnnFlashAttention的耗时要更长,我们选中4卡算子,可以从slice看到算子具体信息,如下图所示: + + **图 8** 4卡算子具体信息 + ![](../figures/4card_ops.png "4卡算子具体信息") + +9. 然后选中5卡对应的算子,如下图所示: + + **图 9** 5卡算子具体信息 + ![](../figures/5card_ops.png "5卡算子具体信息") + + 发现两者差距在8ms,波动在10%以内,比较合理。继续水平向左,慢慢地,我们发现,两张卡的耗时差距越来越小,因此,对于这个案例,可以说问题出在这个算子耗时的差距(当然,这个可以从op statistics中也可以看到,这里只是教授如何寻找性能问题的方法)。如果发现Ascend Hardware上的差距来源于下发,即有张卡迟迟没有下发该算子,那则竖直向上,从CANN侧寻找问题,如此类推,通过竖直向上和水平向左,基本可以找到大部分问题点。 + +## 集群基本概念简介 + +通常来说,集群是由多台计算机组成的系统,其整体性能依赖于所有机器的协同工作。因此,在处理集群性能问题时,定位和解决这些问题往往更为复杂和抽象。在此部分,我们将简要探讨集群的构成以及针对集群性能定位的基础思路,特别聚焦于模型训练的应用场景。 + +在模型训练过程中,主要涉及存储、计算和通信三种行为模式。存储包括主机内存、设备(这里特指昇腾产品)内存及大容量磁盘等,用于存放模型权重、训练数据和保存的数据。计算方面相对直接,主要包括CPU和NPU的运算任务。集群的通信不仅涵盖了单机内部的通信和节点间的通信,还包括如总线、交换机等硬件资源的支持。 + +对于大规模训练,这三个方面都会对训练效率产生影响,具体如下: + +- **存储**:集群训练常使用共享存储。在高I/O负载下,由于带宽限制等因素,可能会导致数据读取或权重保存过程中的阻塞,从而影响训练性能。这种现象通常反映在host操作耗时较长上,从性能剖析(参考单机优化分析方法)来看,主要体现为较长的空闲时间。 +- **计算**:在大型集群训练中,由于机器数量众多,可能出现某些节点计算速度较慢的情况,即所谓的慢节点。这种情况会导致模型通信时间显著增加。 +- **通信**:集群间通过由交换路由器组成的网络进行通信。高通信量和大量通信单元容易引发网络丢包或拥塞等问题,表现为网络监控数据异常(如PFC队列异常)、所有卡均处于等待状态等。需要注意的是,尽管慢节点和通信问题都可能表现为通信时间的增加,但前者会明确显示出某些节点的响应明显慢于其他节点。 + +### 深入排查策略 + +讨论完集群的基本概念后,接下来介绍如何进行集群性能分析以及常用的排查策略。 + +首先,需要确定集群性能问题的具体类型。一般来说,可以将集群问题分为两类:一类是性能下降,另一类是性能波动。 + +- 对于性能下降的问题,可分为几种情况: + - 小规模集群扩展到大规模后出现的性能下降; + - 同规模集群更换硬件等引起的性能下降; + - 在长时间稳定运行期间突然或逐渐出现的性能下降。 + + 处理这类问题的关键在于对比性能变化前后的数据,识别出核心原因,如通信、计算或调度等,并进一步排查。如果是通信问题,则需检查是否存在慢节点或丢包;如果是从小规模向大规模扩展引起的问题,可能是模型分割策略不当所致。对于调度问题,则应优先考虑存储问题或慢节点的影响。 + +- 性能波动问题的首要步骤是捕捉到波动阶段,将其与正常阶段对比,以确定造成波动的主要模块,并基于此进行深入调查。具体的排查方法可参照性能下降问题的处理方式。 + +## 一些优化方向 + +### 并行策略 + +#### 并行策略设计的一般指导原则 + +并行策略的设计与调试高度依赖于具体模型结构及运行环境,因此很难找到一个适用于所有场景的统一方案。然而,基于以往的性能调优经验,我们可以总结出一些具有普遍适用性的优化建议。 + +1. 当遇到显存不足、模型体积过大无法一次性加载等问题时,优先考虑采用 **TP(Tensor Parallelism)** 对模型进行切分。同时应确保 TP 的切分数不超过单台设备上的计算卡数量。例如,在一台拥有 8 张加速卡的服务器中,TP 的最大值不应超过 8。这样可以在充分利用硬件资源的同时,有效降低单卡显存压力。 +2. 如果仅靠 TP 切分仍无法满足显存需求,则可以引入 **PP(Pipeline Parallelism)** 实现跨设备切分。从效率角度出发,PP 的阶段数越少越好,以减少计算资源的闲置浪费。 +3. 在硬件资源充足的情况下,可以启用 **DP(Data Parallelism)** 来实现数据层面的并行处理,从而提升整体训练吞吐量。而在资源受限的环境中,若已启用 TP 和 PP 后仍然存在显存瓶颈,可进一步结合 **ZeRO-1 阶段优化** 和 **重计算技术** 进行优化。ZeRO-1 可将优化器状态分布到多个设备上,并通过集合通信完成同步;而重计算则通过牺牲部分计算时间来换取更高的显存利用率,从而提高训练效率。 +4. 即使模型当前能够正常运行,也可以尝试主动应用内存优化手段(如 ZeRO-1 或重计算),并在保证稳定性的同时适当增加 batch size。这种方式有时会带来意想不到的性能提升。 + +综上所述,合理选择并行策略并结合实际资源情况进行调优,能够在有限硬件条件下显著提升模型训练效率。但最终方案仍需根据具体的模型结构和部署环境进行评估与实验验证。 + +#### TP 线性度与 micro batch size 线性度测试方法 + +在对大规模模型进行分布式部署前,建议先进行 **TP 并行数** 和 **micro batch size** 的线性度测试,以便识别关键算子的行为特征,为后续部署提供依据。以 GPT-3 类型的大模型为例,可以构建如下测试方案: + +[](../figures/tp.png) + +通过该测试可以获得模型某一层结构在不同 TP 切分方式和 batch size 下各算子的执行耗时。这些信息对于确定最优的 TP 并行度和 micro batch size 具有重要参考价值。不过,在实际部署过程中还需综合考虑硬件资源的限制,尤其是芯片内部内存容量等约束条件。因此,在制定部署策略时,必须兼顾模型性能目标与硬件能力之间的平衡。 + +### 融合算子 + +融合算子的优化原理为,通过数学意义上的等价替换,将多个算子融为一个算子的计算,减少冗余计算,同时减少下发次数,从而提高性能。 + +常见融合算子如下: + +- RotaryMul & RotaryMulGrad +- RmsNorm & RmsNormGrad +- ScaledMaskedSoftmax & ScaledMaskedSoftmaxGrad +- MatmulAllReduce +- FlashAttentionScore +- SwiGLu + +可以将此类融合算子替换为自研版本,或者参考昇腾官方版本。详情参见https://www.hiascend.com/document/detail/zh/Pytorch/700/ptmoddevg/trainingmigrguide/performance_tuning_0030.html。 + +### 通信优化 + +HCCL(Huawei Collective Communication Library,华为集合通信库)是基于昇腾AI处理器的高性能集合通信库,提供单机多卡、多机多卡集合通信原语,在PCIe、HCCS和RoCE高速链路实现集合通信功能,实现分布式训练。 + +- HCCS(Huawei Cache Coherent System),华为一致性系统总线,用于NPU和NPU之间互联的高速总线。 +- PCIE(Peripheral Component Interconnect Express),一种串行外设扩展总线标准,用于计算机系统的外设扩展使用。 +- DMA(Direct Memory Access)指一种高速的数据传输操作,允许在外部设备和存储器之间直接读写数据,既不通过CPU,也不需要CPU干预。 +- RDMA(Remote Direct Memory Access),远程直接内存访问技术,一般指能够跨过网络的DMA方式。 +- RoCE(RDMA over Converged Ethernet),承载在融合以太网上的RDMA技术,即跨越以太网的RDMA通信方式,本文特指RoCE v2。 + +软件架构图 + +![软件架构图](../figures/comm_1.png) +硬件架构图 (8p) + +![硬件架构图 (8p)](../figures/comm_2.png) + +在硬件中,通过HCCS实现两两互联(Full Mesh),NPU和CPU之间通过PCIE连接。 + +Full Mesh是指在一个网络拓扑中,每个节点都直接连接到其他节点,形成一个完全互联的网络结构。在Full Mesh网络中,任何两个节点之间都可以直接通信,这种网络结构通常用于需要高度可靠性和高带宽的应用场景,如数据中心、高性能计算和金融交易等。 + +硬件架构图(16p) + +![硬件架构图(16p)](../figures/comm_3.png) + +### 显存 + +MindSpore提供了专门的DryRun功能用于显存调优。 + +在训练大规模深度学习模型的过程中,各个计算节点(即rank)之间的设备内存使用情况往往呈现出复杂且不一致的特点。用户完成网络脚本编写后,通常需要通过多轮试运行来不断调整并行策略、重计算机制以及负载均衡等关键参数。 +当遇到内存不足或编译失败等问题时,当前的调试流程通常依赖于实际的多机环境进行验证。这种方式不仅消耗大量计算资源,而且由于多机之间建立通信连接耗时较长,导致整体调试效率低下,浪费了大量的device执行时间。 +如果能够在本地环境中模拟整个编译过程,并对并行策略的有效性进行初步验证,则可以显著减少对真实集群资源的依赖。同时,还能规避多机通信中建链所带来的额外开销,实现更快速的策略验证与调优。 +为此,MindSpore框架提供了 DryRun(干运行)机制,通过对接口进行模拟(mock),虚拟化所有设备侧的行为。在整个模拟过程中,仅执行框架 Host 端的逻辑流程,无需真正启动设备端计算。借助该机制,可以在单机环境下高效模拟大规模集群中每个 rank 的内存使用情况,提前评估模型并行策略的合理性,并在部署前进行相应的优化调整,从而提升整体训练效率并节省宝贵资源。 + +详情参见https://www.mindspore.cn/tutorials/zh-CN/r2.6.0/debug/dryrun.html。 diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/performance/intro.md b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/performance/intro.md new file mode 100755 index 0000000000000000000000000000000000000000..fe09052d014ca69ade22c71fbaa1d5e71a982766 --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/performance/intro.md @@ -0,0 +1,15 @@ +# 性能分析概述 + +性能调优,尤其是设计AI处理器的性能调优是个非常庞大且专业的议题。本文只提供一个常用的优化流程,告诉读者一个常规的深度学习调优流程是怎样的。另外以MindSpeed+MSAdapter+Mindspore为例,说明大模型的性能调优的概念和一些调优方向。 + +本文档提供: + +- [性能调优分析](analysis.md) +- [大模型MindSpeed与MindSpore联合调优](tune.md) +- 性能调优[工具简介](tools.md) + +希望给用户提供一个基础的性能调优思路流程,和大模型调优的一些基本概念。 + +详细与深入的调优流程可参考如下图与昇腾团队提供的[NPU性能调优指南](https://www.hiascend.com/document/detail/zh/Pytorch/700/ptmoddevg/trainingmigrguide/performance_tuning_0001.html)。 + +![](../figures/performance_flow.png) \ No newline at end of file diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/performance/tools.md b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/performance/tools.md new file mode 100755 index 0000000000000000000000000000000000000000..356f74be281dd6849a0a34cae43321431cd6b9c2 --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/performance/tools.md @@ -0,0 +1,42 @@ +# 常用性能分析工具介绍 + +本文简要介绍在昇腾平台上常用的性能调优工具,适用于 PyTorch Ascend 和 MSAdapter 等多种训练框架。包括了常用Profiler,对比工具,集群分析工具,和图形界面的集成工具。 + +## 概述 + +性能调优工具是一套基于 CANN(Compute Architecture for Neural Networks)平台构建的分析系统,旨在帮助开发者深入理解模型在 NPU 上的执行效率。当训练过程中遇到性能瓶颈或需要进一步优化时,可以借助这些工具进行详细的性能剖析和问题定位。 + +主要工具包括:Ascend PyTorch Profiler、性能比对工具、集群分析工具以及 MindStudio Insight。其中,Ascend PyTorch Profiler 是基于 CANN 实现的核心性能采集工具;性能比对工具与集群分析工具则来自开源社区,用于对采集的数据进行专项分析;MindStudio Insight 则是一款可视化调优工具,集成了 CANN 数据的解析与图形化展示功能,便于用户快速识别性能问题。 + +## Ascend PyTorch Profiler + +该工具同样适用于 MSAdapter 场景。具体使用方法请参考《CANN 性能调优工具用户指南》中“使用 PyTorch 框架接口采集和解析性能数据”章节。Ascend PyTorch Profiler 能够全面采集 PyTorch 训练过程中的各项性能指标,包括但不限于: + +- PyTorch 层级算子信息 +- CANN 层级算子信息 +- 底层 NPU 算子执行数据 +- 各类算子的内存占用情况 + +通过这些详尽的数据,用户可以对整个训练流程的性能表现进行全面评估。 + +## 性能比对工具 + +性能比对工具([compare_tools](https://gitee.com/ascend/mstt/tree/master/profiler/msprof_analyze/compare_tools))主要用于比较模型在相同或不同硬件平台下的性能差异。目前支持 GPU 与 NPU、NPU 与 NPU 之间的性能对比。通过对训练耗时和内存使用的逐项分析,能够快速定位性能劣化的具体算子,从而提升调优效率。 + +该工具将训练时间划分为计算、通信和调度三个维度,并分别对计算和通信任务进行算子级别的比对分析;同时,也将总内存消耗按算子级别进行拆解比对,帮助用户从多个角度发现问题。 + +## 集群分析工具 + +集群分析工具([cluster_analyse](https://gitee.com/ascend/mstt/tree/master/profiler/msprof_analyze/cluster_analyse))专为多节点训练场景设计,可用于分析大规模分布式训练中的性能问题。当前主要功能包括: + +- 迭代内部耗时分析(基于通信域) +- 通信时间统计 +- 通信矩阵分析 + +通过这些分析手段,可以有效识别出性能瓶颈,如慢速卡、低效节点或通信链路延迟等问题,进而指导优化策略的制定。 + +## MindStudio Insight + +关于该工具的安装与配置,请参阅昇腾团队的《MindStudio Insight 用户指南》中的“安装与卸载”章节。MindStudio Insight 是一款面向大模型训练集群的专业级可视化调优工具,提供包括时间线视图(Timeline)、通信行为分析、计算耗时分布等在内的多项可视化功能。 + +借助该工具,用户可以直观地观察训练过程中的关键性能指标,发现潜在瓶颈,并据此制定针对性的优化方案,显著提升训练效率。 diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/performance/tune.md b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/performance/tune.md new file mode 100755 index 0000000000000000000000000000000000000000..e07e624334948f5682a882f46f53c2569cb7a5ea --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/performance/tune.md @@ -0,0 +1,239 @@ +# 大模型MindSpeed与MindSpore联合调优 + +大规模模型通常包含更多的参数,并采用更复杂的结构设计,因此在训练过程中往往需要消耗更多的计算资源和时间。特别是在AI框架的动态图模式下,尽管开发与调试过程更加灵活便捷,但也带来了更为显著的性能与内存管理挑战。本文将重点探讨在昇思动态图环境下,如何对大规模模型进行性能与内存方面的优化,同时介绍相关工具的使用方法,以帮助开发者快速识别并解决性能瓶颈,从而提升训练效率、降低训练成本。 + +## 常见的性能评估指标 + +1. **单步耗时(秒)**:完成一个完整批次(Batch Size, BS)所需的时间。 +2. **吞吐量(样本数/秒)**:模型在单位时间内能够处理的最大训练样本数量。其计算公式为: + $$ + 吞吐量 = \frac{BS \times N}{step\_time} + $$ + 其中,BS表示每个数据并行维度上的批次大小,N代表集群中数据并行的数量,step_time是指在分布式环境中完成一次完整BS处理所花费的时间(单位为秒)。 +3. **模型算力利用率(MFU,%)**:即Model FLOPs Utilization,指的是模型前向与反向传播过程中实际使用的矩阵运算能力与系统理论最大算力之间的比值。该指标体现了模型在训练过程中对硬件算力的利用效率。影响MFU的因素主要包括: + - **模型结构**:不同类型的模型在分布式训练中的算力利用效率可能差异较大。例如,Transformer类模型因其高度并行化和密集矩阵运算的特性,通常能在多机训练中实现较高的MFU。 + - **分布式策略**:包括数据并行、模型并行、流水线并行等不同的并行方式及其具体实现手段(如梯度累积、张量并行等),都会对算力利用率产生影响。 + - **硬件配置**:GPU型号、数量、网络带宽等硬件条件也会影响整体训练性能和资源利用率。 + - **软件优化措施**:例如编译器优化、库函数调优、自动混合精度训练等技术,也能有效提升MFU。 + - **数据集与批次设置**:数据规模、复杂度以及训练过程中使用的批次大小,均会影响每次迭代的计算负载和资源利用情况。 +4. **扩展效率(线性度)**:衡量从单卡扩展到多卡、甚至跨节点集群时训练效率的变化情况,又称为加速比。通常通过吞吐量来计算,公式如下: + $$ + 线性度 = \frac{集群总吞吐量}{单卡吞吐量 \times 集群卡数} + $$ + 该指标范围在0到1之间,数值越接近1表示扩展效率越高。一般认为,当线性度大于0.8时,扩展效果较为理想。 + +## MindSpore动态图机制介绍 + +### 动态图中的并行支持 + +随着模型规模与数据量的不断增长,单一计算设备已难以满足大模型训练的需求。为了提升训练效率、加快训练进程,并行计算策略被广泛采用,将任务合理分配到多个计算节点上协同执行。MindSpeed-Core-MS 提供了对多种常见并行方式的支持,包括 DP(数据并行)、MP(模型并行)以及 PP(流水线并行)等通用策略。同时,它还支持类似 Megatron 的细粒度配置选项,帮助用户在昇腾硬件平台上实现高效的大模型训练。 + +- **DP(数据并行)**:该策略通过将输入数据划分为多个子批次,分别由不同的计算设备进行处理。每个设备保存一份完整的模型参数副本,并基于本地数据完成前向与反向计算。最后通过对各设备上的梯度或参数进行汇总与平均,实现全局更新。 + +- **MP(模型并行)**:该策略将整个模型拆分为若干个子模块,分别部署在不同的计算设备上。每个设备负责处理其对应的模型部分,并将中间结果传递给后续设备继续处理,从而实现跨设备的协同计算。 + +- **PP(流水线并行)**:该方法将模型的不同层或组件分配给不同的设备,形成一个计算流水线。每个设备专注于处理其对应阶段的数据流,在前一阶段输出完成后立即开始下一阶段的计算,从而提升整体计算吞吐能力。 + +如需了解具体并行策略的配置方式,请参考:[动态图并行-GPT模型预训练开发指南](https://gitee.com/ascend/MindSpeed-Core-MS/blob/r0.1.0/docs/source_zh_cn/usage/pretrain_gpt.md) + +### PyNative动态图模式下的优化改进 + +MindSpore 的 PyNative 模式采用了算子直调技术,显著提升了接口执行性能。在 2.3 版本之前,大多数 API 是通过组合多个小粒度算子来实现的,并依赖于单算子子图的执行流程,涉及构图、编译优化、算子选择及编译等多个步骤,导致首次运行时性能较低。为解决这一问题,系统引入了算子直调机制,即通过 pybind 直接调用底层算子接口,跳过复杂的中间流程,减少数据结构转换和调度开销。实测显示,不同接口的性能提升幅度在 0.5 到 4 倍之间。 + +此外,该模式还提供了一系列基础分布式功能接口,涵盖硬件交互、重计算控制、通信操作等方面,为构建高性能训练流程提供了支撑。 + +更多详情请参阅:[动态图支持算子直调](https://www.mindspore.cn/news/newschildren?id=3223&type=versionRelease) + +## 性能优化策略 + +为了提升训练效率,通常需要从以下几个方面来考虑和实施性能优化措施。 + +- **数据处理时间**:这包括将模型所需的训练数据及权重加载到内存中的时间,以及数据在CPU上的预处理时间和传输到NPU(神经网络处理单元)的时间。当模型分布于多个NPU上时,还需考虑从一个NPU广播数据至其他NPU所需的时间。 +- **主机下发时间**:指的是Python脚本逻辑及其API接口启动所花费的时间。理想情况下,这部分时间应与设备执行过程并行进行,以避免设备闲置。 +- **设备执行时间**:即NPU执行各个算子计算逻辑所需的时间。 +- **通信时间**:在分布式训练环境中,这是指不同设备间传输数据所需的时间。通过优化网络拓扑结构或减少不必要的通信频率等方式可以降低这一时间。同时,通信和计算任务可以并行执行,利用并行库提供的技术掩盖部分通信延迟。 + +### 用户编程检查清单 + +- 关闭确定性计算: + + ```python + ms.set_context(deterministic='OFF') + ``` + +- 禁用流同步: + + ```python + ms.set_context(pynative_synchronize=False) + ``` + +- 选用高性能API: + - MindSpore提供了一套对标PyTorch的高效API集合,大多数情况下其性能优于传统操作集。详情请参阅[Mint接口列表](https://www.mindspore.cn/docs/zh-CN/master/api_python/mindspore.mint.html)。 + - 使用大模型专用融合算子,如RotaryPositionEmbedding、Swiglu等。 +- 避免不必要的数据拷贝: + - 尽量使用原地更新方法,减少冗余的数据移动操作。 + - 减少不必要的连续化操作:当前多数aclnn算子支持非连续输入,因此尽量避免频繁调用`.contiguous()`,或者先通过`is_contiguous()`判断再决定是否调用。 + - 当需要数据转换时,优先选择`.from_numpy()`接口,它可以在数据连续的情况下实现无拷贝转换。[mindspore.Tensor.from_numpy](https://www.mindspore.cn/docs/zh-CN/master/api_python/mindspore/Tensor/mindspore.Tensor.from_numpy.html) +- 减少原始Python函数的使用,例如.sum(),建议替换为mint.sum()。 + +### 性能配置指南 + +- **批次大小**: + - **全局批次大小**:在保持其他参数不变的情况下增加GBS(全局批次大小)有助于提高MFU(模型算力利用率)。 + - **微批次大小**:对于给定的GBS,增加MBS(微批次大小)可能减少流水线中的气泡效应,但也可能导致更高的计算密度。具体调整需根据实际情况实验确定,默认情况下micro-batch-size=2可能是较优的选择。 + + 示例配置: + + ```yaml + # Global-batch-size = DP * batch_size * micro_batch_num + dataset_config.batch_size # 训练和评估时的批次大小,默认值:1 + dataset_config.micro_batch_num # 微批次大小,默认值:1 + ``` + +- **虚拟流水线并行(VPP)**:在大规模流水线并行场景中,可以通过分出更多流水线阶段来减少空闲时间,尽管这会增加通信量。 + + 示例配置: + + ```yaml + parallel_config.virtual_pipeline_model_parallel_size # 虚拟流水线并行(VPP)的大小,默认值:None + parallel_config.num_layers_per_virtual_pipeline_stage # 每个VPP的层数,无缺省 + ``` + +- **重计算**:在显存充足的情况下,可以完全禁用重计算;否则,可以选择开启部分重计算功能。 + + 示例配置: + + ```yaml + parallel_config.recompute # 完全重计算,默认值:None + parallel_config.select_recompute # 按算子选择重计算,默认值:None + parallel_config.select_comm_recompute # 选择通信重计算,默认值:None + ``` + +更多配置细节可参考:[动态图并行-GPT模型预训练开发指南](https://gitee.com/ascend/MindSpeed-Core-MS/blob/r0.1.0/docs/source_zh_cn/usage/pretrain_gpt.md) + +### 高级优化特性 + +- **负载均衡**:MindSpore的SAPP工具能够自动规划最佳的流水线并行策略,从而优化集群的计算能力和内存使用效率。 +- **非饱和切分**:通过优化跨机通信模式来提高多机环境下的线性度和性能。示例代码如下: + + ```python + initialize_model_parallel(tensor_model_parallel_size=parallel_config.tensor_model_parallel_size, zero_shard_size=zero_shard_size) + ``` + +- **JIT编译**:允许将Python函数编译为静态图,以便MindSpore对其进行运行时优化。详见:[JIT介绍](https://www.mindspore.cn/docs/zh-CN/master/api_python/mindspore/mindspore.jit.html) + +### 性能分析案例 + +有关详细的性能分析,请参阅以下资源: + +- [MindStudio Insight用户指南](https://www.hiascend.com/document/detail/zh/mindstudio/70RC3/msinsightug/msascendinsightug/Insight_userguide_0002.html) +- [MindStudio Insight性能调试样例 (Ascend)](https://www.mindspore.cn/docs/zh-CN/master/model_train/optimize/profiler.html) + +以下是对“内存优化”部分的改写版本,内容经过重述以避免直接复制,同时保留了技术细节与逻辑结构: + +--- + +## 显存管理与优化策略 + +在模型训练过程中,内存开销主要包括以下几个方面:模型参数、优化器状态、前向传播中间结果以及临时变量。这些资源既可能占用主机(Host)侧的内存,也可能占用设备(Device)侧的显存。由于显存资源通常较为有限,开发者更关注如何有效降低显存使用,提升训练效率。 + +### 用户编程注意事项 + +- **自定义算子反向计算时的数据按需保留** + 自定义算子可能会导致不必要的显存占用问题。用户在编写此类算子时,可通过调用 `used_bprop_inputs` 方法仅保留反向传播所需的数据。例如,在以下示例中,反向计算只需使用 `dout`(索引为2),因此应在初始化方法中设置标记,使得正向执行后只保留该数据。 + + ```python + class ReduceScatterToSequenceParallelRegion(nn.Cell): + def __init__(self, need_to_swapaxes): + super().__init__() + self.world_size = get_tensor_model_parallel_world_size() + self.need_to_swapaxes = need_to_swapaxes + if self.world_size > 1: + self.tp_group = get_tensor_model_parallel_group() + self.used_bprop_inputs = [2] # 只保留反向所需的dout数据 + + def construct(self, input_): + ... + + def bprop(self, *args): + ... + ``` + +- **启用虚拟内存机制** + 建议开启虚拟内存功能,以减少大块连续内存分配带来的显存峰值压力。配置方式如下: + + ```bash + export MS_ALLOC_CONF="enable_vmm:True" + ``` + + 注意:该环境变量采用键值对格式,多个配置项应一次性设置完成,各配置间使用逗号分隔,避免多次设置被覆盖。 + +- **手动触发垃圾回收** + 建议每隔数百个训练步主动调用 Python 的垃圾回收机制,及时释放无用对象所占用的内存资源。 + + ```python + import gc + gc.collect() + ``` + +--- + +### 显存优化配置建议 + +- **重计算策略** + 通过 `parallel_config` 中的 `recompute_config` 参数可以启用重计算机制,支持三种模式: + + - **完全重计算(full_recompute_list)**:对指定的 ParallelTransformer 层进行完整重计算。 + - **选择性重计算(select_recompute_list)**:在使用稀疏注意力(SA)时重计算 Attention 部分;在使用 FlashAttention(FA)时,默认重计算 MLP 激活部分(激活函数需封装为 `nn.Cell` 类型才生效)。 + - **通信重计算(select_comm_recompute_list)**:用于重计算序列并行中的 AllGather 操作。 + + 示例配置如下: + + ```yaml + parallel_config: + tensor_model_parallel_size: 2 + pipeline_model_parallel_size: 2 + num_layer_list: [2, 2] + recompute_config: + recompute: [1, 1] + select_recompute: [1, 1] + select_comm_recompute: [1, 1] + ``` + +- **分布式优化器** + 在数据并行(DP)场景下,使用分布式优化器可将重复的内存分配和梯度更新任务进行拆分,并利用高效的通信机制进行协同计算,从而显著降低整体内存消耗。 + + ```yaml + accelerate_config: + parallelization: + use_distributed_optimizer: True # 启用分布式优化器 + ``` + +### 显存问题分析流程 + +若已按照上述建议进行了优化但仍存在显存不足的问题,可参考以下步骤进行深入排查: + +1. **理论显存估算** + 用户根据模型结构计算预期显存占用,可参考文档:[模型显存计算预估](https://cloud.tencent.com/developer/article/2403424) +2. **开启流同步模式** + + ```python + ms.set_context(pynative_synchronize=True) + ``` + +3. **启用显存追踪功能** + + ```bash + export MS_ALLOC_CONF="memory_tracker:True" + ``` + +4. **生成显存分析报告(二选一)** + - **实际运行小规模模型(推荐)** + - **使用 Dryrun 模拟**(适用于 MindSpore 2.5+ 版本): + + ```bash + export MS_SIMULATION_LEVEL=1 + ``` + +5. **分析显存报告** + 根据生成的显存报告,重点关注未及时释放的显存区域。 diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/precision/0diff.md b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/precision/0diff.md new file mode 100755 index 0000000000000000000000000000000000000000..1b1cdf024de1d16e9a65c812de119c861db93498 --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/precision/0diff.md @@ -0,0 +1,254 @@ +# 零误差对齐 + +基于同硬件条件下,选择相同内核与算子库后在PyTorch NPU和MSAdapter分别运行后,我们可以得到对应的loss与grad norm,在代码层面的无差别则这两个可以做到0误差。 + +![](../figures/0loss.png) + +## 对齐思路 + +### 精度零误差对齐checklist: + +1. 确认确定性计算是否开启 +2. 对精度需加载权重 +3. 确认pta和ms的MindSpeed-LLM MindSpeed Megatron对应的commit id保持一致 +4. 确认两边脚本策略是否一致 +5. 确认已知精度对齐修改点是否修改 +6. 确认任务本身在该环境中能否固定住(两次任务loss 0误差),如对不齐则是环境包问题 + +## 一、模型训练计算流程 + +![](../figures/precision-flow1.png) + +## 二、精度对齐流程 + +![](../figures/precision-flow2.png) + +## 三、准备工作 + +1. 数据集处理 +2. 超参对齐 + - MindSpeed-core-MS已经默认对齐 +3. 开启确定性计算(性能测试需要关闭确定性计算) + +## 四、正向计算&反向计算&clip_by_global_norm + +用户如果使用了msprobe(对齐方法1)示例如下,用户也可以使用下文的添加打印(对齐方法2)自行比对。 +![](../figures/msprobe-md5.png) + +正向计算:对比正向loss,如果小数点后16位一致,说明loss对齐,loss对齐16位打印。 + +反向计算:对比**MS MintFunctional.embedding.1.backward** 和 **Torch Functional.embedding.1.backward**,如果输入输出md5一致,说明梯度对齐。 + +global_norm : 图中示例对比  **MS dump结果倒数第一个Mint.mul算子**和 **Torch dump结果倒数第一个Tensor.__mul__算子**的第二个输入,如果完全一致,说明global_norm对齐。 + +## 五、优化器更新权重 + +同第四步,这一步由于用的优化器不同需要自行打印进行参数对齐,参考文末的打印方法。 + +## 对齐方法1:使用MSprobe精度对齐工具 + +工具参考[MSprobe](msprobe.md),排查思路按照上述即可。 + +## 对齐方法2:自行打印对齐精度 + +### 打印正向计算结果 + +如果发现log中的第一个iteration loss无法对齐的情况下。在模型的每一个module的forward函数中进行打印,请将tensor转化为32位浮点数进行打印,或者直接numpy保存进行比对。 + +MindSpore打印tensor: + +```python +# 无需指定rank,有对应rank log文件 +print(f"module name input tensor : L1 {x.float().sum().item()} and L2 {x.float().norm(2).item()}") +``` + +PyTorch NPU打印tensor: + +```python +if torch.distributed.get_rank() == 0: + print(f"module name input tensor : L1 {x.float().sum().item()} and L2 {x.float().norm(2).item()}") +``` + +output tensor同理。 + +同样可打印数据输入id确保数据问题,loss和logits确保正向的结果一致。 + +### 使用hook打印模型梯度 + +如果发现log中的第一个iteration loss可以对齐,但是grad_norm无法对齐的情况下,可以打印模型梯度来判断是否反向计算发生了偏差。反向计算的偏差通常设计重写backward函数。 + +MindSpore打印参数的原始梯度: + +```python +import numpy as np +from mindspore.communication import get_rank +def register_hook_for_params(module): + """ register backward hook for each params. """ + for idx, param in enumerate(module.parameters_and_names()): + param[1].register_hook(_make_param_hook(idx, param[0], param[1])) + +def _make_param_hook( + idx, + name, + param, +): + """ make closure function as the param hook. """ + def param_hook(grad): + # print("in the hook:", param.name, grad.value()) + np.save(f"/home/ma-user/work/ms_dump/{get_rank()}_{idx}_{name}", grad.contiguous().float().asnumpy().flatten()) + return grad + return param_hook + +register_hook_for_params(model) +``` + +PyTorch NPU打印参数的原始梯度: + +```python +import numpy as np +def register_hook_for_params(module): + """ register backward hook for each params. """ + for idx, param in enumerate(module.named_parameters()): + param[1].register_hook(_make_param_hook(idx, param[0], param[1])) + +def _make_param_hook( + idx, + name, + param, +): + """ make closure function as the param hook. """ + def param_hook(grad): + # print("in the hook:", param.name, grad.value()) + np.save(f"/home/ma-user/work/torch_dump/{torch.distributed.get_rank()}_{idx}_{name}", grad.contiguous().cpu().float().numpy().flatten()) + return grad + return param_hook + +register_hook_for_params(model) +``` + +MindSpore打印输入输出梯度: + +```python +def grad_hook(grad): + np.save( + f'/home/ma-user/work/ms/hidden_states_{mindspore.communication.get_rank()}', + grad[0].to(mindspore.float32).asnumpy()) +hook = ops.HookBackward(grad_hook) +hidden_states = hook(hidden_states) +``` + +PyTorch NPU打印输入输出梯度: + +```python +def grad_hook(grad): + np.save( + f'/home/ma-user/work/torch/hidden_states_{torch.distributed.get_rank()}', + grad.float().cpu().detach().numpy()) +hidden_states.register_hook(grad_hook) +``` + +此处提供了np.save方法,同样可使用上一步的数值打印方法。 + +### 打印分布式优化器梯度 + +如果发现模型反向梯度能零误差对齐,但是grad_norm仍然无法对齐的时候,考虑答应分布式优化器梯度。 +Megatron中梯度的实际更新由分布式优化器完成。请根据模型使用的优化器找到实际使用的优化器进行打印,以下以AdamW为例。 + +注意:MoE结构可能使用ChainedOptimizer包含多个分布式优化器,需要打印每一个。 + +MindSpore在MindSpeed/mindspeed/optimizer/adamw.py中adamw函数中添加如下打印: + +```python +import zlib +from msprobe.mindspore.common.utils import convert_bf16_to_fp32 +def get_md5_for_tensor(x): # 新增打印 + x = convert_bf16_to_fp32(x) + tensor_bytes = x.contiguous().asnumpy().tobytes() + crc32_hash = zlib.crc32(tensor_bytes) + return f"{crc32_hash:08x}" +for i, param in enumerate(params): + grad = grads[i] + exp_avg = exp_avgs[i] + exp_avg_sq = exp_avg_sqs[i] + # Perform stepweight decay + ## param.mul_(1 - lr * weight_decay) + bias_correction1 = beta1 ** (step - 1) + bias_correction2 = beta2 ** (step - 1) + if torch.distributed.get_rank() == 0: # 新增打印 + print("=========================") + print(param.shape, ) + print(step, bias_correction1, bias_correction2, lr, weight_decay, beta1, beta2, eps, amsgrad, maximize, flush=True) + for x in (param.data, exp_avg, exp_avg_sq, grad): + x_np = x.detach().cpu().to(torch.float32).numpy() + md5 = get_md5_for_tensor(x) + print(x_np.shape, x_np.min(), x_np.max(), x_np.mean(), md5) + param.data, exp_avg, exp_avg_sq = torch_npu.npu_apply_adam_w( + bias_correction1, + bias_correction2, + lr, + weight_decay, + beta1, + beta2, + eps, + grad, + None, + amsgrad, + maximize, + out=(param.data, exp_avg, exp_avg_sq) + ) + if torch.distributed.get_rank() == 0: # 新增打印 + print("+++++++++++++++++++++++++++++++++++++++++") + for x in (param.data, exp_avg, exp_avg_sq): + x_np = x.detach().to(torch.float32).cpu().numpy() + md5 = get_md5_for_tensor(x) + print(x_np.shape, x_np.min(), x_np.max(), x_np.mean(), md5) +``` + +PyTorch NPU在MindSpeed/mindspeed/optimizer/adamw.py中adamw函数中添加如下打印: + +```python +def get_md5_for_tensor(x): # 新增打印 + import zlib + if x.dtype == torch.bfloat16: + x = x.float() + tensor_bytes = x.cpu().detach().numpy().tobytes() + crc32_hash = zlib.crc32(tensor_bytes) + return f"{crc32_hash:08x}" + +for i, param in enumerate(params): + grad = grads[i] + exp_avg = exp_avgs[i] + exp_avg_sq = exp_avg_sqs[i] + # Perform stepweight decay + ## param.mul_(1 - lr * weight_decay) + bias_correction1 = beta1 ** (step - 1) + bias_correction2 = beta2 ** (step - 1) + if torch.distributed.get_rank() == 0: # 新增打印 + print("=========================") + print(param.shape, ) + print(step, bias_correction1, bias_correction2, lr, weight_decay, beta1, beta2, eps, amsgrad, maximize, flush=True) + for x in (param.data, exp_avg, exp_avg_sq, grad): + x_np = x.detach().cpu().to(torch.float32).numpy() + md5 = get_md5_for_tensor(x) + print(x_np.shape, x_np.min(), x_np.max(), x_np.mean(), md5) + param.data, exp_avg, exp_avg_sq = torch_npu.npu_apply_adam_w( + bias_correction1, + bias_correction2, + lr, + weight_decay, + beta1, + beta2, + eps, + grad, + None, + amsgrad, + maximize, + out=(param.data, exp_avg, exp_avg_sq) + ) + if torch.distributed.get_rank() == 0: # 新增打印 + print("+++++++++++++++++++++++++++++++++++++++++") + for x in (param.data, exp_avg, exp_avg_sq): + x_np = x.detach().to(torch.float32).cpu().numpy() + md5 = get_md5_for_tensor(x) + print(x_np.shape, x_np.min(), x_np.max(), x_np.mean(), md5) +``` diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/precision/computation.md b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/precision/computation.md new file mode 100755 index 0000000000000000000000000000000000000000..3ca76f037be57876cad054acc857ee16acf558be --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/precision/computation.md @@ -0,0 +1,218 @@ +# 跨硬件精度分析 + +随着昇腾AI处理器(简称NPU)在深度学习领域的普及应用,用户在利用NPU训练各类深度学习模型(特别是大语言模型)时可能会面临一些技术挑战。这主要源于NPU与主流AI处理器在硬件架构、指令运算机制以及浮点数处理方式等方面存在区别。 + +本文将重点分析​​NPU与通用AI处理器的计算特性差异​​,并通过实验数据验证这些差异不会对模型训练效果产生明显影响(详见​​计算差异对训练结果的影响分析​​)。此外,针对大规模分布式训练中遇到的共性问题(这些问题并非昇腾平台特有),我们将在​​精度调试实战案例​​中详细说明问题的成因、表现特征以及相应的解决方案。 + +## NPU与主流AI处理器之间的计算差异 + +NPU与主流AI处理器的计算差异主要体现在浮点舍入方式和运算过程两个方面 + +### 1.浮点舍入方式的差异 + +主流AI处理器通常支持四种标准舍入模式,而NPU在此基础上额外提供了A模式和O模式,使得舍入方式更加多样化。虽然所有舍入操作都会引入一定的数值误差,但NPU通过扩展舍入选项,能够更好地适应不同场景的计算需求。 + +NPU支持的舍入模式包括: + +- A模式(远离零舍入):当尾数为5时,正数向上舍入,负数向下舍进。 +- O模式(向奇数舍入):当尾数为5时,向最接近的奇数方向舍入。 +- 最近舍入(RN):向最接近的可表示值舍入,若存在两个等距值则优先选择偶数。 +- 向负无穷(RD):向下舍入。 +- 向正无穷(RU):向上舍入。 +- 向零(RZ):直接截断小数部分。 + +其中,默认模式为最近舍入(RN),与传统的四舍五入略有不同: + +- 最近舍入(RN): + - Round(0.5) = 0 + - Round(1.5) = 2 + - Round(2.5) = 2 +- 四舍五入: + - Round(0.5) = 1 + - Round(1.5) = 2 + - Round(2.5) = 3 + +### 2.计算过程的差异 + +计算过程的差异主要体现在浮点运算精度、累加顺序等方面。由于硬件架构和指令集的不同,即使是相同的计算任务,NPU和主流AI处理器在中间计算步骤中也可能产生细微的数值偏差,从而导致最终结果与标杆数据存在一定误差。 + +## 精度调试的前提条件 + +### 计算差异对训练稳定性的影响​​ + +在深度学习训练过程中,微小的计算差异在某些超参数配置(如较大的学习率、Adam优化器的beta1和beta2参数)或特定场景(如浅层参数的极小梯度)下可能被放大,导致训练稳定性出现显著差异。例如,在主流AI处理器或NPU上,可能会出现单方训练不稳定(如频繁的loss尖刺),甚至双方均不稳定的情况。这种现象在大规模训练和跨平台对比实验中较为常见。 + +### ​计算差异与Loss Landscape的关系​​ + +由于计算精度的细微差别,不同AI处理器训练的模型参数可能位于Loss Landscape的不同位置。由于Loss Landscape的高度复杂性,主流AI处理器或NPU的某一方可能处于更陡峭的区域,从而在训练对比中表现较差。特别是在超参数设置不合理(如学习率过大)时,这种差异带来的不确定性会更加明显。 + +例如,在LLaMA2-13B模型的训练中,当基础学习率设为1e-3时,即使在同一主流AI处理器上运行两次训练,loss曲线也难以完全对齐,且尖刺出现的位置具有较大随机性。这表明,在训练不稳定的情况下,即使是同一硬件平台也难以保证完全一致的训练轨迹。因此,​​精度调试和精度对齐的前提是训练过程必须稳定​​,否则跨平台对比将面临更大的挑战。 + +**图 1** LLaMA2-13B模型上主流AI处理器的loss曲线图 + +![](../figures/JD-1new.png) + +## 计算差异对训练结果的影响 + +### 计算误差对训练影响的实证研究 + +[Google TPU上的实验](https://dl.acm.org/doi/abs/10.1145/3579371.3589105)表明,计算精度与模型精度存在复杂关联。实验通过注入82.3%-90.3%的比特翻转故障发现: + +- 训练loss未出现显著差异 +- 65.5%-86.3%的case中loss表现略优于基准 +- 计算噪声可能产生类似正则化的效果 +- 证明适度的计算或通信精度差异不一定影响训练稳定性 + +### 计算误差模拟实验(LLaMA2-1B模型) + +**实验设计:​​** + +1. 基准测试: + - 启用确定性计算 + - NPU两次训练loss差异极小 + - 反向传播梯度方向相似度>99% +2. 误差注入测试: + - 对ParallelTransformerLayer每层输出注入±1%无偏误差 + - 1000步训练后loss差异约1.5% + - 注入±0.48%误差时loss差异<1%(见图2) + + **图 2** 实验1中NPU的loss曲线对比图 + ![](../figures/exp1_npu_loss.png "实验1中NPU的loss曲线对比图") +3. 模型参数分析: + - 1000步后参数余弦相似度≈1 + - 误差注入仅导致优化路径延迟 + - 反向传播梯度注入结果类似 + +**结论:​​** +可控的无偏计算误差不影响最终收敛,且与训练稳定性无关 + +### 跨平台训练对比实验(LLaMA2-7B) + +**实验配置:​​** + +- 模型架构:32层Transformer +- 数据集:C4 real news-like (9B tokens) +- 并行设置: + - DP=4, TP=1, PP=2 +- 优化器参数 + + | 超参名 | 说明 | 超参值 | + |-----------------------|--------------------------|-----------------| + | adam_beta1 | adam优化器梯度动量参数 | 0.9 | + | adam_beta2 | adam优化器梯度方差参数 | 0.95 | + | adam_eps | adam优化器极小值参数 | 1e-8 | + | weight_decay | 权重衰减 | 0.1 | + | clip_grad | 修剪梯度 | 1.0 | + | lr | 学习率 | 5e-5 | + | lr_warmup_fraction | 学习率预热步数占比 | 0.01 | + | global_batch_size | 全局批大小 | 256 (1M token) | + +**实验结果:​​** + +- 8000步训练: + - 平均loss差异<0.6% + - 最终收敛差异<0.1% +- 参数相似度: + - 2000步:0.998 + - 8000步:0.965 +- 训练曲线高度一致(见图3) + + **图 3** 实验2中主流AI处理器和NPU的loss曲线对比图 + ![](../figures/exp2.png "实验2中主流AI处理器和NPU的loss曲线对比图") + +**结论:​​** +主流AI处理器与NPU在LLM训练中表现高度一致,收敛位置相近 + +## 用户使用案例 + +### Qwen-1.8B + +用户使用NPU训练结果优于主流AI处理器的情况也很常见。Qwen-1.8B模型在小学习率下进行训练,NPU的loss表现比主流AI处理器更好。更高的蓝线为主流AI处理器的loss,更低的红线为NPU的loss,如图4所示。 + +**图 4** Qwen-1.8B模型上NPU与主流AI处理器的loss曲线对比图 +![](../figures/Qwen_loss.png "Qwen-1-8B模型上NPU与主流AI处理器的loss曲线对比图") + +### LLaMA2-7B + +用户使用使用昇腾千卡平台上训练LLaMA2-7B模型,已经做到了loss完全一致(训练不稳定状态的前1万步除外),如图所示,并且每3万步MMLU评估精度,得分波动在4%以内,如图所示。 + +**图 5** LLaMA2-7B模型上NPU与主流AI处理器的loss曲线图 + +![](../figures/JD-6new3.png) + +**图 6** MMLU评分对比图 +![](../figures/MMLU.png "MMLU评分对比图") + +## 精度调试过程案例 + +用户在实际使用时遇到的一些典型性能问题及其根因和解决方法: + +### 案例一:高学习率导致的训练不稳定问题 + +​​现象描述​​: + +- 使用1e-3高学习率训练LLaMA2-13B模型 +- 主流AI处理器和NPU均出现训练不稳定 +- loss曲线尖刺位置无法对齐 + +​​根因分析​​: + +- 过高的学习率导致优化过程震荡 +- 不同硬件平台的数值计算差异在高学习率下被放大 + +​解决方案​​: + +1. 将学习率调整为1e-4 +2. 优化效果: + - 训练稳定性显著提升 + - 跨平台loss曲线实现良好对齐 + +### 案例二:DeepSpeed分布式优化器同步问题 + +​​现象描述​​: + +- 训练过程中出现偶发性loss尖刺 +- 问题在主流AI处理器和NPU上表现一致 + +​​根因分析​​: + +- DeepSpeed优化器存在计算通信同步bug +- 脏数据进入导致训练过程异常 + +​​解决方案​​: + +1. 升级修复版DeepSpeed +2. 优化通信同步机制 +3. 效果验证: + - 消除偶发loss尖刺 + - 训练稳定性得到保障 + +### 案例三:大模型训练稳定性优化 + +​​问题演进​​: + +1. 初始问题: + - 使用错误的adam_beta2参数 + - 导致LLaMA2-1B/7B/13B训练不稳定 +2. 后续问题: + - 修复参数后13B模型仍不稳定 + - 下游评测指标不达标 + +​​优化方案​​: + +1. 参数调整: + - 学习率降至1e-4 + - 关闭dropout层 +2. 训练效果: + - 成功稳定训练13B大模型 + - 下游任务评测表现超出预期 +3. 业务成果: + - 达成预设性能指标 + - 实现业务目标 + +### 经验总结 + +- 大模型训练需精细调参 +- 学习率和正则化设置对稳定性影响显著 +- 硬件平台差异可通过参数优化消除 + diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/precision/intro.md b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/precision/intro.md new file mode 100755 index 0000000000000000000000000000000000000000..a67f54f2e6a8dfae70bc98e0a84afe658ea77a91 --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/precision/intro.md @@ -0,0 +1,30 @@ +# 精度分析概述 + +在使用MSAdapter进行大模型适配的情境下涉及了两种适配。 + +第一,从GPU跨硬件适配到NPU,用户可以选择PyTorch Ascend或者MSAdapter。由于硬件的不同,无法完成进行零误差对齐,只能观察loss收敛趋势或者benchmark评分收敛趋势判断正确性。 + +第二,同硬件上将PyTorch Ascend适配到MSAdapter。由于使用了相同的硬件,内核和算子,开启确定性计算后可以做到零精度对齐。 + +具体内容参考: + +- 非确定性计算torch(跨硬件) + - 精度趋势拟合 + - 主要指loss趋势拟合,benchmark趋势拟合 + - 参考[跨硬件精度分析](computation.md) + - 更细节的内容请参考[详细精度分析指南](https://www.hiascend.com/document/detail/zh/Pytorch/700/ptmoddevg/trainingmigrguide/LMaccuracy_0002.html),流程如下图 + ![](../../figures/precision_flow.png) + +- 确定性计算torch npu(同硬件) + 必须开启确定性计算配置 + + ```bash + export HCCL_DETERMINISTIC=true # HCCL确定性 + export ASCEND_LAUNCH_BLOCKING=1 # 硬件确定性 + export NCCL_DETERMINISTIC=1 + ``` + + - 同硬件下,基于相同的Kernel与算子,可以保证零误差。精度对齐流程参考[零误差对齐流程](0diff.md) + - 相关[工具MSprobe](msprobe.md) + - MindSpeed-XX的用例MSAdapter与PyTorch已经做到零误差 + diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/precision/msprobe.md b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/precision/msprobe.md new file mode 100755 index 0000000000000000000000000000000000000000..45cb2cd02a9f93c8d643c2c1b786cc5c380a25fb --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_compatibility/precision/msprobe.md @@ -0,0 +1,152 @@ +# 工具MSprobe + +若用户出现了误差,并希望实现0误差,可以使用MSprobe工具进行问题追踪。本文提供了MSprobe的安装与基本使用。 + +## 一、安装 + +`pip install mindstudio-probe` + +修改/root/miniconda3/envs/mindspore2.6.0/lib/python3.10/site-packages/msprobe/mindspore/service.py,开启通信算子dump(路径请用户自行修改)。 + +```python +# MS在100行左右(这个def函数仅有一个tab缩进!!),定义一个函数 +def new_register_primitive_hook(self): + print("reach here qzx") + from mindspore.ops.auto_generate.gen_ops_prim import (dist_comm_all_reduce_op, dist_comm_all_gather_op, + dist_comm_all_gather_into_tensor_op, dist_comm_reduce_scatter_op, + dist_comm_reduce_scatter_tensor_op, dist_comm_barrier_op, + dist_comm_scatter_op, dist_comm_gather_op, + dist_comm_irecv_op, dist_comm_broadcast_op, + dist_comm_isend_op) + primitive_instances = {"dist_comm_all_reduce_op": dist_comm_all_reduce_op, + "dist_comm_all_gather_op": dist_comm_all_gather_op, + "dist_comm_all_gather_into_tensor_op": dist_comm_all_gather_into_tensor_op, + "dist_comm_reduce_scatter_op": dist_comm_reduce_scatter_op, + "dist_comm_reduce_scatter_tensor_op": dist_comm_reduce_scatter_tensor_op, + "dist_comm_barrier_op": dist_comm_barrier_op, + "dist_comm_scatter_op": dist_comm_scatter_op, + "dist_comm_gather_op": dist_comm_gather_op, + "dist_comm_irecv_op": dist_comm_irecv_op, + "dist_comm_broadcast_op": dist_comm_broadcast_op, + "dist_comm_isend_op": dist_comm_isend_op, + } + for pname, primitive_instance in primitive_instances.items(): + primitive_combined_name = pname + Const.SEP + primitive_instance.__class__.__name__ + new_primitive = type('NewPrimitive', (primitive_instance.__class__,), + {'__call__': self.primitive_hook_service.wrap_primitive(primitive_instance.__call__, + primitive_combined_name)}) + primitive_instance.__class__ = new_primitive +``` + +然后再找到这个register_api_hook函数,里面加这一句。 +![](../figures/msprobe-1.png) +dump没有embedding问题: + +在/your_workspace/torch/nn/functional.py中将embedding替换为mint算子。 + +![](../figures/msprobe-2.png) + +```python +return mindspore.mint.nn.functional.embedding(input, weight, padding_idx, max_norm, norm_type, scale_grad_by_freq) +``` + +ValueError(Only support fusion of gelu and swiglu)问题规避: +![](../figures/msprobe-3.png) +在site-packages/mindstudio-probe/pytorch/hook_module/support_wrap_ops.yaml中注释-gelu和-silu。 + +## 二、代码修改 + +修改mindspeed_llm/training/training.py: + +MSAdatper / MindTorch + +```python +from msprobe.mindspore import PrecisionDebugger +``` + +修改mindspeed_llm/training/training.py   train函数  500行上下,两边一致 + +```python +debugger = PrecisionDebugger('your_workspace/MindSpeed/config.json') +while iteration < args.train_iters: + if iteration == 1: + debugger.start() + args.curr_iteration = iteration + loss_dict, skipped_iter, grad_norm, num_zeros_in_grad = \ + train_step(forward_step_func, + train_data_iterator, + model, + optimizer, + opt_param_scheduler, + config) + if iteration == 1: + debugger.stop() # 关闭数据dump + debugger.step() # 结束一个step的dump +``` + +注意: + +1. debugger 只能初始化一次 +2. 精度问题一般串行定位,大部分情况只需要dump一个step +3. MS global step从1开始,PT iteration从0开始 +4. 如果mindspore版本>=2.5,需参考这个PR修改:fix jit grad · Pull Request !3202 · Ascend/mstt - Gitee.com + +## 三、统计量对比示例 + +算子level: + +- L1 算子级别 +- L0 Cell级别 + +算子list: + +- 限定dump算子范围 + +### MS config.json + +```json +{ + "task": "statistics", + "dump_path": "your_workspace/MindSpeed-Core-MS/data_dump/", + "rank": [], + "step": [], + "level": "L1", + "statistics": { + "scope": [], + "list": [], + "data_mode": ["all"], + "summary_mode": "statistics" + } +} +``` + +结果分析 +![](../figures/msprobe-4.png) + +1. dump.json与stack.json数据顺序与实际执行顺序一致 +2. 大部分算子反向由框架导出,在stack.json中有一条正向的记录,不包含反向 +3. 部分layer通过bprob/backward函数自定义反向梯度计算,反向算子后缀为.forward +4. 统计值无法体现极小差异,无法定位真正开始有差异的算子,建议使用二进制dump +5. 当前套件代码实现有差异,dump算子名称无法完全对齐 +6. inplace算子采集到的输入错误,当前实际采集到的是输出,例如MS的adam_opt优化器算子、PT的Tensor.__iadd__算子 +7. MSprobe不支持套件通过自定义算子接入流程使能的融合算子dump(如MindSpeed-Core的rotary_position_embedding),该类算子可以通过上下游算子确认精度 +8. MindSpore算子dump,ops类算子dump以白名单方式支持,部分新ops算子如ops.rotary_position_embedding无法dump,需刷新ops算子列表 + +## 四、二进制对比 + +summary_mode 设置为 md5,dump耗时增长,8B网络耗时5分钟 + +结果如下 +![](../figures/msprobe-5.png) + +**本文只体用工具的基本使用,具体对齐流程见[零误差对齐](0diff.md)** + +## 参考链接 + +MindSpore 场景的精度数据采集:https://gitee.com/ascend/mstt/blob/master/debug/accuracy_tools/msprobe/docs/06.data_dump_MindSpore.md + +PyTorch 场景的精度数据采集:https://gitee.com/ascend/mstt/blob/master/debug/accuracy_tools/msprobe/docs/05.data_dump_PyTorch.md + +配置文件介绍:https://gitee.com/ascend/mstt/blob/master/debug/accuracy_tools/msprobe/docs/02.config_introduction.md#12-task-%E9%85%8D%E7%BD%AE%E4%B8%BA-statistics + +config.json配置示例:https://gitee.com/ascend/mstt/blob/master/debug/accuracy_tools/msprobe/docs/03.config_examples.md#21-task-%E9%85%8D%E7%BD%AE%E4%B8%BA-statistics