昇思MindSpore进阶教程--开发常见问题
大家好,我是刘明,明志科技创始人,华为昇思MindSpore布道师。
技术上主攻前端开发、鸿蒙开发和AI算法研究。
努力为大家带来持续的技术分享,如果你也喜欢我的文章,就点个关注吧
MindSpore官网提供了一份在使用MindSpore过程中的 FAQ ,本章也整理了一下在迁移文档中提及的常见问题及解决方法。
环境准备
Q: 如何搭建MindSpore环境?
A: MindSpore目前支持在昇腾、GPU、CPU等多种设备上运行,但在安装过程中需要注意选择配套的硬件平台、操作系统、Python版本,否则会出现很多不可预测的报错。详细可参考 安装指导 。
更多环境准备常见问题请参考 环境准备常见问题分析 。
模型分析与准备
Q: 如何查看MindSpore对迁移代码中的API支持程度?
A: 可以使用API自动扫描工具MindSpore Dev Toolkit(推荐),或手动查询API映射表进行分析。详细可参考 分析API满足度 。
数据处理
Q: 怎么将PyTorch的dataset转换成MindSpore的dataset?
A: MindSpore和PyTorch的自定义数据集逻辑是比较类似的,首先需要用户先定义一个自己的 dataset 类,该类负责定义 init 、 getitem 、 len 来读取自己的数据集,然后将该类实例化为一个对象(如: dataset/dataset_generator ),最后将这个实例化对象传入 GeneratorDataset (mindspore用法)/ DataLoader (pytorch用法),至此即可以完成自定义数据集加载了。
而MindSpore在 GeneratorDataset 的基础上提供了进一步的 map -> batch 操作,可以很方便地让用户在 map 内添加一些其他的自定义操作,并将其 batch 起来。
对应的MindSpore的自定义数据集加载如下:
# 1 Data enhancement,shuffle,sampler.
class Mydata:def __init__(self):np.random.seed(58)self.__data = np.random.sample((5, 2))self.__label = np.random.sample((5, 1))def __getitem__(self, index):return (self.__data[index], self.__label[index])def __len__(self):return len(self.__data)
dataset_generator = Mydata()
dataset = ds.GeneratorDataset(dataset_generator, ["data", "label"], shuffle=False)
# 2 Customized data enhancement
dataset = dataset.map(operations=pyFunc, {other_params})
# 3 batch
dataset = dataset.batch(batch_size, drop_remainder=True)
Q: 为什么在迭代数据的时候会报错:“The actual amount of data read from generator xx is different from generator.len xx, you should adjust generator.len to make them match” ?
A: 在定义可随机访问数据集时, len 方法返回的结果一定要是真实的数据集大小,设置大了在 getitem 取值时会有越界问题。如数据集大小未确定,可以使用可迭代数据集,详见 自定义数据集 。
Q: 为什么在迭代数据的时候会报错:“Invalid Python function, the ‘source’ of ‘GeneratorDataset’ should return same number of NumPy arrays as specified in column_names, the size of column_names is:xx and number of returned NumPy array is:xx” ?
A: 这是因为GeneratorDataset的 column_names 参数指定的列名数量与 source 参数输出的数据数量不匹配。
Q: 使用 GeneratorDataset 或 map 进行加载/处理数据时,可能会因为语法错误、计算溢出等问题导致数据报错,如何进行排查和调试?
A: 观察报错栈信息,由报错栈信息大概定位到出错代码块,在出错的代码块附近添加打印或调试点,进一步调试。详细可参考 数据处理调试方法一 。
Q: 数据增强 map 操作出错,如何调试 map 操作中各个数据处理算子?
A: 可以通过单个算子执行的方式调试或者通过数据管道调试模式调试 map 操作。
Q: 在训练的时候,会获得非常多warning提示我们数据集性能较慢应该怎么处理?
A: 可以单独迭代数据集,查看每条数据的处理时间,以此判断数据集的性能如何。详细可参考 数据处理调试方法三 。
Q: 在对数据进行处理的过程中,如果因为计算错误、数值溢出等因素,产生了异常的结果数值,从而导致训练网络时算子计算溢出、权重更新异常等问题该怎么排查?
A: 关闭混洗,固定随机种子,确保可重现性,然后利用NumPy等工具快速校验结果。详细可参考 数据处理调试方法四 。
更多数据处理常见问题请参考 数据处理常见问题分析 以及迁移中的数据处理差异请参考 MindSpore和PyTorch的数据处理差异 。
梯度求导
Q: 如何自己实现算子的反向计算?
A: MindSpore提供了自动的梯度求导接口,该功能对用户屏蔽了大量的求导细节和过程。但如果有某些特殊场景,用户需要手动控制其反向的计算,用户也可以通过Cell.bprop接口对其反向进行定义。详细可参考 自定义Cell反向 。
Q: 如何处理梯度溢出造成训练不稳定的问题?
A: 网络溢出一般表现为loss Nan/INF,loss突然变得很大等。MindSpore提供 dump数据 获取到溢出算子信息。当网络中出现梯度下溢时,可使用loss scale配套梯度求导使用,详细可参考 loss scale ;当网络出现梯度爆炸时,可考虑添加梯度裁剪,详细可参考 梯度裁剪 。
调试调优
Q: 请问想加载PyTorch预训练好的模型用于MindSpore模型finetune有什么方法?
A: 需要把PyTorch和MindSpore的参数进行一一对应,因为网络定义的灵活性,所以没办法提供统一的转化脚本。
一般情况下,CheckPoint文件中保存的就是参数名和参数值,调用相应框架的读取接口后,获取到参数名和数值后,按照MindSpore格式,构建出对象,就可以直接调用MindSpore接口保存成MindSpore格式的CheckPoint文件了。
其中主要的工作量为对比不同框架间的parameter名称,做到两个框架的网络中所有parameter name一一对应(可以使用一个map进行映射),下面代码的逻辑转化parameter格式,不包括对应parameter name。
import torch
import mindspore as msdef pytorch2mindspore(default_file = 'torch_resnet.pth'):# read pth filepar_dict = torch.load(default_file)['state_dict']params_list = []for name in par_dict:param_dict = {}parameter = par_dict[name]param_dict['name'] = nameparam_dict['data'] = ms.Tensor(parameter.numpy())params_list.append(param_dict)ms.save_checkpoint(params_list, 'ms_resnet.ckpt')
Q: loss不收敛或精度不达标,该怎么定位?
A: 精度不达标一般体现在loss不收敛上。但是有很多复杂的原因可导致精度达不到预期,定位难度较大。这里提供几个指导链接供用户逐一排查问题。
Q: 模型训练过程中,第一个step耗时很长,该怎么优化?
A: 模型训练过程中,第一个step包含网络编译时长,如果想要优化第一个step的性能,可分析模型编译是否能进行优化。详细可参考 静态图网络编译性能优化 。
Q: 模型训练过程中,非首个step耗时很长,该怎么优化?
A: 模型训练过程中,非首个step的耗时包括迭代间隙、前反向计算和迭代拖尾,如果想要优化非首step的性能,需要先获取网络的迭代轨迹,再分析哪部分是性能瓶颈,最近进行性能优化。
详细可参考 性能调优指南 ;和 性能调试案例 。
Q: 加载标杆权重进行模型推理验证正向流程时,有warning警告显示权重未加载成功,该如何解决?
A: load_checkpoint过程中,如果有权重未加载上,MindSpore会给出warning提示,一般加载失败有两种原因:1、权重名称对不上;2、权重在网络中缺失。
如果权重名称对不上,需要打印MindSpore的权重名称和标杆的权重名称,看是否MindSpore的权重名称多了backbone或network等前缀,如果是,检查MindSpore在初始化 Cell 时是否加上auto_prefix=False。
如果权重名称缺失,需要分析是否合理,如果合理,可忽略告警提示,如果不合理,需要分析网络定义是否错误,进行定位修改。
Q: 迁移过程使用PyNative进行调测,流程成功,切换成Graph模式,为什么会出现一堆的报错?
A: PyNative模式下模型进行推理的行为与一般Python代码无异。但是切换成Graph模式时,MindSpore通过源码转换的方式,将Python的源码转换成中间表达IR(Intermediate Representation),并在此基础上对IR图进行优化,最终在硬件设备上执行优化后的图。
而这一步操作中MindSpore目前还未能支持完整的Python语法全集,所以construct函数的编写会存在部分限制。
如:PyNative模式下可直接判断某个Tensor值是否为0,但切换成Graph模式则会报错不支持。
if response == 0:return loss
return loss/response
遇到类似情况,可将代码修改为:
response_gt = max(response, ms.Tensor(1))
loss = loss/response_gt
return loss相关文章:
昇思MindSpore进阶教程--开发常见问题
大家好,我是刘明,明志科技创始人,华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享,如果你也喜欢我的文章,就点个关注吧 MindSpore官网提供了一份在使用MindSpore…...
【Linux】Linux进程地址空间
1.程序地址空间分配回顾 在前⾯C语⾔以及C部分介绍过⼆者的内存分配如下图所示: 全局变量区和未初始化全局变量区也被称为数据区,数据区中除了有全局变 量,还有静态变量和常量 使⽤下⾯的代码演示不同的内容所处的地址: #includ…...
创建包含可导入浏览器信任的SSL自签名证书
问题:现在的三大浏览器,chrome、edge、firefox 一般都默认启用https检查,这就要求我们自建的局域网内的网址和其他诸如nextcloud、photoprism、tiddlywiki等应用也必须要有证书。解决方法是使用openssl自己生成一个。由此则会再衍生出一个问题…...
[Windows] 很火的开源桌面美化工具 Seelen UI v2.0.2
最近,一款来自Github的开源桌面美化工具突然在网上火了起来,引发了大家的关注,不少小伙伴纷纷开始折腾了起来。而折腾的目的,无非是为了一点点乐趣而已,至于结果如何,并不是最要紧的,反倒是体验…...
华帝携手抖音头部达人,金牌导演李力持量身打造厨电定制微短剧
10月21日,由华帝独家冠名,金牌导演李力持执导,抖音头部达人逆袭丁姐领衔主演,ATV亚洲电视、知行易达、抖音商城联合出品的24集现代家庭治愈美食定制微短剧《女厨神》上线抖音。 该剧讲述了热爱生活和美食的丁姐,为了家…...
监控易监测对象及指标之:JBoss 7.1.x中间件监控
监控易是一款功能全面的监控软件,能够实时追踪和分析各类IT资源的性能数据,提供及时的故障预警和性能报告。本文将对监控易针对JBoss 7.1.x中间件的监控指标进行深入解读,以帮助用户更好地理解和应用这些数据。 JBoss 7.1.x作为一款广泛使用的…...
Java 模拟退火算法
模拟退火算法(Simulated Annealing, SA)是一种用于全局优化的启发式搜索算法,它模仿了物理学中金属退火的过程。该算法在搜索空间中逐步降低“温度”,以寻找全局最优解。下面是一个用Java实现模拟退火算法的简单示例。 假设我们要…...
LeetCode[中等] 80. 删除有序数组中的重复项 II
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 public cl…...
机器学习5
1.1 决策树的定义 决策树是用于分类和回归的机器学习算法。它通过一系列的“是或否”的决策来分类数据。每个决策是基于数据的某个属性进行的,如“色泽是青绿吗?”。决策树的核心是通过树状结构,将一个复杂的问题逐步拆解为多个简单的二元问…...
【Python技术】利用akshare定时获取股票实时价,低于5日线钉钉通知报警
今天看了下大盘,临时有个想法,我想知道某个股票回踩5日线的价格,如果实时价格低于5日线通过钉钉报警通知我。 说干就干,临时撸了下简单的代码,仅做演示。 1、计算5日线思路 很多券商软件的MA5价格是近5个交易日收盘…...
LINUX1.2
1.一切都是一个文件 (硬盘) 2.系统小型 轻量型,300个包 3.避免令人困惑的用户界面 ------------------> 就是没有复杂的图形界面 4.不在乎后缀名,有没有都无所谓,不是通过后缀名来定义文件的类型(win…...
Proximal Distance Algorithm (近段距离算法)
文章目录 第一篇\section*{近端距离算法(Proximal Distance Algorithm)详解}\subsection*{1. MM原理(Majorization-Minimization Principle)}\subsection*{2. 近端距离算法(Proximal Distance Algorithm)}\…...
如何判断一个数是几位数与这个数是否为回文数并打印出其逆序数
1 问题 判断一个数是几位数与这个数是否为回文数并打印出其逆序数。 2 方法 先输入一个少于五位数的数用int的方法打出这个数的个十百千万的数字再用条件语句else-if来判断这个数是几位数,并打印其逆序数最后判断这个数是否为回文数,打印其数 通过实验、…...
Solon 之 STOMP
一、STOMP 简介 如果直接使用 WebSocket 会非常累,就像用 Socket 编写 Web 应用。没有高层级的交互协议,就需要我们定义应用间所发消息的语义,还需要确保连接的两端都能遵循这些语义。 如 HTTP 在 TCP 套接字之上添加了请求-响应模型层一样…...
在掌控板上搭建http服务器
在掌控板上搭建http服务器 打开Arduino IDE,并且已经添加了ESP32的支持库。以下是创建一个基本HTTP服务器的步骤: 包含必要的库: #include <WiFi.h> #include <WebServer.h>配置WiFi: 替换ssid和password为你的WiFi网…...
HCIA复习实验
实验要求 实验拓扑以及实验分析 第一步先划分网段 先对内网划分 192.168.1.0/24划分 192.168.1.0/26---骨干主线路 192.168.1.64/26---骨干备线路 ---192.168.1.128/25--vlan2 3汇总---便于减少路由表条目---在大型网络方便 192.168.1.128/26---vlan2 192.168.1.192/26---vla…...
生信软件39 - GATK最佳实践流程重构,提高17倍分析速度的LUSH流程
1. LUSH流程简介 基因组测序通常用于分子诊断、分期和预后,而大量测序数据在分析时间方面提出了挑战。 对于从FASTQ到VCF的整个流程,LUSH流程在非GVCF和GVCF模式下都大大降低了运行时间,30 X WGS数据耗时不到2 h,从BAM到VCF约需…...
c#编写的各类应用程序、类库的引用(黑白盒)
001 课程简介,C# 语言简介,开发环境准备 (yuque.com)https://www.yuque.com/yuejiangliu/dotnet/timothy-csharp-001 一个Solution里包含多个Project 一、见识 C# 编写的各类应用程序 二、类库的引用(黑/白盒引用) 1、黑盒引用&a…...
计算机网络考研笔记
...
用感性的方式浅要了解什么是AI 与 大模型
什么是人工智能(AI)? 人工智能(Artificial Intelligence,简称 AI)是指由人制造出来的具有一定智能的系统,能够理解和学习人类的行为,并在某些任务上模仿人类的智能行为。这些任务包…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...
