From 8d1a51f14e902da24f31e098e3253ff111ba1ed8 Mon Sep 17 00:00:00 2001 From: lijing Date: Thu, 18 Nov 2021 17:21:42 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B7=9F=E6=96=B0=E7=B2=BE=E5=BA=A6=E5=AF=B9?= =?UTF-8?q?=E6=AF=94=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...77\347\224\250\346\214\207\345\215\227.md" | 154 +++++++++++++++++- 1 file changed, 152 insertions(+), 2 deletions(-) diff --git "a/pytorch-train-guide/\347\262\276\345\272\246\345\257\271\346\257\224\345\267\245\345\205\267\344\275\277\347\224\250\346\214\207\345\215\227.md" "b/pytorch-train-guide/\347\262\276\345\272\246\345\257\271\346\257\224\345\267\245\345\205\267\344\275\277\347\224\250\346\214\207\345\215\227.md" index 6a3dd16..ec3a8fa 100644 --- "a/pytorch-train-guide/\347\262\276\345\272\246\345\257\271\346\257\224\345\267\245\345\205\267\344\275\277\347\224\250\346\214\207\345\215\227.md" +++ "b/pytorch-train-guide/\347\262\276\345\272\246\345\257\271\346\257\224\345\267\245\345\205\267\344\275\277\347\224\250\346\214\207\345\215\227.md" @@ -12,12 +12,13 @@ - 对比模式 - 根据device类型的不同,本工具支持2种不同的对比模式, + 根据device类型的不同,本工具支持3种不同的对比模式, **GPU->NPU模式**:在GPU上进行算子golden数据(同时包含输入和输出数据)的dump,NPU上load GPU上每个算子的输入,将每个算子的输出dump。最后对比GPU和NPU上每个算子的输出。**首推,同时支持fp32/O1/O2精度模式训练**。 **CPU->NPU模式**:在CPU上进行算子golden数据(同时包含输入和输出数据)的dump,NPU上load CPU上每个算子的输入,将每个算子的输出dump。最后对比CPU和NPU上每个算子的输出。**目前仅支持fp32精度模式训练,后续版本支持其他精度模式**。 + **NPU->GPU模式**:在NPU上进行算子golden数据(同时包含输入和输出数据)的dump,GPU上load NPU上每个算子的输入,将每个算子的输出dump。最后对比GPU和NPU上每个算子的输出。**一般较少使用,同时支持fp32/O1/O2精度模式训练**。 ## 1 GPU->NPU模式 ### 1.1 在NPU和GPU环境安装hdf5 @@ -219,4 +220,153 @@ tip4: with中的代码请保持与CPU一致 ### 2.6 对比 -请参考1.6节 \ No newline at end of file +请参考1.6节 + +## 3 NPU->GPU模式 + +### 3.1 在NPU和GPU环境安装hdf5 + +获取代码: + +``` +git clone https://github.com/HDFGroup/hdf5.git -b hdf5_1_10_7 +``` + +编译hdf5: + +``` +./configure --prefix=/usr/local/hdf5 --enable-cxx +make -j$(nproc) +make install +``` + +### 3.2 编译GPU版本torch + +**在GPU环境进行以下操作** + +获取代码(**注:必须使用ascend仓的代码,使用官方代码无法使用本工具**): + +``` +https://gitee.com/ascend/pytorch-develop.git +``` + +设置环境变量: + +``` +export PATH=/usr/local/hdf5/bin:$PATH +export LD_LIBRARY_PATH=/usr/local/hdf5/lib:$LD_LIBRARY_PATH +export LIBRARY_PATH=/usr/local/hdf5/lib:$LIBRARY_PATH +export CPATH=/usr/local/hdf5/include:$CPATH +``` + +修改编译选项: + +修改build.sh中的编译选项, + +修改前: + +``` +DEBUG=0 USE_DISTRIBUTED=1 USE_HCCL=1 USE_MKLDNN=0 USE_CUDA=0 USE_NPU=1 BUILD_TEST=0 USE_NNPACK=0 python"${PY_VERSION}" setup.py build bdist_wheel +``` + +修改后: + +``` +USE_DUMP=1 DEBUG=0 USE_DISTRIBUTED=0 USE_HCCL=0 USE_NCCL=0 USE_MKLDNN=0 USE_CUDA=1 USE_NPU=0 BUILD_TEST=0 USE_NNPACK=0 python"${PY_VERSION}" setup.py build bdist_wheel +``` + + +修改后编译torch, 指令:bash build.sh,参考pytorch仓[README](https://gitee.com/ascend/pytorch-develop) + + +### 3.3 编译NPU版本torch + +**在NPU环境进行以下操作** + +获取代码: + +``` +https://gitee.com/ascend/pytorch-develop.git +``` + +设置环境变量: + +``` +export PATH=/usr/local/hdf5/bin:$PATH +export LD_LIBRARY_PATH=/usr/local/hdf5/lib:$LD_LIBRARY_PATH +export LIBRARY_PATH=/usr/local/hdf5/lib:$LIBRARY_PATH +export CPATH=/usr/local/hdf5/include:$CPATH +``` + +修改编译选项: + +修改build.sh中的编译选项, + +修改前: + +``` +DEBUG=0 USE_DISTRIBUTED=1 USE_HCCL=1 USE_MKLDNN=0 USE_CUDA=0 USE_NPU=1 BUILD_TEST=0 USE_NNPACK=0 python"${PY_VERSION}" setup.py build bdist_wheel +``` + +修改后: + +``` +USE_DUMP=1 DEBUG=0 USE_DISTRIBUTED=1 USE_HCCL=1 USE_MKLDNN=0 USE_CUDA=0 USE_NPU=1 BUILD_TEST=0 USE_NNPACK=0 python"${PY_VERSION}" setup.py build bdist_wheel +``` + + +修改后编译torch, 指令:bash build.sh,参考pytorch仓[README](https://gitee.com/ascend/pytorch-develop) + +### 3.4 dump NPU的输入和输出 + +首先在NPU环境安装3.3节编译的whl包,然后修改训练代码,使能dump功能。找到模型训练中每个step的正向、反向,用with torch.utils.dumper进行上下文管理,同时**建议仅dump一个step**,例如 + +``` +for i, data in enumerate(dataloader): + with torch.utils.dumper(use_dump=True, dump_path="./model_npu.h5") as dump: + xxx # forward code + xxx # backward code + exit() + xxx # optimizer code +``` + +tip1: dump_path为dump数据的保存路径,可自定义设置 + +tip2: 不建议将参数更新相关的代码放在with内 + +### 3.5 在GPU上load NPU上dump的数据,并dump输出 + +首先在GPU环境安装3.2节编译的whl包,然后修改训练代码,使能load功能。找到模型训练中每个step的正向、反向,用with torch.utils.dumper进行上下文管理,同时**建议仅load一个step**,例如 + +``` +for i, data in enumerate(dataloader): + with torch.utils.dumper(use_load=True, load_file_path='model_npu.h5', dump_path="./model_gpu.h5") as dump: + xxx # forward code + xxx # backward code + exit() + xxx # optimizer code +``` + +tip1: load_file_path为NPU dump文件路劲,请从NPU环境拷贝到当前环境 + +tip2: dump_path为dump数据的保存路径,可自定义设置 + +tip3: with中的代码请保持与NPU一致 + +### 3.6 对比 + +使用msaccucmp.py进行精度对比 + +首先找到msaccucmp.py的位置: + +``` +find / -name msaccucmp.py +``` + +进行对比: + +``` +python3 /usr/local/Ascend/ascend-toolkit/5.0.2/x86_64-linux/tools/operator_cmp/compare/msaccucmp.py compare -m model_npu.h5 -g model_gpu.h5 +``` + +**注意:参数-m后仍然使用NPU的dump文件的路劲,-g后仍然使用GPU的dump文件的路径**。 \ No newline at end of file -- Gitee