• [其他问题] RuntimeError: For 'Conv2D', 'C_in' of input 'x' shape divide by parameter 'group' must be equal to 'C_in' of input 'weig
    运行报错:RuntimeError: For 'Conv2D', 'C_in' of input 'x' shape divide by parameter 'group' must be equal to 'C_in' of input 'weight' shape: 3, but got 'C_in' of input 'x' shape: 224, and 'group': 1.使用的卷积层:输入的图片shape为:对应的输入维度就是3,为什么还是报错是224呢?
  • [经验分享] 基于MindStudio的Resnet50深度学习模型开发
    基于MindStudio的MindX SDK应用开发全流程目录一、MindStudio介绍与安装 21 MindStudio介绍 22 MindSpore 安装 4二、MindX SDK介绍与安装 51 MindX SDK介绍 52.MindX SDK安装 6三、可视化流程编排介绍 81 SDK 基础概念 82.可视化流程编排 8四、SE-Resnet介绍 10五、开发过程 101 创建工程 102 代码开发 123 数据准备及模型准备 144 模型转换功能介绍 155 运行测试 16六、遇见的问题 21MindStudio介绍与安装相关课程:昇腾全流程开发工具链(MindStudio)本课程主要介绍MindStudio在昇腾AI开发中的使用,作为昇腾AI全栈中的全流程开发工具链,提供覆盖训练模型、推理应用和自定义算子开发三个场景下端到端工具,极大提高开发效率。建议开发前,学习该课程的第1章和第3章,可以少走很多弯路!!!MindStudio介绍MindStudio提供您在AI开发所需的一站式开发环境,支持模型开发、算子开发以及应用开发三个主流程中的开发任务。依靠模型可视化、算力测试、IDE本地仿真调试等功能,MindStudio能够帮助您在一个工具上就能高效便捷地完成AI应用开发。MindStudio采用了插件化扩展机制,开发者可以通过开发插件来扩展已有功能。功能简介针对安装与部署,MindStudio提供多种部署方式,支持多种主流操作系统,为开发者提供最大便利。针对网络模型的开发,MindStudio支持TensorFlow、Pytorch、MindSpore框架的模型训练,支持多种主流框架的模型转换。集成了训练可视化、脚本转换、模型转换、精度比对等工具,提升了网络模型移植、分析和优化的效率。针对算子开发,MindStudio提供包含UT测试、ST测试、TIK算子调试等的全套算子开发流程。支持TensorFlow、PyTorch、MindSpore等多种主流框架的TBE和AI CPU自定义算子开发。针对应用开发,MindStudio集成了Profiling性能调优、编译器、MindX SDK的应用开发、可视化pipeline业务流编排等工具,为开发者提供了图形化的集成开发环境,通过MindStudio能够进行工程管理、编译、调试、性能分析等全流程开发,能够很大程度提高开发效率。功能框架MindStudio功能框架如图1-1所示,目前含有的工具链包括:模型转换工具、模型训练工具、自定义算子开发工具、应用开发工具、工程管理工具、编译工具、流程编排工具、精度比对工具、日志管理工具、性能分析工具、设备管理工具等多种工具。图1-1 工具链功能架构工具功能MindStudio工具中的主要几个功能特性如下:工程管理:为开发人员提供创建工程、打开工程、关闭工程、删除工程、新增工程文件目录和属性设置等功能。SSH管理:为开发人员提供新增SSH连接、删除SSH连接、修改SSH连接、加密SSH密码和修改SSH密码保存方式等功能。应用开发:针对业务流程开发人员,MindStudio工具提供基于AscendCL(Ascend Computing Language)和集成MindX SDK的应用开发编程方式,编程后的编译、运行、结果显示等一站式服务让流程开发更加智能化,可以让开发者快速上手。自定义算子开发:提供了基于TBE和AI CPU的算子编程开发的集成开发环境,让不同平台下的算子移植更加便捷,适配昇腾AI处理器的速度更快。离线模型转换:训练好的第三方网络模型可以直接通过离线模型工具导入并转换成离线模型,并可一键式自动生成模型接口,方便开发者基于模型接口进行编程,同时也提供了离线模型的可视化功能。日志管理:MindStudio为昇腾AI处理器提供了覆盖全系统的日志收集与日志分析解决方案,提升运行时算法问题的定位效率。提供了统一形式的跨平台日志可视化分析能力及运行时诊断能力,提升日志分析系统的易用性。性能分析:MindStudio以图形界面呈现方式,实现针对主机和设备上多节点、多模块异构体系的高效、易用、可灵活扩展的系统化性能分析,以及针对昇腾AI处理器的性能和功耗的同步分析,满足算法优化对系统性能分析的需求。设备管理:MindStudio提供设备管理工具,实现对连接到主机上的设备的管理功能。精度比对:可以用来比对自有模型算子的运算结果与Caffe、TensorFlow、ONNX标准算子的运算结果,以便用来确认神经网络运算误差发生的原因。开发工具包的安装与管理:为开发者提供基于昇腾AI处理器的相关算法开发套件包Ascend-cann-toolkit,旨在帮助开发者进行快速、高效的人工智能算法开发。开发者可以将开发套件包安装到MindStudio上,使用MindStudio进行快速开发。Ascend-cann-toolkit包含了基于昇腾AI处理器开发依赖的头文件和库文件、编译工具链、调优工具等。MindStudio安装具体安装操作请参考:MindStudio安装指南 MindStudio环境搭建指导视频场景介绍纯开发场景(分部署形态):在非昇腾AI设备上安装MindStudio和Ascend-cann-toolkit开发套件包。可作为开发环境仅能用于代码开发、编译等不依赖于昇腾设备的开发活动(例如ATC模型转换、算子和推理应用程序的纯代码开发)。如果想运行应用程序或进行模型训练等,需要通过MindStudio远程连接功能连接已部署好运行环境所需软件包的昇腾AI设备。开发运行场景(共部署形态):在昇腾AI设备上安装MindStudio、Ascend-cann-toolkit开发套件包、npu-firmware安装包、npu-driver安装包和AI框架(进行模型训练时需要安装)。作为开发环境,开发人员可以进行普通的工程管理、代码编写、编译、模型转换等功能。同时可以作为运行环境,运行应用程序或进行模型训练。软件包介绍MindStudio:提供图形化开发界面,支持应用开发、调试和模型转换功能,同时还支持网络移植、优化和分析等功能。Ascend-cann-toolkit:开发套件包。为开发者提供基于昇腾AI处理器的相关算法开发工具包,旨在帮助开发者进行快速、高效的模型、算子和应用的开发。开发套件包只能安装在Linux服务器上,开发者可以在安装开发套件包后,使用MindStudio开发工具进行快速开发。MindX SDK介绍与安装MindX SDK介绍MindX SDK提供昇腾AI处理器加速的各类AI软件开发套件(SDK),提供极简易用的API,加速AI应用的开发。应用开发旨在使用华为提供的SDK和应用案例快速开发并部署人工智能应用,是基于现有模型、使用pyACL提供的Python语言API库开发深度神经网络应用,用于实现目标识别、图像分类等功能。图2-1 MindX SDK总体结构通过MindStudio实现SDK应用开发分为基础开发与深入开发,通常情况下用户关注基础开发即可,基础开发主要包含如何通过现有的插件构建业务流并实现业务数据对接,采用模块化的设计理念,将业务流程中的各个功能单元封装成独立的插件,通过插件的串接快速构建推理业务。mxManufacture & mxVision关键特性:配置文件快速构建AI推理业务。插件化开发模式,将整个推理流程“插件化”,每个插件提供一种功能,通过组装不同的插件,灵活适配推理业务流程。提供丰富的插件库,用户可根据业务需求组合Jpeg解码、抠图、缩放、模型推理、数据序列化等插件。基于Ascend Computing Language(ACL),提供常用功能的高级API,如模型推理、解码、预处理等,简化Ascend芯片应用开发。支持自定义插件开发,用户可快速地将自己的业务逻辑封装成插件,打造自己的应用插件。MindX SDK安装步骤1 Windows场景下基于MindStuido的SDK应用开发,请先确保远端环境上MindX SDK软件包已安装完成,安装方式请参见《mxManufacture 用户指南》 和《mxVision 用户指南》 的“使用命令行方式开发”>“安装MindX SDK开发套件”章节。步骤2 在Windows本地进入工程创建页面,工具栏点击File > Settings > Appearance & Behavior > System Settings > MindX SDK进入MindX SDK管理界面。界面中MindX SDK Location为软件包的默认安装路径,默认安装路径为“C:\Users\用户名\Ascend\mindx_sdk”。单击Install SDK进入Installation settings界面,如图2-2。图2-2 MindX SDK管理界面如图2-3所示,为MindX SDK的安装界面,各参数选择如下:Remote Connection:远程连接的用户及IP。Remote CANN Location:远端环境上CANN开发套件包的路径,请配置到版本号一级。Remote SDK Location:远端环境上SDK的路径,请配置到版本号一级。IDE将同步该层级下的include、opensource、python、samples文件夹到本地Windows环境,层级选择错误将导致安装失败。Local SDK Location:同步远端环境上SDK文件夹到本地的路径。默认安装路径为“C:\Users\用户名\Ascend\mindx_sdk”。图2-3 MindX SDK安装界面图2-4 安装完成后的MindX SDK管理界面步骤3 单击OK结束,返回SDK管理界面,可查看安装后的SDK的信息,如图2-4所示,可单击OK结束安装流程。可视化流程编排介绍SDK基础概念通过stream(业务流)配置文件,Stream manager(业务流管理模块)可识别需要构建的element(功能元件)以及element之间的连接关系,并启动业务流程。Stream manager对外提供接口,用于向stream发送数据和获取结果,帮助用户实现业务对接。Plugin(功能插件)表示业务流程中的基础模块,通过element的串接构建成一个stream。Buffer(插件缓存)用于内部挂载解码前后的视频、图像数据,是element之间传递的数据结构,同时也允许用户挂载Metadata(插件元数据),用于存放结构化数据(如目标检测结果)或过程数据(如缩放后的图像)。图3-1 SDK业务流程相关基础单元可视化流程编排MindX SDK实现功能的最小粒度是插件,每一个插件实现特定的功能,如图片解码、图片缩放等。流程编排是将这些插件按照合理的顺序编排,实现负责的功能。可视化流程编排是以可视化的方式,开发数据流图,生成pipeline文件供应用框架使用。图 4-2 为推理业务流Stream配置文件pipeline样例。配置文件以json格式编写,用户必须指定业务流名称、元件名称和插件名称,并根据需要,补充元件属性和下游元件名称信息。步骤1 进入工程创建页面,用户可通过以下方式开始流程编排。在顶部菜单栏中选择Ascend>MindX SDK Pipeline,打开空白的pipeline绘制界面绘制,也可打开用户自行绘制好的pipeline文件,如图3-3。绘制界面分为左侧插件库、中间编辑区、右侧插件属性展示区,具体参考pipeline绘制 。步骤2 在左侧编辑框选择插件,拖动至中间编辑框,按照用户的业务流程进行连接。如果拖动错误插件或者错误连线,选中错误插件或者错误连线单击键盘Del键删除。用户自定义的流水线绘制完成后,选中流水线中的所有插件,右键选择Set Stream Name设置Stream名称,如果有多条流水线则需要对每一条流水线设置Stream名称。绘制完成单击Save保存。图3-2 Detection and Classification配置pipeline样例图3-3 pipeline绘制界面SE-Resnet50介绍残差神经网络是何凯明提出的网络.在深度学习中,网络越深往往取得的效果越好,但是设计的网络过深后若干不为零的梯度相乘导致了梯度消失的现象影响了训练,在残差神经网络中借助其残差结构可以有效的避免梯度消失的问题,在imagenet数据集上取得了优异的结果.SE-Resnet50网络结构,如图4-1所示:图4-1 SE-Resnet50网络结构开发过程创建工程步骤一:安装完成后,点击 ”New Project” 创建新的项目,进入创建工程界面。选择Ascend App项目类别,然后就是常规的命名和路径修改,在CANN Version处点击change配置远程连接和远程CANN地址。图5-1-1 创建项目步骤二:点击CANN Version的Change后进入下界面进行相关配置,点击远程连接配置的最右侧添加按钮。图5-1-2 远程连接配置步骤三:在定义SSH 配置、保存远程服务器的连接配置后返回Remote CANN Setting界面,继续配置CANN location。加载完后再点击Finish即可完成远程环境配置。图5-1-3 配置CANN location 步骤四:完成远程连接设置后,点击next会进到模板选择界面,由于我们是推理任务,此时我们选择MindX SDK Project(Python),再点击Finish。MindX SDK(昇腾行业SDK),提供面向不同行业使能的开发套件,简化了使用昇腾芯片推理业务开发的过程。SDK提供了以昇腾硬件功能为基础的功能插件,用户可以通过拼接功能插件,快速构建推理业务,也可以开发自定义功能插件。图5-1-4 MindX SDK Project(Python)代码开发代码地址:cid:link_2SDK相关工程目录结构:代码介绍:acc.py:求精度代码,在得到sdk推理结果之后会运行acc.py来求精度,具体使用会在本章节运行测试部分详细展示.data_to_bin.py:数据预处理代码,会将数据集中图片转换为二进制形式保存在路径中,具体使用会在本章节数据准备部分详细展示infer.py:里面包含了Sdk_Api这个类,其中主要使用到的函数为图5-2-1 将cv形式输入转换为sdk输入图5-2-2 得到输出结果config.py:已经写好的配置文件,运行时不需要改动Se_resnet50_ms_test.pipeline:pipeline配置文件,运行时需要修改其中的om文件路径,具体会在运行测试部分详细说明.main.py:推理时所运行的文件,会将所有经过预处理之后的二进制文件通过图5-2-1、5-2-2所示函数,得到推理结果.数据准备及模型准备数据集使用的是imagenet,在infer/sdk/目录下先创建一个文件夹“./dataset”,将910上经过数据预处理的图片保存为二进制放入,具体操作如下:在910服务器上执行文件data_to_bin.py图5-3-1 data_to_bin.py配置参数在文件中将数据集路径如图5-3-1所示改为实际路径之后,运行python data_to_bin.py.运行之后./dataset中会生成images与target两个文件夹,里面分别为图片经过预处理之后保存的二进制文件以及每个图片对应的lebel.图5-3-2 生成的images与target的二进制文件在准备好二进制文件后在910上导出onnx模型文件,保存到infer/sdk目录下。具体操作如下:按照图5-3-3所示位置修改pth路径信息,之后运行python pthtar2onnx.py图5-3-3修改pth路径信息图5-3-4 生成onnx文件运行之后会生成图5-3-4所示onnx文件.模型转换功能介绍用户使用torch框架训练好的第三方模型,在导出onnx模型后,可通过ATC工具将其转换为昇腾AI处理器支持的离线模型(*.om文件),模型转换过程中可以实现算子调度的优化、权重数据重排、内存使用优化等,可以脱离设备完成模型的预处理,详细架构如图5-4-1所示。图5-4-1 ATC工具功能架构在本项目中,要将pytorch框架下训练好的模型(*.onnx文件),转换为昇腾AI处理器支持的离线模型(*.om文件),具体步骤如下:步骤1 点击Ascend > Model Converter,进入模型转换界面,参数配置如图5-4-2所示,若没有CANN Machine,请参见第六章第一节CANN安装。图5-4-2 模型转换界面1各参数解释如下表所示:CANN MachineCANN的远程服务器Model File*.onnx文件的路径(可以在本地,也可以在服务器上)Model Name生成的om模型名字Output Path生成的om模型保存在本地的路径步骤2 点击Next进入图5-4-3界面,该项目数据不需要预处理,直接点击Next,进入图5-4-4界面,再点击Finish开始模型转换。图5-4-3 模型转换界面2图5-4-4 模型转换界面3步骤3 等待出现如图5-4-5所示的提示,模型转换成功图5-4-5模型转换成功运行测试步骤1 修改“sdk/config/SE-resnet50.pipeline”中的参数,具体操作如图5-5-1所示;图5-5-1 修改pipeline中*.om文件路径步骤2 在MindStudio工程界面,依次选择“Run > Edit Configurations...”,进入运行配置页面。选择“Ascend App > 工程名”配置应用工程运行参数,图5-5-2为配置示例。配置完成后,单击“Apply”保存运行配置,单击“OK”,关闭运行配置窗口。图5-5-2 工程推理工程运行参数配置在本工程中,推理时运行文件选择main.py,运行参数为--img_path [LR_path] --dataset_name images --pipeline_path [pipeline_path] python3 main.py --img_path "/home/data/xd_mindx/csl/val/" --dataset_name images --pipeline_path "/home/data/xd_mindx/csl/infer/sdk/config/SE-resnet50_test.pipeline"参数解释如下表:参数解释我的设置img_path推理图片路径./val/images/pipeline_pathPipeline文件路径./config/Se_resnet50_ms_test.pipelineinfer_result_dir推理结果保存路径./infer_result/images/images/步骤3 点击运行,出现如图5-5-3所示提示,即为运行成功,infer_result文件夹中即为推理结果,保存为二进制形式。图5-5-3推理操作过程步骤4 配置后处理运行程序,在MindStudio工程界面,依次选择“Run > Edit Configurations...”,进入运行配置页面,如图5-5-4所示,点击“+”,后选择Python(后处理可以直接在本地运行),如图5-5-5所示。图5-5-4运行配置界面图5-5-5 运行后处理相关配置Script path运行文件路径Parameters运行时的参数如图5-5-5所示,运行文件为acc.py:步骤5 点击运行,出现如图5-5-6所示提示,即为运行成功。图5-5-6 运行后处理程序步骤6 结果分析,如图5-5-6所示,已经达到了标准精度。 遇见的问题在使用MindStudio时,遇到问题,可以登陆MindStudio昇腾论坛进行互动,提出问题,会有专家老师为你解答。模型转换时,没有CANN Machine图6-1 CANN管理界面解决方案:按以下步骤,重新安装CANN Machine步骤1 点击File>Settings>Appearance & Behavior > System Settings > CANN,进入CANN管理界面,如图6-1所示:步骤2 点击Change CANN,进入Remote CANN Setting界面,如图6-2所示重新安装CANN,点击Finish,安装CANN。6-2 Remote CANN Setting界面图6-3 安装CANN完成参数解释如下表:Remote Connection远程服务器IPRemote CANN location远程服务器中CANN路径步骤3 完成CANN安装,点击OK,重启MindStudio,如图6-3所示。MindStudio导入应用工程后,提示“No Python interpreter configured for the module”解决方案:步骤1 在顶部菜单栏中选择File > Project Structure,在Project Structure窗口中,点击Platform Settings > SDKs,点击上方的“+”添加Python SDK,从本地环境中导入Python,如图6-4所示。图6-4 导入Python SDK步骤2 点击Project Settings > Project,选择上一步添加的Python SDK,如图6-5所示。图6-5 设置Project SDK步骤3 点击Project Settings > Modules,选中“MyApp”,点击“+”后选择Python,为Python Interpreter选择上述添加的Python SDK。点击OK完成应用工程Python SDK配置,如图6-6所示。图6-6 选择Python SDK
  • [API使用] CPU架构训练出了.mindir模型,并且生成了.cpkt文件,如何在CPU架构下直接进行推理使用呢?
    https://www.mindspore.cn/news/newschildren?id=354在进行如上链接中的实验时,有两个问题想要求助一下1.生成好的训练模型.mindir文件直接在CPU上如何使用?链接中给的是转换为.ms文件在Android上使用,想请问在win10系统CPU架构下可否直接使用呢?有相关使用教程吗?2.这个实验中模型训练后仅可以进行两种类型分类,修改哪个脚本可以增加分类类型呢?
  • [问题求助] transformer中matmul算子
    现在我在尝试转transformer模型,其中涉及到一个matmul(onnx中)算子,输入为400*19*128 & 128*128. 使用mindstudio转模型时,提示a(400)与b(128)必须相等,该算子转换失败。 想请问一下各位大佬,有没有什么好办法解决/避开这个问题。 貌似om中的matmul无法进行广播机制
  • [MindX SDK] 安全帽识别 HelmetIdentification
    在mind-SDK的应用案例,安全帽识别中,其需要的mxVersion版本是2.0.4,我下载的版本是3.0.RC2。其脚本main-env.sh中设置了环境变量export ${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:${install_path}/acllib/lib64:/usr/local/Ascend/driver/lib64:${MX_SDK_HOME}/include:${MX_SDK_HOME}/python其中有一个目录是 ${MX_SDK_HOME}/opensource/lib64,但下载的mxVersion中,opensource中并没有lib64这个目录。想问问是什么原因呢?
  • [功能调试] 数据集路径传入错误:有关wgan模型使用lsun数据集训练的问题
    1. 系统环境硬件环境(Ascend/GPU/CPU): Ascend软件环境:– MindSpore 版本: 1.8.0执行模式:动态图(PYNATIVE_MODE) – Python 版本: 3.7.6– 操作系统平台: linux2. 报错信息2.1 问题描述开启脚本处理成功后,输出文件内没有任何ckpt文件生成,执行时间也很快,只有几秒钟2.2 报错信息2.3 脚本代码python data.py export ../bridge_train_lmdb --out_dir /cache/data/bridge --flat python train.py --dataset lsun --dataroot /cache/data/bridge/ --noBN 03. 根因分析数据集需要指定bedroom等数据集的上一级,例如我解压到/cache/data/bedroom,需要指定/cache/data,不能指定/cache/data/bedroom,数据集路径传错了4. 解决方案修改启动脚本的命令python train.py --dataset lsun --dataroot /cache/data/ --noBN 0
  • [功能调试] 问题报错:num_workers 设置成2以上时,会不断创建新的python进程
    1.系统环境硬件环境(Ascend/GPU/CPU): Ascend软件环境:– MindSpore 版本: 1.8.0执行模式:动态图(GRAPH_MODE) – Python 版本: 3.7.6– 操作系统平台: linux2. 报错信息2.1 问题描述num_workers 设置成8的时候, 会随着Epoch的增加而增加python进程,比如一个Epoch是70分钟,那么就是每70分钟又新增好多python进程,之前的进程也没有关闭,这样导致不断增加内存消耗,跑到中途就会把内存撑爆。以下是4卡时的情况(无论几卡都一样)2.2 报错信息内存爆炸2.3 脚本代码# Copyright 2022 Huawei Technologies Co., Ltd # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================ import os import time import mindspore import mindspore.nn as nn from mindspore import save_checkpoint, context, load_checkpoint, load_param_into_net from mindspore.communication.management import init, get_rank from mindspore.context import ParallelMode from mindspore.nn.dynamic_lr import piecewise_constant_lr from trainonestepgen import TrainOnestepGen from src.datasets.dataset import RBPNDataset, create_train_dataset from src.loss.generatorloss import GeneratorLoss from src.model.rbpn import Net as RBPN from src.util.config import get_args from src.util.utils import save_losses, init_weights args = get_args() mindspore.set_seed(args.seed) epoch_loss = [] best_avgpsnr = 0 eval_mean_psnr = [] save_loss_path = 'results/genloss/' if not os.path.exists(save_loss_path): os.makedirs(save_loss_path) def train(trainoneStep, trainds): """train the generator Args: trainoneStep(Cell): the network of trainds(dataset): train datasets """ trainoneStep.set_train() trainoneStep.set_grad() steps = trainds.get_dataset_size() for epoch in range(args.start_iter, args.nEpochs + 1): e_loss = 0 t0 = time.time() for iteration, batch in enumerate(trainds.create_dict_iterator(), 1): x = batch['input_image'] target = batch['target_image'] neighbor_tensor = batch['neighbor_image'] flow_tensor = batch['flow_image'] loss = trainoneStep(target, x, neighbor_tensor, flow_tensor) e_loss += loss.asnumpy() print('Epoch[{}]({}/{}): loss: {:.4f}'.format(epoch, iteration, steps, loss.asnumpy())) t1 = time.time() mean = e_loss / steps epoch_loss.append(mean) print("Epoch {} Complete: Avg. Loss: {:.4f}|| Time: {} min {}s.".format(epoch, mean, int((t1 - t0) / 60), int(int(t1 - t0) % 60))) save_ckpt = os.path.join(args.save_folder, '{}_{}.ckpt'.format(epoch, args.model_type)) save_checkpoint(trainoneStep.network, save_ckpt) name = os.path.join(save_loss_path, args.valDataset + '_' + args.model_type) save_losses(epoch_loss, None, name) if __name__ == '__main__': # distribute # parallel environment setting context.set_context(mode=context.GRAPH_MODE, device_target=args.device_target) if args.run_distribute: print("distribute") device_id = int(os.getenv("DEVICE_ID")) device_num = args.device_num context.set_context(device_id=device_id) init() context.reset_auto_parallel_context() context.set_auto_parallel_context(parallel_mode=ParallelMode.DATA_PARALLEL, gradients_mean=True, device_num=device_num) rank = get_rank() else: device_id = args.device_id context.set_context(device_id=device_id) # get dataset train_dataset = RBPNDataset(args.data_dir, args.nFrames, args.upscale_factor, args.data_augmentation, args.file_list, args.other_dataset, args.patch_size, args.future_frame) train_ds = create_train_dataset(train_dataset, args) train_loader = train_ds.create_dict_iterator() train_steps = train_ds.get_dataset_size() print('===>Building model ', args.model_type) model = RBPN(num_channels=3, base_filter=256, feat=64, num_stages=3, n_resblock=5, nFrames=args.nFrames, scale_factor=args.upscale_factor) init_weights(model, 'KaimingNormal', 0.02) print('====>start training') if args.pretrained: ckpt = os.path.join(args.save_folder, args.pretrained_sr) print('=====> load params into generator') params = load_checkpoint(ckpt) load_param_into_net(model, params) print('=====> finish load generator') lossNetwork = GeneratorLoss(model) milestone = [int(args.nEpochs / 2) * train_steps, args.nEpochs * train_steps] learning_rates = [args.lr, args.lr / 10.0] lr = piecewise_constant_lr(milestone, learning_rates) optimizer = nn.Adam(model.trainable_params(), lr, loss_scale=args.sens) trainonestepNet = TrainOnestepGen(lossNetwork, optimizer, sens=args.sens) train(trainonestepNet, train_ds) print(train_dataset)3. 根因分析关于train_loader=train_ds.create_dict_iterator()这个函数的创建我认为是: 1、直接在 for epoch in range():的循环里创建迭代器是可以使用的,但是num_parallel_workers要设置成1,不然会发生不断创建python进程的情况。 2、在for epoch in range():循环外面 生成迭代器加载数据集(一般都是这样),for循环调用train_loader即可, num_parallel_workers可以设置>=2。4. 解决方案按照官网上的标准流程修改代码 cid:link_0修改后可正常运行。
  • [功能调试] 报错:YOLOv3_darknet53图片解码失败:[Decode] failed. Decode: image decode failed
    1. 系统环境硬件环境(Ascend/GPU/CPU): modelart软件环境:– MindSpore 版本: 1.5.1执行模式:动态图(PYNATIVE_MODE) – Python 版本: 3.7.6– 操作系统平台: linux2. 问题描述2.1 问题描述YOLOv3_darknet53图片解码失败2.2 报错信息2.3 脚本代码# Copyright 2020-2022 Huawei Technologies Co., Ltd # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================ """YoloV3 train.""" import os import time import datetime import mindspore as ms import mindspore.nn as nn import mindspore.communication as comm from src.yolo import YOLOV3DarkNet53, YoloWithLossCell from src.logger import get_logger from src.util import AverageMeter, get_param_groups, cpu_affinity from src.lr_scheduler import get_lr from src.yolo_dataset import create_yolo_dataset from src.initializer import default_recurisive_init, load_yolov3_params from src.util import keep_loss_fp32 from model_utils.config import config # only useful for huawei cloud modelarts. from model_utils.moxing_adapter import moxing_wrapper, modelarts_pre_process ms.set_seed(1) def conver_training_shape(args): training_shape = [int(args.training_shape), int(args.training_shape)] return training_shape def set_graph_kernel_context(): if ms.get_context("device_target") == "GPU": ms.set_context(enable_graph_kernel=True) ms.set_context(graph_kernel_flags="--enable_parallel_fusion " "--enable_trans_op_optimize " "--disable_cluster_ops=ReduceMax,Reshape " "--enable_expand_ops=Conv2D") def network_init(args): device_id = int(os.getenv('DEVICE_ID', '0')) ms.set_context(mode=ms.GRAPH_MODE, device_target=args.device_target, save_graphs=False, device_id=device_id) set_graph_kernel_context() # Set mempool block size for improving memory utilization, which will not take effect in GRAPH_MODE if ms.get_context("mode") == ms.PYNATIVE_MODE: ms.set_context(mempool_block_size="31GB") # Since the default max memory pool available size on ascend is 30GB, # which does not meet the requirements and needs to be adjusted larger. if ms.get_context("device_target") == "Ascend": ms.set_context(max_device_memory="31GB") profiler = None if args.need_profiler: profiling_dir = os.path.join("profiling", datetime.datetime.now().strftime('%Y-%m-%d_time_%H_%M_%S')) profiler = ms.profiler.Profiler(output_path=profiling_dir) # init distributed if args.is_distributed: comm.init() args.rank = comm.get_rank() args.group_size = comm.get_group_size() if args.device_target == "GPU" and args.bind_cpu: cpu_affinity(args.rank, min(args.group_size, args.device_num)) # select for master rank save ckpt or all rank save, compatible for model parallel args.rank_save_ckpt_flag = 0 if args.is_save_on_master: if args.rank == 0: args.rank_save_ckpt_flag = 1 else: args.rank_save_ckpt_flag = 1 # logger args.outputs_dir = os.path.join(args.ckpt_path, datetime.datetime.now().strftime('%Y-%m-%d_time_%H_%M_%S')) args.logger = get_logger(args.outputs_dir, args.rank) args.logger.save_args(args) return profiler def parallel_init(args): ms.reset_auto_parallel_context() parallel_mode = ms.ParallelMode.STAND_ALONE degree = 1 if args.is_distributed: parallel_mode = ms.ParallelMode.DATA_PARALLEL degree = comm.get_group_size() ms.set_auto_parallel_context(parallel_mode=parallel_mode, gradients_mean=True, device_num=degree) @moxing_wrapper(pre_process=modelarts_pre_process) def run_train(): """Train function.""" if config.lr_scheduler == 'cosine_annealing' and config.max_epoch > config.T_max: config.T_max = config.max_epoch config.lr_epochs = list(map(int, config.lr_epochs.split(','))) config.data_root = os.path.join(config.data_dir, 'train2014') config.annFile = os.path.join(config.data_dir, 'annotations/instances_train2014.json') profiler = network_init(config) loss_meter = AverageMeter('loss') parallel_init(config) network = YOLOV3DarkNet53(is_training=True) # default is kaiming-normal default_recurisive_init(network) load_yolov3_params(config, network) network = YoloWithLossCell(network) config.logger.info('finish get network') if config.training_shape: config.multi_scale = [conver_training_shape(config)] ds = create_yolo_dataset(image_dir=config.data_root, anno_path=config.annFile, is_training=True, batch_size=config.per_batch_size, device_num=config.group_size, rank=config.rank, config=config) config.logger.info('Finish loading dataset') config.steps_per_epoch = ds.get_dataset_size() lr = get_lr(config) opt = nn.Momentum(params=get_param_groups(network), momentum=config.momentum, learning_rate=ms.Tensor(lr), weight_decay=config.weight_decay, loss_scale=config.loss_scale) is_gpu = ms.get_context("device_target") == "GPU" if is_gpu: loss_scale_value = 1.0 loss_scale = ms.FixedLossScaleManager(loss_scale_value, drop_overflow_update=False) network = ms.build_train_network(network, optimizer=opt, loss_scale_manager=loss_scale, level="O2", keep_batchnorm_fp32=False) keep_loss_fp32(network) else: network = nn.TrainOneStepCell(network, opt, sens=config.loss_scale) network.set_train() t_end = time.time() data_loader = ds.create_dict_iterator(output_numpy=True) first_step = True stop_profiler = False for epoch_idx in range(config.max_epoch): for step_idx, data in enumerate(data_loader): images = data["image"] input_shape = images.shape[2:4] config.logger.info('iter[{}], shape{}'.format(step_idx, input_shape[0])) images = ms.Tensor.from_numpy(images) batch_y_true_0 = ms.Tensor.from_numpy(data['bbox1']) batch_y_true_1 = ms.Tensor.from_numpy(data['bbox2']) batch_y_true_2 = ms.Tensor.from_numpy(data['bbox3']) batch_gt_box0 = ms.Tensor.from_numpy(data['gt_box1']) batch_gt_box1 = ms.Tensor.from_numpy(data['gt_box2']) batch_gt_box2 = ms.Tensor.from_numpy(data['gt_box3']) loss = network(images, batch_y_true_0, batch_y_true_1, batch_y_true_2, batch_gt_box0, batch_gt_box1, batch_gt_box2) loss_meter.update(loss.asnumpy()) # it is used for loss, performance output per config.log_interval steps. if (epoch_idx * config.steps_per_epoch + step_idx) % config.log_interval == 0: time_used = time.time() - t_end if first_step: fps = config.per_batch_size * config.group_size / time_used per_step_time = time_used * 1000 first_step = False else: fps = config.per_batch_size * config.log_interval * config.group_size / time_used per_step_time = time_used / config.log_interval * 1000 config.logger.info('epoch[{}], iter[{}], {}, fps:{:.2f} imgs/sec, ' 'lr:{}, per step time: {}ms'.format(epoch_idx + 1, step_idx + 1, loss_meter, fps, lr[step_idx], per_step_time)) t_end = time.time() loss_meter.reset() if config.need_profiler: if epoch_idx * config.steps_per_epoch + step_idx == 10: profiler.analyse() stop_profiler = True break if config.rank_save_ckpt_flag: ckpt_path = os.path.join(config.outputs_dir, 'ckpt_' + str(config.rank)) if not os.path.exists(ckpt_path): os.makedirs(ckpt_path, exist_ok=True) ckpt_name = os.path.join(ckpt_path, "yolov3_{}_{}.ckpt".format(epoch_idx + 1, config.steps_per_epoch)) ms.save_checkpoint(network, ckpt_name) if stop_profiler: break config.logger.info('==========end training===============') if __name__ == "__main__": run_train()3. 根因分析记录一下排查流程吧,用户使用了自有数据集,因此无法判断是代码异常还是数据集异常,先在相同的网络上跑coco公共数据集,发现不报错,排除代码问题,然后使用get_batch_size(),get_class_indexing(),get_col_names(),get_dataset_size(),get_repeat_count(),查看数据集是否争取加载,发现正确加载。排除图片问题。一次偶然的机会,偶然发现其实是数据集中描述图片标签的json文件损坏,某张图片未查找到,至此,问题排查结束。4. 解决方案重新换了一份json文件正确的数据集(非公开的)。5. 经验总结排查数据集问题,不止要注意对数据集目录结构、图像的问题排查,保存图像信息的json也很重要。
  • [问题求助] bearpi-hm-micro可以做外接摄像头模块吗
    请问各位大佬,bearpi-hm-micro可以做外接摄像头模块吗?可以后面搞深度学习吗?
  • [技术干货] 关于利用Ascend910 推理网络,NPU利用率为0的问题
    使用mindspore搭建了LeNet5网络,对Mnist数据集进行训练,在Modelarts平台上运行,使用公共资源池中的Ascend 910,在训练阶段可以看到NPU利用率在10%左右,但是在推理阶段NPU利用率始终为0,不知这种现象是否正常?对于NPU的利用是否存在单独的开关呢?还是说只要用mindspore搭建即可?
  • [执行问题] 训练到第23个epoch中止,无法正常运行
    报错内容RuntimeError: For 'GetNext', get data timeout. Queue name: 9d263f4a-46dc-11ed-b99c-0242ac110002 ---------------------------------------------------- - C++ Call Stack: (For framework developers) ---------------------------------------------------- mindspore/ccsrc/plugin/device/gpu/kernel/data/dataset_iterator_kernel.cc:135 ReadDevice看不出问题代码是哪部分,因为是dataset_iterator_kernel的问题,请问出错的地方是数据加载吗用官网的例子修改的函数如下def create_dataset(dataset_path, spilt, repeat_num=1, batch_size=32,num_classes=6):    """    Create a train or eval dataset.    Args:        dataset_path (str): The path of dataset.        spilt (str): Whether dataset is used for train or eval.        repeat_num (int): The repeat times of dataset. Default: 1.        batch_size (int): The batch size of dataset. Default: 32.    Returns:        Dataset.    """    if spilt == 'train':        dataset_path = os.path.join(dataset_path, 'train')        do_shuffle = True    elif spilt == 'val':        dataset_path = os.path.join(dataset_path, 'val')        do_shuffle = False    else:        dataset_path = os.path.join(dataset_path, 'test')        do_shuffle = False    if device_num == 1 :        ds = das.ImageFolderDataset(dataset_path,num_parallel_workers=8, shuffle=do_shuffle,decode=True,                                   class_indexing={'scab':0,'healthy':1,'frog_eye_leaf_spot':2,'rust':3,'complex':4,'powdery_mildew':5})    else:       ds = das.ImageFolderDataset(dataset_path,num_parallel_workers=8, shuffle=do_shuffle, num_shards=device_num, shard_id=device_id,decode=True,                                   class_indexing={'scab':0,'healthy':1,'frog_eye_leaf_spot':2,'rust':3,'complex':4,'powdery_mildew':5})    resize_height = 224    resize_width = 224    buffer_size = 100    rescale = 1.0 / 255.0    shift = 0.0    # define map operations    random_crop_op = C.RandomCrop((32, 32), (4, 4, 4, 4))    random_horizontal_flip_op = C.RandomHorizontalFlip(device_id / (device_id + 1))    resize_op = C.Resize((resize_height, resize_width))    rescale_op = C.Rescale(rescale, shift)    normalize_op = C.Normalize([0.4914, 0.4822, 0.4465], [0.2023, 0.1994, 0.2010])    change_swap_op = C.HWC2CHW()    trans = []    if spilt == 'train':        trans += [random_crop_op, random_horizontal_flip_op]    type_op = C2.TypeCast(mstype.float32)    trans += [resize_op, rescale_op, normalize_op, change_swap_op,type_op]    Onehot_op = C2.OneHot(num_classes)    type_cast_op = C2.TypeCast(mstype.int32)       ds = ds.map(operations=type_cast_op, input_columns="label", num_parallel_workers=8)    ds = ds.map(operations=trans, input_columns="image", num_parallel_workers=8)    # apply batch operations    ds = ds.batch(batch_size, drop_remainder=True)    # apply dataset repeat operation    ds = ds.repeat(repeat_num)    return ds
  • [推理] 5.1rc1环境使用5.0.2的镜像进行sdk推理,可以正常运行。5.0.4环境使用5.0.2的镜像进行sdk推理,报错507011
    5.1rc1环境使用5.0.2的镜像进行sdk推理,可以正常运行。5.0.4环境使用5.0.2的镜像进行sdk推理,报错507011ubuntu 18.04800-9000服务器(910A)cann:5.1rc1800-9000服务器(910B) cann:5.0.4sdk 5.0.2镜像版本 cann 5.0.2om直接在modelzoo上下载的,链接如下cid:link_0
  • [问题求助] modelarts上训练yolov4保存模型失败报错
    [mindspore/train/serialization.py:189] Failed to save the checkpoint file /cache/train/outputs/2022-09-16_time_10_09_50/ckpt_0/0-1_154.ckpt.
  • [执行问题] mindspore框架,MaskRCNN模型,gpu进行训练,损失出现nan值
    mindspore框架,MaskRCNN模型,gpu进行训练,损失出现nan值
  • [技术干货] ImageNet2012数据预处理
    作用使用代码实现一键式将ImageNet2012数据集解压、打标签介绍使用shell脚本对ImageNet2012数据集进行预处理,执行shell脚本便可以实现给ImageNet2012数据集的训练集、验证集解压和解决验证集没有标签的问题。使用的数据集:ImageNet2012数据集大小:共1000个类、224*224彩色图像训练集:共1,281,167张图像验证集:共50,000张图像数据集下载适用场景ImageNet2012ILSVRC2012_img_train.tar解压后还是tar包ILSVRC2012_img_val.tar解压后没有标签使用说明文件目录ILSVRC2012 ├── ILSVRC2012_img_val.tar ├── ILSVRC2012_img_train.tar ├── ImageNet2012Preprocess/ ├── train/ └── val/git 方法git clone cid:link_1.git bash ImageNet2012Preprocess/ImageNet2012Preprocess.sh下载zip包方法访问 cid:link_1 并下载zip包unzip ImageNet2012Preprocess-master.zip bash ImageNet2012Preprocess-master/ImageNet2012Preprocess.sh后台运行nohup bash ImageNet2012Preprocess/ImageNet2012Preprocess.sh &或者nohup bash ImageNet2012Preprocess-master/ImageNet2012Preprocess.sh &