From d746b00dd56fa22ceaee6f943bcb0934064776af Mon Sep 17 00:00:00 2001 From: lijing Date: Tue, 24 Aug 2021 14:59:49 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=B2=BE=E5=BA=A6?= =?UTF-8?q?=E5=AF=B9=E6=AF=94=E5=B7=A5=E5=85=B7=E4=BD=BF=E7=94=A8=E6=8C=87?= =?UTF-8?q?=E5=8D=97?= 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" | 214 ++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 "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" 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" new file mode 100644 index 0000000..37227b5 --- /dev/null +++ "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" @@ -0,0 +1,214 @@ +- 基本原理 + 将模型在GPU(或CPU)上每个算子的**输入数据load到NPU**上,对比GPU(或CPU)和NPU上**每个算子在相同输入的情况下输出数据的差异**。 + +- 使用场景 + + 用于快速对比模型中所有的单算子精度,相比hook方式,能比较module内部Function接口的精度,且仅需要少量的代码修改。 + +- 使用约束 + + 由于对比依赖对每个算子输入输出数据的存盘,会占用较大的硬盘空间,**强烈建议将模型的batchsize调小(一般设置8以下,可视硬盘空间适当调整)之后再使用本工具**,以免将硬盘写满。 + +- 对比模式 + + 根据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。最后对比GPU和NPU上每个算子的输出。**目前仅支持fp32精度模式训练,后续版本支持其他精度模式**。 + +## 1 GPU->NPU模式 + +### 1.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 +``` + +### 1.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 +``` + +### 1.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 +``` + +### 1.4 dump GPU的输入和输出 + +首先在GPU环境安装1.2节编译的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_gpu.h5") as dump: + xxx # forward code + xxx # backward code + exit() + xxx # optimizer code +``` + +tip1: dump_path为dump数据的保存路径,可自定义设置 + +tip2: 不建议将参数更新相关的代码放在with内 + +### 1.5 在NPU上load GPU上dump的数据,并dump输出 + +首先在NPU环境安装1.3节编译的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_gpu.h5', dump_path="./model_npu.h5") as dump: + xxx # forward code + xxx # backward code + exit() + xxx # optimizer code +``` + +tip1: load_file_path为GPU dump文件路劲,请从GPU环境拷贝到当前环境 + +tip2: dump_path为dump数据的保存路径,可自定义设置 + +tip3: with中的代码请保持与GPU一致 + +### 1.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 +``` + +## 2 CPU->NPU模式 + +### 2.1 安装hdf5 + +请参考1.1节 + +### 2.2 编译CPU版本torch + +由于NPU版本torch自带CPU计算功能,无需进行额外的编译,此步骤跳过 + +### 2.3 编译NPU版本torch + +请参考1.3节 + +### 2.4 dump CPU的输入和输出 + +首先在NPU环境安装2.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_cpu.h5") as dump: + xxx # forward code + xxx # backward code + exit() + xxx # optimizer code +``` + +tip1: dump_path为NPU dump数据的保存路径,可自定义设置 + +tip2: 不建议将参数更新相关的代码放在with内 + +### 2.5 在NPU上load CPU上dump的数据,并dump输出 + +修改训练代码,使能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_cpu.h5', dump_path="./model_npu.h5") as dump: + xxx # forward code + xxx # backward code + exit() + xxx # optimizer code +``` + +tip1: NPU代码请务必关闭混合精度功能,使用fp32训练 + +tip2: load_file_path为CPU dump文件路径 + +tip3: dump_path为NPU dump数据的保存路径,可自定义设置 + +tip4: with中的代码请保持与CPU一致 + +### 2.6 对比 + +请参考1.6节 \ No newline at end of file -- Gitee From 3fe5bdabe22103c3262a630e19d564302fd88629 Mon Sep 17 00:00:00 2001 From: lijing Date: Tue, 24 Aug 2021 15:03:51 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...205\267\344\275\277\347\224\250\346\214\207\345\215\227.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 37227b5..d4d123e 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" @@ -1,4 +1,5 @@ - 基本原理 + 将模型在GPU(或CPU)上每个算子的**输入数据load到NPU**上,对比GPU(或CPU)和NPU上**每个算子在相同输入的情况下输出数据的差异**。 - 使用场景 @@ -15,7 +16,7 @@ **GPU->NPU模式**:在GPU上进行算子golden数据(同时包含输入和输出数据)的dump,NPU上load GPU上每个算子的输入,将每个算子的输出dump。最后对比GPU和NPU上每个算子的输出。**首推,同时支持fp32/O1/O2精度模式训练**。 - **CPU->NPU模式**:在CPU上进行算子golden数据(同时包含输入和输出数据)的dump,NPU上load CPU上每个算子的输入,将每个算子的输出dump。最后对比GPU和NPU上每个算子的输出。**目前仅支持fp32精度模式训练,后续版本支持其他精度模式**。 + **CPU->NPU模式**:在CPU上进行算子golden数据(同时包含输入和输出数据)的dump,NPU上load CPU上每个算子的输入,将每个算子的输出dump。最后对比CPU和NPU上每个算子的输出。**目前仅支持fp32精度模式训练,后续版本支持其他精度模式**。 ## 1 GPU->NPU模式 -- Gitee