diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_migration/FAQ.md b/docs/msadapter/docs/source_zh_cn/msadapter_migration/FAQ.md new file mode 100755 index 0000000000000000000000000000000000000000..9a055145ac64c4e13e4d9bc43c11a6eefe4e968a --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_migration/FAQ.md @@ -0,0 +1,20 @@ +# FAQ + +## 主流模型的支持情况 + +msadapter由于是深度学习框架的底层切换工具,只提供接口级别的一致性。只要模型代码与训练代码仓中未使用不支持的api,就可以一键切换。遇到问题请联系我们团队。 + +主流模型的情况请参考MindSpeed-LLM, MindSpeed-MM, MindSpeed-RL等仓库 + +华为内部业务各类模型已经通过了msadapter的使用,可以做到精度完全对齐。 + +## 目前版本的情况 +torch==2.4.0 +torch_npu +mindspeed==2.0.0 +mindspeed-llm +mindspeed-core-ms +mindspore==2.6.0 + +msadapter会与mindspore一同演进以方便用户的torch使用习惯 + diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_migration/case/deepseek3.md b/docs/msadapter/docs/source_zh_cn/msadapter_migration/case/deepseek3.md new file mode 100755 index 0000000000000000000000000000000000000000..47f53bd55be20dc8746afd5b44d17b66ad94770f --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_migration/case/deepseek3.md @@ -0,0 +1,212 @@ +# DeepSeek3 +Deepseek3属于主流大模型,直接使用MindSpeed-core-MS(MindSpeed-LLM)就可以在NPU上使用MindSpore进行预训练和微调了 + +目前我们提供单机八卡运行。多机运行请直接参考MindSpeed-LLM的文档说明。 + +## 预训练 + +环境安装可以直接参考 + +https://gitee.com/ascend/MindSpeed-LLM/blob/master/docs/mindspore/features/install_guide.md + +单机八卡 + +直接在MindSpeed-Core-MS/MindSpeed-LLM目录增加如下脚本进行与训练 + +注意配置好tokenizer目录,数据集目录,以及ckpt自定义目录 + +用户也可修改脚本路径,确保`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) + +# for --save +# CKPT_SAVE_DIR="/home/c00930917/ckpt" +DATA_PATH="/home/l00834982/gongcang/resource/dataset/enwiki_text_document" +TOKENIZER_PATH="/home/l00834982/gongcang/resource/tokenizer" +CKPT_LOAD_DIR="/home/c00930917/ckpt" + +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 +" +# --recompute-mtp-layer +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_migration/flow/config_change.md b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/config_change.md new file mode 100755 index 0000000000000000000000000000000000000000..5241f023ebfc3e1235204fcf6efbb2aa3a5d38a8 --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/config_change.md @@ -0,0 +1,14 @@ +# MindSpeed配置修改 + +## 参数修改 +文档主要针对mindspeed和megatron的一些参数区别问题 + + +## 特性问题 + +目前的支持情况[MindSpeed特性列表](https://www.hiascend.com/document/detail/zh/Pytorch/700/modthirdparty/Mindspeedguide/mindspeed_0005.html) + + + + + diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/constraints.md b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/constraints.md new file mode 100755 index 0000000000000000000000000000000000000000..57796704a8f1c3fc05da23b15a849a2b8c9de373 --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/constraints.md @@ -0,0 +1,34 @@ +# 模型选取与约束说明(必读) + +## 模型选取 + +建议用户在选取迁移模型时,尽可能选取权威PyTorch模型实现仓,包括但不限于PyTorch([imagenet](https://github.com/pytorch/examples/tree/master/imagenet)/[vision](https://github.com/pytorch/vision)等)、Meta Research([Detectron](https://github.com/facebookresearch/Detectron)/[detectron2](https://github.com/facebookresearch/detectron2)等)、open-mmlab([MMDetection](https://github.com/open-mmlab/mmdetection)/[mmpose](https://github.com/open-mmlab/mmpose)等)。 + +对于大模型,使用较为广泛的资源仓库是[HuggingFace](https://github.com/huggingface)、[Megatron-LM](https://github.com/NVIDIA/Megatron-LM)、[Llama-Factory](https://github.com/hiyouga/LLaMA-Factory)等仓库,可以在其中选取目标模型。 + +**同时请注意,MindSpeed-LLM, MindSpeed-MM已经支持了大部分当前主流的大模型。对于大模型的使用应当率先考虑基于MindSpeed-core-MS的使用(包含了MindSpeed-LLM和MindSpeed-MM** + +## 硬件约束说明 + +在进行模型迁移前,需要了解如下模型迁移约束,评估当前模型迁移的可行性,完成迁移前的环境准备: + +- 迁移前要保证选定的模型能在三方平台(如GPU)上运行,并输出精度和性能基线。 +- 模型迁移前需要参考《Ascend Extension for PyTorch 软件安装指南》完成昇腾PyTorch训练环境安装,以便完成迁移支持度分析与后续的模型训练,包括NPU驱动和固件、CANN软件(Toolkit、Kernels和NNAL)、以及PyTorch框架和torch\_npu插件的安装。 + +目前已知的不支持场景: + +- 当前不支持使用DP(Data Parallel,数据并行)模式的模型迁移。若用户训练脚本中包含NPU平台不支持的torch.nn.parallel.DataParallel接口,则需手动修改该接口为torch.nn.parallel.DistributedDataParallel接口,以执行多卡训练。原脚本需要在GPU环境下基于Python3.8及以上跑通。 +- APEX库中的FusedAdam融合优化器,目前不支持使用自动迁移或PyTorch GPU2Ascend工具迁移该优化器,需用户手工进行迁移,具体修改方法可单击[Link](https://gitee.com/ascend/apex#apexoptimizers)。 +- 大模型迁移暂不支持bmtrain框架的迁移。 +- bitsandbytes已支持在昇腾上进行安装,具体可单击[Supported Backends](https://github.com/bitsandbytes-foundation/bitsandbytes/blob/main/docs/source/installation.mdx#supported-backendsmulti-backend-supported-backends)进行参考,目前仅支持NF4量化/反量化迁移,用于LLM QLoRA微调,其余功能暂不支持。 +- 大模型迁移暂不支持colossai三方库中HybridAdam优化器相关接口的迁移。 +- 目前暂不原生支持xFormers训练,如需使用xFormers中的FlashAttentionScore融合算子的迁移,用户可参考[FlashAttentionScore](FlashAttentionScore.md)章节进行替换。 +- 当前NPU不支持grouped\_gemm第三方库安装。 +- 当前NPU支持composer第三方库安装,但NPU未做适配,无法使用。 + +## 软件(MindSpore)约束说明 + +目前我们使用msadapter和mindspore进行PyTorch的前端脚本的无缝切换,由于MindSpore与PyTorch的设计不同且仍在不断开发演进中,部分功能(即PyTorch API)尚未补全或者不支持 + +请直接参考[MSadapter API](http://daizhou_api.md) + diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/figures/JD-1new.png b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/figures/JD-1new.png new file mode 100755 index 0000000000000000000000000000000000000000..68021a1914a05e77658845529ee01a6cd0abea8a Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/figures/JD-1new.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/figures/JD-6new3.png b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/figures/JD-6new3.png new file mode 100755 index 0000000000000000000000000000000000000000..bceb5dfd465b5418ab1e94a5d830162329d96d2f Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/figures/JD-6new3.png differ diff --git "a/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/figures/MMLU\350\257\204\345\210\206\345\257\271\346\257\224\345\233\276.png" "b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/figures/MMLU\350\257\204\345\210\206\345\257\271\346\257\224\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..05c97292a5fe2b0c5303b975dce4572d0472198f Binary files /dev/null and "b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/figures/MMLU\350\257\204\345\210\206\345\257\271\346\257\224\345\233\276.png" differ diff --git "a/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/figures/Qwen-1-8B\346\250\241\345\236\213\344\270\212NPU\344\270\216\344\270\273\346\265\201AI\345\244\204\347\220\206\345\231\250\347\232\204loss\346\233\262\347\272\277\345\257\271\346\257\224\345\233\276.png" "b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/figures/Qwen-1-8B\346\250\241\345\236\213\344\270\212NPU\344\270\216\344\270\273\346\265\201AI\345\244\204\347\220\206\345\231\250\347\232\204loss\346\233\262\347\272\277\345\257\271\346\257\224\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..b59fb8fac8383b88220d8d1ad02fce761da95c73 Binary files /dev/null and "b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/figures/Qwen-1-8B\346\250\241\345\236\213\344\270\212NPU\344\270\216\344\270\273\346\265\201AI\345\244\204\347\220\206\345\231\250\347\232\204loss\346\233\262\347\272\277\345\257\271\346\257\224\345\233\276.png" differ diff --git "a/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/figures/\345\256\236\351\252\2141\344\270\255NPU\347\232\204loss\346\233\262\347\272\277\345\257\271\346\257\224\345\233\276.png" "b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/figures/\345\256\236\351\252\2141\344\270\255NPU\347\232\204loss\346\233\262\347\272\277\345\257\271\346\257\224\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..8ff7c12a716a54c79bf2021539e761c5f1323618 Binary files /dev/null and "b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/figures/\345\256\236\351\252\2141\344\270\255NPU\347\232\204loss\346\233\262\347\272\277\345\257\271\346\257\224\345\233\276.png" differ diff --git "a/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/figures/\345\256\236\351\252\2142\344\270\255\344\270\273\346\265\201AI\345\244\204\347\220\206\345\231\250\345\222\214NPU\347\232\204loss\346\233\262\347\272\277\345\257\271\346\257\224\345\233\276.png" "b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/figures/\345\256\236\351\252\2142\344\270\255\344\270\273\346\265\201AI\345\244\204\347\220\206\345\231\250\345\222\214NPU\347\232\204loss\346\233\262\347\272\277\345\257\271\346\257\224\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..c1abfed5a38794b6b40731adda73ea836a5c0e78 Binary files /dev/null and "b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/figures/\345\256\236\351\252\2142\344\270\255\344\270\273\346\265\201AI\345\244\204\347\220\206\345\231\250\345\222\214NPU\347\232\204loss\346\233\262\347\272\277\345\257\271\346\257\224\345\233\276.png" differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/install.md b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/install.md new file mode 100755 index 0000000000000000000000000000000000000000..48fce5a2393e18902b3f3ce78f97d284ef22de43 --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/install.md @@ -0,0 +1,40 @@ +# 环境安装 + +[固件与CANN参考官网](https://www.hiascend.com/document/detail/zh/canncommercial/80RC3/softwareinst/instg/instg_0003.html?Mode=PmIns&OS=Ubuntu&Software=cannToolKit) + +[torch npu安装](https://www.hiascend.com/document/detail/zh/Pytorch/60RC3/configandinstg/instg/insg_0001.html) # 这个应该必须?mindspeed应该是依赖的?? + +[mindspeed安装](https://gitee.com/ascend/MindSpeed) + +pip install -r requirements.txt +内容如下 + +``` +mindspore==2.6.0 +pybind11 +ninja +wheel +numpy<=1.26.0 +six +regex +decorator +attrs +psutil +pyyaml +protobuf +einops +scipy +sentencepiece +pytest +pytest-mock +tokenizers<=0.20.3 +transformers>=4.43.2 +gpytorch +pandas +scikit-learn +SQLAlchemy +``` + +最后 +`git clone https://gitee.com/mindspore/msadapter` +`export $PYTHONPATH=your_workspace/msadapter/mindtorch` \ No newline at end of file diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/migatrion.md b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/migatrion.md new file mode 100755 index 0000000000000000000000000000000000000000..d3a17e2796a2089fd7c8149155fdf2990694c18f --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/migatrion.md @@ -0,0 +1,89 @@ +# 迁移步骤 + +## 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”,并设置如下环境变量以指定必要的路径。 +```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 +``` + + +## 2. MSadapter迁移 +若用户使用了torch的很多特性而非megatron,请参见[MSadapter使用指南](http://xxxx/com) + + +## 3. 三方库依赖 + +### transformers +请参考[MindSpeed-core-MS](https://gitee.com/ascend/MindSpeed-Core-MS/tree/feature-0.2/) + +其中`test_convert_llm_ds.sh`的文件中使用版本已经说明支持了transformers的特定版本 + +或者直接 + +`git clone https://gitee.com/mirrors/huggingface_transformers.git -b v4.47.0` + +增加PYTHONPATH,已验证可使用 + +### 一些未支持的第三方库 +主要是torch api问题,参见[MSadapter使用指南](http://xxxx/com) +- 如果使用了torch.DDP则暂时不支持 \ No newline at end of file diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/model_save/intro.md b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/model_save/intro.md new file mode 100755 index 0000000000000000000000000000000000000000..e6807db19b81638bef6e6b529a3843f2c8849694 --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/model_save/intro.md @@ -0,0 +1,12 @@ +# 模型存取 + +正在开发中 + +## MindSpeed & MSadapter读取第三方模型 + +参考[MindSpeed-LLM权重转换](https://gitee.com/ascend/MindSpeed-llm#%E6%9D%83%E9%87%8D%E8%BD%AC%E6%8D%A2) + + +## 第三方读取 MindSpeed & MSadapter模型 + +.storage 尚特性未支持,敬请期待 \ No newline at end of file diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/performance/tools.md b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/performance/tools.md new file mode 100755 index 0000000000000000000000000000000000000000..ab362a14f0c4be7cdf0384f4bbefc4839f443c02 --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/performance/tools.md @@ -0,0 +1,26 @@ +# 性能调优工具 + +具体请参考[NPU性能调优指南](https://www.hiascend.com/document/detail/zh/Pytorch/700/ptmoddevg/trainingmigrguide/performance_tuning_0001.html) + +# 性能调优工具介绍 + +性能调优工具是一套基于CANN的分析工具,其目的在于分析NPU在运行中模型的训练效率,在训练有瓶颈或者有性能优化需求的时候,可以利用性能调优工具进行性能分析。 + +工具主要包括Ascend PyTorch Profiler、性能比对工具、集群分析工具和MindStudio Insight。其中Ascend PyTorch Profiler是基于CANN实现,用于分析CANN上硬件的运行效率和性能数据;性能比对工具和集群分析工具取自开源社区,对Ascend PyTorch Profiler采集得到的数据进行专项分析;MindStudio Insight是一款调优可视化工具,集成了CANN数据的分析和可视化等功能。 + +## Ascend PyTorch Profiler + +这个msadapter可以复用。参见《CANN 性能调优工具用户指南》中的“使用PyTorch框架接口采集和解析性能数据”章节,Ascend PyTorch Profiler接口可全面采集PyTorch训练场景下的性能数据,主要包括PyTorch层算子信息、CANN层算子信息、底层NPU算子信息以及算子内存占用信息等,可以全方位分析PyTorch训练时的性能状态。 + +## 性能比对工具 + +性能比对工具([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 用户指南》中的“安装与卸载”章节,完成工具准备。该工具是一款主要针对大模型集群场景的可视化调优工具,包括了Timeline视图、通信分析、计算耗时等的可视化呈现,以便用户分析潜在的性能瓶颈,并指导如何采取措施提升性能。 + diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/performance/tune.md b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/performance/tune.md new file mode 100755 index 0000000000000000000000000000000000000000..2e7bf211119de92f8a752de129490358025cf0e9 --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/performance/tune.md @@ -0,0 +1,21 @@ +# 调优经验 + +## 框架侧调优 + +- dvm调优(暂未公开,敬请期待) + +- 过往调优文档 + - [MindSpeed+MindSpore](https://gitee.com/ascend/MindSpeed-Core-MS/blob/r0.1.0/docs/source_zh_cn/usage/perform_tuning.md) + - 也可参考[PTA调优](https://www.hiascend.com/document/detail/zh/Pytorch/700/ptmoddevg/trainingmigrguide/performance_tuning_0001.html) + +## 并行侧调优 +- megatron/mindspeed调优 + - DP + - PP/VPP + - TP + - EP + - CP + - SP + +## 算子调优 +暂不涉及 \ No newline at end of file diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/precision/computation.md b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/precision/computation.md new file mode 100755 index 0000000000000000000000000000000000000000..bc1905b7487b26c0bd91b842ad5616eb96e60896 --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/precision/computation.md @@ -0,0 +1,118 @@ +# 计算精度说明 + +随着昇腾AI处理器(以下简称为NPU)在深度学习中的广泛应用,用户在使用NPU训练各种深度学习模型尤其是训练大语言模型时可能会遇到各种问题和困惑。NPU在AI处理器领域属于后来者,并且NPU与主流AI处理器在硬件、指令计算过程和浮点舍入截断模式方面存在差异。因此客户遇到问题和困惑时,往往会将原因归咎于这些天然差异,并且对这些差异存在很深的疑虑和担心。 + +本文中我们将介绍**NPU与主流AI处理器之间的计算差异**,并通过一些实验证明计算差异对训练结果没有显著影响,参见**计算差异对训练结果的影响**。大规模分布式训练所遇到的问题和困难也并非昇腾平台独有,**精度调试过程案例**中将介绍问题的来源、现象以及解决问题的思路和方法。 + +## NPU与主流AI处理器之间的计算差异 + +NPU与主流AI处理器之间的计算差异主要为浮点舍入模式差异和计算过程差异。 + +- **浮点舍入模式的差异** + + 在浮点舍入模式方面,主流AI处理器支持四种舍入模式,而NPU在主流AI处理器的四种模式基础上,增加了A模式和O模式。尽管所有舍入模式都会带来数值精度误差,但NPU通过增加舍入模式的选择,为用户提供了更多灵活性以适应不同的计算需求。相比主流AI处理器,NPU的舍入模式更丰富。 + + - A模式:最近舍入并在尾数为五时选择远离零舍入(正数选择更大数的方向,负数选择更小数的方向)。 + - O模式:最近舍入并在尾数为五时向奇数舍入。 + - 向最接近的可表示的值。 + - 当有两个最接近的可表示的值时首选“偶数”值。 + - 向负无穷大(向下)。 + - 向正无穷大(向上)以及向零(截断)。 + + 默认模式是最近舍入(Round to Nearest),它与四舍五入只有一点不同,对.5的舍入上,采用取偶数的方式。最近舍入模式:Round\(0.5\) = 0;Round\(1.5\) = 2;Round\(2.5\) = 2。四舍五入模式:Round\(0.5\) = 1;Round\(1.5\) = 2;Round\(2.5\) = 3。 + +- **计算过程的差异** + + 计算过程的差异包括计算使用的浮点精度、累加运算的顺序等。计算过程中的细微差异都能引起最终输出结果的不同,从而产生跟标杆比对程度不一的误差。 + +## 精度调试的前提条件 + +小的计算差异在某些超参配置下(例如大学习率、 大adam\_beta1、大adam\_beta2)以及某些场景下(例如浅层参数中极小数值的梯度)会被放大,从而在训练稳定性的表现上出现很大差异。例如主流AI处理器或NPU其中一方不稳定(很多loss尖刺),或者双方都不稳定,这在大规模训练和训练对比实践中都非常常见。 + +小的计算差异会引起AI处理器(主流/NPU)训练的模型参数位于不同的loss landscape位置。因为loss landscape的复杂性,主流AI处理器/NPU的某一方可能处于地形图中非常陡峭的位置,从而在对比中比较不利。特别是当超参不合理时(如大学习率),这种对比的不确定性就更强。LLaMA2-13B模型在1e-3基础学习率下,主流AI处理器运行两次训练得到的loss曲线,如图中可见主流AI处理器运行两次训练得到的loss也很难对齐,尖刺发生的位置有很大不确定性。期望在训练不稳定情况下完全对齐,在主流AI处理器上也是不可能完成的任务。因此,精度调试特别是精度对齐的前提条件是要能稳定训练。 + +**图 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%的loss甚至略微优于无故障基准。故障产生了噪声,相当于在模型结构中引入了正则层。所以计算或者通信的某些精度差异,并不一定会导致训练更不稳定。 + +- 针对计算差异,进行了大量的计算精度误差模拟实验。 + - 实验1,在LLaMA2 -1B模型上,对一些算子或者torch模块(正向和反向)注入各种程度不一的无偏误差(误差均值为0),实验结果证明可控的计算误差对最终的loss收敛没有影响。 + + 实验步骤和结果如下: + + 1. 开启确定性计算,在NPU上两次训练loss误差很小,反向传播时权重梯度方向对比相似度也在99%**,**以此正常训练作为基准。 + 2. 在基准实验设置基础上,对ParallelTransformerLayer的每层输出,每步都加入正负1%的无偏误差(实际的计算误差远小于1%),训练1000步的loss差异大约在1.5%,如果注入正负0.48%的无偏误差,训练1000步的误差小于1% ,如图所示。 + + **图 2** 实验1中NPU的loss曲线对比图 + ![](../figures/实验1中NPU的loss曲线对比图.png "实验1中NPU的loss曲线对比图") + + 3. 对比正常训练时和注入误差训练时,迭代1000步的最终模型参数,发现两者的余弦相似度几乎为1。注入误差训练的模型只是在优化路径上落后于正常训练的模型。 + 4. 以上实验证明,即便人为注入一个很大的无偏误差,对训练结果的影响仍然在可接受范围内,并且对训练稳定性不会造成影响,即loss尖刺跟计算误差无关。对反向过程中的激活值梯度与权重梯度注入误差,也会有非常类似的结果。 + + - 实验2,在LLaMA2 (7B,32层transformer)模型上,对主流AI处理器和NPU进行对比实验,为保证计算差异实验中未开确定性计算。实验在一个能够保持训练稳定性的合理超参配置下,从同一个初始权重训练,能精确对齐loss,并且在检查点的模型参数对比结果显示,两者相似度很高。 + + 实验设置和结论如下: + + - **实验设置:** + - 数据集设置:C4 real news-like,9B token数。 + - 并行设置:DP为4,TP为1,PP为2。 + - 优化器设置:使用开启overlap\_grad\_reduce通信并行的分布式优化器,关键超参 + + **表 1** 优化器关键超参表 + + | 超参名 | 说明 | 超参值 | + |-----------------------|--------------------------|-----------------| + | 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步时主流AI处理器和NPU模型参数的余弦相似度在0.998,到8000步时的余弦相似度在0.965。此实验可以证明在主流AI处理器和NPU上训练LLM,不仅两者在loss上很接近,而且收敛的位置也非常接近,如图3所示。 + + **图 3** 实验2中主流AI处理器和NPU的loss曲线对比图 + ![](figures/实验2中主流AI处理器和NPU的loss曲线对比图.png "实验2中主流AI处理器和NPU的loss曲线对比图") + +## 用户使用案例 + +- NPU在用户使用的过程中,其训练结果优于主流AI处理器的情况也很常见。用户的Qwen-1.8B模型在小学习率下进行训练,NPU的loss表现比主流AI处理器更好。更高的蓝线为主流AI处理器的loss,更低的红线为NPU的loss,如图4所示。 + + **图 4** Qwen-1.8B模型上NPU与主流AI处理器的loss曲线对比图 + ![](../figures/Qwen-1-8B模型上NPU与主流AI处理器的loss曲线对比图.png "Qwen-1-8B模型上NPU与主流AI处理器的loss曲线对比图") + +- 用户在昇腾千卡平台上训练LLaMA2-7B模型,已经做到了loss完全一致(训练不稳定状态的前1万步除外),如图所示,并且每3万步MMLU评估精度,得分波动在4%以内,如图所示。 + + **图 5** LLaMA2-7B模型上NPU与主流AI处理器的loss曲线图 + + ![](../figures/JD-6new3.png) + + **图 6** MMLU评分对比图 + ![](../figures/MMLU评分对比图.png "MMLU评分对比图") + +## 精度调试过程案例 + +用户在实际使用时遇到的一些典型性能问题及其根因和解决方法: + +- **案例一:主流AI处理器/NPU的loss对齐** + + 用户使用高学习率1e-3训练LLaMA2-13B模型,在主流AI处理器和NPU上都发生训练不稳定问题,两者在loss尖刺处始终不能对齐。后来改为低学习率1e-4后,训练稳定性得到极大提升,并且两者的loss也能很好对齐。 + +- **案例二:DeepSpeed bug引起的偶发loss尖刺** + + DeepSpeed分布式优化器中存在计算通信同步bug,会导致脏数据进入,从而引起训练不稳定。这在主流AI处理器和NPU表现是等同的。 + +- **案例三:LLaMA2-1B,7B和13B的训练稳定性问题和下游评测不达标问题** + + 一开始使用了错误的adam\_beta2导致训练不稳定,修复后在13B语言模型上又遇到训练稳定性问题,调低学习率到1e-4并且关闭dropout后成功训练13B大语言模型,并且在各种下游评测任务上超出预期,实现了业务目标。 + diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/precision/intro.md b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/precision/intro.md new file mode 100755 index 0000000000000000000000000000000000000000..09728ea67675c82e2fe1f1306c82150de4c419d3 --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/precision/intro.md @@ -0,0 +1,12 @@ +# 精度概述 + +- 非确定性计算torch + - 精度趋势拟合 + - 主要指loss拟合,benchmark拟合 + - [精度如何计算精度](computation.md) + - [详细精度分析指南](https://www.hiascend.com/document/detail/zh/Pytorch/700/ptmoddevg/trainingmigrguide/LMaccuracy_0002.html) +- 确定性计算torch npu + - 与torch npu的零误差验证由mindspeed-xx保证 + - 与msadapter的历史版本验证 +- [工具](tools.md) + diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/precision/tools.md b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/precision/tools.md new file mode 100755 index 0000000000000000000000000000000000000000..18ec925a3ab9ca4853e57d3aad1d9df3d09290ab --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_migration/flow/precision/tools.md @@ -0,0 +1,8 @@ +# 精度 + +具体请参考 + +https://www.hiascend.com/document/detail/zh/Pytorch/700/ptmoddevg/trainingmigrguide/LMaccuracy_0002.html + +msadapter的精度与torch npu零误差的,出现精度问题请考虑是否是torch npu可能遗留的潜在问题 + diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_migration/intro.md b/docs/msadapter/docs/source_zh_cn/msadapter_migration/intro.md new file mode 100755 index 0000000000000000000000000000000000000000..5bf5ee580c7be623621fd005d3b6d6fda87fbd4c --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_migration/intro.md @@ -0,0 +1,73 @@ +# Torch大模型迁移MSadapter + + +## 总览 +- 概述 +- 流程(见文末) +- 迁移详细流程 + - [迁移分析](flow/migatrion.md) + - [安装](flow/install.md) + - [配置修改](flow/config_change.md) + - [如何迁移](flow/migration.md) + - [精度验证](flow/precision/intro.md) + - [性能调优] + - [模型保存] +- [案例](case/deepseek3.md) +- [FAQ](FAQ.md) + +## 概述 +### 背景 +PyTorch作为当前深度学习领域中广泛采用的框架之一,经过msadapter与mindspore对昇腾平台的兼容性适配,现已支持在昇腾平台上使用torch前端脚本在mindspore后端上高效运行。 + +本手册的主要目标是指导具有一定PyTorch模型训练基础的用户将原本在其他硬件平台(例如GPU)上训练的模型迁移到MindSpore昇思框架后端与昇腾平台(NPU),或者PyTorch Ascend的代码直接迁移至MindSpore昇思框架。 + +手册内容涵盖大模型全流程的使用或者迁移方法,目前主要针对大模型提供了详尽的指导。主要关注点是如何有效地将PyTorch训练模型迁移至昇思框架后端与昇腾平台与上,并在零误差或者合理精度误差范围内高性能运行。 + +本手册面向的读者主要是具有一定深度学习基础与编程经验的研究人员、工程师和开发者: + +- 了解深度学习的基本概念和技术,能够使用Python编程语言、PyTorch框架进行深度学习模型开发和调试; +- 对深度学习模型的训练和优化有一定的了解,包括训练任务执行与评估,分布式训练,性能数据采集及分析等; +- 对常见的系统性能优化手段有基本认知,例如并行化、编译优化等。 + +### 什么是模型迁移 + +模型迁移在硬件上指将原本运行在GPU或其他硬件平台的深度学习模型迁移至NPU,并保障模型在合理精度误差范围内高性能运行。 + +除了硬件上的迁移改动,可以将深度学习框架的后端执行从PyTorch迁移到MindSpore昇思后端框架。 + +### 为什么要做模型迁移 + +将模型从其他硬件平台迁移到NPU时,由于硬件架构和库的不同,涉及到一系列底层到上层的适配操作。以GPU为例,模型迁移至NPU需要适配的原因可分为三方面: + +- 硬件特性和性能特点差异 + + 由于NPU和GPU的硬件特性和性能特点不同,模型在NPU上可能需要进一步的性能调试和优化,以充分发挥NPU的潜力。 + +- 计算架构差异 + + NVIDIA GPU采用CUDA(Compute Unified Device Architecture)的并行计算架构,而华为NPU采用CANN(Compute Architecture for Neural Networks)的异构计算架构。 + +- PyTorch深度学习框架在NPU上的修改 **这个删除** + + 为了支持NPU硬件,需要通过[Ascend Extension for PyTorch](https://www.hiascend.com/document/detail/zh/Pytorch/600/quickstart/productoverview/ptoverview_0001.html)对PyTorch框架进行适配:包括适配张量运算、自动微分等功能,以便在NPU上高效执行。此外,[PyTorch](https://pytorch.org/tutorials/advanced/privateuseone.html)正持续原生支持NPU,以提供给用户更好的模型体验,实现迁移修改最小化。 + +- PyTorch与MindSpore + + MindSpore是原生支持NPU硬件的工具,为了方便广大开发者的PyTorch使用习惯,现在使用msadapter可以在绝大多数情况下无缝切换至MindSpore后端框架。MindSpore为华为内部纯自研框架,华为团队可以提供更多的NPU性能加速与快速响应客户需求的开发,并且长期迭代与技术规划而不用受限于PyTorch的官方版本发布。 + +## 流程 + +1. [迁移分析](flow/constraints.md) + - 判断哪些东西必须修改 +2. [环境安装](flow/install.md) +3. [配置修改](flow/config_change.md) + - mindspeed与megatron的配置有区别 +4. [具体迁移操作](flow/migatrion.md) + - 具体操作步骤 +5. [验证精度](flow/precision/intro.md) + - 非确定性loss收敛验证 + - 确定性零误差验证 +6. [性能勘验](flow/precision/intro.md) + - 非重点,请着重参考外部文档 +7. [模型保存](flow/model_save/intro.md) + diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/api.md b/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/api.md new file mode 100755 index 0000000000000000000000000000000000000000..7cf38f6ee7739c906bd305d9f105b2d1097c59f3 --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/api.md @@ -0,0 +1,5 @@ +# API + +详情参见 + +https://daizhou_api.com diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/constraints.md b/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/constraints.md new file mode 100755 index 0000000000000000000000000000000000000000..b326bc4df2d7069753ebb7746b8a09e5b01fa64e --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/constraints.md @@ -0,0 +1,80 @@ +# MSadapter约束说明(重要) + +MSadapter目前未能完全适配PyTorch,若用户用了如下功能请选择修改代码,或者等待MSadapter正式版本 + +根据PyTorch的API分类如下 + +如果为大部分支持的模块出现报错,请查看[API](api.md) + +| PyTorch 模块 | 支持度 | 描述 | +|-------------------------------------|------------|------| +| `torch` | 大部分支持 | PyTorch 的核心包,包含张量和基本运算 | +| `torch.nn` | 大部分支持 | 神经网络模块,提供层和损失函数 | +| `torch.nn.functional` | 大部分支持 | 包含神经网络中常用的函数(如激活函数、损失函数等) | +| `torch.Tensor` | 大部分支持 | 张量对象,PyTorch 的主要数据结构 | +| `Tensor Attributes` | 部分缺失,补齐中 | 张量的属性,如 dtype、device、shape 等 | +| `Tensor Views` | 等待MindSpore2.7.0 | 张量视图操作,如 reshape、transpose 等 | +| `torch.amp` | ? | 自动混合精度训练支持 | +| `torch.autograd` | 机制不同,需要手动调用修改 | 自动求导引擎 | +| `torch.library` | 使用NPU算子 | 自定义算子库支持 | +| `torch.cpu` | 支持 | CPU 后端支持 | +| `torch.cuda` | 支持 | CUDA 支持,用于 GPU 运算 | +| `Understanding CUDA Memory Usage` | 无 | 理解和优化 CUDA 内存使用的指南 | +| `Generating a Snapshot` | 无 | 生成内存快照 | +| `Using the visualizer` | 工具不同 | 使用可视化工具分析性能 | +| `Snapshot API Reference` | 无 | 快照相关 API 参考文档 | +| `torch.mps` | | Apple Metal Performance Shaders (MPS) 后端支持 | +| `torch.backends` | gloo未支持 | 后端配置与管理 | +| `torch.export` | 等待MindSpore2.7.0 | 导出模型以供部署 | +| `torch.distributed` | 等待MindSpore2.7.0 | 分布式训练支持 | +| `torch.distributed.algorithms.join` | 等待MindSpore2.7.0 | 分布式训练中的 join 算法 | +| `torch.distributed.elastic` | 等待MindSpore2.7.0 | 弹性分布式训练支持 | +| `torch.distributed.fsdp` | 等待MindSpore2.7.0 | Fully Sharded Data Parallel(完全分片数据并行) | +| `torch.distributed.optim` | 等待MindSpore2.7.0 | 分布式优化器支持 | +| `torch.distributed.tensor.parallel` | 等待MindSpore2.7.0 | 张量并行支持 | +| `torch.distributed.checkpoint` | 等待MindSpore2.7.0 | 分布式检查点支持 | +| `torch.distributions` | | 概率分布和采样支持 | +| `torch.compiler` | | 编译器后端支持 | +| `torch.fft` | | 快速傅里叶变换 | +| `torch.func` | | 函数式编程接口 | +| `torch.futures` | | 异步计算支持 | +| `torch.fx` | | 图形表示和转换工具 | +| `torch.hub` | | 预训练模型中心 | +| `torch.jit` | 使用@torch.compile() | Just-In-Time 编译器 | +| `torch.linalg` | | 线性代数运算 | +| `torch.monitor` | | 监控工具 | +| `torch.signal` | | 信号处理支持 | +| `torch.special` | | 特殊数学函数 | +| `torch.overrides` | | 运算符重载支持 | +| `torch.package` | | 模型打包工具 | +| `torch.profiler` | | 性能分析工具 | +| `torch.nn.init` | | 参数初始化方法 | +| `torch.onnx` | | ONNX 格式支持 | +| `torch.optim` | | 优化器实现 | +| `Complex Numbers` | | 复数支持 | +| `DDP Communication Hooks` | | DDP 通信钩子 | +| `Pipeline Parallelism` | | 流水线并行支持 | +| `Quantization` | | 量化支持 | +| `Distributed RPC Framework` | | 分布式 RPC 框架 | +| `torch.random` | | 随机数生成 | +| `torch.masked` | | 掩码张量支持 | +| `torch.nested` | | 嵌套张量支持 | +| `torch.sparse` | | 稀疏张量支持 | +| `torch.Storage` | | 存储底层接口 | +| `torch.testing` | | 测试工具 | +| `torch.utils` | | 实用工具集 | +| `torch.utils.benchmark` | | 性能基准测试工具 | +| `torch.utils.bottleneck` | | 性能瓶颈检测工具 | +| `torch.utils.checkpoint` | | 内存节省的检查点机制 | +| `torch.utils.cpp_extension` | | C++ 扩展支持 | +| `torch.utils.data` | | 数据加载和处理工具 | +| `torch.utils.jit` | | JIT 工具 | +| `torch.utils.dlpack` | | DLPack 转换支持 | +| `torch.utils.mobile_optimizer` | | 移动端优化器 | +| `torch.utils.model_zoo` | | 模型仓库 | +| `torch.utils.tensorboard` | | TensorBoard 集成 | +| `Type Info` | | 类型信息参考 | +| `Named Tensors` | | 命名张量支持 | +| `Named Tensors operator coverage` | | 命名张量操作支持情况 | +| `torch.__config__` | | 配置信息 | +| `torch._logging` | | 日志记录支持 | \ No newline at end of file diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/diff.md b/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/diff.md new file mode 100755 index 0000000000000000000000000000000000000000..a49f7c38839a41fcfce288be251700a16e396d66 --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/diff.md @@ -0,0 +1,159 @@ +# 框架差异介绍 +mindspore包含静态图模式和动态图模式。本文mindspore默认指代mindspore动态图模式。 + +本文档记录torch mindspore jax微分机制差异(后续补齐框架设计的不同目的造成的差异) + +侧重torch与mindspore,以及两者的使用比对 + +## 简介 +mindspore在前端可以简易理解为 +- torch的模型表达与正向转播 +- jax的函数式反向传播 + +在代码表达力方面,jax函数式微分显著高于torch的命令式微分,见文末的高阶微分与混合微分。由于jax仍然受众较少,多为google内部与美国研究院使用。mindspore的前端选择类似torch的方式减少用户习惯转变的困难。 + +在顶层设计、调用而言:PyTorch的核心是模型,MindSpore,JAX核心是函数 +- torch是包含了前反向的模型 +- mindspore, jax是打包了模型的函数 + +函数式微分mindspore官网未详细介绍,内容与jax一致,可以参考jax的使用方式 + +## 自动微分使用与机制 +常规模型构建与正向mindspore与torch无差别 + +torch为内置微分,除非要自定义反向,否则无需调用 +```python +for inputs, labels in train_loader: + inputs, labels = data_process(inputs, labels) + optimizer.zero_grad() + outputs = model(inputs) + loss = criterion(outputs, labels) + loss.backward() + optimizer.step() +``` + +mindspore,jax需要一次显式微分调用,且正向也是打包模型的函数: +```python +x = ops.ones(5, mindspore.float32) # input tensor +y = ops.zeros(3, mindspore.float32) # expected output +w = Parameter(Tensor(np.random.randn(5, 3), mindspore.float32), name='w') # weight +b = Parameter(Tensor(np.random.randn(3,), mindspore.float32), name='b') # bias +def function(x, y, w, b): + z = ops.matmul(x, w) + b + loss = ops.binary_cross_entropy_with_logits(z, y, ops.ones_like(z), ops.ones_like(z)) + return loss +grad_fn = mindspore.grad(function, (2, 3)) +grads = grad_fn(x, y, w, b) + +``` + +## 如何关闭微分 +Torch关闭微分 +```python +with torch.no_grad(): + out_tensor = some_func() +``` + +JAX关闭微分 +```python +def f(x, compute_grad): + if compute_grad: + return x ** 2 + else: + return jax.lax.stop_gradient(x ** 2) + +# 需要梯度时 +df_with_grad = jax.grad(f)(1.0, compute_grad=True) # 2.0 + +# 不需要梯度时 +df_no_grad = jax.grad(f)(1.0, compute_grad=False) # 0.0(梯度被阻断) +``` + + +## 函数式微分 +虽然JAX的函数和PyTorch的操作序列最终都会转换为底层计算步骤,但​​核心区别在于抽象层次和约束条件: + +JAX通过​​纯函数​​隐藏操作序列,强调数学抽象和确定性,适合高性能计算。 +PyTorch通过​​显式操作​​暴露计算图,强调灵活性和动态性,适合快速实验。 +选择依据: + + +纯动态、调试友好 -> PyTorch +并行化、编译优化 -> JAX,MindSpore + +torch函数式微分目前只是Beta版本,暂不可用,且非原生。 + +torch的优势是更符合程序员的编程视角,而非数学物理研究人员视角。 + + + +mindspore与jax为原生的函数式微分,在微分表达力expressiveness上显著优于torch。torch基本可以认为只支持二阶微分,即海森矩阵。3阶就需要进行手动计算图管理,背离常用习惯。 + + +https://gitee.com/mindspore/mindspore/issues/IAK0Y9 + + +### 高阶微分与混合微分 + + +### 高阶微分 +```python + +import jax +import jax.numpy as jnp + +def f(x): + return x ** 3 + 2 * x ** 2 + jnp.sin(x) + +# 一阶导 +dfdx = jax.grad(f) +# 二阶导 +d2fdx2 = jax.grad(jax.grad(f)) +# 三阶导 +d3fdx3 = jax.grad(jax.grad(jax.grad(f))) +``` +### 混合微分 +```python + +def g(x, y, z): + return x * y ** 2 + jnp.exp(z) + +# 对x求一阶导,y求二阶导,z不求导 +mixed_grad = jax.grad( + jax.grad( # 对y的二阶导 + lambda x, y, z: jax.grad(lambda y: g(x, y, z))(y), # 对y的一阶导 + argnums=1 + ), + argnums=0 # 对x的一阶导 +) + +x, y, z = 1.0, 2.0, 0.5 +print("∂²g/∂y∂x:", mixed_grad(x, y, z)) # 混合导数结果 +``` +### 高阶混合微分 +```python +from functools import partial + +def h(x, y, z): + return x ** 3 * y + y ** 2 * jnp.log(z) + +# 自定义混合微分函数 +def mixed_derivative(func, x_order=0, y_order=0, z_order=0): + def wrapped(*args): + f = func + # 对x求导x_order次 + for _ in range(x_order): + f = jax.grad(f, argnums=0) + # 对y求导y_order次 + for _ in range(y_order): + f = jax.grad(f, argnums=1) + # 对z求导z_order次 + for _ in range(z_order): + f = jax.grad(f, argnums=2) + return f(*args) + return wrapped + +# 示例:∂³h/∂x²∂y +dh = mixed_derivative(h, x_order=2, y_order=1) +print("∂³h/∂x²∂y:", dh(1.0, 2.0, 3.0)) # 在(1,2,3)处的值 +``` \ No newline at end of file diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/faq.md b/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/faq.md new file mode 100755 index 0000000000000000000000000000000000000000..1694138a46cebaf366684f293ba453790f5a512f --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/faq.md @@ -0,0 +1,41 @@ +# FAQ + +## PyTorch接口的支持情况 + +我们已经支持了常用900+个torch api的无缝切换,保证功能的一致性与性能。 +torch api总共约2000+个api,msadapter与mindspore团队正在陆续补齐中 + +## PyTorch接口版本 + +目前我们只关注主要功能,针对PyTorch 2.x版本的主流接口进行适配(2.1.0版本可以视为稳定版本) + +在功能补全后会有特定的分支给不同PyTorch版本 + +## 第三方框架支持情况 + +megatron有支持版本 + +transformers有支持版本 + +其他暂不支持,后续会有支持计划。 + +## 主流模型的支持情况 + +msadapter由于是深度学习框架的底层切换工具,只提供接口级别的一致性。只要模型代码与训练代码仓中未使用不支持的api,就可以一键切换。遇到问题请联系我们团队。 + +主流模型的情况请参考MindSpeed-LLM, MindSpeed-MM, MindSpeed-RL等仓库。 + +华为内部业务各类模型已经通过了msadapter的使用,可以做到精度完全对齐。 + +## 性能情况 +性能问题较为复杂,不在此讨论。mindspore团队会持续地提升后端运行速度 + +## 目前版本的情况 +``` +torch 2.1.0 ~ 2.5.0 后续版本尚未测试 +mindpore==2.6.0 +msadapter master分支 +``` + +msadapter会与mindspore一同演进以方便用户的torch使用习惯 + diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/figures/image.png b/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/figures/image.png new file mode 100755 index 0000000000000000000000000000000000000000..d4b6ef8a436ae120635ac5978718b11df85c9703 Binary files /dev/null and b/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/figures/image.png differ diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/install.md b/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/install.md new file mode 100755 index 0000000000000000000000000000000000000000..e80a2f60c0c06e6ec2ab259d0433513348d7f87d --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/install.md @@ -0,0 +1,23 @@ +### msadapter 环境配置 + +原生 PyTorch 的环境安装如下 + +pip install安装如下包 +``` +torch>=2.1.0 +mindspore==2.6.0 +``` +安装完成后 + +`git clone https://gitee.com/mindspore/msadapter` + +直接使用master + +`export $PYTHONPATH=your_workspace/msadapter/mindtorch` + +只需一行环境变量配置便可以把torch的实际执行替换为msadapter,后端为mindspore动态图版本 + +注意:由于框架的机制不相同,还是需要修改部分代码,详请参加[Quick Start](quick_start.md) + +第三方库用户请查看[MSadatper大模型迁移指南](http://msmsmsmsmsmsmsm.com) + diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/intro.md b/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/intro.md new file mode 100755 index 0000000000000000000000000000000000000000..da08dbee25bcd5e0ad78d9003d91e9dc438396e0 --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/intro.md @@ -0,0 +1,53 @@ +# MSadapter使用文档 + +## 总览 +- 介绍(本文档) +- [安装](install.md) +- [Quick Start](quick_start.md) + - 流程 + - 用例 +- [约束](constraints.md) + - 暂不支持的功能 + - [框架机制差异](diff.md) +- [API](api.md) +- [LLM](llm.md) +- [FAQ](faq.md) + +## 概述 +PyTorch作为当前深度学习领域中广泛采用的框架之一,经过msadapter与mindspore对昇腾平台的兼容性适配,现已支持在昇腾平台上使用torch前端脚本在mindspore后端上高效运行。 + +本手册的主要目标是指导具有一定PyTorch模型训练基础的用户上训练的模型迁移到MindSpore昇思框架后端与昇腾平台(NPU)。 + +手册内容涵盖模型全流程的使用或者迁移方法,目前主要针对大模型提供了详尽的指导。主要关注点是如何有效地将PyTorch训练模型迁移至昇思框架后端与昇腾平台与上,并在零误差或者合理精度误差范围内高性能运行。 + +本手册面向的读者主要是具有一定深度学习基础与编程经验的研究人员、工程师和开发者并已经熟练使用PyTorch。 + +## 为什么要使用MSadapter + +| 深度学习框架 | 优势 | 劣势 | +| :------------ | :------------ | :------------ | +| torch | 业界主流,性能最佳,问题少 | 制裁导致训练GPU资源大幅下降,NPU成为首选 | +| msadapter + mindspore | 符合用户习惯且改动较少;小代价兼容torch各个版本;可以配合mindspore演进,不受制于torch版本 | torch部分接口与功能暂时不支持 | +| 原生mindspore | 纯自研框架,不受制于torch | torch GPU已经是主流,用户学习成本过高 | + +- 硬件特性和性能特点差异 + + 由于NPU和GPU的硬件特性和性能特点不同,模型在NPU上可能需要进一步的性能调试和优化,以充分发挥NPU的潜力。 + +- 计算架构差异 + + NVIDIA GPU采用CUDA(Compute Unified Device Architecture)的并行计算架构,而华为NPU采用CANN(Compute Architecture for Neural Networks)的异构计算架构。 + +- PyTorch与MindSpore + + MindSpore是原生支持NPU硬件的工具,为了方便广大开发者的PyTorch使用习惯,现在使用msadapter可以在绝大多数情况下无缝切换至MindSpore后端框架。MindSpore为华为内部纯自研框架,华为团队可以提供更多的NPU性能加速与快速响应客户需求的开发,并且长期迭代与技术规划而不用受限于PyTorch的官方版本发布。 + +## msadapter使用核心与目标 +用户使用`export $PYTHONPATH=workspace/msadapter/mindtorch`之后,根据迁移分析修改少量代码/或不修改后即可在NPU调用后端mindspore运行。 + +希望用户可以在进行此环境变量配置后,直接无缝运行mindspore是我们的核心目的。目前复杂代码仍有一些限制,但功能会逐渐补齐。 + +## 第三方库用户 +目前华为团队已经支持了megatron的完整迁移 + +详情参见[MSadatper大模型迁移指南](http://msmsmsmsmsmsmsm.com) diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/llm.md b/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/llm.md new file mode 100755 index 0000000000000000000000000000000000000000..b99a4ea96637d47c3f73b7f2ca426d355318859c --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/llm.md @@ -0,0 +1,6 @@ +# LLM手册 + +直接使用MSadapter进行LLM开发请参考 [MindSpeed-LLM](https://gitee.com/ascend/MindSpeed-LLM) + + +希望使用MSadpter进行torch的大模型迁移参考 [Torch大模型迁移指南-MSadapter](?????????) \ No newline at end of file diff --git a/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/quick_start.md b/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/quick_start.md new file mode 100755 index 0000000000000000000000000000000000000000..3f3c0ae8883fe2abc1e3ee10214d1224f1a20e63 --- /dev/null +++ b/docs/msadapter/docs/source_zh_cn/msadapter_user_guide/quick_start.md @@ -0,0 +1,199 @@ +# Quick Start + + +## 流程 + +1. [查看约束](constraints.md) + - 部分PyTorch功能尚未支持 +2. [API修改](api.md) + - 涵盖了主流PyTorch接口 + - 必要修改见下文 + +## 重要API说明 +|torch api | 解决方案&说明 | 后续支持状态 | +| :------------ | :------------ | :------------ | +| torch.Tensor.to(device) | 如果在NPU无需to,只有cpu需要改为torch.Tensor.cpu() | 正在开发中 | +| loss.backward() & model.forward() | 请参考下方用例, 有约10行改动 | 由于微分机制不同,无法无缝迁移,需要手动修改 | +| torch.compile | 暂不支持,请使用@torch.compile()相关内容。不支持类Dynamo功能,图优化更类似于jax的显示jit | 暂无支持计划,使用@torch.compile | +| torch.Tensor.View相关 | View提供了很多视图功能,暂不支持。例如Tensor.conj() | 正在开发中 | +| torch.Tensor成员变量 |requires_grad, _storage此类重要变量暂时没有同步|正在开发中| + +## 用例 +代码对比 +![](figures/image.png) + +1. msadapter默认把tensor都存储在NPU上,无需显示指定。指定cpu则需.cpu() +2. 训练接口由于机制不同需要显示调用一次MindSpore计算图 + +可运行用例代码如下 + +### PyTorch +```python +import argparse +import torch +import torch.nn as nn +import torch.optim as optim +from torch.utils.data import DataLoader +from torchvision import datasets, transforms + +class ToyModel(nn.Module): + def __init__(self): + super(ToyModel, self).__init__() + self.net1 = nn.Linear(10, 10) + self.relu = nn.ReLU() + self.net2 = nn.Linear(10, 5) + + def forward(self, x): + return self.net2(self.relu(self.net1(x))) + +def parse_args(): + parser = argparse.ArgumentParser(description="command line arguments") + parser.add_argument('--batch_size', type=int, default=64) + parser.add_argument('--epochs', type=int, default=10) + parser.add_argument('--learning_rate', type=float, default=0.0001) + return parser.parse_args() + +def data_process(inputs, labels): + squeezed_tensor = inputs.squeeze(0).squeeze(0) + inputs = squeezed_tensor[:, :10] + labels = labels.repeat(28, 5) * (1/140) + return inputs, labels + + +def main(): + # 获取传参 + args = parse_args() + transform = transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize((0.5,), (0.5,)) + ]) + train_dataset = datasets.MNIST(root='./data', train=True, download=False, transform=transform) + # 加载数据集 + train_loader = DataLoader(train_dataset, batch_size=args.batch_size, shuffle=True) + + model = ToyModel().to('cuda') + + # 定义损失函数 + criterion = nn.CrossEntropyLoss() + optimizer = optim.Adam(model.parameters(), lr=args.learning_rate) + step = 0 + + for epoch in range(args.epochs): + model.train() + for inputs, labels in train_loader: + + inputs, labels = data_process(inputs, labels) + + inputs, labels = inputs.to('cuda'), labels.to('cuda') + + optimizer.zero_grad() + outputs = model(inputs) + # 将loss转到NPU处理 + loss = criterion(outputs, labels).to('cuda') + loss.backward() + optimizer.step() + # 添加每个step的打印,用户可自行修改 + print(type(loss)) + print(f"step == {step}") + step += 1 + +if __name__ == "__main__": + main() +``` + + +### MSadapter +```python +import argparse + +import torch +import torch_npu +import torch.nn as nn +import torch.optim as optim + +from torch.utils.data import DataLoader +from torchvision import datasets, transforms + +from mindspore.ops import composite as C +from mindspore.common.api import _pynative_executor + +class ToyModel(nn.Module): + def __init__(self): + super(ToyModel, self).__init__() + self.net1 = nn.Linear(10, 10) + self.relu = nn.ReLU() + self.net2 = nn.Linear(10, 5) + + def forward(self, x): + return self.net2(self.relu(self.net1(x))) + +def parse_args(): + parser = argparse.ArgumentParser(description="command line arguments") + parser.add_argument('--batch_size', type=int, default=64) + parser.add_argument('--epochs', type=int, default=1) + parser.add_argument('--learning_rate', type=float, default=0.0001) + return parser.parse_args() + +def data_process(inputs, labels): + squeezed_tensor = inputs.squeeze(0).squeeze(0) + inputs = squeezed_tensor[:, :10] + labels = labels.repeat(28, 5) * (1/140) + return inputs, labels + + +def main(): + # 获取传参 + args = parse_args() + transform = transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize((0.5,), (0.5,)) + ]) + train_dataset = datasets.MNIST(root='./data', train=True, download=False, transform=transform) + # 加载数据集 + train_loader = DataLoader(train_dataset, batch_size=args.batch_size, shuffle=True) + # 将模型转移到NPU上 + # device = torch.device("npu") + # model = ToyModel().to(device) + model = ToyModel() + + # 定义损失函数 + criterion = nn.CrossEntropyLoss() + optimizer = optim.Adam(model.parameters(), lr=args.learning_rate) + step = 0 + + for epoch in range(args.epochs): + model.train() + for inputs, labels in train_loader: + # 数据预处理,将数据集的数据转成需要的shape + inputs, labels = data_process(inputs, labels) + # 将数据转到NPU处理 + # inputs, labels = inputs.to(device), labels.to(device) #################### + + optimizer.zero_grad() + + + # loss = criterion(outputs, labels).to(device) + def flag_func(): + pass + _pynative_executor.set_grad_flag(True) + _pynative_executor.new_graph(flag_func, inputs) + outputs = model(inputs) + loss = criterion(outputs, labels) + _pynative_executor.end_graph(flag_func, loss, inputs) + + + # loss.backward() + grad_ = C.GradOperation(True, True, True) + weights = model.trainable_params() + _pynative_executor.check_run(grad_, flag_func, weights, None, inputs) + _pynative_executor.grad(flag_func, grad_, weights, None, inputs, torch.ones_like(loss)) + + + optimizer.step() + # 添加每个step的打印,用户可自行修改 + print(f"step == {step}") + step += 1 + +if __name__ == "__main__": + main() +```