• [问题求助] 手动编译PyTorch,运行失败,报undefined symbol错误
    这几天想升级容器中的PyTorch版本(1.5->1.8),Gitee上Ascend提供了PyTorch1.8的编译安装教程,但我尝试多次均以失败告终,具体情况是import torch正常,但import torch_npu报错cdws@dev-614175bc-d1c1-4701-8999-a48965cd902c-d7q2z:~/userdata/Downloads/pytorch/test/test_network_ops$ pythonPython 3.7.5 (default, Aug 13 2021, 09:52:41)[GCC 7.5.0] on linuxType "help", "copyright", "credits" or "license" for more information.>>> import torch>>> import torch_npuTraceback (most recent call last):File "", line 1, inFile "/home/cdws/.local/lib/python3.7/site-packages/torch_npu/__init__.py", line 26, inimport torch_npu.npuFile "/home/cdws/.local/lib/python3.7/site-packages/torch_npu/npu/__init__.py", line 42, infrom .utils import (is_initialized, _lazy_call, _lazy_init, init, set_dump,File "/home/cdws/.local/lib/python3.7/site-packages/torch_npu/npu/utils.py", line 27, inimport torch_npu._CImportError: /usr/local/python3.7.5/lib/python3.7/site-packages/torch/lib/libc10_npu.so: undefined symbol: _ZN3c107Warning4warnENS_14SourceLocationERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE其他信息请见本人提的issue:安装PyTorch1.8.1后,导入torch_npu报错,报undefined symbol错误 · Issue #I5U4Z2 · Ascend/pytorch - Gitee.com
  • [问题求助] 请提供包含新版PyTorch的镜像
    这几天想在昇腾AI处理器上使用PyTorch进行模型训练,但是官方AscendHub提供的镜像版本很老(PyTorch版本1.5),望尽快推出1.8版本PyTorch镜像
  • [API使用] Pytorch中的torch.device该如何迁移到MindSpore中
    想把一个用PyTorch写的UNet网络转成用MindSpore写的,其中一个torch.device的API找不到MindSpore的映射,请问应该怎么改?torch写的代码如下:torch写的代码的运行结果如下:​尝试用ms.set_context(device_target="GPU\cpu\acsend"),但是运行结果输出为None.
  • [其他] 浅谈开源的Python机器学习库:PyTorch
    PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。2017年1月,由Facebook人工智能研究院(FAIR)基于Torch推出了PyTorch。它是一个基于Python的可续计算包,提供两个高级功能:1、具有强大的GPU加速的张量计算(如NumPy)。2、包含自动求导系统的深度神经网络。2022年9月,扎克伯格亲自宣布,PyTorch 基金会已新鲜成立,并归入 Linux 基金会旗下。PyTorch的前身是Torch,其底层和Torch框架一样,但是使用Python重新写了很多内容,不仅更加灵活,支持动态图,而且提供了Python接口。它是由Torch7团队开发,是一个以Python优先的深度学习框架,不仅能够实现强大的GPU加速,同时还支持动态神经网络。PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。除了Facebook外,它已经被Twitter、CMU和Salesforce等机构采用 。2022年9月,扎克伯格亲自宣布,PyTorch 基金会已新鲜成立,并归入 Linux 基金会旗下。PyTorch给用户提供Build级别的移动端定制化支持、增加分布式模型并行训练、让Java程序能够运行TorchScript等。此外还有JIT、C++、分布式训练、Eager前端、PyTorch Mobile等方面的功能改进和Bug修复。运行环境:Windows(CUDA,CPU)、MacOS(CPU)、Linux(CUDA,ROCm,CPU)优点:PyTorch是相当简洁且高效快速的框架设计追求最少的封装设计符合人类思维,它让用户尽可能地专注于实现自己的想法与google的Tensorflow类似,FAIR的支持足以确保PyTorch获得持续的开发更新PyTorch作者亲自维护的论坛 供用户交流和求教问题入门简单
  • [其他] 浅谈PyTorch安装环境
    PyTorch的安装十分简单,根据PyTorch官网,对系统选择和安装方式等灵活选择即可。这里以anaconda为例。Pytorch的安装经过了几次变化,请大家以官网的安装命令为准。另外需要说明的就是在1.2版本以后,Pytorch只支持cuda 9.2以上了,所以需要对cuda进行升级,部分显卡都可以用,包括笔记本的MX250也是可以顺利升级到cuda 10.1。此处使用Conda包管理器。注意:如果使用镜像站,请删除“-c pytorch”;安装CUDA(即GPU)版本时注意安装CUDNN运行库# 全部通用,ROCm仅支持Linuxconda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch    #CUDA 10.2conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch    #CUDA 11.3conda install pytorch torchvision torchaudio cpuonly -c pytorch #CPUpip3 install torch torchvision==0.11.2 -f https://download.pytorch.org/whl/rocm4.2/torch_stable.html# ROCm 4.2 (仅Linux)验证输入python 进入    import torchprint(torch.__version__)    #Pytorch版本print(torch.version.cuda)   #CUDA版本print(torch.backends.cudnn.version())   #CUDNN版本配置Jupyter Notebook新建的环境是没有安装安装ipykernel的所以无法注册到Jupyter Notebook中,所以先要准备环境    #安装ipykernelconda install ipykernel#写入环境python -m ipykernel install  --name pytorch --display-name "Pytorch for Deeplearning"下一步:定制 Jupyter Notebook    #切换回基础环境activate base#创建jupyter notebook配置文件jupyter notebook --generate-config## 这里会显示创建jupyter_notebook_config.py的具体位置打开文件,修改    c.NotebookApp.notebook_dir = '' 默认目录位置c.NotebookApp.iopub_data_rate_limit = 100000000 这个改大一些否则有可能报错测试至此,Pytorch 的开发环境安装完成,可以在开始菜单中打开Jupyter Notebook 在New 菜单中创建文件时选择Pytorch for Deeplearning 创建PyTorch的相关开发环境了 。
  • [问题求助] Ascend310芯片上, AlphaPose 转 om模型后,onnx 识别正确,om识别错误
    模型源项目git@github.com:soloist-v/AlphaPoseOnnx.git移植om的项目git@github.com:PalmsSA/AlphaPose_npu.git
  • [行业动态] 9 月 12 日PyTorch正式加入Linux基金会
     9 月 12 日,PyTorch 和 Linux 基金会双双在自家的官网宣布,PyTorch 已经正式加入 Linux 基金会的消息。PyTorch 最初由 Meta 的 AI 团队孵化,在以社区为中心的管理之下,PyTorch 现已发展成为一个由贡献者和用户组成的庞大社区。截至 2022 年 8 月,PyTorch 是世界上与 Linux 内核和 Kubernetes 并列的五个增长最快的开源软件社区之一。从 2021 年 8 月到 2022 年 8 月,PyTorch 统计了超过 6.5 万次提交. 超过 2400 名贡献者以提交问题或 PR 或编写文档的方式参与了这项工作。这些数字使 PyTorch 成为历史上最成功的开源项目之一。“很高兴 Linux 基金会将成为我们的新家,因为他们在支持像我们这样的大型开源项目(例如 Kubernetes 和 NodeJS)方面拥有丰富的经验。”PyTorch 联合创始人 Soumith Chintala 称。“PyTorch 通过良好的维护和开源社区管理达到了目前的状态。我们不会改变 PyTorch 的任何优点。”Linux 基金会称。“PyTorch 将通过加入 Linux 基金会加强其治理。”PyTorch 联合创始人 Soumith Chintala 称。PyTorch 是 Facebook 开发的用于训练神经网络的 Python 包,也是 Facebook 倾力打造的首选深度学习框架。在 2017 年 1 月首次推出,Facebook 人工智能研究院(FAIR)在 GitHub 上开源了 PyTorch,迅速占领了 GitHub 热度榜榜首。Facebook 用 Python 重写了基于 Lua 语言的深度学习库 Torch,不仅使得 PyTorch 继承了 Torch 灵活、动态的编程环境和用户友好的界面,支持以快速和灵活的方式构建动态神经网络,还允许在训练过程中快速更改代码而不妨碍其性能,即支持动态图形等尖端 AI 模型的能力。2018 年 Caffe2 正式并入 PyTorch 后,PyTorch 的发展势头更呈不可阻挡之势。据 Meta 称,自 PyTorch 创建以来,约有 2,400 名贡献者在该框架上构建了超过 150,000 个项目。因此,PyTorch 已成为人工智能研究和商业生产使用的领先平台之一,包括作为亚马逊网络服务、微软 Azure 和 OpenAI 的技术基础。    在人工智能和机器学习领域,开源是重中之重。Linux 基金会是开源生态系统的一个重要组成部分。目前,Linux 基金会在世界各地拥有数千名成员,拥有 850 多个开源项目。这些项目要么直接为基础 AI/ML 项目(LF AI 和数据)做出贡献,要么为其用例做出贡献并与其平台集成。(例如,LF Networking、AGL、Delta Lake、RISC-V、CNCF、Hyperledger)。“PyTorch 的精髓之处(以及它的维护者的功劳)在于,它的确是如今许多 AI 和 ML 项目的基础平台,它是一把真正的瑞士军刀。”Linux 基金会称。正如开发人员在 Linux 之上构建了我们今天所知的大量技术一样,许多 AI/ML 社区也是在 PyTorch 之上构建而成。PyTorch 进一步支持了新兴技术和不断变化的用户需求。Linux 基金会表示,作为 Linux 基金会的一部分,PyTorch 及其社区将受益于我们的许多计划和支持社区,例如培训和认证计划(我们已经在进行中)、社区研究(例如我们的项目旅程报告),当然还有其他社区活动等。PyTorch 社区将在 Linux 基金会内部和周围工作,PyTorch 社区也有一个可以访问 LFX 协作门户的入口,我们将为 PyTorch 社区提供指导并帮助 PyTorch 社区确定未来的领导者、寻找潜在的员工、并观察共享的社区动态。“像 PyTorch 这样有可能成为关键技术基础平台的项目,保持中立对它更有益处。中立性和真正的社区所有权使 Linux 和 Kubernetes 在变得更加成熟的同时继续加速和增长,从而超越预期。用户、维护者和社区开始将它们视为可以永久依赖和信任的公共资源的。”Linux 基金会称。“PyTorch 通过良好的维护和开源社区管理达到了目前的状态。我们不会改变 PyTorch 的任何优点。”Linux 基金会称。来源:https://pytorch.org/blog/PyTorchfoundation/https://venturebeat.com/ai/pytorch-has-a-new-home-meta-announces-independent-foundation/https://linuxfoundation.org/zh/blog/welcoming-pytorch-to-the-linux-foundation/
  • [API使用] 请问在mindspore中是否有类似索引方式的实现
    import numpy as np arr=np.arange(12) mask=arr%2==0 arr=arr[mask] print(arr)请问通过布尔数组过滤矩阵,在mindspore中有没有对应的函数实现,若没有,请问如何实现高效的上述逻辑
  • yolov5的openvino部署
    软硬件环境ubuntu 18.04 64bitopenvino_2020.3.341yolov5 4.0openvino是什么openvino是一个用于解决在intel硬件平台上进行深度学习部署的方案,支持windows、linux和macOS。openvino环境搭建下载地址:https://software.intel.com/content/www/us/en/develop/tools/openvino-toolkit/download.html下载后解压并进入目录tar xvf l_openvino_toolkit_p_2020.3.341.tgzcd l_openvino_toolkit_p_2020.3.341执行脚本开始按提示安装# 或者使用带GUI界面的安装脚本sudo ./install_GUI.shsudo ./install.sh按回车键继续选2,不同意收集我的信息按回车键继续同意并开始安装按回车键继续至此,安装结束接下来测试下安装是否成功cd /opt/intel/openvino/deployment_tools/demo./demo_security_barrier_camera.sh./demo_security_barrier_camera.sh -d GPU(测试gpu环境)这就说明,openvino的环境安装成功了。这里需要注意下,由于,在安装过程中,脚本已经帮我们设置了相关的环境,所以我们去测试时无需做任何设置。但是如果下次开机,或者打开新的terminal,我们就需要重新来设置环境,执行source /opt/intel/openvino/bin/setupvars.sh或者直接将上述命令写入~/.bashrc中,就不用每次手动敲了。目录/opt/intel下有openvino和openvino_2020.3.3412个目录,其实它们是同一个东西,openvino是个软链接文件。pt转onnx首先准备依赖pip install onnx coremltools networkx defusedxml由于目前openvino的版本对onnx opset 11 版本后的支持有问题,因此需要修改文件model/export.py,将原来opset_version由12改为10,如下torch.onnx.export(model, img, f, verbose=False, opset_version=10, input_names=['images'], output_names=['classes', 'boxes'] if y is None else ['output'])接下来就可以将yolov5的pt模型转换成onnx格式了,这里使用其自带的yolov5s.pt模型进行测试python models/export.py --weights weights/yolov5s.pt --img-size 640 --batch-size 1转换结束后,就会在weights文件夹下生成yolov5s.onnxonnx转irir即Intermediate Representation,openvino的模型优化器(Model Optimizer)会将给定的模型转化为标准的ir格式,并对其进行优化。使用openvino自带的脚本,就可以完成从.onnx到.bin和.xml的转换,命令如下mo.py --input_model weights/yolov5s.onnx可以看到在当前目前生成了yolov5s.bin和yolov5s.xmlopenvino测试这里使用c++语言编写测试程序,下载地址:https://github.com/fb029ed/yolov5_cpp_openvino,非常感谢作者fb029ed的分享cd yolov5_cpp_openvino/demomkdir buildcmake ..make./detect_test需要将前面生成的yolov5s.bin、yolov5s.xml和一张测试图片拷贝到res目录下,图片重命名为bus.jpg文章转自: 迷途小书童的Note
  • [经验分享] 【MindStudio体验官第一期活动】基于MindStudio MindX SDK复现Head Pose Estimation
    ​前言本文将介绍基于MindStudio为开发工具,昇腾 Atlas 300 卡为主要的硬件平台,使用MindX SDK实现对图像中的头部进行姿态识别。Head Pose Estimation 是通过一幅面部图像来获得头部的姿态角,即计算 pitch,yaw 和 roll 三个欧拉角,分别学名俯仰角、偏航角和滚转角,通俗讲就是抬头、摇头和转头以此来判断当前人体的头部姿态。这在众多场景中都有着十分优秀的应用,比如注意力检测,行为分析,人机互动,视线追踪等。华为提供的软硬件平台为开发提供了十分有力的帮助,接下来将为大家介绍此次的使用经验。1 软硬件平台搭建1.1 服务器平台搭建搭建服务器的方法请参照官方攻略1.2 软件平台搭建此步需要进行一些准备工作,本次开发的代码与模型由华为官方提供,请先到下载地址下载1.21 MindStudio安装配置MindStudio下载下载解压后安装​选择自己的安装地址​根据自己需求选择​​重启电脑后打开MindStudio进行相关配置​点击Customize下的All settings​点击加号,设置服务器连接​配置CANN​配置SDK​下图是安装成功的界面​至此,MindStudio的基本设置配置完成。1.22 MobaXterm安装MobaXterm主要是用于SSH连接服务器,更方便修改服务器文件。下载地址下载安装完成后打开,点击SSH,输入自己服务器地址​​连接成功后如图所示​软件的基本安装配置到此结束。2 代码介绍2.1 软件方案介绍本方案中,采用yolov4预训练模型对输入图片进行头部识别,头部识别后对识别出的头部图像进行抠图,然后使用WHENet模型进行头部姿态识别,最终根据WHENet模型识别得到的yaw,pitch,roll信息生成头部上带有三位坐标轴确定头部姿态的jpg图片。注:由于YOLO模型限制,目前仅支持侧脸与正脸图片的头部姿态识别2.2 代码目录结构与说明本sample工程名称为HeadPoseEstimation,工程目录如下图所示:├── models│ ├── coco.names # 标签文件│ ├── insert_op.cfg # 模型转换aipp配置文件│ ├── yolov4.cfg # yolo模型配置文件│ ├── WHENet_b2_a1_modified.om # 头部转换模型WHENet│ └── yolov4_detection.om # 头部识别模型YOLO├── pipeline│ └── recognition.pipeline # pipeline文件├── plugins│ ├── MxpiHeadPoseEstimationPostProcess # 姿态后处理插件│ │ ├── CMakeLists.txt│ │ ├── build.sh│ │ ├── MxpiHeadPoseEstimationPostProcess.cpp│ │ └── MxpiHeadPoseEstimationPostProcess.h│ ├── MxpiHeadPoseEstimationPostProcess # 自定义proto结构体│ │ ├── CMakeLists.txt│ │ ├── build.sh│ │ └── mxpiHeadPoseProto.proto│ └── build.sh├── main.py├── build.sh # 编译头部姿态后处理插件脚本└── test.jpg2.3 技术实现流程图图1 头部姿态识别流程图图2 头部姿态识别pipeline示意图2.4 环境依赖软件名称版本ubantu18.04.1 LTSMindX SDK2.0.4Python3.9.2CANN5.0.4在编译运行项目前,需要设置环境变量:环境变量介绍# 执行如下命令,打开.bashrc文件vi .bashrc# 在.bashrc文件中添加以下环境变量MX_SDK_HOME=${SDK安装路径}LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64/GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scannerGST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins# 保存退出.bashrc文件# 执行如下命令使环境变量生效source ~/.bashrc#查看环境变量env2.5 模型获取此处提供转换好的YOLOV4模型,WHENet模型的om文件以及一份测试集:下载地址注:下载后请将两个模型请放置于models目录下3 编译运行在MindStudio下点击degug可以自动将本地工程文件上传至服务器3.1 打开工程文件并设置打开Settings,选择如下目录,配项目配置服务器以及映射文件​​项目映射将工程转换成Ascend App3.2 配置环境变量使用MobaXyerm打开.bashrc文件输入前面介绍的环境变量后保存,运行source .bashrc3.3 为项目配置Debug运行bash build.shcd至plugins/MxpiHeadPosePlugin/build/ 修改下面代码中的SDK目录并执行cp libmxpi_headposeplugin.so {自己的MindX_SDK目录}/mxVision/lib/plugins/修改pipeline/recognition.pipeline文件中: mxpi_objectpostprocessor0插件的postProcessLibPath属性,修改为{SDK安装路径}/lib/modelpostprocessors/libyolov3postprocess.so3.3 在MindStudio运行可以看到MindStudio将指令返送到服务器,服务器运行完成后将结果返回到本地,十分方便。4 总结MindStudio是一款更能是全齐全,使用门槛低的开发工具。开发者可以方便的在上面进行AI开发。同时官方社区也提供了详尽的使用文档供我们使用,论坛也有很多经验丰富的开发者分享他们的开发经历,相信以后会有越来越多的人加入使用MindStudio来开发应用。
  • [经验分享] 使用MindStudio进行SE-ResNext101-Pytorch模型的开发
    基于MindStudio完成SE-ResNext101-Pytorch模型的开发视频链接可参见:cid:link_3一、PyTorch环境搭建和配置1.PyTorch简介​PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。2017年1月,由Facebook人工智能研究院(FAIR)基于Torch推出了PyTorch。它是一个基于Python的可续计算包,提供两个高级功能:1、具有强大的GPU加速的张量计算(如NumPy)。2、包含自动求导系统的深度神经网络。PyTorch是专门针对 GPU 加速的深度神经网络(DNN)编程。Torch 是一个经典的对多维矩阵数据进行操作的张量(tensor )库,在机器学习和其他数学密集型应用有广泛应用。​ PyTorch具有如下优点:​ 1.简洁:代码易于理解,PyTorch的源码只有TensorFlow的十分之一左右,更少的抽象、更直观的设计使得PyTorch的源码十分易于阅读。​ 2.速度:PyTorch 的灵活性不以速度为代价,在许多评测中,PyTorch 的速度表现胜过 TensorFlow和Keras 等框架。​ 3.易用:PyTorch 是所有的框架中面向对象设计的最优雅的一个。PyTorch的面向对象的接口设计来源于Torch,而Torch的接口设计以灵活易用而著称,Keras作者最初就是受Torch的启发才开发了Keras。PyTorch继承了Torch的衣钵,尤其是API的设计和模块的接口都与Torch高度一致。PyTorch的设计最符合人们的思维,它让用户尽可能地专注于实现自己的想法,即所思即所得,不需要考虑太多关于框架本身的束缚。​ 4.活跃的社区:PyTorch 提供了完整的文档,循序渐进的指南,作者亲自维护的论坛供用户交流和求教问题。Facebook 人工智能研究院对 PyTorch 提供了强力支持。​ PyTorch(Caffe2) 通过混合前端,分布式训练以及工具和库生态系统实现快速,灵活的实验和高效生产。PyTorch 和 TensorFlow 具有不同计算图实现形式,TensorFlow 采用静态图机制(预定义后再使用),PyTorch采用动态图机制(运行时动态定义)。PyTorch 具有以下高级特征:混合前端:新的混合前端在急切模式下提供易用性和灵活性,同时无缝转换到图形模式,以便在C ++运行时环境中实现速度,优化和功能。分布式训练:通过利用本地支持集合操作的异步执行和可从Python和C ++访问的对等通信,优化了性能。   Python优先: PyTorch为了深入集成到Python中而构建的,因此它可以与流行的库和Cython和Numba等软件包一起使用。  丰富的工具和库:活跃的研究人员和开发人员社区建立了丰富的工具和库生态系统,用于扩展PyTorch并支持从计算机视觉到强化学习等领域的开发。本机ONNX支持:以标准ONNX(开放式神经网络交换)格式导出模型,以便直接访问与ONNX兼容的平台,运行时,可视化工具等。   C++前端:C++前端是PyTorch的纯C++接口,它遵循已建立的Python前端的设计和体系结构。它旨在实现高性能,低延迟和裸机C++应用程序的研究。 使用GPU和CPU优化的深度学习张量库。2.Ascend PyTorch基于PyTorch框架的动态图概念,参考对于友商CUDNN、CPU、CUDA、MKL、MKLDNN等算子的实现和库的支持的方式,通过调用单一Ascend TBE算子或调用多个Ascend TBE算子组合的方式,实现PyTorch框架对Ascend NPU的支持。方案中,Ascend NPU被当做是和GPU同一类别的设备,包括内存管理,设备管理,以及算子调用实现。因此在适配修改方案中,会仿照PyTorch结构中原有的CUDA形式,做一个NPU的扩展。3.AscendPyTorch环境安装配置选择合适的AscendPytorch版本安装Pytorch依赖环境如果使用非root用户安装,用户需要在本步骤的每句命令后加**--user**,示例如:pip3 install pyyaml --user。pip install pyyaml pip install wheel编译安装PyTorch和昇腾插件首先安装官方torch包,然后编译安装插件。#x86_64 pip3 install torch==1.8.1 #若使用pip命令安装cpu版本PyTorch报错,请手动下载whl包安装,下载地址:(https://download.pytorch.org/whl/torch) #aarch64 git clone -b v1.8.1 https://github.com/pytorch/pytorch.git --depth=1 pytorch_v1.8.1 #进入源码安装包获取被动依赖代码。 cd pytorch_v1.8.1 git submodule sync git submodule update --init --recursive #执行编译安装。 python3 setup.py install编译生成pytorch插件的二进制安装包。git clone -b master cid:link_7.git cd pytorch # 下载master分支代码,进入插件根目录 # 指定python版本编包方式: bash ci/build.sh --python=3.7 # 或 bash ci/build.sh --python=3.8 # 或 bash ci/build.sh --python=3.9然后安装pytorch/dist下生成的插件torch_npu包,{arch}为架构名称。可以进入目录下查看pip install --upgrade dist/torch_npu-1.8.1rc1-cp37-cp37m-linux_{arch}.whl最后运行环境变量在pytorch目录下执行设置环境变量source env.sh具体安装链接参考cid:link_7二、MindStudio工具简介和安装1.MindStudio工具简介​ MindStudio是一套基于华为自研昇腾AI处理器开发的AI全栈开发工具平台,包括网络模型移植、应用开发、推理运行及自定义算子开发等功能。通过MindStudio能够进行工程管理、编译、调试、运行、性能分析等全流程开发,提高开发效率。同时,MindStudio是一套基于IntelliJ框架的开发工具链平台,提供了应用开发、调试、模型转换功能,同时还提供了网络移植、优化和分析功能,为用户开发应用程序带来了极大的便利。MindStudio提供以下4项服务功能。​ 针对安装与部署,MindStudio提供多种部署方式,支持多种主流操作系统,为开发者提供最大便利。​ 针对算子开发,MindStudio提供包含UT测试、ST测试、TIK算子调试等的全套算子开发流程。支持TensorFlow、PyTorch、MindSpore等多种主流框架的TBE和AI CPU自定义算子开发。​ 针对网络模型的开发,MindStudio支持TensorFlow、PyTorch、MindSpore框架的模型训练,支持多种主流框架的模型转换。集成了训练可视化、脚本转换、模型转换、精度比对等工具,提升了网络模型移植、分析和优化的效率。​ 针对应用开发,MindStudio集成了Profiling性能调优、编译器、MindX SDK的应用开发、可视化pipeline业务流编排等工具,为开发者提供了图形化的集成开发环境,通过MindStudio能够进行工程管理、编译、调试、性能分析等全流程开发,能够很大程度提高开发效率。​ MindStudio功能框架如下图所示,目前含有的工具链包括:模型转换工具、模型训练工具、自定义算子开发工具、应用开发工具、工程管理工具、编译工具、流程编排工具、精度比对工具、日志管理工具、性能分析工具、设备管理工具等多种工具。MindStudio具有如下功能:​ 1.TBE算子开发​ 支持自定义TBE(Tensor Boost Engine)算子开发,利用TBE的性能优化和代码生成能力,实现充分发挥昇腾AI处理器极致性能的自定义算子。​ ① TBE算子工程创建、代码开发​ ② TBE算子编译、运行、验证和部署​ ③ TBE算子仿真运行与性能调优,辅助识别算子性能瓶颈​ 2.模型转换​ 将开源框架的网络模型(如Caffe、TensorFlow等)转换成昇腾AI处理器支持的离线模型,模型转换过程中可以实现算子调度的优化、权值数据重排、内存使用优化等。​ ① 模型转换​ ② 模型可视化,查看模型结构和算子属性​ ③ 支持AIPP硬件图像预处理​ 3.AI应用开发​ 支持AI应用开发,通过使用开放的模型/算子加载与执行、媒体数据处理等C++ API,支撑用户开发深度神经网络应用,用于实现目标识别、图像分类等功能。​ ① 应用工程创建、代码开发(C++)​ ② 工程编译、上板运行、结果输出​ ③ 工程的单步调试​ ④ 应用性能分析,辅助应用性能瓶颈定位​ 4.性能调优​ 提供高效、易用、可灵活扩展的系统化性能分析工具,便于快速识别产品的关键性能瓶颈并提出针对性能优化的建议,实现产品的极致性能。​ ① 性能数据自动采集与Profiling​ ② 性能Timeline视图,查看运行的Stream和Task​ ③ 性能统计视图分析,识别最耗时的算子​ 5.算子比对​ 为了定位/解决模型的精度问题,算子比对工具提供了将华为自有模型算子的运算结果与Caffe标准算子的运算结果进行比对的功能,以便快速确认误差发生的原因。​ ① 整网或者指定网络层输出数据​ ② 整网算子比对和分析​ ③ Lower Bound比对算法,Vector比对算法(余弦相似度、最大绝对误差、累积相对误差、欧式相对距离等)​ 6.智能代码编辑​ 支持C/C++、Python语言语法高亮、定义跳转、自动完成、参数提示。2.MindStudio安装​ MindStudio支持Ubuntu,Euler和Cent OS多种操作系统。MindStudio可以在Ubuntu服务器上使用原生桌面自带的终端gnome-terminal进行安装,也可以在Windows服务器上通过SSH登录到Ubuntu服务器进行安装,因为MindStudio是一款GUI程序,所以在Windows服务器上通过SSH登录到Ubuntu服务器进行安装时,需要使用集成了Xserver的SSH终端(比如mobaxterm)。2.1 安装流程step1:环境要求step2:准备软件包step3:安装依赖step4:安装MindStudio2.2 环境要求将MindStudio安装在Windows服务器上时,Windows服务器为本地环境,Linux服务器为远端环境。本地环境要求:Windows 10 x86_64操作系统本地环境依赖:Python(版本要求:3.7~3.9)MinGWCMakeACLib(可选,Windows工控机场景开发Windows应用)2.3 准备软件包1.软件安装前,请获取所需软件包和对应的数字签名文件。(1)MindStudio_5.0.RC1_win.exe,MindStudio安装包,需要安装后使用(2)MindStudio_5.0.RC1_win.zip,MindStudio免安装压缩包,解压后可直接运行获取链接:cid:link_52.为了防止软件包在传递过程或存储期间被恶意篡改,下载软件包时需下载对应的数字签名文件用于完整性验证。3.安装MindStudio的两种方式(1)以免安装压缩包.zip文件形式,直接解压到相应文件目录即可(2)下载exe文件以及对应的数字签名文件,2.4 安装依赖安装python依赖1.在Python官网下载Python安装包到Windows本地系统。MindStudio目前支持Python版本为3.7~3.9,下面以安装Python3.7.5依赖包为例。选择Windows x86-64 executable installer。其他安装细节请参考链接:cid:link_42.打开系统命令行,输入python -V命令确认python版本是否为3.7.5。安装Python3相关依赖。pip install xlrd==1.2.0 pip install absl-py pip install numpy如若返回如下信息,则表示安装成功。Successfully installed xlrd-1.2.0 Successfully installed absl-py-0.12.0 six-1.15.0 Successfully installed numpy-1.20.1安装MinGW依赖1.下载最新的MinGW安装包,根据系统选择对应版本,例如windows64位选择x86_64-posix-seh。2.解压MinGW安装包到自定义路径。3.将MinGW安装路径添加到系统变量中。安装细节参见链接:cid:link_44.打开系统命令行,输入gcc -v命令。 当界面提示“gcc version x.x.x (x86_64-posix-sjlj-rev0, Built by MinGW-W64 project)”信息时,表示安装成功。安装CMakeCMake是个一个开源的跨平台自动化建构系统,用来管理软件建置的程序,并不依赖于某特定编译器,并可支持多层目录、多个应用程序与多个库。可以登录CMake官网下载CMake。以msi格式软件包为例,安装步骤如下:单击快捷键“win+R”,输入cmd,单击快捷键“Ctrl+Shift+Enter”,进入管理员权限命令提示符。若弹出“用户帐户控制”提示窗口,单击“是”。执行以下命令,安装软件包:msiexec /package *{path}*{name}.msi例如:msiexec /package D:\cmake-3.16.5-win64-x64.msi安装。推荐安装版本3.16.5-win64-x64安装细节参见链接: cid:link_4安装ACLlib包如果用户需要开发Windows应用,并在本地编译或运行(已安装Atlas加速卡的Windows服务器才能运行),请安装此包和对应的依赖。详细操作请参见《CANN Windows版用户指南》的“ACLlib安装与卸载”章节和“配置开发环境”章节。安装MindStudio安装参考链接:cid:link_1启动MindStudio,如果没有报错信息且能正常进入欢迎界面如图,则表示MindStudio安装成功三、训练工程创建,工程功能以及相关菜单介绍1.启动MindStudio。2.本文以SE-ResNeXt101模型为例,介绍使用MindStudio进行PyTorch模型训练开发。下载SE-ResNeXt101项目代码,项目地址为:cid:link_03.新建Ascend Training工程。工程信息由用户自行根据实际配置。单击“Next”,进入训练工程选择界面。4.选择PyTorch Project5.项目结构如图所示。该项目结构目录是将下载的SE-ResNext101项目拷贝到新建的工程目录下生成。6.代码目录结构如图所示├─ SE-ResNext-101-32x4d │─ demo.py #(可选)用于运行单p在线推理 │─ main.py #主文件 │─ models.py #网络模型文件 │─ README.md #SE-ResNext101模型介绍相关文件 │─ requirements.txt #Python依赖库信息 └─test │─ env_npu.sh #标准的npu环境变量 │─ train_eval_8p.sh #(可选)运行8p的eval脚本 │─ train_finetune_1p.sh #1p 模型迁移脚本,运行一定step,主要为功能实现,能够支持加载预训练模型修改class_num进行运行,一般将class_num设置为默认数据集class_num+1即可 │─ train_full_1p.sh #(可选)1p 完整训练脚本,要求能够复现精度性能,若使用8P脚本对齐精度则1P脚本非必须 │─ train_full_8p.sh #8p 完整训练脚本,要求能够复现精度性能 │─ train_performance_1p.sh #1p 性能脚本,运行一定step,得到性能数据,运行时长应该控制在30min内或1000step以内 │─ train_performance_8p.sh #8p 性能脚本,运行一定step,得到性能数据,运行时长应该控制在30min内或1000step以内7.点击File->Projects Structure->Add Python SDK->SSH Interpreter->Deploy8.点击File->settings->tools->deployment,配置映射。点击左上角加号,输入连接名称。Local Path要求的是填入本地的项目名称路径,Deployment Path的是部署到服务器上的项目名称,这两个可以保持一致,也可以不保持一致。excluded paths(非必需)为配置忽略路径,表示忽略的项目文件不会上传到远程服务器。9.选择所需要的python解释器。Name的值可以随意取。完成配置。等待进度条结束,将会自动上传项目到远程服务器。 Tools->Deployment-> 勾选Automatic Upload,可以在每次本地文件保存后,自动同步项目到服务器。至此,本地项目连接到远程服务器的步骤完成。四、使用MindStudio训练SE-ResNext101模型1.模型介绍及数据集论文名称:Squeeze-and-Excitation Networks项目地址:cid:link_0模型架构:SE-ResNeXt101-32x4d是在Resenext101-32x4d模型基础上增加了SE模块。数据集:ImageNet数据集ImageNet是一个计算机视觉系统识别项目,是目前世界上图像识别最大的数据库。是美国斯坦福的计算机科学家,模拟人类的识别系统建立的。ImageNet数据集包含1000个类别,里面包含120多万的自然图像,大概有150G。且评价指标是固定的top1、top5等。ImageNet数据集下载链接:cid:link_82.代码介绍运用mmclassification,mmclassification是一款基于 PyTorch 的开源图像分类工具箱, 集成了常用的图像分类网络,将数据加载,模型骨架,训练调参,流程等封装为模块调用。Github链接如下: cid:link_2seresnext101_32x4d.py 配置文件如下:将模型的结构参数以字典的形式保存 # model settings model = dict( type='ImageClassifier', backbone=dict( type='SEResNeXt', depth=101, num_stages=4, out_indices=(3, ), groups=32, width_per_group=4, se_ratio=16, style='pytorch'), neck=dict(type='GlobalAveragePooling'), head=dict( type='LinearClsHead', num_classes=1000, in_channels=2048, loss=dict(type='CrossEntropyLoss', loss_weight=1.0), topk=(1, 5), )) model.py详细模型文件,SE-ResNext101模型架构如下def forward(self, x): x = self.conv1(x) x = self.bn1(x) x = self.relu(x) x = self.maxpool(x) x = self.layer1(x) x = self.layer2(x) x = self.layer3(x) x = self.layer4(x) x = self.avgpool(x) x = x.view(x.size(0), -1) x = self.fc(x) return xmain.py主文件的参数设置def main(): parser = argparse.ArgumentParser(description='PyTorch Se-ResNeXt101 ImageNet Training') # dataset setting parser.add_argument('--data_path', metavar='DIR', default='/opt/npu/imagenet', help='path to dataset') parser.add_argument('--workers', default=192, type=int, metavar='N', help='number of data loading workers (default: 4)') # training setting parser.add_argument('--epochs', default=100, type=int, metavar='N', help='number of total epochs to run') parser.add_argument('--batch-size', default=128, type=int, metavar='N', help='mini-batch size (default: 256), this is the total ' 'batch size of all GPUs on the current node when ' 'using Data Parallel or Distributed Data Parallel') parser.add_argument('--lr', default=0.6, type=float, metavar='LR', help='initial learning rate', dest='lr') parser.add_argument('--momentum', default=0.9, type=float, metavar='M', help='momentum') parser.add_argument('--weight-decay', default=1e-4, type=float, metavar='W', help='weight decay (default: 1e-4)', dest='weight_decay') # apex setting parser.add_argument('--amp', default=True, action='store_true', help='use amp to train the model') parser.add_argument('--opt-level', default="O2", type=str, help='apex optimize level') parser.add_argument('--loss-scale-value', default=None, type=float, help='static loss scale value') parser.add_argument('--combine-grad', default=True, action='store_true', help='use amp to train the model') # basic distribution setting parser.add_argument('--ddp', dest='ddp', action='store_true', help='use distribution training') parser.add_argument('--nodes', default=1, type=int, help='number of data loading workers (default: 4)') parser.add_argument('--node_rank', default=0, type=int, help='ranking within the nodes') parser.add_argument('--device_list', default='0,1,2,3,4,5,6,7', type=str, help='device id list') parser.add_argument('--seed', default=None, type=int, help='seed for initializing training. ') parser.add_argument('--print-freq', default=10, type=int, metavar='N', help='print frequency (default: 10)')模型训练过程:def train(train_loader, model, criterion, optimizer, epoch, deviceid, args): # switch to train mode batch_time = AverageMeter('Time', ':6.3f') data_time = AverageMeter('Data', ':6.3f') losses = AverageMeter('Loss', ':.4e') top1 = AverageMeter('Acc@1', ':6.2f') top5 = AverageMeter('Acc@5', ':6.2f') progress = ProgressMeter( len(train_loader), [batch_time, data_time, losses, top1, top5], prefix="Epoch: [{}]".format(epoch)) # switch to train mode model.train() optimizer.zero_grad() end = time.time() for i, (images, target) in enumerate(train_loader): images = images.npu(non_blocking=True) target = target.long().npu(non_blocking=True) if args.mainprocess: # measure data loading timetime data_time.update(time.time() - end) output = model(images) loss = criterion(output, target.long()) with amp.scale_loss(loss, optimizer) as scaled_loss: scaled_loss.backward() optimizer.step() optimizer.zero_grad() if args.mainprocess: acc1, acc5 = accuracy(output, target, topk=(1, 5)) losses.update(loss.item(), images.size(0)) top1.update(acc1[0], images.size(0)) top5.update(acc5[0], images.size(0)) # measure elapsed time batch_time.update(time.time() - end) end = time.time() if i % args.print_freq == 0 and args.mainprocess: progress.display(i) if args.stop_step_num is not None and i >= args.stop_step_num: break if args.mainprocess and batch_time.avg: print("[npu id:", deviceid, "]", "batch_size:", args.world_size * args.batch_size, 'Time: {:.3f}'.format(batch_time.avg), '* FPS@all {:.3f}'.format( args.batch_size * args.world_size / batch_time.avg))模型验证过程:def validate(val_loader, model, criterion, deviceid, args): # switch to validate mode batch_time = AverageMeter('Time', ':6.3f') losses = AverageMeter('Loss', ':.4e') top1 = AverageMeter('Acc@1', ':6.2f') top5 = AverageMeter('Acc@5', ':6.2f') progress = ProgressMeter( len(val_loader), [batch_time, losses, top1, top5], prefix='Test: ') # switch to evaluate mode model.eval() with torch.no_grad(): end = time.time() for i, (images, target) in enumerate(val_loader): images = images.npu(non_blocking=True) target = target.to(torch.int32).npu(non_blocking=True) # compute output output = model(images) loss = criterion(output, target.long()) # measure accuracy and record loss acc1, acc5 = accuracy(output, target, topk=(1, 5)) if args.mainprocess: losses.update(loss.item(), images.size(0)) top1.update(acc1[0], images.size(0)) top5.update(acc5[0], images.size(0)) # measure elapsed time batch_time.update(time.time() - end) end = time.time() if i % args.print_freq == 0 and args.mainprocess: progress.display(i) if args.mainprocess: print("[gpu id:", deviceid, "]", '[AVG-ACC] * Acc@1 {top1.avg:.3f} Acc@5 {top5.avg:.3f}' .format(top1=top1, top5=top5)) return top1.avg数据集加载函数:def dataloader(args): """ Create training & validation dataloader """ traindir = os.path.join(args.data_path, 'train') valdir = os.path.join(args.data_path, 'val') normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # Create Dataset train_dataset = datasets.ImageFolder( traindir, transforms.Compose([ transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), normalize, ])) val_dataset = datasets.ImageFolder(valdir, transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), normalize, ])) # Create Sampler if args.distributed: train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset, num_replicas=args.world_size, rank=args.rank) else: train_sampler = None # Create Loader train_loader = torch.utils.data.DataLoader(dataset = train_dataset, batch_size=args.batch_size, shuffle=(train_sampler is None), num_workers=args.loader_workers, drop_last=True, pin_memory=False, sampler=train_sampler) val_loader = torch.utils.data.DataLoader(dataset = val_dataset, batch_size=args.batch_size, shuffle=False, drop_last=True, num_workers=args.loader_workers, pin_memory=False, sampler=None) return train_loader, val_loader, train_sampler最后是精度定义函数,本项目的评价指标def accuracy(output, target, topk=(1,)): """Computes the accuracy over the k top predictions for the specified values of k""" with torch.no_grad(): maxk = max(topk) batch_size = target.size(0) _, pred = output.topk(maxk, 1, True, True) pred = pred.t() correct = pred.eq(target.view(1, -1).expand_as(pred)) res = [] for k in topk: temp = correct[:k] correct_k = temp.reshape(-1).float().sum(0, keepdim=True) res.append(correct_k.mul_(100.0 / batch_size)) return res3.模型训练1.在每次训练完成后,请将服务器中output目录下的文件同步到本地,否则再次运行时这些文件将会被删除,导致不能评估。2.首先运行env.sh环境搭建脚本。点击Run->Edit Configurations,在弹出的配置页面中,点击左上角“+”按钮,选择Ascend Training,如下图。Name为该运行配置名称,不能重复。Executable填入本地被执行文件位置,选择./test/env_npu.sh。然后运行。3.执行1p 完整训练脚本。同上,点击Run->Edit Configurations,在弹出的配置页面中,点击左上角“+”按钮,选择Ascend Training,如下图。Name:train_full_1p。Executable选择./test/train_full_1p.sh。Command Arguments选择--data_path=/data/imagenet参数配置如下:参数说明Run Mode选择remote run(远程运行) 或者 local run(本地运行)Deployment需要部署的远程服务器环境Executable需要执行的脚本文件路径Command Arguments脚本执行所需要的参数Environment Variables配置环境变量,一般不需要配置训练过程如下图所示(部分):(训练过程重定向到了910A_1p.log)4.执行8p完整训练脚本点击Run->Edit Configurations,在弹出的配置页面中,点击左上角“+”按钮,选择Ascend Training,如下图。Name:train_full_8p。Executable选择./test/train_full_8p.sh。Command Arguments选择--data_path=/data/imagenet训练过程如下图所示(部分):(训练过程重定向到了910A_8p.log)五、FAQpip安装pytorch后在import torch时报错ImportError: llibpython3.7m.so: cannot open shared object file: No such file or directory。解决方法:如果环境上没有/usr/lib64,则复制/usr/lib目录:sudo cp /usr/local/python3.7.5/lib/libpython3.7m.so /usr/liblinux系统下如何查看CANN版本。解决方法步骤如下:以软件包的安装用户登录软件包的安装环境。进入软件包安装信息文件目录。(以下以Ascend-cann-toolkit软件包为例)cd /usr/local/Ascend/ascend-toolkit/latest/{arch}-linux其中/usr/local/Ascend为root用户默认安装路径,请用户根据实际情况替换。*{arch}*表示CPU架构(arm64或x86_64)。在命令行执行以下命令获取版本信息。cat ascend_toolkit_install.info查看服务器的架构信息uname -msyntax error near unexpected token ”报错问题,运行mindstudio时,控制台报错解决方法1:使用dos2unix工具进行处理。在linux上安装dos2unix工具:sudo apt-get install dos2unix(根据系统使用不同命令安装)安装成功后可以定义一个shell脚本,或者手动执行一下命令dos2unix *.sh就会看到:dos2unix: converting file *.sh to Unix format ...就将这个文件转换为了linux下的执行文件了。解决方法2:根据报错行代码重新手动换行。AscendPytorch1.5.0和AscendPytorch1.8.1两者差别很大。a.下载安装方面:# AscendPytorch1.5.0没有torch_npu包,只需要下载下面两者包即可 pip install apex-0.1+ascend-cp37-cp37m-linux_aarch64.whl pip install torch-1.5.0+ascend.post5.20220505-cp37-cp37m-linux_aarch64.whl # AscendPytorch1.8.1导入了torch_npu库 apex-0.1+ascend.20220505-cp37-cp37m-linux_aarch64.whl torch_npu-1.8.1rc2.20220505-cp37-cp37m-linux_aarch64.whl torch-1.8.1+ascend.rc2.20220505-cp37-cp37m-linux_aarch64.whlb.代码编写方面# AscendPytorch1.5.0没有torch_npu包,只需要下载下面两者包即可 >>import torch >>torch.npu.set_device(0) # AscendPytorch1.8.1导入了torch_npu库 >>import torch_npu >>torch_npu.npu.set_device(0)六、从昇腾官方体验更多内容和支持欢迎大家在昇腾论坛进行讨论和交流:cid:link_6在这可以进行问题的求助,也可以分享自己在使用昇腾过程中积累的经验。
  • [问题求助] YOLOV5适配不成功
    在yolov3的demo上直接更改模型换成yolov5的模型,想看看性能,为啥会报错在进行模型转换时是这样写的
  • [其他] 浅谈PyTorch的基本配置
    导入包和版本查询import torchimport torch.nn as nnimport torchvisionprint(torch.__version__)print(torch.version.cuda)print(torch.backends.cudnn.version())print(torch.cuda.get_device_name(0))可复现性在硬件设备(CPU、GPU)不同时,完全的可复现性无法保证,即使随机种子相同。但是,在同一个设备上,应该保证可复现性。具体做法是,在程序开始的时候固定torch的随机种子,同时也把numpy的随机种子固定。np.random.seed(0)torch.manual_seed(0)torch.cuda.manual_seed_all(0)torch.backends.cudnn.deterministic = Truetorch.backends.cudnn.benchmark = False显卡设置# Device configurationdevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')如果需要指定多张显卡,比如0,1号显卡。import osos.environ['CUDA_VISIBLE_DEVICES'] = '0,1'也可以在命令行运行代码时设置显卡:CUDA_VISIBLE_DEVICES=0,1 python train.py清除显存torch.cuda.empty_cache()也可以使用在命令行重置GPU的指令nvidia-smi --gpu-reset -i [gpu_id]
  • [热门活动] 【CANN训练营】【2022第二季】基于昇思的GAN实现
    大作业第1,2题的代码可以复制后在ModelArts上进行训练。以下是搜索题目(超链接发布失败):第1题 【深度学习2】基于Pytorch的WGAN理论和代码解析第2题 CycleGAN的pytorch代码实现(代码详细注释)CycleGAN训练很耗时,注意代金券消耗。
  • [模型训练] 【MindSpore易点通】如何迁移PyTorch代码并在Ascend上实现单机单卡训练
    本文将具体介绍如何将PyTorch的代码迁移至MindSpore,并在Ascend芯片上实现单机单卡训练。使用的PyTorch代码为:Resnet50+CIFAR-10的图像分类任务。示例代码:包含PyTorch和MindSpore代码数据集:CIFAR-10MindSpore API主要类别一、训练流程对比介绍由于MindSpore的架构设计不同于PyTorch框架,二者的训练流程以及代码实现也有不同,下图展示了两者的区别。二、训练代码实现2.1 基本参数配置该部分与Pyotrch基本保持一致import argparse if __name__ == "__main__": parser = argparse.ArgumentParser(description='MindSpore CIFAR-10 Example') parser.add_argument('--pre_trained', type=str, default=None, help='Pretrained checkpoint path') parser.add_argument('--data_path', type=str, default=None, help='data_path') parser.add_argument('--epoch_num', type=int, default=200, help='epoch_num') parser.add_argument('--checkpoint_max_num', type=int, default=5, help='Max num of checkpoint') args = parser.parse_args() LR_ORI = 0.01 EPOCH_MAX = args.epoch_num TRAIN_BATCH_SIZE = 128 VAL_BATCH_SIZE = 100 MOMENTUM_ORI = 0.9 WEIGHT_DECAY = 5e-4 CHECKPOINT_MAX_NUM = args.checkpoint_max_num # Data path TRAIN_PATH = args.data_path VAL_PATH = args.data_path2.2 配置运行信息MindSpore通过context.set_context来配置运行需要的信息,譬如运行模式、后端、硬件等信息。该用例中,我们配置使用图模式,并运行在Ascend芯片上。from mindspore import context context.set_context(mode=context.GRAPH_MODE, device_target='Ascend')2.3 数据集加载与处理PyTorch的数据增强方式包括:RandomCrop,RandomHorizontalFlip,Normalize,ToTensor。通过文API映射关系找到PyTorch在MindSpore对应的接口,进行代码迁移,此处使用了c_transforms接口,是基于C++ opencv开发的高性能图像增强模块,因此最后需通过HWC2CHW()将HWC格式转为MindSpore支持的CHW格式。 迁移后的MindSpore数据集加载与处理代码如下:import mindsporeimport mindspore.dataset as dsimport mindspore.dataset.vision.c_transforms as CVimport mindspore.dataset.transforms.c_transforms as C def create_dataset(data_home, do_train, batch_size): # Define dataset if do_train: cifar_ds = ds.Cifar10Dataset(dataset_dir=data_home, num_parallel_workers=8, shuffle=True, usage='train') else: cifar_ds = ds.Cifar10Dataset(dataset_dir=data_home, num_parallel_workers=8, shuffle=False, usage='test') if do_train: # Transformation on train data transform_data = C.Compose([CV.RandomCrop((32, 32), (4, 4, 4, 4)), CV.RandomHorizontalFlip(), CV.Rescale(1.0 / 255.0, 0.0), CV.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), CV.HWC2CHW()]) else: # Transformation on validation data transform_data = C.Compose([CV.Rescale(1.0 / 255.0, 0.0), CV.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), CV.HWC2CHW()]) # Transformation on label transform_label = C.TypeCast(mindspore.dtype.int32) # Apply map operations on images cifar_ds = cifar_ds.map(operations=transform_label, num_parallel_workers=8, python_multiprocessing=True, input_columns="label") cifar_ds = cifar_ds.map(operations=transform_data, num_parallel_workers=8, python_multiprocessing=True, input_columns="image") cifar_ds = cifar_ds.batch(batch_size, num_parallel_workers=8, drop_remainder=True) steps_per_epoch = cifar_ds.get_dataset_size() return cifar_ds, steps_per_epoch定义好后直接在主函数中调用即可# Create dataset ds_train, steps_per_epoch_train = create_dataset(TRAIN_PATH, do_train=True, batch_size=TRAIN_BATCH_SIZE) ds_val, steps_per_epoch_val = create_dataset(VAL_PATH, do_train=False, batch_size=VAL_BATCH_SIZE)MindSpore针对以下三种情况已经做了很好的适配,可参考使用。1.常用数据集加载2.特定格式数据集加载(MindRecord)3.自定义数据集加载2.4 网络定义分析PyTorch网络中所包含的算子,通过API映射关系和MindSpore API,找到MindSpore对应的算子,并构造Resnet网络:MindSpore中使用nn.Cell构造网络结构。在Cell的__init__函数内,定义需要使用的算子。然后在construct函数内将定义好的算子连接起来,最后将输出通过return返回。构造resnet的block单元注: 为了保证权重初始化与PyTorch一致,故定义了_conv2d和_dense函数。import mathimport mindsporeimport mindspore.nn as nnfrom mindspore.ops import operations as P EXPANSION = 4 def _conv2d(in_channel, out_channel, kernel_size, stride=1, padding=0): scale = math.sqrt(1/(in_channel*kernel_size*kernel_size)) if padding == 0: return nn.Conv2d(in_channel, out_channel, kernel_size=kernel_size, stride=stride, padding=padding, pad_mode='same', weight_init=mindspore.common.initializer.Uniform(scale=scale)) else: return nn.Conv2d(in_channel, out_channel, kernel_size=kernel_size, stride=stride, padding=padding, pad_mode='pad', weight_init=mindspore.common.initializer.Uniform(scale=scale)) def _dense(in_channel, out_channel): scale = math.sqrt(1/in_channel) return nn.Dense(in_channel, out_channel, weight_init=mindspore.common.initializer.Uniform(scale=scale), bias_init=mindspore.common.initializer.Uniform(scale=scale)) class ResidualBlock(nn.Cell): def __init__(self, in_planes, planes, stride=1): super(ResidualBlock, self).__init__() self.conv1 = _conv2d(in_planes, planes, kernel_size=1) self.bn1 = nn.BatchNorm2d(planes) self.conv2 = _conv2d(planes, planes, kernel_size=3, stride=stride, padding=1) self.bn2 = nn.BatchNorm2d(planes) self.conv3 = _conv2d(planes, EXPANSION*planes, kernel_size=1) self.bn3 = nn.BatchNorm2d(EXPANSION*planes) self.shortcut = nn.SequentialCell() if stride != 1 or in_planes != EXPANSION*planes: self.shortcut = nn.SequentialCell( _conv2d(in_planes, EXPANSION*planes, kernel_size=1, stride=stride), nn.BatchNorm2d(EXPANSION*planes)) self.relu = nn.ReLU() self.add = P.Add() def construct(self, x_input): out = self.relu(self.bn1(self.conv1(x_input))) out = self.relu(self.bn2(self.conv2(out))) out = self.bn3(self.conv3(out)) identity = self.shortcut(x_input) out = self.add(out, identity) out = self.relu(out) return out构建主干网络ResNet网络中有大量的重复结构,可以使用循环构造多个Cell实例并通过SequentialCell来串联,减少代码重复。在construct函数内将定义好的算子连接起来,最后将网络输出通过return返回。主干网络代码如下:class ResNet(nn.Cell): def __init__(self, num_blocks, num_classes=10): super(ResNet, self).__init__() self.in_planes = 64 self.conv1 = _conv2d(3, 64, kernel_size=3, stride=1, padding=1) self.bn1 = nn.BatchNorm2d(64) self.relu = nn.ReLU() self.layer1 = self._make_layer(64, num_blocks[0], stride=1) self.layer2 = self._make_layer(128, num_blocks[1], stride=2) self.layer3 = self._make_layer(256, num_blocks[2], stride=2) self.layer4 = self._make_layer(512, num_blocks[3], stride=2) self.avgpool2d = nn.AvgPool2d(kernel_size=4, stride=4) self.reshape = mindspore.ops.Reshape() self.linear = _dense(2048, num_classes) def _make_layer(self, planes, num_blocks, stride): strides = [stride] + [1]*(num_blocks-1) layers = [] for stride in strides: layers.append(ResidualBlock(self.in_planes, planes, stride)) self.in_planes = EXPANSION*planes return nn.SequentialCell(*layers) def construct(self, x_input): x_input = self.conv1(x_input) out = self.relu(self.bn1(x_input)) out = self.layer1(out) out = self.layer2(out) out = self.layer3(out) out = self.layer4(out) out = self.avgpool2d(out) out = self.reshape(out, (out.shape[0], 2048)) out = self.linear(out) return out对外调用接口def resnet_50(): return ResNet([3, 4, 6, 3])下图展示了PyTorch与MindSpore在定义一个小的CNN网络上的差异:2.5 定义损失函数和优化器PyTorch损失函数和优化器:# Define network net = resnet_50() device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') net = net.to(device) # Define the loss function criterion = torch.nn.CrossEntropyLoss() # Define the optimizer optimizer = torch.optim.SGD(net.parameters(), LR_ORI, MOMENTUM_ORI, WEIGHT_DECAY)迁移后的MindSpore的损失函数和优化器:# Define network net = resnet_50() # Define the loss function loss = nn.loss.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean') # Define the optimizer opt = nn.SGD(net.trainable_params(), LR_ORI, MOMENTUM_ORI, WEIGHT_DECAY)2.6 构建模型MindSpore推荐使用mindspore.Model接口对网络进行封装,内部会自动构建训练流程。需要将定义好的网络原型、损失函数、优化器和metrics传入Model接口,同时为了便于模型评估,MindSpore中提供了多种Metrics,如Accuracy、Precision、Recall、F1等。注:此处为了发挥Ascend芯片的高性能算力,开启了amp_level="O3"。from mindspore import Model # Create train model metrics = {'accuracy': nn.Accuracy(), 'loss': nn.Loss()} model = Model(net, loss, opt, metrics=metrics, amp_level="O3")2.7 训练并验证MindSpore通过调用Model.train接口,并在callbacks中传入自带的ModelCheckpoint、LossMonitor和自定义的EvalCallBack、PrintFps实例,进行训练并验证。import timefrom mindspore.train.callback import Callback, ModelCheckpoint, LossMonitorfrom mindspore.train.callback import CheckpointConfig class EvalCallBack(Callback): def __init__(self, eval_model, eval_dataset, eval_per_epoch): self.eval_model = eval_model self.eval_dataset = eval_dataset self.eval_per_epoch = eval_per_epoch def epoch_end(self, run_context): cb_param = run_context.original_args() cur_epoch = cb_param.cur_epoch_num if cur_epoch % self.eval_per_epoch == 0: acc = self.eval_model.eval(self.eval_dataset, dataset_sink_mode=False) print(acc) class PrintFps(Callback): def __init__(self, step_num, start_time): self.step_num = step_num self.start_time = start_time self.end_time = time.time() def epoch_begin(self, run_context): self.start_time = time.time() def epoch_end(self, run_context): self.end_time = time.time() cb_param = run_context.original_args() cur_epoch = cb_param.cur_epoch_num fps = self.step_num / (self.end_time - self.start_time) print("Epoch:{}, {:.2f}imgs/sec".format(cur_epoch, fps)) # CheckPoint CallBack definition config_ck = CheckpointConfig(save_checkpoint_steps=steps_per_epoch_train, keep_checkpoint_max=CHECKPOINT_MAX_NUM) ckpoint_cb = ModelCheckpoint(prefix="train_resnet_cifar10", directory="./checkpoint/", config=config_ck) # Eval CallBack definition EVAL_PER_EPOCH = 1 eval_cb = EvalCallBack(model, ds_val, EVAL_PER_EPOCH) train_data_num = steps_per_epoch_train * TRAIN_BATCH_SIZE # FPS CallBack definition init_time = time.time() fps_cb = PrintFps(train_data_num, init_time) # Train print("============== Starting Training ==============") model.train(EPOCH_MAX, ds_train, callbacks=[LossMonitor(), eval_cb, fps_cb, ckpoint_cb], dataset_sink_mode=True, sink_size=steps_per_epoch_train)三、运行启动命令:python MindSpore_1P.py --epoch_num=xxx --data_path=xxx在Terminal中运行脚本,可以看到网络输出结果: 相关代码请点击附件下载: