• [其他干货] Mindspore项目DPRNN模型迁移经验分享
    今年4月份到10月份参加了华为众智项目新一期的开发,在模型迁移过程中学到了很多,也积累了一些迁移方面的经验,想通过这个帖子分享给大家。模型结构简介:在分享迁移经验之前首先简单介绍一下DPRNN模型,便于大家对这个模型有一个简单的了解。双路径循环神经网络(DPRNN)是一个时域单通道语音分离的高效长序列建模,它由三个处理阶段组成:编码器、分离阶段和解码器。首先,编码器模块用于将混合波形的短段转换为它们在中间特征空间中的对应表示。然后,该表示用于在每个时间步估计每个源的乘法函数(掩码)。最后利用解码器模块对屏蔽编码器特征进行变换,重构源波形。下图是论文中关于语音分离阶段流程的解释。看完上面的模型简介之后,相信大家已经对DPRNN模型有了一个大致的认识。接下来就是我在做此项目过程中具体的流程规划。模型迁移流程在正式进行模型迁移工作之前,首先要详细阅读论文并且熟悉论文对应的源码,然后就是阅读mindspore开发文档,熟悉mindspore整体的开发流程,查询torch与mindspore算子对应关系,这样可以有效减少模型迁移的时间。DPRNN模型的迁移流程如下:将torch源码迁移成mindspore版本代码,并在pynative动态图模式下跑通(pynative模式下,可以方便地设置断点,获取网络执行的中间结果).将mindspore版本代码在graph图模式下跑通通过调整模型超参,初始化等方法提升模型评估精度310推理代码编写训练,评估以及310推理的单卡和多卡运行脚本编写迁移难点模型的迁移主要分为三个阶段,分别为数据预处理,网络主干以及loss。下面是在这三个阶段中遇到的问题以及解决办法:数据预处理在这一阶段的开发中,我发现mindspore库中缺少一个重要的音频处理算子:torchaudio,通过查询库上代码和各版本的源码,了解到原始音频是应该先处理为一个二进制的json文件,再将这个json文件传入训练的网络之中。所以我重写了预处理文件,为了验证结果,将这部分代码处理后的json文件传入了torch代码中,发现效果基本一致,完美规避了torchaudio没有mindspore对应算子的问题。网络主干首先是一维卷积算子nn.Conv1d,由于初始化的方式不同,torch版本和mindspore版本的输入输出有很大的差异,经过尝试,发现使用HeUniform()初始化方法可以得到和torch版本相同的输出。然后是nn.GroupNorm归一化算子,通过代码报错发现mindspore版本的GroupNorm算子不能对三维向量进行运算,而对应的torch版本算子却可以正常运行,所以只能对向量先进行扩维操作,然后通过transpose函数进行向量转置,通过GroupNorm算子之后再进行转置以及降维操作,通过此方法可以得到和torch版本GroupNorm算子相同的输出。对于nn.LSTM算子,mindspore1.5版本环境下需要加上两个Tensor(h_0,c_0)的元组,数据类型为mindspore.float32或mindspore.float16,shape为(num_directions * num_layers, batch_size, hidden_size),如果不加这两个参数脚本运行会报错。但是mindspore1.6以及之后的版本都可以不加这两个参数。两版代码的区别我放在下面的代码区。mindspore1.5版本可运行的LSTM算子部分代码如下:def __init__(self, out_channels,hidden_channels, rnn_type='LSTM', norm='ln',dropout=0, bidirectional=False, num_spks=2): super(Dual_RNN_Block, self).__init__() # RNN model self.intra_rnn = nn.LSTM(out_channels, hidden_channels, 1, batch_first=True, dropout=dropout, bidirectional=bidirectional) self.h0 = Tensor(np.ones([2 * 1, 516, hidden_channels]).astype(np.float32)) self.c0 = Tensor(np.ones([2 * 1, 516, hidden_channels]).astype(np.float32)) self.inter_rnn = nn.LSTM(out_channels, hidden_channels, 1, batch_first=True, dropout=dropout, bidirectional=bidirectional) self.h1 = Tensor(np.ones([2 * 1, 500, hidden_channels]).astype(np.float32)) self.c1 = Tensor(np.ones([2 * 1, 500, hidden_channels]).astype(np.float32)) def construct(self, x): ''' x: [B, N, K, S] out: [Spks, B, N, K, S] ''' B, N, K, S = x.shape # intra RNN # [BS, K, N] intra_rnn = x.transpose((0, 3, 2, 1)).view(B*S, K, N) # [BS, K, H] intra_rnn, (hn, cn) = self.intra_rnn(intra_rnn, (self.h0, self.c0))mindspore1.6以及之后版本可运行的LSTM算子部分代码如下:def __init__(self, out_channels,hidden_channels, rnn_type='LSTM', norm='ln',dropout=0, bidirectional=False, num_spks=2): super(Dual_RNN_Block, self).__init__() # RNN model self.intra_rnn = nn.LSTM(out_channels, hidden_channels, 1, batch_first=True, dropout=dropout, bidirectional=bidirectional) self.inter_rnn = nn.LSTM(out_channels, hidden_channels, 1, batch_first=True, dropout=dropout, bidirectional=bidirectional) def construct(self, x): ''' x: [B, N, K, S] out: [Spks, B, N, K, S] ''' B, N, K, S = x.shape # intra RNN # [BS, K, N] intra_tran = x.transpose((0, 3, 2, 1)).view(B*S, K, N) # [BS, K, H] intra_rnn, _ = self.intra_rnn(intra_tran)loss使用SI-SNR标准来计算loss,这也是语音分离任务中普遍使用的loss函数。这一部分基本没遇到什么问题。模型迁移过程中为了随时debug调试,推荐大家使用pynative模式进行开发,但是最终的交付目标是graph模式运行成功,所以最后我们需要在graph模式下再将整个训练的过程走一遍。在这一部分中,由于语音分离模型的特殊性,传入的语音长度不尽相同,所以源码对语音进行了切割处理,但是在pynative模式下正常运行的代码到了graph模式下就会出现op compale failed的问题,最终我们发现在graph模式下计算动态长度会出现一些问题,所以进行了先处理、再编译的方式处理数据,成功解决了graph模式不能运行的问题。模型调优经验除去之前因为mindspore环境原因导致loss一直不下降(在-2~0之间来回震荡),模型调参提升精度是整个项目耗时最长的阶段。在mindspore版本代码graph图模式下跑通之后,loss下降趋势与torch源码loss下降趋势有很大差异,比如torch源码sisnr评估精度是12.68,但是刚迁移完成没经过任何调优的mindspore版本代码sisnr精度只能到5.11,这个时候就需要通过调整模型参数、优化器、初始化函数以及学习率等方法来提升模型的精度。调整优化器torch源码使用的是Adam优化器,但是最初的mindspore版本代码使用Adam优化器之后效果却不尽人意,在conv-tasnet网络使用SGD优化器取得显著效果之后,我也试着把Adam优化器改为SGD优化器,最后效果反而比使用Adam优化器版本代码的效果更差,经过各种查询,得出SGD优化器对全卷积网络模型精度提升很多,但是对DPRNN这种含有LSTM的网络来说,使用SGD优化器不是一个很好的选择。在尝试了各种优化器之后,我最终换回了Adam优化器,后来发现通过调整优化器中weight-decay参数对应值可以取得不错的效果。调整初始化函数源码的初始化策略在mindspore上并无对应,而mindspore默认的初始化函数效果又很差,通过不断的尝试与对比,发现Heuniform初始化函数效果最好。调整学习率torch源码使用的初始学习率为5e-4,通过使用ReduceLROnPlateau学习率策略动态调整学习率,当特定的度量指标,如训练损失、验证损失或准确率不再变化时,学习率就会降低为原来的1/2,但是mindspore1.9以下的版本却没有这个算子对应,所以只能通过加载模型文件继续训练的方法找到最合适的学习率,最后通过nn.piecewise_constant_lr函数将合适的学习率整合成动态学习率,代码如下:milestone = [15 * num_steps, 45 * num_steps, 75 * num_steps, 100 * num_steps] learning_rates = [args.lr, args.lr1, args.lr2, args.lr3] lr = nn.piecewise_constant_lr(milestone, learning_rates) optimizer = nn.Adam(net.trainable_params(), learning_rate=lr, weight_decay=args.l2)310推理编写310推理的时候报过out of memory错误,我使用的模型总共需要6层dprnn block,使用5层block时310推理可以正常运行。但当使用6层block的时候,可以export出mindir文件,但是310推理却报out of memory错误,在gitee上提了issue之后,工程师建议看做没做8bit量化,如果是全卷机网络可以把输入大小减少些。后续将输入通道大小减少一半,在未影响精度的前提下310推理可以正常运行,如果之后有同学在310推理的时候也遇到这个问题的话,可以尝试一下这个方法。除此之外的其他部分当时我参考了gitee上modelZoo库中模型中的310推理,几乎没做任何改动。只适当修改了执行脚本,没遇到什么太多的问题。总结总之,如果在模型迁移开发中遇到了问题,可以去gitee上提交issue,会有工程师给你提供解决问题的方法,虽然mindpsore还有一些不足之处,但它也在不断完善,不断进步,希望这个帖子可以对大家有一点点帮助,也祝愿Mindpsore平台越来越好。
  • [API使用] 使用ResNet报错提示GetEvaluatedValueForNameSpaceString
    在执行res = model.eval(test_data)时报错,错误提示是:File "D:\program\python39\lib\site-packages\mindspore\common\api.py", line 1131, in compileresult = self._graph_executor.compile(obj, args_list, phase, self._use_vm_mode())AttributeError: ConvNormActivation<(features): SequentialCell<(0): Conv2d(1): BatchNorm2d>> object has no attribute __bool__----------------------------------------------------- C++ Call Stack: (For framework developers)----------------------------------------------------mindspore\ccsrc\pipeline\jit\static_analysis\prim.cc:1455 GetEvaluatedValueForNameSpaceString测试代码是参考这篇文章的https://developer.huaweicloud.com/develop/aigallery/notebook/detail?id=9f2ffd90-6e2a-4df5-beba-2ad8acbbdbce该文章的代码能正常运行(训练和预测),文章里用是它自行定义的ResNet;改成使用:from mindvision.classification.models.resnet import resnet18 as resnetnet = resnet(num_classes=config.class_num, pretrained=False)后就会产生上述错误。
  • [算子使用] 经验分享|昇思MindSpore周旭林:首先学会像成功者那样自信
    本期项目经验分享来自周旭林同学,承担的项目是【昇思MindSpore CPU正向算子开发:SparseApplyProximalAdagrad】。01、关于昇思MindSpore项目介绍项目名称昇思MindSpore CPU正向算子开发:SparseApplyProximalAdagrad(注:项目内容在开放申请阶段经过了社区调整,后续实际开发的算子为EditDistance,其它描述不变)项目链接https://summer-ospp.ac.cn/#/org/prodetail/221cb0310项目描述算子开发流程:我的项目关于算子开发,交付目标是完成一个CPU正向算子。先来解释这些概念。算子是什么算子是什么?算子是深度学习框架的基本组件。一般AI模型由若干个计算模块(即网络中的block)组合而成,比如全连接层Dense、卷积层Conv、激活函数Relu就是计算模块,模块的实现是通过调用封装好的算子来完成的。算子怎么分类?由于计算模块的数据处理对象一般为Tensor,而不同的后端硬件平台对Tensor的存储、处理和计算方式有所不同(如何基于GPU和Ascend等AI加速器的硬件特点对算子实现做特殊处理以使其执行速度更快,这是另一个有趣的话题)。MindSpore对 CPU、GPU 和 Ascend 等硬件平台都提供支持,因此根据算子所支持的不同设备的底层逻辑,可分为 CPU 算子、GPU 算子和 Ascend 算子。因为AI模型需要进行反向传播,所以有时需要定义一个新算子来履行原先算子的反向实现功能,因此就有正向算子和反向算子之分。算子如何开发算子开发本质上是打通算子在MindSpore中被调用的各个环节,这些环节可分为Python前端和C++后端两个部分。算子通过Python前端的接口被调用,并在具体硬件平台的后端实际执行。算子如何被调用?MindSpore支持静态图模式,在该模式下AI模型的工作的会经过构图、图执行这些步骤:首先在前端构图环节,会将编写模型的 Python 语言中用到的算子接口API(比如mindspore.ops.Conv表示卷积模块)表达翻译为计算图(由计算模块共同组成的有向无环图);接下来在图执行环节,每个计算模块所对应算子输入的 type 和 shape 才会被推导(即构图完成后才能拿到,这样处理是为了能在不考虑Tensor具体信息的情况下先对计算图做编译优化);最后后端会根据图以及算子名称、输入输出个数和类型匹配具体平台的算子实现,并将执行结果返回到 Python 侧进行输出。那么,算子如何开发?遵照算子被调用的逻辑,主要需要开发 Python 算子原语、C++侧输出推导文件和基于硬件平台的底层实现文件,具体来说:1.Python 算子原语开发:算子原语就是算子的前端接口 API,在 MindSpore 中用 Python 实现,是组成网络模型的基本单元,可以被运行在不同硬件平台上的算子共用。算子原语主要包括算子的名称、属性、输入输出名称、输出 shape 推理方法、输出 data type 推理方法等信息。在存在 C++侧输出推导文件时,Python 算子原语的开发意义主要在于定义名称和属性;2.C++侧输出推导文件开发:C++侧输出推导文件本质上是算子原语的 C++形式。由于算子属性的初始化已在 Python 算子原语中完成,因此 C++算子原语的主要功能是对输入数据的规范性进行校验,并推导算子输出的 data type 和 shape。这里其实可以将C++侧输出推导文件理解为算子前端,单独抽取出来并写成C++文件的意义主要是为了保证一般算子在推导时的高效。目前只有当遇到动态shape等特殊情况时,为了方便处理才会直接在Python算子原语中推导;3.CPU 底层实现文件开发:利用框架提供的 C++ API,结合算子具体特性实现算子内部计算逻辑,并在保证结果和精度达标的基础上尽量保证性能达到最优。这里的C++ API 除了经典的STL库以外,还包括MindSpore提供的辅助类和方法。总的来说,算子这个组件在MindSpore框架中,分为了算子前端和算子后端:其中前端是算子接口 API,用于从抽象上指代某类算子并供用户调用;后端是对用户不可见的算子底层实现,随实际运行平台而不同。算子开发既要实现算子接口API(重点是实现其中的data type和shape的推导流程),也要完成后端底层实现。我当时修改并交付的代码包括以下文件,最终在Gitee中以PR的形式合入。 文件名功能含义修改描述edit_distance_cpu_kernel.ccEditDistance算子CPU底层实现的源文件实现算子的底层逻辑,包括具体算法实现和新增数据类型支持edit_distance_cpu_kernel.hEditDistance算子CPU底层实现的头文件定义算子的所用数据结构,实现对编辑距离的求解edit_distance.ccEditDistance算子C++侧推导文件从type和shape等角度验证算子输入的规范性array_ops.pyEditDistance算子Python前端接口更新算子基本信息描述算子如何验收算子开发除了交付代码以外,为了方便验证和合入代码,还需要提交开发者自测交付件。交付件需要涵盖算子设计文档、算子自测用例、测试报告与执行结果等。这些交付件需要给华为的测试负责人验收,一般他们关心以下方面:1.算子文档是否规范?交付件需要证明该算子的文档齐全且为最新(比如,若打通了CPU平台上该算子的支持,就要更新官网上的适用平台说明);2.代码交付是否完全合格?这里的合格除了接口规格要与友商保持一致以外,还需要保证结果在各种情况下都正确。为了证明这点,交付件中需要包括根据“算子自验报告”中的逐个细节(比如Tensor维度取从0维到7维的情况、输入数据类型不匹配的报错情况等)一一编写。算子自验报告需要面面俱到,当时的报告长得像是以下这样子。因此,交付件需要清楚地涵盖到以上的内容。在我的交付件中,一级目录的文件和文件夹描述如下。名称类型描述doctest自验执行结果截图算子的文档规范验证结果算子自验报告Excel表格自测数据的构造逻辑和覆盖内容算子自验测试用例由自测数据组成的代码库包括20个自测数据和必要的测试脚本EditDistance测试用例执行结果.docx截图算子通过自测数据的截图证明EditDistance接入设计文档.docWord文档算子开发文档其文件树结构如下所示。02、项目开发方案描述模型开发流程下面介绍我负责的项目内容和开发细节,内容组织遵循项目的开发思路。开发思路在了解了算子开发流程后,我遵循了以下流程进行开发前调研、开发中划分模块和开发后自测检验。1.算子分析:了解算子的作用、适用范围和特性,关注算子的属性、输入和输出参数的shape和dtype等规格;2.接口实现:基于算子的功能设计面向用户的Python API接口,并按照指定文档格式添加算子的基本信息。由于MindSpore中已有EditDistance算子的Python接口,因此本次开发不涉及该部分;3.输入规范性检验:即实现C++侧推导文件。需要考虑包括算子名称、属性、输出shape、dtype推理函数等信息,并对不合理的输入抛出异常;4.实现基于特定平台的底层逻辑:在本项目中为基于CPU平台实现算子内部逻辑,主要包括“序列生成”、“序列比较”和“编辑距离求解”三个模块。其中,“序列生成”模块负责从所输入的稀疏矩阵中提取出需要计算编辑距离的序列;“序列比较”模块负责对所提取出的序列进行枚举和比较;比较后需要输出的结果通过调用“编辑距离求解”模块得到。5.测试用例构建:测试用例包括UT测试用例和ST测试用例。前者需要附在Pull Request上面,在本项目中不涉及;后者无需跟开发代码一同上库,但是需要根据测试提供的模板编写用例,与标杆对比结果,并全量测试算子功能和异常场景。算子分析与示例演示我的项目开发的算子对象是EditDistance算子,需要对标TensorFlow已有实现来完成交付。该算子的功能是计算两个序列的编辑距离。序列将作为输入以稀疏矩阵的形式给出。提一下这里涉及到的两个概念:编辑距离是是衡量两个字符串(序列)差异程度的量化标准。具体来说,给定当前字符串s和期望字符串t,并定义如下操作均为合法操作:(1)在s插入一个新字母;(2)在s中删除一个原有字母;(3)替换s中的任意一个字母为其它字母。则s和t的编辑距离,就是将s变成t的最小合法操作数。稀疏矩阵是内部元素大部分都为无意义值的矩阵,它是相对于稠密矩阵而言的。在深度学习框架中,稠密矩阵一般用 Tensor 存储,因为 Tensor 是存储多维数组的理想数据结构;但是稀疏矩阵一般会采用特定的表示方法,即通过只存储在给定索引上有意义的元素值及其下标来表示一个矩阵。其中一种表示方法需要三个参数:indices、values 和 shape,其中:indices 表示稀疏矩阵中所有有意义值各自所在的位置。它是一个 shape 为 [N, R] 的 Tensor,其中N表示稀疏矩阵中有意义值的个数,R表示该稀疏矩阵的维度;values 表示稀疏矩阵中所有的有意义值。它是一个 shape 为[N]的 Tensor,用来给 indices 中的每个位置提供具体数值;shape:表示该稀疏矩阵的维度。它是一个包含R个数的元组或 shape 为[R]的 Tensor。现在,了解了算子作用后,我遇到的第一个挑战是这个算子的输入太多了,且序列之间比较的逻辑看起来不容易理解。贴一个该算子对参数和输入的具体规范感受下。normalize:bool类型参数,在EditDistance算子类初始化时传入。若为true,表示输出得到的编辑距离会被目标序列的长度normalize;hypothesis_indices :Tensor类型输入,要求shape为[N,R],其中N表示hypothesis中有意义的值的个数,R表示hypothesis的矩阵维度;hypothesis_values:Tensor类型输入,要求shape为[N];hypothesis_shape:Tensor类型输入,要求shape为[R];truth_indices:Tensor类型输入,要求shape为[M,R],其中M表示truth中有意义的值的个数,R表示truth的矩阵维度,且该维度应与hypothesis的矩阵维度保持一致;truth_values:Tensor类型输入,要求shape为[M];truth_shape :Tensor类型输入,要求shape为[R]。output:以Tensor形式返回的编辑距离,该Tensor的shape为R-1,为表示当前序列的稀疏矩阵和表示目标序列的稀疏矩阵在对应序列位置上的编辑距离。因此,这里让我们用一个具体的例子来详细分析一下该算子怎么用。这里以tensorflow做示范(mindspore的用法与其相同),给定以下包括truth和hypothesis两个稀疏矩阵的输入。让我们通过手工计算求解基于这些输入的编辑距离。hypothesis的稀疏矩阵维度为(2,1,1),它实际上表示的是一个维度为(2,1)的序列矩阵,且序列中的元素个数不超过1。即位置在(0,0)的序列内容为[1],位置在(1,0)的序列内容为[2],为方便指代,可简记为:(0,0) = [1](1,0) = [2]truth的稀疏矩阵维度为(2,2,2),它实际上表示的是一个维度为(2,2)的序列矩阵,且序列中的元素个数不超过2。可简记为:(0,0) = [](0,1) = [1](1,0) = [2, 3](1,1) = [1]由于truth的序列矩阵相关维度包括了hypothesis的序列矩阵相关维度,因此在计算编辑距离之前,会自动将hypothesis的序列矩阵维度转化为与truth的一致,并将额外增加的位置对应的序列内容置为空。随后,比较序列矩阵中的每一个序列,具体来说:对于(0,0)位置:hypothesis的序列为 [1],truth的序列为 [],因此编辑距离为1;由于truch的序列长度为0,因此normalize后的编辑距离为inf;对于(0,1)位置:hypothesis的序列为 [],truth的序列为 [1],因此编辑距离为1;由于truch的序列长度为1,因此 normalize后的编辑距离为1;对于(1,0)位置:hypothesis的序列为 [2],truth的序列为 [2,3],因此编辑距离为1;由于truch的序列长度为2,因此normalize后的编辑距离为0.5;对于(1,1)位置:hypothesis的序列为 [],truth的序列为 [1],因此编辑距离为1;由于truch的序列长度为1,因此normalize后的编辑距离为1。采用edit_distance算子所得的结果如下。可以看出实际输出结果与上述推导的结果一致。输入规范性检验在规范性检验里,我遇到了开发中的第二个挑战,即由于 EditDistance 算子的参数较多,对它们的规范性校验较为复杂,需要细心处理。这个过程既需要单独考虑每个参数的特定规格,又需要考虑不同参数之间的约束和联系(比如代表同一个稀疏矩阵的三个参数必须遵循稀疏矩阵的构造规范)。在Editdistance的开发中,依次通过如下检查步骤来完成算子输入的规范性检验,若其中一个不通过则抛出具体的报错异常:确认输入为六个参数;确认六个参数的 dtype 都为 Tensor;获取六个参数的 shape 并做检查。对于分别表示两个稀疏矩阵索引的两个参数,确认它们的秩为 2;对于其他四个参数,确认它们的秩为 1;确认表示稀疏矩阵索引和表示稀疏矩阵索引范围的两对参数,它们的维度数量一致;确认表示稀疏矩阵索引范围的两个参数的值保持一致或满足自动广播条件;确认六个参数的元素数据类型合法,其中表示稀疏矩阵索引的参数和表示稀疏矩阵索引范围的参数元素数据类型必须为 int64,表示稀疏矩阵值的一对参数元素数据类 型必须一致且在所支持的参数列表内。序列生成序列生成负责基于输入的稀疏矩阵得到需要计算编辑距离的序列。该部分开发的难点在于无法直接参照TensorFlow源码的算子实现逻辑,这是我在开发中的遇到的第三个挑战,也是本项目的难点所在。一般算子开发任务是对标友商中的已有实现的,这会给开发工作带来便利:因为已经有了现成的源码,只需要参考逻辑实现“本土化”移植到mindspore中就可以了。但是本次开发却行不通,这是因为在TensorFlow中,EditDistance算子的内部实现涉及将输入的三个Tensor转化为一个与其对应的稀疏矩阵,并使用稀疏矩阵的遍历方法来对矩阵进行处理,因此需要动用专门的SparseTensor数据结构完成稀疏矩阵的通用操作。但是MindSpore中没有此类数据结构(更具体地来说,是没有实现稀疏矩阵的顺序遍历方法),因此只好自行构造方案进行处理。本次开发采用的方案基于朴素的枚举思路,方案伪代码如下。其中,indices、values和shape三个输入参数共同表示一个稀疏矩阵,该稀疏矩阵可能存在部分有实际值的下标是落在输出矩阵的某一个特定下标output_index对应的位置里面的,算法的目标就是对于特定的output_index,将稀疏矩阵中所有落在该位置的有意义的值收集起来生成一个序列,以便后续进行比较。当然在实际开发中,还需要考虑代码书写的规范性。比如两个不同数据类型变量的计算需要调用工具函数做显性类型转换,并判断生成序列的所在下标是否超出输出矩阵范围等,这里就不做详细讨论了。序列比较在基于两个稀疏矩阵hypothesis和truth都生成了对应的序列后,需要通过序列比较模块,对位于同样输出下标的序列进行比较以计算编辑距离。这里遇到了第四个挑战:该模块尽管可以通过简单循环和嵌套判断直接实现,但是函数内环形复杂度就会过大导致无法通过门禁。这里的环形复杂度是一种程序逻辑复杂性的度量,程序中所包含的判断和循环语句越多,环形复杂度越大。为了在保证功能的前提下精简算法,首先需要分类讨论序列比较的八种不同情况如下。若采用直接的判断方法,则每种对应情况需要进行三次分支判断才能检索到。为了降低环形复杂度,修改思路是将部分判断“隐藏”在另一个函数里,通过两个函数合理分摊分支判断,这样就能避免某个函数的环形复杂度过大的情况。注意到当且仅当 truth 序列为空且 normalize 参数为 true 时,需要根据 hypothesis 序列是否为空来判断是返回 inf 还是 0,而除了这种情况以外的情况都可以直接调用编辑距离求解函数求解。通过这种方式就可以将对序列是否为空的判断转移到求解函数中(求解函数会在下一节探讨),从而降低当前函数的环形复杂度。这个部分的码风长如下这样子。// calculate distance if (normalize_ && truth_seq_size == 0) { output_addr[output_index] = (hypothesis_seq_size != 0 ? std::numeric_limits::infinity() : static_cast(0)); continue; } auto cmp = std::equal_to(); size_t dis = LevenshteinDistance(truth_seq, hypothesis_seq, cmp); output_addr[output_index] = (normalize_ ? SizeToFloat(dis) / SizeToFloat(truth_seq_size) : SizeToFloat(dis)); }编辑距离求解在完成序列生成和序列比较两个预处理步骤后,我们就把算子开发任务转换成了:给定两个已经从稀疏矩阵中单独抽离出来的纯粹的序列,求解它们的编辑距离。这是第五个挑战,难度等同于这道力扣题:力扣[1]。可以用动态规划解决,动态转移方程为如下。其中,dis(i, j)表示 s 的前缀子串 s[0~i]与 t 的前缀子串 t[0~j]的编辑距离,[s[i − 1] ≠ t[j − 1]] 表示若 s 的第 i 位字母与 t 的第 j 位字母不同,则该值为 1;否则为 0。最终 s 和 t 的编辑距离为dis(s. length, t. length)。下面是这道力扣题的求解代码。class Solution {public: int minDistance(string word1, string word2) { vector> dis(word1.size()+1, vector(word2.size()+1,0)); int len1 = word1.size(); int len2 = word2.size(); for (int i=0;i<=len2;i++) dis[0][i]=i; for (int i=0;i<=len1;i++) dis[i][0]=i; for (int i=1;i<=len1;i++) for (int j=1;j<=len2;j++) { dis[i][j]=min({dis[i-1][j]+1,//删除word1的一个字母 dis[i][j-1]+1,//删除word2的一个字母,等价于增加 word1的一个字母 dis[i-1][j-1]+(word1[i-1]!=word2[j-1])}); //修改word1的一个字母。若该字母其实无需修改,则不增加合法操作数 } return dis[len1][len2]; } };下面是本次项目开发关于编辑距离求解部分的函数。template inline size_t LevenshteinDistance(const std::vector &s, const std::vector &t, const Cmp &cmp) { const size_t s_size = s.size(); const size_t t_size = t.size(); if (s_size == 0 || t_size == 0) { return std::max(s_size, t_size); } std::vector> dis(s_size + 1, std::vector(t_size + 1, 0)); for (size_t i = 0; i <= t_size; i++) dis[0][i] = i; for (size_t i = 0; i <= s_size; i++) dis[i][0] = i; for (size_t i = 1; i <= s_size; i++) for (size_t j = 1; j <= t_size; j++) { dis[i][j] = std::min({dis[i - 1][j] + 1, dis[i][j - 1] + 1, dis[i - 1][j - 1] + (cmp(s[i - 1], t[j - 1]) ? 0 : 1)}); } return dis[s_size][t_size];}从上面两个代码片段可以看出:同样是封装成函数,实际开发场景与力扣模拟场景还是存在值得注意的区别。举例来说,需要用 C++ 的 template 机制实现以支持不同种类的数据类型,并且传入自定义比较类型 Cmp 实现 所传入的序列元素的对比;另外还要考虑到在 EditDistance 算子的使用场景中,大部分比较的两个序列中至少有一方的长度为 0,因此增加相应的特殊判断显得更有必要,同时也可以均摊上一节提到的环形复杂度。项目开发完成后,就需要一一编写针对性测试用例进行验证。若多次测试无误,就可以将代码和交付件转交给测试人员验收,同时预告项目开发基本完成了。最后放上Editdistance的MindSpore官网链接[2]。03、随访参与开源之夏ospp:请简单介绍一下自己和你的开源经历吧xlinsist:我是来自暨南大学19级智能科学与技术专业的周旭林,我最开始投身开源的动机是希望能以更有效的方式接触和揭秘AI“黑盒”背后的技术。在日常专业课的学习中,老师会给我们讲授神经网络和深度学习模型的概念和原理,并提供机会让我们基于TensorFlow搭建模型进行实践。由于我时常好奇所用到的这些库的内部实现方式,因此经常会通过查阅技术博客采撷对这些细节的解读。这个习惯为我能“随机搜索”到开源项目提供了基础。“梦开始的地方”是在今年初关注到的华为开源书籍《机器学习系统:设计与实现》。这本书讲述了 AI 模型以计算图的形式经过框架和编译器并最终得到部署的完整流程。由于彼时鲜有全面涉及相关内容的教材,我饶有兴趣地参与了这本书的内测阅读,提出了一些关于排版的建议和修订并最终在书籍检视活动中获了奖。这在给我带来成就感的同时也让我了解到了这样一种社区玩法,即通过积极参与自己感兴趣的方向中正在开展的活动,能够让你保持对前沿资讯的关注并投入到有实际价值的事情中。ospp:你是从什么渠道了解开源之夏的,为什么选择参与开源之夏?xlinsist:由于书籍检视活动让我意犹未尽,于是我开始有意识地在网上寻找其它机会,就是在这个过程中我认识了开源之夏。事实上,好的开源平台自然会吸引开发者关注、参与并留下产出。开源之夏就是这样一个优秀的平台,它的开发流程、导师制度和奖励机制能够很好地激发我们参与其中的热情,因此我关注到了它。在翻看了前两届学生的活动记录和结项成果后,我当即认为这就是一个我可以争取的机会,因为通过主动了解前辈们的开发心得和项目经验,我实际上是为自己确定了在项目开发中想成为的榜样,而榜样的树立可以为我带来无形的激励力量。参与开源社区ospp:介绍一下你在开源之夏活动的项目吧,你是怎么从这么多项目中选中它的呢?xlinsist:我选择的项目关于算子开发,交付目标是对标友商开发完成一个CPU算子并验证通过。这里的算子是深度学习框架的基本组件,深度学习模型中一个网络层的实现就是通过调用算子来完成的。挑中该项目主要出于两个考虑:首先,算子开发本质上是打通算子在MindSpore中被调用的各个环节,这些环节包括Python前端和C++后端两个部分,我认为理清算子开发流程对我接触MindSpore这个“黑盒”背后的技术会有很大帮助;再者,算子开发是一个通用的开发任务,它不要求开发者预先对框架的某一组件部分有较深的理解基础,但是需要有一定的源码理解和编程实现能力,可以参考友商框架的实现思路在MindSpore中完成逻辑开发。我相信当开发思路大致清楚后,这就不会是一个特别难上手的任务,因此我把它视为我在昇思MindSpore社区的“good-first-issue”,它是我上手MindSpore的一个很好的切入点。ospp:在开展项目的过程中,涉及陌生的知识领域你是如何应对的?xlinsist:开展项目对我来说是一个从0到1的过程。除了理清算子开发的完整流程,我还需要熟记目标算子的功能和参数,熟悉MindSpore的安装和使用,才可以开始编码开发。编码期间需要了解库函数的使用并遵循一定的编程规范,编码完成后也需要遵循验收标准提供交付件。这些过程看似繁琐,但都是项目开发的必经之路。因此我不但需要适应它,还需要刻意将这些细节培养成自己的开发习惯。在这样的意识指导下,我会用一种“终局思维”去应对陌生的知识领域,即为了推进这个项目,我首先要走出当下因知识盲区而面临的困惑;为了解答这个困惑,我首先要弄清楚某个具体知识点的含义。这样就将当下遇到的大困惑转换成小困惑,大困难拆解成小困难,最后通过研读源码和求助社区和导师不重复也不遗漏地解决一个个小困难,最终就能解决问题。ospp:项目进行中社区和导师给你带来了怎样的帮助?xlinsist:在项目开发前后我幸运地得到了社区前辈们的支持,他们为我在开源社区中快速成长带来了很多帮助,对此我由衷表示感谢。首先要感谢我的导师,他对我在开发过程中遇到的困惑和瓶颈都有问必答。每周我都会将当前工作进展汇总后发给他交流确认,在重要的开发阶段也会建立线上会议与他直接探讨。跟导师的及时交流让我在项目开展时逐渐建立起一种自信,即眼前项目最终一定能完成,因为我所遇到的流程性问题都能在他那寻求解答,而对于相对复杂的细节和程序性问题也能够找他磋商,这对项目进展起到了非常积极的推进作用。然后也要感谢社区的算子测试负责人,他帮助我仔细检查了自测交付件的规范性,并在处理转测遇到的突发情况时提供了关键的设备资源和材料。在开发代码刚开始转测时,曾出现测试环境与本地环境不一致导致无法验证自测结果的问题。为了提高沟通效率,我在导师的帮助下直接单方面联系到他,他为我提供了众智服务器以保证源码编译验证的高效性,并及时地将测试结果发与我交流。这些验收反馈对保证交付质量具有重要意义。最后还要感谢在社区和交流群中为我答疑解惑的前辈们。在最开始准备项目申请书的日子里,我曾参加华为SIG的内部交流会向前辈提出自己的疑问,也曾在交流群里向老师们寻求参考资料和学习建议,令我感激的是我每次都能得到他们热心且详细的答复,这对我在申请书的撰写和项目的学习上都带来了很大帮助。ospp:通过参与这次开源之夏的活动,你对开源社区有什么新的理解和看法?你会怎么跟在校学生介绍或推荐开源社区?xlinsist:开源本身就是一个很棒的想法。从宣传的角度来看,它为社区和外围开发者搭建起了交流的桥梁,这一方面可以提高社区的知名度,另一方面可以满足开源爱好者对关注前沿和参与其中的需求,是一个“双赢”的策略;从运作的角度来看,吸引外部的开发者可以为社区输送有潜力的人才,改善人员结构,并带动社区的活跃氛围。开源社区是一个宝贵的资源库。对于像我这样的在校学生来说,最初踏入开源社区仿佛打开新世界的大门,那里有大量深度和广度兼具的成功项目,它们会帮助你建立起你跟其它技术大佬的联系。在有这样丰富机会的环境下,你会自觉地去思考自己想要的是什么,而不是受限于自己在学校只接触过什么;你会开始跟随自己的兴趣去探索,而不是盲目跟随大家都在讨论的规划。你不需要顾虑自己以前没参与过类似项目,因为社区中有很多适合你的“good-first-issue”可以作为切入点;你不需要担心自己的水平有限,因为社区里总会有热心高手为你答疑解惑。你要做的是“Fake it till you make it”,即先从“假装”自己就是以后也想成为的大佬中获得自信,像他们那样子参与其中,迈出第一步,直到真的能把这个事情办成。在校学生参与开源项目有许多好处。首先,它是项目导向的,即需要在规定时间内完成项目开发,但是整体节奏可以自行安排,这就为那些在学校尚有学习任务但是想体验“兼职实习”的学生提供了机会。其次,由于项目的ddl和任务指标较为明确,这反而有利于推动自己完成一些看似不可能的挑战。再者,这样的一次项目经历会成为大学阶段的一个代表性成就,是一个极佳的“面向简历学习”范例,即所学的内容和所做的事情刚好能成为自己简历上有价值的一笔,后续去面试时,就能有东西可以说。尽管对方不一定会关心你的项目细节,但是从你的申请书撰写、项目开发推进过程、项目难点解决方案中,也可以了解你的思考历程和行动方式,这会成为一个亮点。收获与寄语ospp:这次的开源之夏你顺利完成并结项,有什么珍贵的经验可以分享给大家呢?xlinsist:首先,在开发前再怎么强调调研的重要性都不为过。开源之夏会根据大家的项目申请书决定中选学生,因此我会建议参与开源之夏的学弟学妹们提早决定和准备自己的项目,做足充分的调研并将自己对项目的理解尽可能详细地呈现在申请书上。然后,在调研的过程中会涉猎到很多技术博客,有些博客的观点和细节可能让人“眼花缭乱”,这时切记不要迷信和盲从,而是回归自己的项目内容并诉诸实践。因为当你决定承担起这个项目时,你就是这个项目的“专家”,你应该敢于让自己成为这方面的“权威”,并通过理性输出自己的见解来打动他人。在正式开发时,注意要跟导师主动沟通,做好及时反馈。这是因为一旦项目开始,没有人会清楚你目前的项目进展和细节,一般也不会直接打扰和过问,直到你能将自己的进展反馈出来,并主动讲述自己的情况。我在开始开发项目时,就跟导师约好我会于每周五晚上用几句话概括本周的工作和下周的安排,并将自己目前遇到的问题或觉得会有挑战性的地方备注在后面。这样的反馈沟通既是对导师的尊重,也表明自己正在把握着对项目的掌控感。在任何时候,若需要资源和信息都可以跟社区多多求助。我在前面也提到过社区甚至为我提供了众智服务器验证本地环境,这意味着我不再需要在自己的轻薄本上编译一次就要挂一个晚上等待了:) 这极大提高了我的生产效率。另外在最后的转测阶段,为了合力定位问题,社区还提供了原有测试仓的部分关键用例供我进行本地检验,这就给任务的交付质量多带来了一层保障。ospp:最后,有什么话想对准备参与开源之夏的学弟学妹们说的?xlinsist:我曾经在项目申请书的结尾这样写道:“希望如有机会,我也能够成长为后续开源之夏活动的导师,以实际行动点亮开源计划中的一盏指明灯,为后辈们指引光明的道途。”我始终相信开源社区是一个注重传承的社区,既能承载过来人的经验,也能包容后浪们的智慧。我会继续以实际行动投入到开源社区的建设中,尽我所能给大家解答困惑。也希望大家在开展项目时,能够主动参与到开源社区中来,积极参与到大家的讨论中来。当我们的力量汇聚在了一起时,我们的光明就是黑夜中璀璨的星空。[1]https://leetcode.cn/problems/edit-distance/[2]https://www.mindspore.cn/docs/zh-CN/master/api_python/ops/mindspore.ops.EditDistance.html
  • [公告] 重磅!第八届“互联网+”大赛产业赛道全国总决赛,昇思MindSpore开发者勇夺 “1金3银5铜”!
    2022年11月10日-13日,第八届中国国际“互联网+”大学生创新创业大赛总决赛 在线上举行,1128支参赛队伍汇聚云端、隔空比拼。在本次比赛中,昇思MindSpore开发者们斩获佳绩,在互联网+大赛产业赛道中喜获1金 3银 5铜 的成绩!中国国际“互联网+”大学生创新创业大赛 中国国际“互联网+”大学生创新创业大赛由教育部等十二部委和地方省级人民政府共同主办,今年已是第八届。大赛旨在落实党中央、国务院提出的“大众创业、万众创新”的重大部署,深入实施创新驱动发展战略,引领新时代高校人才培养范式深刻变革,推动形成新的人才培养观和新的质量观,推动赛事成果转化,促进“互联网+”新业态形成,服务经济提质增效升级,以创新引领创业、创业带动就业,推动高校毕业生更高质量创业就业。本届大赛于2022年4月正式启动,报名参赛人数1450万 余人,参赛项目340万 余个,覆盖参赛国家和地区111 个,真正实现“百国千校万人” 参赛,获金奖比例近万分之一。昇思MindSpore高度重视此次大赛,对参赛项目进行精准指导和培训,不断优化升级项目质量。昇思MindSpore社区开发者们克服种种困难,经历多轮路演、调整修改,全力以赴、不畏强敌、奋勇争先。经过激烈角逐,最终取得优异成绩。党的二十大报告指出,要构建人工智能这一新的增长引擎。昇思MindSpore一直在加强开源生态建设,积极拥抱所有高校开发者,助力高校开展产教赛融合教学改革,共建AI创新大家庭,推进计算产业人才发展。相信不久的将来,会在更多赛场上看到昇思MindSpore社区开发者们利用所学专业知识,站上更高的舞台!
  • [其他干货] Mindspore 昇腾众智gdprnn网络开发经验
    前言本文记录了完成华为昇腾众智项目的主要过程、遇到的问题及解决方案等。项目介绍我所做的模型是gdprnn,此模型是一个语音分离任务的模型,gdprnn由三个处理模块组成,编码器、分离模块和解码器。首先,编码器模块用于将混合波形的短段转换为它们在中间特征空间中的对应表示。然后,该表示用于主模型进行分离。最后,利用解码器模块对主模型输出结果重构,得到源波形。gdprnn被广泛的应用在语音分离等任务上,取得了显著的效果。论文: Voice Separation with an Unknown Number of Multiple Speakers源码地址:cid:link_1项目目标完成gdprnn从Pytorch到Mindspore的迁移任务迁移完成后在确保在Ascend上达到Pytorch源码精度在Ascend 310上完成推理,并达到Pytorch源码精度数据集使用的数据集为: librimix,LibriMix 是一个开源数据集,用于在嘈杂环境中进行语音分离。 要生成 LibriMix数据集,请参照开源项目:cid:link_3数据处理常用的数据集可以直接调用mindspore.dataset接口实现,其使用方法可在MindSpore编程指南中查看。在数据处理过程中基本没遇到什么难题,唯一要注意的是,数据最好使用numpy去处理,对性能会有很大提升网络迁移使用MindSpore定义神经网络需要继承mindspore.nn.cell,cell是所有神经网络的基类。MindSpore在构建网络时使用construct构建网络前向过程。在网络迁移过程中可以参考Mindspore官网中Pytorch和MindSpore的API映射关系。在迁移过程中遇到MindSpore没有与Pytorch对应index_add算子,为实现相同操作,我自定义了两个矩阵来替代index_add算子训练在训练过程中首先使用MindSpore封装好的函数model.train进行训练,不过在训练训练过程中不能对方向传播和梯度进行操作,进而将训练改为TrainOneStep进行训练,采用for loop结构能更方便进行梯度截断等操作。在云上训练过程中遇到八卡生成ckpt冲突问题,我为每张卡创建一个文件,解决了此问题310推理在导出mindir后,进行310推理过程,会报一个mindir的错误,然而并没有发现mindir有什么问题,最终我调低日志等级后发现错误的真正原因,并顺利解决。310 Ascend不能执行复杂的python 脚本,尽可能使用CPU执行python脚本,不过在使用CPU执行脚本后报错Illegal Instruction,排查之后确定原因:进程代码段中数据是作为指令运行的,如果不小心代码段被错误覆盖,那么CPU可能无法识别对应的代码,进而造成Illegal Instruction。同样,如果栈被不小心覆盖了,造成返回地址错误、CPU跳转到错误地址,执行没有意义的内存数据,进而造成Illegal Instruction。a *= b就是a = a * * b,前面的a把后面的a覆盖了,最终为每个变量命名均不相同便解决此问题性能调优在精度达标后发现MindSpore的性能要比Pytorch慢很多,使用二分法确定性能慢的原因是MindSpore的lstm比Pytorch要慢很多,此问题已交由工程师解决,在去掉lstm后性能仍然比Pytorch要慢一些,与工程师沟通解决profile报错的问题,并使用profile确定性能慢的算子,最终将数据从float32改为float16性能得到极大提升
  • [网络构建] Mindspore 昇腾众智 DPTNet网络开发经验
    项目目标完成DPTNet从Pytorch到Mindspore框架的迁移在迁移过后保证模型910推理精度在Mindspore框架下精度超过Pytorch的代码导出模型并完成310推理迁移顺序在Pytorch到Mindspore迁移时,我的迁移顺序是:Pytorch的GPU >> Mindspore的GPUMindspore的GPU >> Mindspore的Ascend在Pynative模式下跑通在Graph下跑通调整模型超参,初始化,开启数据下沉等310推理迁移过程中遇到的困难模型的迁移主要分为三个阶段,分别为数据预处理,网络主干以及loss。下面就迁移过程中三个部分遇到的困难进行说明:数据预处理:数据预处理部分的pytorch代码迁移到mindspore的过程中没有做过多的改动,因为这部分不涉及框架中的算子。主干网络(网络结构图如下):由模型图可以看出,整个模型可以分为三个部分,分别为Encoder、Separator、Decoder。在模型的迁移过程中我们需要关注哪些算子mindspore中没有或者功能不同,如果没有,是否有替代方法。在迁移模型的过程中主要遇到了以下问题首先是一维卷积Conv1d,由于初始化的方式不同,pytorch和mindspore的输入输出有很大的差异,经过不断的尝试,发现使用HeUniform()可以得到和torch近似的效果。其次是MultiHeadAttention这个算子。虽然mindspore中有这个算子,但是和torch的初始化方式不一样。mindspore需要传入序列的长度。具体差异如下所示,可以看出初始化方式还是有很大的区别。torch代码mindspore代码index_add算子在ms1.6环境下,不支持输入tensor,支持输入元组。但mindspore在图模式下不支持强转,所以我尝试了别的方法。起初我们尝试使用切片的方式来实现,发现在前向的过程中没问题,但由于我们切片的步长为2,在反向的过程中会报错,所以我放弃了这种方法。接着我们发现index_add这个算子和在我这个项目中实现的功能可以用矩阵乘法来实现。所以我设计了一个[64000, 4000]的tensor来实现这一操作。这一操作在之后训练以及调模型的过程中都没发现问题,但在导出mindir的时候报错。关于这个后面会介绍。loss部分:使用SI-SNR来计算loss,这也是语音分离任务中普遍使用的loss。在这一部分基本没遇到什么困难。Pynative和Graph下跑通在这个过程中参考官方教程进展很顺利,如果大家遇到问题可以参考官方文档。模型调参我在模型调参时,同时在GPU和mindspore下进行调参。将模型由float32改为float16: 由于网络由6层transformer块组成,在Ascend910上由于显存小而跑不起来,所以最后决定将数据预处理和model部分的代码都改为float16,数据预处理部分的代码好改,直接使用cast便可以实现。但模型部分需要对每个算子进行单独处理,例如conv1d,其它的算子也和此相似。使用float16后,不仅可以正常训练,并且速度也加快了。模型初始化:在DPTNet中,一开始我使用的默认初始化,发现效果很差。最后对比torch和mindspore代码发现使用Heuniform效果组好。学习率:源码中使用了固定学习率,但是在实际测试中发现,使用动态学习率效果更好。310推理导出mindir之前提到的用矩阵相乘实现index_add这个算子的过程中使用了一个[64000, 4000]的tensor,导致导出模型时会报如下的错误。最终发现就是由于这个tensor超过2G导致mindir导不出来。最后将这个tensor拆为[8000, 4000], 模型便可以顺利导出了。这一部分参考了库上模型中的310推理,没遇到什么太大的问题。总而言之,在迁移的过程中遇到了很多问题,但最终都得以解决,这得益与和工程师的沟通。所以在迁移过程中,如果发现问题,可以在官网提issue。会有工程师解决你的问题。
  • [模型训练] Mindspore 众智项目 模型迁移经验分享
    开发背景2021.9 - 2021.12 我参加了华为的众智项目的开发,负责了Yolact++的模型迁移任务2022.4 - 2022.10 我参加了华为的众智项目新一期的开发,负责了TasNet的模型迁移任务本文着重分享一下今年做的TasNet的模型迁移任务。项目目标完成TasNet从Pytorch到Mindspore框架的模型迁移任务在迁移过后保证模型910推理精度在Mindspore框架下精度超过Pytorch的代码保证模型能够顺利导出并完成310推理迁移顺序在Pytorch到Mindspore迁移时,我个人建议的迁移顺序是:Pytorch的GPU >> Mindspore的GPUMindspore的GPU >> Mindspore的Ascend在Pynative模式下跑通在Graph下跑通调整模型超参,初始化,开启数据下沉等迁移经验:Pytorch的GPU >> Mindspore的GPU这一部分要介绍的其实不多,这一部分工作量比较小,整体做法可以看作是:当Pytorch框架下代码(源码)的文件中不存在框架代码时,可以直接保留,就像TasNet中的数据前处理,是把数据集中的语音为了后续查找方便,先处理成一个JSON文件,此处并不涉及任何框架内容,所以可以直接保留。当使用了源码中的框架部分(数据加载,训练等)数据加载:这部分可以参考Dataset的操作,思想上和Pytorch非常近似训练:这部分其实要比torch的部分看起来清爽的多,把需要的部分按照模型训练中的介绍的封装好,然后直接调用model.train()就可以直接执行训练模型部分:对于过程中使用的算子,建议参照算子对应的内容,并仔细查看差异对比,必要时建议先构造单算子测试用例,看看不同框架下的差异对比,并适当的选择对应参数如何设置注:在这一部分迁移的过程中,我不建议立即进行训练和调参,根据我的模型开发经验发现,在Mindspore在GPU和Ascend下达到最优精度的参数差别较大,所以不急于进行参数调整。迁移经验:Mindspore的GPU >> Mindspore的Ascend这一部分其实遇到了一些问题,也是前期开发花费时间比较多的地方,这部分迁移代码需要修改的地方不是很多,但都是一些细节的问题。由于早期开发时,我所拿到的Ascend910机器里面的环境还都是MS1.3和MS1.5左右的版本,所以当时很多语法和后来交付时使用的MS1.7和MS1.9的语法和部分算子的内置参数有一些差距,给后来造成了不少的麻烦。比如:TasNet的核心部分是一个4层的LSTM用作语音分离,但是在MS1.3的版本中隐藏层的神经元数量只能使用2的n次幂,使用其他参数会出现一些错误,这个问题在MS1.5及后续版本已经解决,但是在MS1.6版本的时候经过测试发现,在hidden_size不设置为2的n次幂的时候,loss在下降到一定程度便不在下降,但设置为2的n次幂的时候,loss可以正常下降。同样的代码放回到源码,或是Mindspore GPU并没有出现,loss均可以正常下降。解决:通过和华为的工程师进行沟通和一些测试发现,Mindspore Ascend的底层对于非2的n次幂的LSTM的hidden_size缺少一些后续的优化,因此loss在下降一些之后就不再下降,在后续版本应该是已经解决了。(但当时后续版本还没有公开所以我没测试过)迁移经验:在Graph下跑通这一部分其实容易遇到一些问题,但是在我的模型开发中这次遇到的问题较少。相关介绍可以参考动静态图。比如:TasNet对于输入的语音的长度并不是固定的,而是按单位长度进行切割,在切割后,很自然的会有仍参差不齐的语音片段,源码对于它的操作是,当不够单位长时补齐至单位长,但是语音的总长度仍然不一定是一样长的。因此源码将输入后的同一个batch的语音按照该batch中最长的进行补齐。在Mindspore GPU和Mindspore Ascend Pynative下都可以正常运行,但是在Mindspore Ascend Graph下会出现op compile failed,通过提issue和与一些华为的工程师进行沟通,发现在Graph下计算动态长度会出现一些问题,因为代码执行流程是先编译好一张静态图然后进行执行,所以动态部分可能会出现类似的问题。解决:我在我的项目中预先处理好所有的语音进行补齐,这样不仅可以把一些动态长度写死,而且可以优化一些矩阵乘法,总体来说稍微增加了一点显存的使用,但是优化了一些模型训练速度,而且避开了Graph下的编译失败的问题。迁移经验:调整调优我在模型调参时,同时进行Mindspore GPU和Ascend的环境下进行调参,同时输出了一些中间结果进行对比。数据加载:一开始我并没在意数据加载中的问题,因为做了一个小数据集,发现在torch和Mindspore读出来的数据是一致的,顺序也没差别就放在一边了,但是最后交付的时候发现性能差距比较大,因此后期从fp32更换为fp16,实测性能从5000ms/step降为800ms/step,效果还是很明显的。模型初始化:在TasNet中,一开始我使用的默认初始化,发现效果很差,后来经过对比发现Mindspore和torch的nn.conv1d和nn.Dense的初始化差别比较大,通过查看初始化分布观察对应公式,最后修正了部分算子的初始化,出现了很好的效果。但是不是只换成同型的初始化就可以了,比如同样是Uniform也是有区别的,要注意默认参数。当然也不是完全配置成一样的初始化就是最好的,毕竟框架是不一样的,所以还是需要进行大量实验。学习率:源码中使用了固定学习率,但是在实际测试中发现,TasNet在Ascend下使用动态学习率效果更好(前期学习率大一些,后期小一些),当然配置也很容易。# 前10个epoch学习率1e-3, 11-30epoch学习率为3e-4 milestone = [10 * num_steps, 30 * num_steps] learning_rates = [1e-3, 3e-4] lr = nn.piecewise_constant_lr(milestone, learning_rates)loss_scale:在一次测试中发现,适当的修改loss_scale会产生一些意想不到的好的效果。迁移经验:模型导出这一部分其实可以直接查看教程,核心就是下面的内容def export(): args = parser.parse_args() # 配置 context.set_context(mode=context.GRAPH_MODE, device_target="Ascend", device_id=0) # 设置context net = TasNet(...) # 设置网络 param_dict = load_checkpoint(args.ckpt_path) # 加载ckpt load_param_into_net(net, param_dict) # 把参数load进网络 input_mixture = Tensor() # 构建一个同型的输入 export(net, input_mixture, file_name='TasNet_MindIR', file_format='MINDIR') # 导出迁移经验:310推理这一部分当时我们几乎完全参考了库上的模型中的310推理,几乎没做任何改动。只适当修改了执行脚本,没遇到什么太多的问题。总的来说,模型迁移过程中一定要保持多环境下的对比,在遇到问题时一定要即使提issue,有非常多的热心的工程师帮忙解决问题。同时,不要只怀疑自己代码的问题,也适当换着环境进行执行同样的代码。调参时注意模型loss和精度的变化规律,努力找到最好的结果。最后TasNet也顺利交付了,这是我交付的第二个模型,希望以后能更多参与众智的项目。
  • [热门活动] MSG·暴走校园 | 北京邮电大学站来喽,助力校园开发者了解AI新应用!
    # AI进校园随着人工智能的快速发展,人们对于人脸识别,机器学习,无人驾驶等技术不再陌生。人工智能已成为公众意识的最前沿,无论是通过《机械姬》和《终结者》等好莱坞大片,还是关于人工智能在各种任务中超越人类的新闻报道,人们都开始了解这个领域的意义。各大高校也都纷纷开设了人工智能相关专业,培养领域人才,为了让更多校园开发者了解人工智能与深度学习知识,昇思MindSpore在2022年开展了“MSG·暴走校园”活动。活动通过趣味的AI实操课程教学,让同学们更加直观地体验和感知AI互动项目带来的乐趣,激发同学们对创意应用开发的思考和创新,帮助校园开发者更好地了解并使用全场景AI框架昇思MindSpore。11月29日,MSG·暴走校园 继续解锁下一所高校,本次活动我们将携手北京邮电大学的同学们一起探索人工智能领域最前沿动态!活动时间:2022年11月29日(周二)10:00-11:30活动地点:北京邮电大学(校内专场活动)
  • [公告] 加入昇思MindSpore Elec AI SIG,共同构建智能电磁技术
    电磁场看不见、摸不着,却在日常生活中无处不在。电磁场的产生主要源于自然和人工两类。自然产生的电磁场有地磁场、太阳光以及一切物体热辐射产生的电磁波等等。自然电磁场催生并推动了人类的文明:由于太阳光的存在,人类可以在温度适宜的地球居住,可以通过植物的光合作用获取充足的食物;利用地磁场人类可以进行导航,进而迎来了大航海和全球化时代。随着科技的发展,人类已经不满足于自然产生的电磁场,开始主动向环境中发射电磁场,并充分挖掘电磁场的应用潜力。如通信领域中利用无线电波收听广播、利用高频微波进行手机通话等;又如地质勘探中利用电磁波的回波探明煤炭存储等。电磁场的应用不胜枚举,为了能够更好的利用电磁场,人们通过实验、理论以及计算等手段研究电磁场的机理。实验方面,1820年奥斯特在一次讲座上偶然发现通电的导线让小磁针发生偏转,从而发现了电能生磁的现象。1831年,法拉第在实验中发现变化的磁场可以产生电场,即磁也能够生电。麦克斯韦总结前人的工作,提出了位移电流假说(变化的电场能够产生磁场),完善了电生磁的理论。最终,麦克斯韦将电磁场理论用给简洁、对称和完美的数学形式表示出来,即麦克斯韦方程组。随着计算机技术的发展,人们采用数值计算的方式去求解麦克斯韦方程组,模拟电磁场在空间中的分布。这样即可以节省实验的成本,也可以通过仿真设计出更加符合需求的电子设备。传统的电磁计算方法包括精确的全波方法和高频近似方法。全波方法如时域有限差分(Finite-Difference Time-Domain method,FDTD),有限元(Finite-Element-Method,FEM)、矩量法(Method of MoMents,MoM)等;高频近似方法如几何光学法(Geometrical Optics,GO)、物理光学法(physical optics,PO)等。数值计算较好地辅助了电子产品的设计,但传统的数值方法仍存在许多缺陷,如需要进行复杂的网格剖分、迭代计算,计算过程复杂、计算周期长。神经网络具有万能逼近和高效推理能力,这使得神经网络在求解微分方程时具有潜在的优势。为此,昇思MindSpore Elec AI专项兴趣小组(简称:智能电磁AI SIG)正式成立,并面向开源社区招募志同道合的伙伴。1MindSpore Elec AI SIG的使命围绕实际生产中的各类电磁应用场景,在昇思MindSpore框架下探索和研究基于AI的电磁正问题以及反问题。例如开发高效精确的AI电磁模型,构建高效的MindSpore Elec基础工具包,提升电子产品的设计效率等。小组主要开展了如下几个方向的工作:MindSpore Elec基础工具包构建基于MindSpore构建MindSpore Elec基础工具包。基础工具包内置有数据构建及转换、仿真计算以及结果可视化等。1)数据构建及转换:支持CSG (Constructive Solid Geometry,CSG) 模式的几何构建,以及cst和stp数据(CST等商业软件支持的数据格式)的高效张量转换。2)仿真计算:a) AI电磁模型库:提供物理和数据驱动的AI电磁模型,物理驱动无需额外的标签数据,只需方程和初边界条件即可;数据驱动是指训练需使用仿真或实验等产生的数据。b) 优化策略:数据压缩可以有效地减少神经网络的存储和计算量;多尺度滤波、动态自适应加权可以提升模型的精度,克服点源奇异性等问题;小样本学习主要是为了减少训练的数据量,节省训练的成本。3)结果可视化:仿真的结果如S参数或电磁场等可保存在CSV、VTK文件中。MindInsight可以显示训练过程中的损失函数变化,并以图片的形式在网页上展示结果;Paraview是第三方开源软件,具有动态展示切片、翻转等高级功能。AI电磁仿真模型和方法构建1) 端到端可微的传统电磁仿真方法研究:基于MindSpore构筑传统的电磁仿真方法如FDTD/有限元/矩量法等,形成端到端可微的AI融合方法。这样可以利用MindSpore加速传统的数值方法,生成模型训练的数据,也可以基于自动微分机制,实现数据同化、电磁反演等应用。2)AI电磁仿真融合算法研究:物理驱动(如PINNs方法)和数据驱动的AI方法,以及物理和数据融合的算法创新等。AI电磁仿真模型应用1)正问题:基站天线、雷达天线、射频电路与系统等的电磁仿真;2)反问题:电磁超材料设计、雷达勘探、电磁成像等。2MindSpore Elec SIG工作计划前期以成员学术交流活动为主,每月组织线上交流活动,围绕AI电磁中涉及的问题,介绍研究工作进展,讨论研究工作中的难点。后期通过合作开发等模式,在国内高校及企业间开展电磁AI问题的合作研究。3MindSpore Elec AI SIG构成小组领衔成员陆卫兵 东南大学科研院 院长/教授杨武 东南大学信息科学与工程学院 副研究员徐勇 江苏浩云连德信息技术有限公司 高级工程师李家奇 东南大学物理学院 副教授陈新蕾 南京航空航天大学电子信息工程学院 副教授小组成员01、Kyang,昇思MindSpore高级工程师02、翁瑞,东南大学信息科学与工程学院 博士生03、Adrian Lee,昇思MindSpore高级工程师04、Lulu Zhang,昇思MindSpore高级工程师05、秦洁,东南大学软件学院 硕士生06、张哲,东南大学软件学院 硕士生07、孙丁一,东南大学-蒙纳士大学苏州联合研究生院 硕士生08、苑玉杰,昇思MindSpore布道师4MindSpore Elec AI SIG召唤你扫码加入智能电磁AI SIG交流群sig仓:https://gitee.com/mindspore/community/tree/master/sigs/mindelec代码仓:https://gitee.com/mindspore/mindscience/tree/master/MindElec昇思MindSpore开源社区算力使能,快来SIG申请你的专属算力昇思MindSpore为推动SIG发展和开发者活跃,发布社区专属算力使能计划,面向SIG发放海量算力,免费领取。助力开发者了解和掌握全场景AI技术,支撑开发者实践和项目开发,助力开发者全面发展。关于MindSpore SIG昇思MindSpore社区欢迎业界专家、学术伙伴在社区成立特别兴趣小组(SIG),作为社区领域技术代言人,打造领域技术品牌,共建昇思MindSpore开源生态。MindSpore SIG即MindSpore Special Interest Groups,即“昇思特别兴趣小组”,MindSpore社区成立个技术SIG的初衷是为该领域的专家、教授和学生提供一个开放交流的平台,通过会议分享、项目开发等活动促进技术交流、合作共赢,并使得SIG成员的影响力和技术能力得到提升,截止目前,MindSpore SIG共计成立20+。如果你也想成立一个SIG扫码添加小助手了解更多
  • [论文解析] 论文精讲 | 稠密检索新突破:华为提出掩码自编码预训练模型RetroMAE,大幅刷新多项基准
    稠密检索是搜索、推荐、广告等领域的关键性技术;面向稠密检索的预训练是业界高度重视的研究课题。近期,华为泊松实验室联合北京邮电大学、华为昇思MindSpore团队提出“基于掩码自编码器的检索预训练语言模型RetroMAE”,大幅刷新稠密检索领域的多项重要基准。而其预训练任务的简洁性与有效性,也为下一步技术的发展开辟了全新的思路。该工作已录用于自然语言处理领域顶级学术会议EMNLP 2022。基于昇思开源学习框架的模型与源代码已向社区开放。论文名称RetroMAE: Pre-Training Retrieval-oriented Language Models Via Masked Auto-Encoder论文地址https://arxiv.org/abs/2205.12035开源地址https://github.com/mindspore-ecosystem/mindsearch01稠密检索预训练近年来,稠密检索技术被愈发广泛的应用于搜索引擎、开放域问答、推荐系统等场景。与传统的基于“关键词+倒排索引”的检索所方式不同,稠密检索利用深度神经网络理解并建模输入文本的实际含义,并为其生成相应的语义表征向量;借助语义表征向量之间的空间相似性,系统得以精准、快速的获取检索结果。深度学习的繁荣特别是预训练语言模型的出现极大地促进了稠密检索的发展。特别的,以BERT、RoBERTa为代表的预训练语言模型已被普遍用作稠密检索中的骨干网络架构。借助预训练语言模型强大的语义建模能力,稠密检索的精度得到了极大的提升。在BERT、RoBERTa等初代预训练语言模型之后,大量新方法被相继提出,如XLNET、T5、ELECTRA、DeBERTa等。这些新生代预训练语言模型在诸如GLUE、SuperGLUE等通用的自然语言处理评测基准上展现了更为强劲的实力。不过与人们预期不同的是,新生代预训练语言模型并未在稠密检索任务上带来实质的性能提升;时至今日,早期的BERT依然被用作稠密检索中的主流网络。对此,业界的普遍观点是目前常见的预训练学习任务,如MLM、Seq2Seq,并未有效关注到模型的语义表征能力,因而也就与稠密检索对模型能力的诉求南辕北辙。为了克服这一问题,越来越多的学者尝试革新预训练策略以更好的因应稠密检索任务,近年来常被提及的自监督对比学习就是其中的代表。然而,当下基于自监督对比学习的预训练方法存在诸多限制。例如,自监督对比学习的一个重要环节是设计数据增强策略,而受制于“伪正样例”、“平凡正样例”等问题,各类数据增强策略在实际中的性能收益与通用性十分有限。另外,自监督对比学习高度依赖海量负样例,而这一需求也导致巨大的训练开销。就目前的研究现状而言,面向稠密检索的预训练算法依然有很大的亟待完善的空间。02RetroMAE:基于掩码自编码器(Masked Auto-Encoder)的稠密检索预训练不同于以往常见的自监督对比学习方法,生成式的预训练因其学习任务更高的挑战性、对无标签数据更高的利用率、以及无需负采样及数据增强策略等特点,而被近来的检索预训练领域的工作所重视。在此之前,业界已提出了诸如SEED [1]、TSDAE [2]等优秀工作,通过改造传统的Seq2Seq等类型的生成任务,这些工作有效提升了预训练语言模型在稠密检索任务上的表现。受到这些积极信号的启发,RetroMAE继承并拓展了生成式预训练这一技术路线。图1. 基于掩码自编码器的预训练流程示例基础架构:掩码自编码器。RetroMAE采用了经典的掩码自编码器这一架构来预训练模型的语义表征能力。首先,输入文本经掩码操作后由编码器(Encoder)映射为隐空间中的语义向量;而后,解码器(Decoder)借助语义向量将另一段独立掩码的输入文本还原为原始的输入文本(如图1)。图2. 解码增强。双流注意力机制(H1:query stream,H2:content stream),随机生成注意力掩码矩阵(蓝色点:可见位置,灰色点:掩码位置)为了使训练任务更具挑战性、且实现更高的无标注数据利用率,RetroMAE设计了如下三个关键技术。1、非对称的网络结构。编码器采用全尺寸的Transformer网络(如BERT),已实现对深度语义的有效建模。然而,解码器则采用单层的Transformer网络;这一设计不仅提升了解码难度,也使得解码任务可以灵活使用多样化的上下文信息,实现对无监督数据更加充分的利用。2、非对称的掩码率。对于编码器端的输入,RetroMAE采用了“适度的”掩码率,仅仅遮蔽其中15~30%的词汇;而对于解码器端的输入,RetroMAE采用了非常“激进的”掩码率,50~90%的词汇将会被遮蔽。3、解码增强。由于解码器仅由单层Transformer构成,因此,RetroMAE有针对性的设计了增强式的解码策略,即通过生成随机的注意力掩码矩阵(attention mask matrix)以及双流注意力机制(two-stream attention),以实现每个待解码单词对上下文的多样化利用。具体而言,解码器会同时编码两个输入序列,一个作为query stream,另一个作为content stream。此外,解码器将随机生成注意力掩码矩阵,矩阵中的每一行元素标明了每个待解码单词所能感知的上下文位置。在query stream对content stream进行自self-attention的过程中,注意力掩码矩阵将为每个单词过滤掉需要掩码的上下文。由于注意力掩码矩阵的随机性,每个单词所利用的上下文将彼此不同;而解码过程中多样化的上下文信息也将有效提升算法对无标注数据的利用效率。图3. RetroMAE (blue)在BEIR上与BERT (red)、RoBERTa (green)、DeBERTa(purple)的对比图4. RetroMAE在零样本稠密检索基准BEIR上的表现图5. RetroMAE在开放域问答检索基准MS MARCO上的表现03实验探究RetroMAE在零样本学习(zero-shot learning)与监督学习(supervised learning)场景下均展现了极强的稠密检索性能。根据在零样本稠密检索基准BEIR [3]之上的表现(图3、图4),RetroMAE在绝大多数任务中都明显优于BERT、RoBERTa、DeBERTa等传统基线,其平均检索精度更是远超此前同等规模的预训练模型。与此同时,RetroMAE在开放域问答基准MS MARCO [4]上同样表现不俗(图5),其段落检索精度取得了对比RocketQAv2 [5]、AR2 [6]、ERNIE-search [7]、ColBERTv2[8]等近年稠密检索强基线的显著优势。这些实验结果不仅验证了RetroMAE的有效性,更是进一步反映了预训练模型对于稠密检索的巨大意义。目前,RetroMAE已逐步应用于包括网页搜索在内的华为各主要搜索产品,全面提升深度语义检索在实际场景中的有效性。为推动相关技术的进一步发展,RetroMAE的模型、源代码均已向社区开发 [9,10]。04昇思MindSpore AI框架昇思MindSpore是华为推出的全场景AI框架,旨在实现易开发、高效执行、全场景覆盖三大目标,为数据科学家和算法工程师提供设计友好、运行高效的开发体验。作为近年来人工智领域备受瞩目的议题,大规模预训练模型是昇思MindSpore框架着重打造的能力。为此,开发人员设计实现了MindSpore Transformer等套件,构建集模型训练、推理、部署为一体的全流程服务,实现从单GPU到大规模集群训练的无缝切换,并提供包括数据并行、模型并行、流水线并行在内的完备的训练策略。此前,MindSpore框架已成功支持包括盘古大模型在内的众多大规模预训练任务。RetroMAE是昇思MindSpore框架的又一次成功实践。得益于昇思MindSpore深度协同优化的高性能算子库,RetroMAE得以充分释放硬件算力,高效的实现了基于海量无标注数据的预训练任务。未来,华为将继续借助昇思MindSpore框架打造一流的深度语义检索能力,助力更加智慧、精准的搜索体验。参考文献[1] Less is More: Pre-train a Strong Text Encoder for Dense Retrieval Using a Weak Decoder[2] TSDAE: Using Transformer-based Sequential Denoising Auto-Encoder for Unsupervised Sentence Embedding Learning[3] BEIR: A Heterogenous Benchmark for Zero-shot Evaluation of Information Retrieval Models[4] MS MARCO: A Human Generated Machine Reading Comprehension Dataset[5] RocketQAv2: A Joint Training Method for Dense Passage Retrieval and Passage Re-ranking[6] Adversarial Retriever-Ranker for dense text retrieval[7] ERNIE-Search: Bridging Cross-Encoder with Dual-Encoder via Self On-the-fly Distillation for Dense Passage Retrieval[8] ColBERTv2: Effective and Efficient Retrieval via Lightweight Late Interaction[9] https://github.com/staoxiao/RetroMAE[10] https://github.com/mindspore-ecosystem/mindsearch
  • [安装经验] MindSpore 2.0.0 for Windows GPU泄漏版尝鲜
    在看了MindSpore架构师王磊老师的帖子(  https://zhuanlan.zhihu.com/p/574507930 )之后,本来张小白要源码编译MindSpore for Windows GPU版的,尽管已经安装了CUDA 11.1和配套的cuDNN 8.6.0 for CUDA 11.X( cid:link_1  ),但是由于各种意外,编译的进度停滞了。然而,凭一点点小道消息,张小白发现了别人编译好的pip安装包:嗟来之食张小白也可以吃的,毕竟饿了很久了,慌不择路饥不择食也是情有可原的。于是,开干!从上面的文件名 mindspore_gpu-2.0.0-cp37-cp37m-win_amd64.whl 可以看出,这个whl包应该是用Python 3.7编译的。首先打开Windows的命令行,查看下当前的Python版本:正好对应了。所以如果文件名是 xxx_cp39_cp39m_xxxx.whl,张小白会怎么办?显然是要先准备一个Anaconda的Python 3.9环境再安装。这个思路不知道读者们Get到了没有。。不过,这个时候必须要解决一下 安装了CUDA和cuDNN之后的一个小BUG(这其实是源码编译发现的问题,等张小白真的源码编译成功后再仔细解释这件事儿)就是在 CUDA 11.1和配套的cuDNN 8.6.0 for CUDA 11.X安装手册( cid:link_1  )中,简单的将cuDNN解压是不行的:因为MindSpore会直接到$CUDNN_HOME的lib下找文件,而不是到lib/x64目录下找。所以,自然需要将上图左边的文件拷贝到 $CUDNN_HOME的lib目录下。好了,这个小插曲解决了之后,我们再来安装MindSpore 2.0.0 for Windows GPU版吧!pip install mindspore_gpu-2.0.0-cp37-cp37m-win_amd64.whl这就装好了?!张小白有点不相信自己的眼睛(后来的事实表明,确实没那么简单)再安装MindVision:pip install mindvision...打开 cid:link_0下载 mindspore_quick_start.pypython mindspore_quick_start.py --device_target=GPU奇怪,刚才不是装过了mindvision了吗?怎么还会报找不到mindvision的错?难道pip被装到了不该装的地方?那只有一个办法:使用python -m pip install xxx这种安装法了。python -m pip install mindspore_gpu-2.0.0-cp37-cp37m-win_amd64.whlpython -m pip install mindvision下载验证脚本:打开 cid:link_0下载可以获得 mindspore_quick_start.py 文件。GPU的第一次验证:python mindspore_quick_start.py --device_target=GPU好像有点卡:不过居然走下去了:从目录结构可以看出,它自动创建了lenet和mnist两个目录,然后下载了mnist数据集,然后开始例行的训练、评估、推理流程:虽然10轮epoch都已经做完了,但是python代码迟迟没有退出:恐怕真的有点什么问题。张小白强行中断了当前脚本的执行。先用以前在ubuntu的GPU环境中常用的test.py脚本试试:编辑test.py执行python test.py奇怪,这倒是OK的。应该说明MindSpore GPU版应该是没问题的。再来试试:python mindspore_quick_start.py --device_target=GPU。。。关闭图形的小窗口后:居然打印出来了训练的结果:预测:126133,实际126133。嗯,孺子可教也!不过张小白总觉得GPU训练的时间有点慢,不如用CPU方式训练比较一下:python mindspore_quick_start.py --device_target=CPUCPU训练后居然会出现有个图片推理结果错误了。但是这也许不重要。我们看下训练的速度比较:epochGPUCPU024977264421414454464426085760892380228836564958719873551122461170806128539131625715876316434181637341670899179141183806看来不能光靠感觉,得靠数字说话,虽然LeNet是个最简单的网络,但是张小白这台2019年的笔记本的GPU的训练速度还是比CPU略快的。后记:1.其实很开心看到MindSpore 2.0.0 for Windows GPU版本的出台,这使得有独立显卡的兄弟们,不用双系统,也不用wsl,可以一边打原神,一边进行猫狗训练了。2.源码编译虽然不成功,但是用别人的成果尝鲜还是必要的。毕竟这个周末,可能这个消息是令不知道师张小白最为兴奋的事情了。安装包下载地址:链接:https://pan.baidu.com/s/1Gl6Tz97IKszl11AJxdefwQ  提取码:5vok
  • [基础知识] 【转载】吴恩达来信2022-11-24:AI的发展需要更多尊重与理解
    【编者按】吴恩达是AI界的翘楚。他在知乎上一直有个专题,叫做《吴恩达来信》。信中时常用中英文对AI的过去、现在和未来做了分析,对人醍醐灌顶或者发人深省。下面是张小白对这些文章的转载,仅供学习之用,不用于商业目的,如有侵权请告知。Dear friends,Last week, Facebook’s parent company Meta released a demo of Galactica, a large language model trained on 48 million scientific articles. Two days later, amid controversy regarding the model’s potential to generate false or misleading articles, the company withdrew it.Is Galactica dangerous? How should researchers, as well as the broader AI community, approach such developments?Michael Black, director of the Max Planck Institute for Intelligent Systems, raised concern about Galactica’s potential for harm by generating seemingly authoritative scientific papers that are factually bonkers. Meta chief AI scientist Yann LeCunvigorously defended the model. He pointed out that, despite worries that people might misuse large language models (LLMs), it largely hasn’t happened.At the risk of offending both sides, let me share my take.I support the Galactica researchers. Their scientific work on large language models is technically interesting and impressive. Their model does well on tasks such as mathematical reasoning and answering multiple-choice questions.When a technology shows potential to cause significant harm, it’s important to carefully assess the likely benefits against the likely harm. One problem with the way Galactica was released is that we don’t yet have a robust framework for understanding of the balance of benefit versus harm for this model, and different people have very different opinions. Reading through the paper, I see potential for exciting use cases. I also see risk of large-scale fakery that could cause harm. While I support the technical work, I would prefer that the demo had been released only after a more thorough assessment.Prior to a careful analysis of benefit versus harm, I would not recommend “move fast and break things” as a recipe for releasing any product with potential for significant harm. I would love to see more extensive work — perhaps through limited-access trials — that validates the product’s utility to third parties, explores and develops ways to ameliorate harm, and documents this thinking clearly.That said, I would also love to see less vitriol toward researchers who are trying to do their best. People will differ on the best path forward, and all of us sometimes will be right and sometimes will be wrong. I believe the Meta researchers are trying to do their best. Whether we agree or disagree with their approach, I hope we’ll treat them with respect.Part of the disagreement likely stemmed from widespread distrust of Meta, where a focus on maximizing user engagement has contributed to social polarization and spread of disinformation. If a lesser-known or more-trusted company had released Galactica, I imagine that it would have had more leeway. For instance, Stability AI released its Stable Diffusion text-to-image model with few safeguards. The company faced little criticism, and so far the model has spurred greatcreativityand littleharm. I don’t think this is necessarily an unfair way to approach companies. A company’s track record does matter. Considering the comparatively large resources big companies can use to drive widespread awareness and adoption of new products, it’s reasonable to hold them to a higher standard.The authors withdrew the model shortly after the controversy arose. Kudos to them for acting in good faith and responding quickly to the community’s concerns.When it comes to building language models that generate more factually accurate output, the technical path forward is not yet clear. LLMs are trained to maximize the likelihood of text in their training set. This leads them to generate text that sounds plausible — but a LLM that makes up facts can also perform well on this training objective.Some engineers (including the Galactica’s team) have proposed that LLMs could be an alternative to search engines. For example, instead of using search to find out the distance to the Moon, why not pose the question as a prompt to a language model and let it answer? Unfortunately, the maximum-likelihood objective is not well aligned with the goal of providing factually accurate information. To make LLMs better at conveying facts, research remains to be done on alternative training objectives or, more likely, model architectures that optimize for factual accuracy rather than likelihood.Whether a tool like Galactica will be more helpful or harmful to society is not yet clear to me. There will be bumps in the rollout of any powerful technology. The AI community has produced racist algorithms, toxic chatbots, and other problematic systems, and each was a chance to learn from the incident and get better. Let’s continue to work together as a community, get through the bumps with respect and support for one another, and keep building software that helps people.Keep learning!Andrew亲爱的朋友们,上周,Facebook的母公司Meta发布了Galactica的demo版本,这是一个在4800万篇科学文章上进行训练的大型语言模型。两天后,在关于该模型可能产生虚假或误导性文章的争议中,Meta撤回了这个模型。Galactica危险吗?研究人员以及更广泛的人工智能社区应该如何应对这种发展?马克斯·普朗克智能系统研究所所长Michael Black提出,Galactic生成的一些看似权威实际却是疯狂的的科学论文,可能导致潜在危害的担忧。Meta首席人工智能科学家Yann LeCun则大力捍卫该模型。他指出,尽管有人担心大型语言模型(LLMs)可能会被滥用,但这种情况在很大程度上并没有发生。冒着可能冒犯双方的风险,让我分享一下我的感受。● 我支持Galactica的研究人员。他们在大型语言模型上实践的科学工作实际上是很有趣的,令人印象深刻。他们的模型在数学推理和回答多项选择题等任务上表现良好。● 当一项技术显示出可能造成重大伤害时,仔细进行评估可能带来的好处和伤害是很重要的。Galactica的发布方式存在一个问题,即我们还没有一个稳健的框架来理解这个模型在利与弊上的平衡,不同的人有非常不同的观点。通过阅读这篇论文,我看到了令人兴奋的用例的潜力。我也看到了可能造成伤害的大规模造假的风险。虽然我支持技术工作,但我更希望模型的demo版本能够在经过更彻底的评估后再发布。● 在仔细分析利弊之前,我不建议将“快速行动,打破常规”作为发布任何可能产生重大危害的产品的处方。我希望看到更广泛的研究——也许是通过有限获取的试验——来验证产品对第三方的效用、探索和开发减轻伤害的方法,并清楚记录这些想法。● 也就是说,我也希望大家对那些努力工作的研究人员少一些尖刻的批评。人们对于最好的前进道路会有不同的看法,有时会对,有时会错。我相信Meta的研究人员一定也是尽力在做他们觉得正确的事情。无论我们是否同意他们的做法,都应该尊重他们。● 部分分歧可能源于对Meta的普遍不信任,Meta专注于最大化用户粘性,导致了社会两极分化和虚假信息的传播。如果Galactica由一家不太知名或更值得信任的公司发布,它可能会有更多的回旋余地。例如,Stability AI发布的Stable Diffusion文本-图像模型几乎没有任何安全保护。该公司也几乎没有受到批评,到目前为止,该模型激发了巨大的创造力,几乎没有带来伤害。我并不认为这是对待公司的一种不公平的方式。一家公司的业绩记录确实很重要。考虑到大公司可以使用相对较大的资源来推动新产品的广泛认识和采用,对它们提出更高的标准也是合理的。● 在争议出现后不久,Meta撤回了该模型。他们的行动是真诚的,并对社群关注的问题作出了迅速的回应,对此我们应向他们致敬。当人们谈到构建生成更准确的输出的语言模型时,前方的技术道路还不明朗。LLMs被训练用于最大化其训练集中文本的似然性。这导致他们生成看起来似是而非的文本——但一个编造事实的LLM也可以在这一训练目标上表现良好。一些工程师(包括Galactica团队)提出LLMs可以作为搜索引擎的替代品。例如,与其使用搜索引擎来查找地球到月球的距离,为什么不将问题作为提示文本提交给语言模型,让它来回答呢?不幸的是,最大似然目标与提供事实准确信息的目标并不一致。为了让LLMs更好地传达事实,还需要对其他训练目标进行研究,或者更有可能的是,对事实准确率而不是可能性进行优化的模型架构。我目前还无法下定论像Galactica这样的工具对社会是有益还是有害的。任何强大的技术的推广过程中都会有颠簸。人工智能社群已经产生了种族歧视算法、有毒聊天机器人和其他有问题的系统,每一个都是从事件中学习并变得更好的机会。让我们继续作为一个社群来工作,在相互尊重和支持的情况下度过难关,继续开发有益于社会的软件。请不断学习!吴恩达发布于 2022-11-24 20:21原帖作者:吴恩达原帖标题:吴恩达来信:AI的发展需要更多尊重与理解原帖地址:cid:link_8
  • [基础知识] 【转载】吴恩达来信2022-11-17:用 AI 解放双手
    【编者按】吴恩达是AI界的翘楚。他在知乎上一直有个专题,叫做《吴恩达来信》。信中时常用中英文对AI的过去、现在和未来做了分析,对人醍醐灌顶或者发人深省。下面是张小白对这些文章的转载,仅供学习之用,不用于商业目的,如有侵权请告知。Dear friends,The population of Earth officially reached 8 billion this week. Hooray! It’s hard to imagine what so many people are up to. While I hope that humanity can learn how to leave only gentle footprints on the planet, I’m excited about the creativity and inventiveness that a growing human population can bring.One measure of human progress is the dwindling percentage of people involved in agriculture. If a smaller fraction of the population can generate enough calories to feed everyone, more people will have time to build houses, care for the sick, create art, invent new technologies, and do other things that enrich human life.Today, roughly 1.5 percent of U.S. jobs are in farming, which enables most of us here to pursue other tasks. Still, a lot of people are involved in various forms of routine, repetitive work. Just as the agricultural workforce fell over centuries from a majority of the population to a tiny minority, AI and automation can free up more people from repetitive work.This is important because we need lots of people to work on the hard tasks ahead of us. For instance, deep learning could not have reached its current state without a large community building on one another’s work and pushing ideas forward. Building applications that will improve human lives requires even more people. Semiconductors are another example: Building a modern chip requires clever effort by many thousands of people, and building the breakthroughs that increase processing power and efficiency as Moore’s Law fades will take even more. I’d like to see a lot more people pushing science and technology forward to tackle problems in energy, health care, justice, climate change, and artificial general intelligence.I love humanity. We must do better to minimize our environmental impact, but I’m happy that so many of us are here: more friends to make, more people to collaborate with, and more of us to build a richer society that benefits everyone!Keep learning!Andrew亲爱的朋友们:本周,地球人口正式达到80亿。好诶!很难想象这么多人都在做些什么。希望人类能够学会如何在这个星球上只留下温柔的足迹的同时,我也对不断增长的人口能够带来的创造力和创造力感到兴奋。衡量人类进步的一个指标是从事农业的人口比例不断下降。如果一小部分人口能够生产出足够的能量来养活其他人,那么更多的人将有时间建造房屋、照顾病人、创造艺术、发明新技术,以及从事其他丰富人类生活的工作。以现在的美国为例,大约有1.5%的工作来自于农业领域,这使美国国内的大多数人能够从事其他工作。尽管如此,许多人仍在从事各种形式的日常重复性工作。正如几个世纪以来农业劳动力从大多数人口减少到少数人口一样,人工智能和自动化可以让更多的人从重复性工作中解放出来。这一点很重要,因为我们需要很多人来完成我们所面临的艰巨任务。例如,如果没有一个大型社群在彼此的工作基础上建立并推动想法的实现,深度学习就不可能达到目前的状态。构建能够改善人类生活的应用程序需要更多的人参与其中。半导体是另一个例子——制造一个现代芯片需要成千上万的人的智慧努力,但随着摩尔定律的消退,完成提高处理能力和效率的突破将耗费更多的时间。我希望看到更多的人能推动科技进步,以解决能源、医疗、司法、气候变化和人工智能等方面的问题。我热爱人类。我们必须做得更好以尽量减少对环境的影响,但我很高兴我们中的许多人都可以在AI社群里:结交更多朋友、与更多人合作,能有更多人参与建设一个惠及所有人的更富裕的社会!发布于 2022-11-17 14:21原帖作者:吴恩达原帖标题:吴恩达来信:用 AI 解放双手原帖地址:cid:link_1
  • [基础知识] 【转载】吴恩达来信2022-11-11:携手对抗全球经济下滑
    【编者按】吴恩达是AI界的翘楚。他在知乎上一直有个专题,叫做《吴恩达来信》。信中时常用中英文对AI的过去、现在和未来做了分析,对人醍醐灌顶或者发人深省。下面是张小白对这些文章的转载,仅供学习之用,不用于商业目的,如有侵权请告知。Dear friends,The economic downturn of the past six months has hit many individuals and companies hard, and I’ve written about the impact of rising interest rates on AI. The effects of high inflation, the Russian war in Ukraine, and an economic slowdown in China are rippling across the globe. Even though unemployment in the U.S. is low, within the tech world, I continue to hear things that point to the possibility that we might go through a challenging time for many months to come.The layoffs at Twitter and Meta are well publicized. Anecdotally, I’ve heard many worrisome stories: Students are having a hard time finding internships for next summer, entrepreneurs are having greater difficulty raising capital, companies are freezing hiring and reducing headcount, and employees are facing effective pay cuts as falling share prices reduce the value of their stock-based compensation. Some managers have told me they want to preserve their machine learning teams — which they hired with great difficulty — but the tech market has cooled and likely will take a while to pick up.What can we do amid the turmoil? Even if the tech world slumps, the long-term value of AI is still clear to me, and it’s worth lifting our eyes toward the future to position ourselves for the eventual rebound.I’d like to draw attention to three investments that I believe will retain or increase their value even in uncertain times. If you’re wondering where to put your effort, attention, or money, consider these areas:Deep technology.AI technologies from programming frameworks like TensorFlow and PyTorch to algorithmic breakthroughs like transformers and diffusion models have deep and long-lasting value.Deep techis difficult to build, and it transforms the way we do AI. I’m continuing to work on deep tech in data-centric AI. Collectively we should keep working to build deep tech, and I’m confident that the long-term benefits to society will be profound.Training.During a bumpy job market, many people stay in school longer (if they can afford it) in the hope of graduating into a healthier job market. Real expertise in technology will continue to hold tremendous value because it helps you to shape the future. So if you’re not sure what to invest in, keep investing in your own technical skills. Wherever the world ends up, people with deep technical skill in AI will be in demand.Community.Having lived in different places, I’ve seen first-hand how some cities have strong communities, where neighbors watch out for each other and lend a helping hand when people are down on their luck, and weak ones, where hardly anyone knows anyone else, and falling sick means having to take care of yourself. The AI community has always been stronger together. If we can step back from wondering how to build our next project or get that promotion and, instead, ask how we can help others around us, the investment in human relationships will have tremendous value.Whether or not the economic downturn affects you, I’m here to support you. As we sail through a potentially tough time in the coming months, remember that the long-term impact of AI has been and will continue to be huge. Let’s keep helping each other and investing in things that will make us stronger for when the world exits its current slump.Keep learning!Andrew亲爱的朋友们:过去6个月的低迷经济重创了许多个人和公司,我曾谈论过利率上升对人工智能的影响。高通胀、俄乌战争以及中国国内经济放缓带来的影响正在全球蔓延。尽管美国的失业率很低,但在科技界,我不断听到了一些消息,表明我们可能会在未来几个月经历一段充满挑战的时期。Twitter和Meta声势浩大地裁员震惊全球。我听到许多令人担忧的传闻:学生们很难在毕业前找到的实习机会、企业家筹集资金的难度更大、公司停止招聘并进行裁员;随着股价的下跌,基于股票的薪酬价值也随之下降,员工因此面临着实际降薪。一些公司经理告诉我,他们希望保留公司的机器学习团队(当初下了很大功夫才组建起来),但科技市场已经降温,可能需要一段时间才能复苏。我们能在全球动荡中做些什么?即使科技行业不景气,人工智能的长期价值在我看来依然清晰可见,我们有必要放眼未来,为终将到来的反弹做好准备。我想请大家注意三个方面的投资,我认为它们即使在不稳定的时期也会保值或增值。如果你不知道该把精力、注意力或金钱放在哪里,可以考虑以下几个方面:*深度技术。从TensorFlow和PyTorch等编程框架到transformer和扩散模型等算法突破,AI技术具有深远而持久的价值。深度技术很难被建立,它改变了我们实践人工智能的方式。我正在继续研究以数据为中心的人工智能的深度技术。我们应共同努力,打造深度科技,我相信这为社会带来的积极影响将是深远的。*加强培训。在动荡的就业环境中,许多人选择了继续深造(如果他们能负担得起),希望毕业后进入一个更健康的就业市场。真正的技术专长将继续拥有巨大的价值,因为它能帮助你塑造未来。所以,如果你不确定该在哪个方面进行投资,那就继续投资你自己的技术技能。无论世界最终走向何方,都会需要在人工智能方面拥有深厚技术技能的人。*壮大社群。因为在不同的地方生活过,我亲眼目睹了一些城市的社区是如何壮大的,在那里,邻居们互相照顾,在人们运气不好的时候伸出援助之手;而在一些城市的社区中,几乎没有人认识其他人,生病意味着必须自己照顾自己。人工智能社群团结在一起总会是更强大的。如果我们能从思考如何建立下一个项目或获得晋升的问题中退一步,转而问问我们如何帮助身边的人,那么在人际关系上的投资将会有巨大的价值。无论你们是否受到了经济衰退的影响,我都会与大家站在一起。当我们携手度过未来几个月潜在的艰难时期时,请记住,人工智能将持续带来巨大且长期的影响。让我们继续相互扶持,投身于在全球走出阴霾时能让我们变得更强大的事物。请不断学习!吴恩达发布于 2022-11-11 09:33原帖作者:吴恩达原帖标题:吴恩达来信:携手对抗全球经济下滑原帖地址:cid:link_3
  • [执行问题] CNN+DNN训练,过了100个epoch后报错了,怎么回事?
    !!怎么报错了呢?小白一个,求解求解!!!!
总条数:3176 到第
上滑加载中