-
在另一个帖子看到有相关思路介绍如下,但是没有脚本作为参考。能否给出具体的脚本供参考?谢谢! 1、环境同时安装pytorch 和 MindSpore 2、用pytorch把权重读出来之后,转换成参数列表的形式 3、使用MindSpore的 save_checkpoint API 保存成MindSpore的checkpoint格式文件 4、把保存的checkpoint 参数文件加载到MindSpore定义的网络中,继续训练
-
## 简介 Pytorch的模型是可以通过导出成onnx文件后转换为om文件的,本文介绍Pytorch官方resnet50转换om的方法,为其它Pytorch模型转om文件提供参考,若转换时遇到不支持算子,则需提需求实现。 ## 推荐配置 表2-1 推荐配置 | 配置项 | 推荐版本 | 获取方式 | | :---------: | :----------------------------------------------------------- | :----------------------------------------------------------- | | resnet50 | resnet50-19c8e357.pth | 官网下载链接:https://download.pytorch.org/models/resnet50-19c8e357.pth | | torch | 1.7.1 | pip3.7 install torch==1.7.1 | | torchvision | 0.8.2 | pip3.7 install torchvision==0.8.2 | | CANN | CANN V100R020C10B031 | 官网:https://www.huaweicloud.com/ascend/cann-download | | Driver | Atlas I 1.1.8.B070 | 官网:https://www.huaweicloud.com/ascend/resource/Software/1**或**[OBS Browser分享链接](https://e-share.obs-website.cn-north-1.myhuaweicloud.com/?token=U2FsdGVkX1+pa/Vvxw0NiBhdPPm7DngtZPaUQuRLJD1OmDsmfLNgk9mISQZsmYdKAGso2+qvGq0byro39LgBsBsUa078HaMpcf3HTmwimEnNcF7MqmWmWDNgYpMDDrsEvWi8cTv7TNmtj6pTUDz+Tr/nz1rVOt/+6LvyvYJTqLhQCPiARGZ7Ge+FK82jZPOymzqRzqFkhglCfkkNEQYzHN/IdTM8B/AFUluleBAvMdeKuaZaKf/zd0HspyODx/SBV+eziTGlLoo02LIsNsKWXdPRzKRzCzrZkILwsGdhjZbp6597yW/8NEFh8Cz3WZBHtfCSoKP0gA2wHfQIHa5aNEoe3ejFXo8UYH+3ue3oTNRh3t3kdKsVu/fIJ6huM/QdS70lwsh9Av7eu+5yvpj0uCM2LDMc52mWuuzYE4bEiRAtLnULfjiOqspzjS7iyZl9yVgfH9/sf/QeoMHazH/6k+bkFx9tPdjr8PL53ZIc4uwjayjKMDJikUZfyHrcwHfxcie7PPpLd6VBFSUptvSbMPgvi8B0W7uoZh+wfnCxlkheBbooq7AhAFovRghjQpCv/aiQmjcKDVOLJc+jy9aIB3IdPLuevcmpENwc9IrdSPBalUCl2EUZERZu0fDX07cdf3w9cGwAzYqqTTe2iD0vz2V5/cvxuaVhyBunD/vK25kRn1A3ogld34XDZZzVO32k8VNr8JqmQmAAo6zyB2Xu9VzPzB4LY+ExFrnu2IUneZ6exciFUlTtCSDMI7yJI7Gr67vd3gvO/5sbqfm5XLCQ7KwRYWL9DW1K9BpT9OyZiG4=)提取码:666666*有效期至: 1/22/2021 21:03:05 GMT+08:00 | | 硬件&OS | x86_64+Atlas 300I 推理卡(型号 3010)&Ubuntu 18.04.1**或**ARM+Atlas 300I 推理卡(型号 3000)&CentOS 7.6 | 官网 | ## 转换方法 1. 下载Pytorch官方resnet50文件,使用root用户上传至服务器任意目录,如/home/pytorch_resnet50。 2. 将如下文件命名为convert_pth2onnx.py,并上传至/home/pytorch_resnet50目录。 convert_pth2onnx.py ```python import torch import torch.onnx import torchvision.models as models device = torch.device("cpu") def convert(): model = models.resnet50(pretrained = False) pthfile = './resnet50-19c8e357.pth' resnet50 = torch.load(pthfile, map_location='cpu') model.load_state_dict(resnet50) print(model) input_names = ["actual_input_1"] output_names = ["output1"] dummy_input = torch.randn(1, 3, 224, 224) torch.onnx.export(model, dummy_input, "resnet50_official.onnx", input_names = input_names, output_names = output_names, opset_version=11) if __name__ == "__main__": convert() ``` 3. 运行python3.7 convert_pth2onnx.py,会在当前目录下生成resnet50_official.onnx文件。 4. 将如下文件命名为trans_onnx2om.sh,并上传至/home/pytorch_resnet50目录。 trans_onnx2om.sh ```shell export PATH=/usr/local/python3.7.5/bin:/usr/local/Ascend/ascend-toolkit/latest/atc/ccec_compiler/bin:/usr/local/Ascend/ascend-toolkit/latest/atc/bin:$PATH export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/atc/python/site-packages:/usr/local/Ascend/ascend-toolkit/latest/atc/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/ascend-toolkit/latest/atc/python/site-packages/schedule_search.egg export LD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/latest/atc/lib64:$LD_LIBRARY_PATH export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp export SLOG_PRINT_TO_STDOUT=1 /usr/local/Ascend/ascend-toolkit/latest/atc/bin/atc \ --model=./resnet50_official.onnx \ --framework=5 \ --input_format=NCHW \ --input_shape="actual_input_1:1,3,224,224" \ --output=./pytorch_resnet50 \ --soc_version=Ascend310 \ --log=info ``` 5. 运行bash trans_onnx2om.sh,看到如下提示表示转换成功,并在当前目录生成pytorch_resnet50.om文件。 ``` ATC run success, welcome to the next use. ``` 6. 若需要用到aipp进行YUV->RGB色域转换,则将如下文件命名为aipp_resnet50.aippconfig,并上传至/home/pytorch_resnet50,并在bash trans_onnx2om.sh脚本第12行之后插件参数"--insert_op_conf=./aipp_resnet50.aippconfig \",再运行bash trans_onnx2om.sh即可。 aipp_resnet50.aippconfig ```aipp aipp_op { aipp_mode: static input_format : YUV420SP_U8 csc_switch : true rbuv_swap_switch : false matrix_r0c0 : 256 matrix_r0c1 : 0 matrix_r0c2 : 359 matrix_r1c0 : 256 matrix_r1c1 : -88 matrix_r1c2 : -183 matrix_r2c0 : 256 matrix_r2c1 : 454 matrix_r2c2 : 0 input_bias_0 : 0 input_bias_1 : 128 input_bias_2 : 128 mean_chn_0 : 124 mean_chn_1 : 117 mean_chn_2 : 104 } ```
-
什么是分布式训练?模型复杂,或者数据量太大,都有可能超过单一AI加速卡的显存大小,导致无法使用单一AI加速卡进行训练加速,所以需要整合多个AI加速卡进行分布式训练,分布式训练一般又分为模型并行与数据并行。模型并行:模型太大,单一AI加速卡内存不足,一个大模型划分为多个子模块,不同子模块交给不同的AI加速卡负责,从而使原本单一AI加速卡无法训练的情况,变得可以加速训练。数据并行:数据量太大,每个AI加速卡都有一份模型,然后各个加速卡取不同的数据,通常是一个batch_size,然后各自完成前向和后向的计算得到梯度用以更新共有的模型权重。数据并行也增大总的batch_size从而加速训练。Pytorch数据并行接口Pytorch提供了两种并行训练接口:torch.nn.DataParallel简称(DP)和torch.nn.DistributedDataParallel简称(DDP)。1. torch.nn.DataParallelDP使用多线程方式,在每次前向推理过程中通过scatter将数据分发到各个加速卡上,调用replica函数在各个加速卡上创建模型副本,然后使用parallel_apply在各个加速卡上完成前向推理,并通过gather将所有输出聚集到首张加速卡上得到loss,接着loss被scatter到GPUs上进行反向传播得到梯度,最后梯度被all_reduce到首张加速卡上更新权重。优点:使用方法简单,只需在单卡训练的基础上,使用DP接口封装一次model即可。model = torch.nn.DataParallel(model)缺点:①只能单机使用。②0号加速卡压力加大,负载不均匀,整体并行度不高。③单进程,受到python GIL锁强限制,效率不高。2. torch.nn.DistributedDataParallelDDP使用多进程方式,每个加速卡由一个进程控制,每个加速卡一份完整的模型,主机CPU将不同的数据分发到每个加速卡上,加速卡之间只传递反向求导的梯度信息。优点:可以多机部署。②每个加速卡无主次之分,负载均匀,并行度高。③每个加速卡对应一个python解析器,没有python GIL的限制,效率较高缺点:使用相对复杂。Pytorch分布式训练NPU迁移(DDP)Pytorch提供两种DDP启动方式,torch.multiprocessing.spawn接口函数和 torch.distributed.launch启动器。由于启动器在部分进程异常退出时,其他进程需要手动关闭的毛病,NPU迁移一般使用torch.multiprocessing.spawn接口函数。以下代码为NPU单P训练的train.py脚本。DDP迁移后train.py脚本
-
在机器学习领域,面对各类复杂多变的业务问题,构建灵活易调整的模型是高阶机器学习工程师必备的工作能力。然而,许多工程师还是有一个想法上的误区,以为只要掌握了一种深度学习的框架就能走遍天下了。事实上,在机器学习领域里没有任何一种框架是能够制霸整个行业的,每位机器学习工程师都必须同时掌握多种框架才能适应业务发展的需要。 那么有没有一种框架是相对来说更方便好用的呢?这个问题的答案是肯定的,在这里我就要为你推荐 PyTorch了。不瞒你说,PyTorch 以它良好的扩展性和超高的实现速度,近年来已赢得了不少工程师的喜爱和赞赏。首先,PyTorch 支持 GPU,这就能够显著提升代码的运行效率。同时,相比 TensorFlow 和 Caffe,PyTorch 拥有反向自动求导技术,让你在调整自定义模型的时候不必从头开始,帮助你节省不少的开发时间。此外,PyTorch 的代码还比 TensorFlow 的代码更加简洁直观、友好易懂,堪称是非常优质的学习案例,这也能帮助许多工程师更深度地理解机器学习。
-
对于我们AI初学者来说,Pytorch tensor是个基本的构建工具,个人理解可以初步从2个方面去学习它:从整体上看,类比多维数组数据类型只能是数值型,最常用的就是32位浮点数,默认用就好下面是详细类型列表,只作为需要参考时使用torch.float32 or torch.float : 32-bit floating-pointtorch.float64 or torch.double : 64-bit, double-precision floating-pointtorch.float16 or torch.half : 16-bit, half-precision floating-pointtorch.int8 : signed 8-bit integerstorch.uint8 : unsigned 8-bit integerstorch.int16 or torch.short : signed 16-bit integerstorch.int32 or torch.int : signed 32-bit integerstorch.int64 or torch.long : signed 64-bit integerstorch.bool : Boolean
-
在学习加载Torch hub模型过程中,在ModelArts用如下Pytorch平台2. 进入并创建一个Pytorch1.4环境的Notebook文件,加载Torch hub模型总会报出属性错误,虽然再次运行后能正常加载模型。3. 理解有可能是Pytorch版本问题,于是进入Terminal界面,安装升级Pytorch,执行同样代码,结果运行正常。
-
大家好,我用pythorch框架时,权重保存为:torch.save(model.state_dict(), PATH),但是我在加载模型时用model.load_state_dict(torch.load(PATH)),model.eval()的方式报错:AttributeError: 'tuple' object has no attribute 'load_state_dict',用model = torch.load(PATH),model.eval()时报错:AttributeError: 'collections.OrderedDict' object has no attribute 'eval',请问有没有专家能解答我的问题,谢谢!
ai-lajifenlei
发表于2020-12-16 20:54:03
2020-12-16 20:54:03
最后回复
ai-lajifenlei
2020-12-17 12:25:03
6241 7 -
【功能模块】mul 算子【操作步骤&问题现象】1、在同一台机器(Tesla V100),分别用 mindspore 1.0.1 和 pytorch 1.6 对一个 1000000 元素的向量测试 Mul 算子2、发现 mindspore 上 mul 算子的性能不到 pytorch 的 1/100测试代码如下:mindsporeimport time import numpy as np from mindspore import Tensor import mindspore.ops as ops import mindspore.context as context context.set_context(device_target="GPU") x = Tensor(np.random.randn(1000000).astype(np.float32)) mul = ops.Mul() mul(x, 2) # compile and warmup t = time.time() for i in range(1000): mul(x, i) print(time.time() - t)pytorchimport time import numpy as np import torch x = torch.randn(1000000).cuda() x * 2 torch.cuda.synchronize() t = time.time() for i in range(1000): y = x * i torch.cuda.synchronize() print(time.time() - t)【日志信息】(可选,上传日志内容或者附件)mindspore: 1.1583075523376465pytorch: 0.011942863464355469补充:mindspore 改用 profiler 后,结果看上去好了不少,但仍比 pytorch 慢。运行 1000 次 mul 的时间为 59721.4 微秒。使用 profiler 的代码import time import numpy as np from mindspore import Tensor import mindspore.ops as ops import mindspore.context as context from mindspore.profiler import Profiler from mindspore import dataset as ds from mindspore.common.initializer import Normal from mindspore import nn from mindspore.train import Model from mindspore.profiler import Profiler class TestNet(nn.Cell): def __init__(self): super(TestNet, self).__init__() self.mul = ops.Mul() def construct(self, x): x = self.mul(x, 2) return x context.set_context(mode=context.GRAPH_MODE, device_target="GPU") profiler = Profiler() data = np.random.randn(1000000).astype(np.float32) net = TestNet() model = Model(net) ms_data = Tensor(data) for i in range(1000): model.predict(ms_data) profiler.analyse()
-
# Ascend PyTorch模型迁移指导 - [1 介绍](#1-介绍) - [1.1 目标读者](#11-目标读者) - [1.2 原理和方案](#12-原理和方案) - [2 环境搭建](#2-环境搭建) - [2.1 目标读者](#21-run包安装) - [2.2 whl包安装](#22-whl包安装) - [3 迁移完成示例](#3-迁移完成示例) - [3.1 gitee上Pytorch模型对应链接](#31-gitee上Pytorch模型对应链接) - [3.2 启动训练方法](#32-启动训练方法) - [4 模型迁移说明](#4-模型迁移说明) - [4.1 迁移流程说明](#41-迁移流程说明) - [4.2 性能调优工具说明](#42-性能调优工具说明) - [4.3 精度调优方法说明](#43-精度调优方法说明) - [4.4 单算子用例编写说明](#44-单算子用例编写说明) - [5 附录](#5-附录) - [5.1 常用的环境变量](#51-常用的环境变量) - [5.2 机器申请及使用指南](#52-机器申请及使用指南) - [5.3 验收资料及脚本规范](#53-验收资料及脚本规范) ## 1 介绍 - **[目标读者](#11-目标读者)** - **[原理和方案](#12-原理和方案)** ### 1.1 目标读者 本文目标读者为Ascend模型迁移开发者,用于指导开发者在昇腾版本的 PyTorch + Apex 下,实现模型训练精度性能达标。 **华为云[support link](https://support.huaweicloud.com/ug-pt-training-pytorch/atlasmprtg_13_0001.html)** >**说明:** > >开发者除编程语言知识外,应对如下基础知识有一定的了解和熟悉: >1. 深度学习方法(cv, nlp等); >2. PyTorch写法及其运行原理; >3. Ascend-PyTorch适配细节; >2. CANN运作流程; ### 1.2 原理和方案 基于PyTorch框架的动态图概念,参考对于友商CUDNN、CPU、CUDA、MKL、MKLDNN等算子的实现和库的支持的方式,通过调用单一Ascend TBE算子或调用多个Ascend TBE算子组合的方式,实现PyTorch框架对Ascend NPU的支持。 方案中,Ascend NPU被当做是和GPU同一类别的设备,包括内存管理,设备管理,以及算子调用实现。因此在适配修改方案中,会仿照PyTorch结构中原有的CUDA形式,做一个NPU的扩展。 ## 2 环境搭建 - **[run包安装](#21-run包安装)** - **[whl包安装](#22-whl包安装)** **说明:** > > **若使用搭建完成的环境,可跳过此步骤。一般情况下,华为默认会提供搭建完成的环境。** ### 2.1 run包安装 1. 安装前准备。 - 当前适配Ascend后的PyTorch,仅支持在真实Ascend NPU系列推理和训练设备上的运行。在Ascend NPU系列设备上部署开发环境,请参考[《CANN V100R020C10 软件安装指南》](https://support.huawei.com/enterprise/zh/doc/EDOC1100164870/59fb2d06)的“获取软件包”和”安装开发环境“章节,完成安装前准备。 2. 完成驱动和固件的安装。 请参考[《CANN V100R020C10 软件安装指南》](https://support.huawei.com/enterprise/zh/doc/EDOC1100164870/59fb2d06)的”安装昇腾芯片驱动和固件“ -\>“安装开发套件和框架插件包”章节,完成安装。 > >安装驱动和固件需要root用户,若使用默认路径安装: > > ps. 如升级run包,建议 ./A800-9010-NPU\_Driver-x.x.x-X86\_64- Ubuntu18.04.run --uninstall;rm -rf /usr/local/Ascend;reboot > >安装驱动:./A800-9010-NPU\_Driver-x.x.x-X86\_64- Ubuntu18.04.run --full --quiet > >安装固件:./A800-9010-NPU\_Firmware-.run --full --quiet > >安装CANN包:./Ascend-Toolkit-\{version\}-xxx-\{gcc\_version\}.run --install --quiet ### 2.2 whl包安装 1. 获取安装Ascend版本的Pytorch和Apex [download link](https://support.huaweicloud.com/ug-pt-training-pytorch/atlasmprtg_13_0003.html) 2. 安装pytorch ``` pip3.7 install --upgrade torch-*.whl pip3.7 install --upgrade apex-*.whl pip3.7 install --upgrade torchvision==0.6.0 # 对应当前torch==1.5.0的版本 ``` **说明:** > >当前适配Pytorch版本为1.5.0 >运行Ascend-Pytorch需要配置环境变量,环境变量脚本参照[pt_set_env.sh](https://gitee.com/ascend/cann-benchmark/blob/master/train/atlas_benchmark-master/utils/shell/pt_set_env.sh) >```source pt_set_env.sh``` 3. (可选)编译和安装PyTorch框架 - 若希望通过修改Pytorch框架层代码来实现性能精度调测,可以自行编译Pytorch版本以满足调测需求 0. gitee上Pytorch **[开源link](https://gitee.com/ascend/pytorch)** - 当前商用版本为 tag: c10tr5 , commit: ef718063a6d884e3a72c63e7884317ef6ec34033 1. 请按照Pytorch开源仓的README.md的指导完成编译 2. 如需恢复环境,重复 [whl包安装](#22-whl包安装)中第2步即可 ## 3 迁移完成示例 - **[gitee上Pytorch模型对应链接](#31-gitee上Pytorch模型对应链接)** - **[启动训练方法](#32-启动训练方法)** **说明:** > >当前已迁移完成6个模型,放在[benchmark](https://gitee.com/ascend/cann-benchmark) ### 3.1 gitee上Pytorch模型对应链接 1. [ResNet50](https://gitee.com/ascend/cann-benchmark/tree/master/train/atlas_benchmark-master/image_classification/ResNet50/pytorch) 2. [DenseNet121](https://gitee.com/ascend/cann-benchmark/tree/master/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch) 3. [MobileNetV2](https://gitee.com/ascend/cann-benchmark/tree/master/train/atlas_benchmark-master/image_classification/MobileNet/pytorch) 4. [ShuffleNetV2](https://gitee.com/ascend/cann-benchmark/tree/master/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch) 5. [EfficientNet-b0](https://gitee.com/ascend/cann-benchmark/tree/master/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch) 6. [DeepMar](https://gitee.com/ascend/cann-benchmark/tree/master/train/atlas_benchmark-master/image_classification/DeepMar/pytorch) ### 3.2 启动训练方法 ``` ./benchmark.sh -e ResNet50 -hw 1p -f pytorch ``` 详情见benchmark仓[README.md](https://gitee.com/ascend/cann-benchmark/tree/master/train) ## 4 模型迁移说明 - **[迁移流程说明](#41-迁移流程说明)** - **[性能调优工具说明](#42-性能调优工具说明)** - **[精度调优方法说明](#43-精度调优方法说明)** - **[单算子用例编写说明](#44-单算子用例编写说明)** ### 4.1 迁移流程说明 模型迁移主要工作就是将开源社区中实现过的模型迁移到Ascend-Pytorch上。工作主要分为以下几步: 1. 模型选取评审阶段(主要为华为方) - 我们将尽可能选取权威Pytorch模型实现仓作为标杆,包括但不限于Pytorch(example/vision等),facebookresearch(detectron/detectron2等)open-mmlab(mmdetection/mmpose等) - 通过dump op方法,联合现有适配算子清单[link](https://support.huaweicloud.com/opl-pytorch/atlasptol_09_0002.html),预评估算子满足度 ```python with torch.autograd.profiler.profile() as prof: out = model(input_tensor) loss = out.sum() loss.backward() print(prof.key_averages().table(sort_by="self_cpu_time_total")) ``` - **请严格按照华为方选取的训练脚本进行迁移工作,如有问题请联系华为相关支撑人员** 2. GPU精度对齐 - 开源社区的实现需要验证,有些实现比较完全容易复现精度的仓如[mmdetection](https://github.com/open-mmlab/mmdetection)仅需验证下即可,有些实现则需要自行补充超参和训练技巧--如[pytorch/examples](https://github.com/pytorch/examples/tree/master/imagenet)中对imagenet训练的实现默认超参以resnet为例,需要模型迁移开发依据paper和其他开源实现补充方法和调整超参 - 由于NPU天然的混合精度属性,在GPU精度对齐过程中需要使用apex对原始代码进行修改,详见[apex官方指导文档](https://nvidia.github.io/apex/amp.html),优先使用O2 Level,如无法收敛可使用O1 Level - GPU需要保存的数据 **说明:** > **计算FPS时请忽略每个EPOCH刚开始的2个step** - 单P运行1个epoch的log,必须包含FPS(语言类请替换为对应统计方式) - 单P模型prof文件,prof方法如下所示 ```python with torch.autograd.profiler.profile(use_cuda=True) as prof: out = model(input_tensor) loss=loss_func(out) loss.backward() optimizer.zero_grad() optimizer.step() prof.export_chrome_trace("output.prof") # "output.prof"为输出文件地址 ``` - 8P训练完成的模型和log,其中log必须包含FPS(语言类请替换为对应统计方式),必须包含训练精度和测试精度 - 由于当前Ascend-Pytorch对应官方Pytorch版本为1.5.0,请在GPU复现时也使用该版本 - GPU复现精度理论上应达到paper中相应的精度或开源项目中所示的精度,如实在无法达到请联系华为方支撑者 3. NPU功能打通 - 使用[华为云网络迁移-单P方法](https://support.huaweicloud.com/ug-pt-training-pytorch/atlasmprtg_13_0030.html),改造开源代码,使模型能够正常运行,包括数据预处理,前向计算,loss计算,反向计算,参数更新等 - 需使用Ascend-Apex改造代码,使用方法基本与开源版本一致,主要为对齐GPU和NPU - 在这个环节优先关注功能性,即是否能跑通,现有算子是否能够满足,其次应关注loss是否符合预期 - 优先打通1P功能,再打通多P功能,多P迁移方法详见[华为云网络迁移-多P方法](https://support.huaweicloud.com/ug-pt-training-pytorch/atlasmprtg_13_0031.html) 4. NPU性能优化 - 由于模型往往需要训练较多step/epoch才能达到符合预期的精度水平,如果性能过差则会导致无法在可控的时间内完成模型训练,拖慢调试进程 - 性能优化首先需要找出性能瓶颈,主要以下几个方面 1. 算子瓶颈,在某个算子上执行过慢 - 定位思路:通过Pytorch的profiler可以观察分析得到耗时大的算子,优先构建单算子用例证明该算子在当前网络场景下性能不足,可以对比CPU或GPU证明性能瓶颈 - 规避方案:使用同等语义其他高效算子替代 - 解决方案:改进算子性能 2. 框架瓶颈,由于适配不当带来了额外操作 - 定位思路:通过get_ascend_op_info.py可以得到OP_INFO,分析OP_INFO中算子的规格和调用关系,定位是否插入了多余的算子,重点关注transdata是否合理 - 解决方案:优化框架层调用方法 3. 编译瓶颈,由于shape或属性来回变化造成反复编译 - 定位思路:使用adc工具得到host侧INFO日志。查看INFO日志,观察第一个step以后的```aclopCompile::aclOp```关键字,如果后续接了```Match op iunputs/type failed```或```To compile op```则说明该算子存在动态编译,需要优化 - 规避方案:使用相近语义的固定shape方案替代动态shape - 解决方案:减少编译或不需要编译该算子 4. copy瓶颈,非连续转连续时进行copy带来的瓶颈 - 定位思路:通过Pytorch的profiler分析整网中的D2DCopywithStreanSynchronize/format_contiguous的耗时 - 规避方案:在对应转连续的地方使用计算类算子替代框架类算子,避开类似transpose,slice等操作带来的不连续 - 解决方案:加速转连续操作 - 优先将性能优化至可以进行精度调试水平,完成精度对齐后最后来优化性能至交付水平 - 性能调优手段详见[性能调优工具说明](#42-性能调优工具说明) - 如遇到无法解决的问题,建议构造单算子用例说明性能问题,联系华为方支撑者 5. NPU精度对齐 - 优先在同等语义和超参下,跑一定的epoch(推荐完整epoch数的20%),使精度,loss等对齐GPU相应水平,完成后再对齐最终精度 - 精度问题排查需要找出是哪一步出现的问题,主要以下几个方面 1. 模型网络计算错误 - 定位思路:在网络中加入hook进行排查判断是哪个地方有较大嫌疑,然后构建单算子用例逐渐缩小错误范围,证明该算子在当前网络场景下计算有误,可以对比CPU或GPU结果证明 - 规避方案:使用同等语义其他算子替代 - 解决方案:改进算子精度或功能问题 2. loss计算错误 - 定位思路:由于Loss的特殊性和可以自定义,在判断Loss计算错误后建议dump网络中的loss的输入来测试而非随机同shape tensor,这样才能更好地复现证明 - 规避方案:使用同等语义其他算子替代 - 解决方案:改进算子精度或功能问题(loss也是由算子构成) 3. 参数更新错误 - 定位思路:在每个optim.step()前对网络中的参数逐个打印其grad进行排查判断是哪个地方有较大嫌疑,然后构建单算子用例逐渐缩小错误范围,证明该算子在当前网络场景下梯度计算有误,可以对比CPU或GPU结果证明。该项优先级应低于1与2,因为1与2的错误同样可以造成grad异常 - 规避方案:使用同等语义其他算子替代 - 解决方案:改进计算grad的算子精度或功能问题 4. 多卡计算错误 - 定位思路:在保证单卡精度OK的前提下,稳定复现多卡不收敛 - 解决方案:建议联系华为方支撑人员,提供稳定复现的单P和多P脚本 - 精度问题较难找出根因,需要使用精度工具的同时,结合自主分析解决问题 - 性能调优手段详见[精度调优方法说明](#43-精度调优方法说明) - 如遇到无法解决的问题,建议构造单算子用例说明性能问题,联系华为方支撑者 ### 4.2 性能调优工具说明 性能调优工具主要有 1. Pytorch profiling 0. Pytorch profiling是一种通过适配原生 1. 获取chrome_trace文件 ```python # 使用ascend-pytorch适配的profile接口,即可获得,推荐只运行一个step # 请在第5个step后进行profiling with torch.autograd.profiler.profile(use_npu=True) as prof: out = model(input_tensor) loss=loss_func(out) loss.backward() optimizer.zero_grad() optimizer.step() prof.export_chrome_trace("output.prof") # "output.prof"为输出文件地址 ``` 2. 打开chrome_trace文件 - 打开chrome,输入 ```chrome://tracing/``` - 将trace文件拖入浏览器即可 2. OPInfo 0. 网络模型最终是以OP执行的,通过OPInfo日志,我们可以获取实际执行时的算子及其属性,获取脚本链接 [get_ascend_op_info.py](https://gitee.com/ascend/docs-dev/blob/master/tutorials/specification%20&%20templates/PyTorch%E6%A8%A1%E5%9E%8B%E4%BC%97%E7%AD%B9%E8%84%9A%E6%9C%AC%E8%A7%84%E8%8C%83%E5%8F%8A%E9%AA%8C%E6%94%B6%E6%B8%85%E5%8D%95/get_ascend_op_info.py) 1. 获取OPInfo ```shell # 将host日志打屏 export SLOG_PRINT_TO_STDOUT=1 # 若adc未找到,则需要先手动添加软链 ln -s /usr/local/Ascend/ascend-toolkit/latest/toolkit/bin/adc /usr/bin/ # 设置日志级别为info,运行完成后需要重新设置为error su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[info]\" --device 0" # step间无法分开,请只运行一个step,运行1个完整的step得到info日志,追加打印到nohup.out # 运行前请```rm nohup.out```以防多次打印 nohup python3.7.5 demo.py & wait # 在当前目录寻找*.log和*.out,解析info日志得到OPInfo信息 # 输出ascend_op_info_summary.txt python3.7.5 get_ascend_op_info.py --host_log_folder ./ ``` 2. 分析TaskInfo中额外的task,尤其关注transdata ### 4.3 精度调优方法说明 1. CPU vs NPU 0. 通过对比CPU和NPU的结果,判断NPU上计算是否正确 ```python # 固定入参 input_tensor_cpu = torch.Tensor() model_cpu = build_model() input_tensor_npu = input_tensor_cpu.npu() model_npu = model_cpu.npu() # 运算结果对比 output_cpu = model_cpu(input_tensor_cpu) output_npu = model_npu(input_tensor_npu) pirnt((output_cpu - output_npu).abs().mean()) ``` 1. 因npu硬件架构与cpu不同,计算结果会略有不同。若运算结果较为接近(一般不高于1e-4),则认为运算结果正常 2. Hook 0. Ascend-Pytorch依然可以通过使用原生Pytorch的hook来打印正向反向中module的输入和输出 ```python # 设置hook func def hook_func(name, module): def hook_function(module, inputs, outputs): print(name+' inputs', inputs) print(name+' outputs', outputs) return hook_function # 注册正反向hook for name, module in model.named_modules(): module.register_forward_hook(hook_func('[forward]: '+name, module)) module.register_backward_hook(hook_func('[backward]: '+name, module)) # 运行 model(input_tensor) ``` 1. 分析FP,BP中的inputs, outputs来锁定 3. grad, running_mean, running_var等param 0. 因为hook直接勾出来的数据往往偏大,较难观察,有时候先使用此处的方法观察更新量也是不错的选择 ```python for name, param in model.named_parameters(): print("[grad]: "+name, param.grad) ``` 1. BN的均值方差排查 ```python for name, module in model.named_modules(): if isinstance(module, nn._BatchNorm): print("[BN_buffer]: "+name, module.running_mean, module.running_var) ``` ### 4.4 单算子用例编写说明 0. 因整网复现问题成本较大,推荐构建单算子用例,来复现精度或性能的问题 1. 单算子用例构建流程及用例展示 ```python # 0 CPU 构建需要测试场景 # 虽然叫法是单算子用例,但有时候不仅仅为一个操作,而是带有上下文的场景,还有时候是一个带参数Module,Module的方式是更通用的方法。此处构建一个包含两个OP的Module。 class Model(nn.Module): def __init__(self, in_channels): super(Model, self).__init__() self.op1 = nn.Conv2d(in_channels, in_channels, 1) self.op2 = F.relu6 def forward(self, x): out = self.op1(x) out = self.op2(out) return out model = Model(in_channels=32) # 0.1 值得一提的是,由于各类Norm(BN,LN)中mean var是buffer的特殊性,建议涉及的用例在CPU和NPU上分别运行且使用同样参数和输入,仅需在构建Module完成后加上save,在再次运行时load即可 torch.save(model.state_dict(), 'model.pth') model.load_state_dict(torch.load('model.pth')) # 1 CPU 固定输入 input_tensor = torch.randn(4,32,16,16) # 1.1 如需保存仅需save即可 torch.save(input_tensor, "input_tensor.pth") input_tensor = torch.load("input_tensor.pth") # 2 CPU 运行,一般推荐把反向也运行下 out = model(input_tensor) loss = out.sum() loss.backward() cpuout = out # 3 to NPU 运行,将构建完成的model和input_tensor放到NPU运行 torch.npu.set_device("npu:0") # 一般先set_device设定运行卡,默认0卡 model = model.npu() input_tensor = input_tensor.npu() out = model(input_tensor) loss = out.sum() loss.backward() npuout = out # 4 精度比对方法 l1_error = (cpuout - npuout).abs().sum() # 4.1 这里仅时比对了正向结果,反向结果无法显示得到,需要通过hook得到,grad等参数更新需要通过打印module对应的属性得到,详见 ### 4.3 精度调优方法说明 # 5 性能prof方法 用于说明性能问题 with torch.autograd.profiler.profile(use_npu=True) as prof: out = model(input_tensor) loss = out.sum() loss.backward() prof.export_chrome_trace('output.prof') ``` ## 5 附录 - **[常用的环境变量](#51-常用的环境变量)** - **[机器申请及使用指南](#52-机器申请及使用指南)** - **[验收资料及脚本规范](#53-验收资料及脚本规范)** ### 5.1 常用的环境变量 ```bash # 0 开启TASK多线程下发 export TASK_QUEUE_ENABLE=1 # 1 开启重定向日志到stdout # 用于导出host日志到屏幕 export SLOG_PRINT_TO_STDOUT=1 # 2 设置日志级别 # 日志级别设置,信息从多到少分别是 debug --> info --> warning --> error --> null,一般设置为error,调试时使用info,--device用于设置对应哪张卡 su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[info]\" --device 0" # 3 dump图 # 主要用于查看图结构 export DUMP_GE_GRAPH=2 export DUMP_GRAPH_LEVEL=3 # 4 dump core ulimit -c unlimited ``` ### 5.2 机器申请及使用指南 - 机器申请 - GPU - 由于GPU资源紧张,请提前做好资源申请,每个模型按3个工作日作为调测时间,每个老师需一次性租借其名下所有模型,若无法按期归还,请提前和华为方支撑者做好沟通 - NPU - 每个模型调测人员至少分配一张NPU用于模型调测,当单P调试结束需要使用多P调测时,请向华为方展示单P调试成果,申请动态调配的NPU资源 - 磁盘使用 - / 下是系统目录 - /home 是可使用的数据盘目录 - 开发主要使用磁盘 - /opt/npu(GPU是/opt/gpu) 是共享的数据集盘目录 - 预存数据集,仅用于copy - **使用如下命令解压数据集到本机使用```tar xf imagenet.tar.gz -C /home/data```** - 请勿在共享盘上运行脚本和写数据 - 重启后请执行 ```bash /root/mount_datadisk.sh``` 挂载数据盘,**请勿在/etc/fstab设置为自动挂载** - 环境变量导入方法 - GPU - ```conda activate pt-1.5``` - NPU **说明:** >请使用python3.7.5启动脚本 - 环境变量脚本参照[pt_set_env.sh](https://gitee.com/ascend/cann-benchmark/blob/master/train/atlas_benchmark-master/utils/shell/pt_set_env.sh) - 详情如下 ```shell script export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/aarch64-linux-gnu:$LD_LIBRARY_PATH export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/ascend-toolkit/latest/toolkit/tools/ide_daemon/bin/ export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH export TASK_QUEUE_ENABLE=1 ``` ### 5.3 验收资料及脚本规范 - 资料已附在 [PyTorch模型众筹脚本规范及验收清单](https://gitee.com/ascend/docs-dev/blob/master/tutorials/specification%20&%20templates/PyTorch%E6%A8%A1%E5%9E%8B%E4%BC%97%E7%AD%B9%E8%84%9A%E6%9C%AC%E8%A7%84%E8%8C%83%E5%8F%8A%E9%AA%8C%E6%94%B6%E6%B8%85%E5%8D%95/) - Pytorch模型众筹代码脚本规范.docx - 附件1_高校合作xx网络转验收_CheckList.xlsx - 附件2_高校合作xx网络转验收_自验报告模板.docx - README_NPU.md - BBS模板.xlsx - 推荐在昇腾社区上使用该模板记录调试的点点滴滴哈
-
最近有不少用户在说,我torch.npu.is_available()返回的是true,但是tensor相加就报错了,基本环境装的没问题,咋就会报错了呢? 报错如下: 解决方法:把变量a修改成:a = torch.tensor([1, 2, 3], dtype=torch.int32).npu() 把变量b修改成:b = torch.tensor([4, 5, 6], dtype=torch.int32).npu() 再相加就可以了
-
【功能模块】【操作步骤&问题现象】按照文档 成功安装了 pytorch,nnae, toolboxptyhon3.7下出现错误>>> import torchTraceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python3.7/dist-packages/torch/__init__.py", line 152, in <module> from torch._C import *ImportError: /home/Ascend/nnae/latest/fwkacllib/lib64/libruntime.so: undefined symbol: halSqMemGet
-
【功能模块】人体姿态识别的openpose部分,使用Pytorch版本得到的推理结果,和使用om得到的不同【操作步骤&问题现象】1、openpose部分的后处理代码功能完全一致,预处理中,比pytorch仅多加了一步HWC转CHW的操作.模型转换:caffe转om,NHWC,N=1 C=3 H=120 W=160,无预处理。2、得到的结果完全不同3、目前使用的代码(openpose的相关处理代码在src/pose_process.cpp中)、用来转换为om的caffe模型压缩包、转换得到的om模型压缩包、用来对比的pytorch代码与pth文件压缩包:链接:https://pan.baidu.com/s/1u6lCEnlV5yuyNF8oQxra3g 提取码:v41c 【截图信息】左图是pytorch下得到的,右图是用om模型得到的麻烦老师们看下是什么问题,谢谢!【日志信息】(可选,上传日志内容或者附件)
-
mmdetection├─.dev_scripts├─.github│ ├─ISSUE_TEMPLATE│ └─workflows├─.idea│ └─inspectionProfiles├─configs # 各类模型的配置文件,入口函数通过config逐步build成最终的det模型│ ├─albu_example│ ├─atss│ ├─carafe│ ├─...(此处折叠大量的文件配置)│ └─_base_ # 基础配置文件│ ├─datasets│ ├─models│ └─schedules├─demo # 一些infer的demo和Tutorial├─docker ├─docs # 使用指南,可以帮助理解│ └─tutorials # customize的一些方法,可以帮助理解├─mmdet # 核心api,介绍train.py为例│ ├─apis # 核心功能构建的抽象主流程,在以下三种场景下的主要入口,需要重点理解│ │ ├─__init__.py # 初始化文件,文件夹内主要实现函数可以通过该文件快速查阅,每个文件夹基本都有,不再赘述│ │ ├─inference.py # 推理│ │ ├─test.py # 测试│ │ ├─train.py # 训练│ │ │ ├─def train_detector│ │ │ │ ├─prepare data loaders│ │ │ │ ├─put model on gpus│ │ │ │ ├─build runner│ │ │ │ ├─fp16 setting│ │ │ │ ├─register hooks│ ├─core # det核心,介绍anchor为例,下同│ │ ├─anchor # anchor生成的文件夹,诸如AnchorGenerator字样的生成器都由文件下相关函数实现│ │ │ ├─anchor_generator.py # AnchorGenerator的主函数,主要实现逻辑│ │ │ ├─builder.py # 入口函数│ │ │ ├─point_generator.py # PointGenerator的主函数,主要实现逻辑│ │ │ ├─utils.py # 公用函数库│ │ ├─bbox │ │ │ ├─assigners # assigner生成的文件夹,诸如Assigner字样的anchor,target匹配器都由文件下相关函数实现│ │ │ ├─coder # coder生成的文件夹,诸如BBoxCoder字样的bbox编码解析器都由文件下相关函数实现│ │ │ ├─iou_calculators # iou_calculators生成的文件夹,诸如overlaps字样的iou计算都由文件下相关函数实现│ │ │ └─samplers # samplers生成的文件夹,诸如Sampler字样的样本采样器都由文件下相关函数实现│ │ ├─evaluation # eval相关函数实现│ │ ├─export # pytorch2onnx相关函数实现│ │ ├─fp16 # fp16相关函数实现│ │ ├─mask # mask生成的文件夹,诸如Masks字样的掩膜生成器都由文件下相关函数实现│ │ ├─post_processing # 后处理如nms,merge相关函数实现│ │ └─utils │ ├─datasets # 数据集相关处理函数│ │ ├─pipelines # 预处理相关函数实现,包括读取,增强,生成训练数据│ │ └─samplers # 训练样本采样相关函数实现│ ├─models # 模型函数实现│ │ ├─backbones # backbone生成的文件夹,诸如model['backbone']字样的特征提取器都由文件下相关函数实现│ │ ├─dense_heads # dense类head(单阶段)生成的文件夹,诸如model['bbox_head'],model['rpn_head']字样的头分类回归器都由文件下相关函数实现│ │ ├─detectors # detector生成的文件夹,诸如model['type']字样的检测器都由文件下相关函数实现,所有检测器的主要逻辑都在该文件夹下,需要精读细读反复读│ │ ├─losses # loss生成的文件夹,各式各样的损失函数都由文件下相关函数实现│ │ ├─necks # 类fpn生成的文件夹,诸如model['neck']字样的特征融合器都由文件下相关函数实现,主要用于将backbone生成的特征做再一次的处理│ │ ├─roi_heads # roi类head(多阶段)生成的文件夹,诸如model['roi_head']字样的头都由文件下相关函数实现│ │ │ ├─bbox_heads # roi类head中bbox_head生成的文件夹,诸如model['roi_head']['bbox_head']字样的头分类回归器都由文件下相关函数实现│ │ │ ├─mask_heads # roi类head中mask_head生成的文件夹,诸如model['roi_head']['mask_head']字样的头掩膜生成器都由文件下相关函数实现│ │ │ ├─roi_extractors # roi类head中bbox_roi_extractor生成的文件夹,诸如model['roi_head']['bbox_roi_extractor']字样的ROIpooling+送入二阶段的处理都由文件下相关函数实现│ │ │ └─shared_heads # mask_rcnn_r50_caffe_c4,faster_rcnn_r50_caffe_c4使用│ │ └─utils│ ├─ops # 可以仔细看下__init__.py,从mmcv中导入了哪些op│ └─utils ├─requirements├─resources├─tests # 测试脚本│ ├─data│ ├─test_data│ └─test_models└─tools # 工具文件夹,本仓内的几乎所有功能都在这有入口函数│ └─convert_datasets # 一些数据集准备工作│ └─train.py # 训练主入口函数,主要在构建model.该文件 + mmdet/apis/train.py(构建整体检测器)就是完整的main函数│ └─dist_train.sh # 推荐使用分布式训练脚本,使用Pytorch原生的torch.distributed.launch实现,具体可以去看看torch.distributed.launch的原理,以便更好地理解和修改│ └─pytorch2onnx.py # 转onnx的入口- windows上安装mmcv请下载 https://github-production-repository-file-5c1aeb.s3.amazonaws.com/145670155/5288027?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20201209%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20201209T021824Z&X-Amz-Expires=300&X-Amz-Signature=f5e8378943f0a023a21a53aa04d8ad795e90ac5e841371faea5c9bd3dd602849&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=145670155&response-content-disposition=attachment%3Bfilename%3Dmmcv_full-1.1.3-cp37-cp37m-win_amd64.whl.zip&response-content-type=application%2Fx-zip-compressed- 需要同步看下具体函数在mmcv库中的实现- 有很多的操作都在mmcv里实现,建议看下mmcv中的函数,如果在NPU上无法复用,需要重新构建函数
-
【功能模块】【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签