• [技术干货] 华为云AI论文精读会2021第九期:多卡昇腾环境实现MindSpore DenseNet 分类训练
    2021年7月5日如约举办了华为云AI论文精读会2021第九期:多卡昇腾环境实现MindSpore DenseNet 分类训练嘉宾是苏州大学计算机软件技术专业 周一锋本次论文精读的领域是MindSpore,嘉宾进行了超级详细的讲解,对MindSpore感兴趣又觉得困难的小伙伴,赶快快来学习一下~华为云AI论文精读会致力于让更多人低门槛使用经典算法,助力AI开发者基于ModelArts,实现高效率论文复现和挑战!观看地址:https://res-static.hc-cdn.cn/cloudbu-site/china/zh-cn/competition/1625448245600070042.mp4华为云AI论文精读会2021·论文算法实战赛报名地址:https://competition.huaweicloud.com/information/1000041393/introduction
  • [技术干货] 探索神经网络三维魔方|MindSpore训练和端测部署TinyNet | NeurIPS 2020
    来自华为诺亚方舟实验室、北京邮电大学以及香港科技大学的研究者们提出了一个新的轻量模型范式TinyNet。相比于EfficientNet的复合放缩范式(compound scaling),通过TinyNet范式得到的模型在ImageNet上的精度要优于相似计算量(FLOPs)的EfficientNet模型。例如, TinyNet-A的Top1准确率为76.8% ,约为339M FLOPs,而EfficientNet-B0类似性能需要约387M FLOPs。另外,仅24M FLOPs 的TinyNet-E的准确率达到59.9%,比之前体量相当的MobileNetV3高约1.9%。注:上图部分来源于:https://link.zhihu.com/?target=https%3A//www.youtube.com/watch%3Fv%3DmqOdIYxxNCs转载自Mindspore首席架构师金雪锋:https://zhuanlan.zhihu.com/p/325923211论文链接:https://link.zhihu.com/?target=https%3A//arxiv.org/pdf/2010.14819.pdfhttps://https://link.zhihu.com/?target=https%3A//arxiv.org/pdf/2010.14819.pdfhttps://link.zhihu.com/?target=https%3A//arxiv.org/pdf/2010.14819.pdfhttps://link.zhihu.com/?target=https%3A//arxiv.org/pdf/2010.14819.pdfhttps://link.zhihu.com/?target=https%3A//arxiv.org/pdf/2010.14819.pdf0开源地址:https://link.zhihu.com/?target=https%3A//gitee.com/mindspore/mindspore/tree/master/model_zoo/research/cv/tinynet简介深度卷积神经网络(CNN)在许多视觉任务中取得了很大成功。然而,如果要在移动设备上部署AI模型,我们需要持续调整网络深度(模型层数)、宽度(卷积通道的数量)和图像分辨率这些网络结构要素来优化内存使用并减少延迟。EfficientNet在模型深度,宽度,图像分辨率这三个维度复合缩放来调整神经网络结构。然而EfficientNet更多关注在如何产生大体量的模型,轻量模型的设计有待更好的发掘。一个直接的方法是应用EfficientNet的缩放公式。例如,我们可以进一步缩小EfficientNet-B0,并得到一个具有200M FLOPs的EfficientNet-B-1。然而这种策略无法得到最有效的模型。我们随机生成了100个通过改变基线模型EfficientNet-B0的三维(模型深度,宽度,图像分辨率)得到的网络模型。这些模型的计算量小于或等于基线模型(图1)。我们发现这其中最佳模型的精度比用EfficientNet缩放公式得到的模型高出约2.5%。本文研究的是模型精度和三个维度(模型深度,宽度,图像分辨率)的关系并希望探索出比EfficientNet更优的模型压缩范式。首先,我们发现对于轻量模型,图像分辨率和模型深度比宽度更重要。然后我们指出,EfficientNet的复合放缩方法不再适合为移动设备设计轻量网络。因此,我们通过对于前沿模型(图1中的红线)的大量实验和观察探索了一个新的压缩模型的范式‘Tiny Formula’。具体来说,给定FLOPs上限,我们通过在前沿模型上进行高斯过程回归,并用‘Tiny Formula’计算最佳输入图像分辨率和模型深度。然后根据最大FLOPs的约束来确定模型的宽度。论文中所提出的‘Tiny Formula’简单有效:例如, TinyNet-A的Top1准确率为76.8% ,计算量约为339M FLOPs,而EfficientNet-B0类似性能需要约387M FLOPs。另外,仅24M FLOPs 的TinyNet-E在ImageNet上图像分类的准确率达到59.9%,比当前体量相当的MobileNetV3高约1.9%。该文章原创地研究了如何通过同时改变分辨率、深度和宽度来生成微小且有效的神经网络。图像分辨率,模型深度和宽度对精度的影响我们发现,高精度模型的输入图像分辨率大约在0.8到1.4之间。当r < 0.8时,分辨率越大,精度越高,而当r > 1.4时精度略微下降。在深度方面,高性能的模型深度从0.5到2不等。当固定计算量时,模型宽度与精度大致呈负相关。好模型主要分布在w < 1处。从图2中我们也发现EfficientNet-B-1精度只有75.8%,精度比相同计算量下的最佳模型要差很多。因此我们需要探索一种新的模型放缩公式,在计算量的约束下获得更好的模型。探索最优Tiny Formula为了寻找这样的函数,我们从[0.25,4]这个区间内对r, d, w进行随机采样,采样出n个参数组合。根据参数组合对基础模型的r, d, w进行改变,得到n个新模型,同时计算出n个新模型的计算量。我们根据计算量和精度,从这n个新模型中选出在帕累托前沿的m个模型(m <= n),这m个模型是我们需要的优秀模型,从而得到其r, d, w与计算量之间的关系。比如,我们得到三个关系如下所示:我们使用高斯过程回归来拟合上述3张图的3个曲线。以分辨率r为例,图中的m个点的横纵坐标分别为计算量FLOPs和分辨率其他2个曲线公式也可以通过类似的方式得到。得到了上述拟合曲线公式,用户只要输入想要的计算量c*,就可以得到预测的r*,d*,w*值。通过(r*,d*,w*)对基础模型EfficientNet的宽度、深度和输入分辨率进行改变,就可以得到计算量为c*的TinyNet模型。实验结果通过改变计算量系数c的值(c = {0.9, 0.5, 0.25, 0.13, 0.06})我们生成了5个轻量模型,TinyNet-A 到E。跟已有的方法相比,在同等计算量量的情况下,我们的方法能够得到性能更优的模型。其中,RA表示Random Augmentation, 一种自动数据增强的方法。MindSpore 代码实现相关训练与推理代码,以及使用方法已经开源在:https://link.zhihu.com/?target=https%3A//gitee.com/mindspore/mindspore/tree/master/model_zoo/research/cv/tinynet为了方便大家验证我们的结果,以及创新,我们将模型的结构,以及超参数的设置汇总到了相关代码仓的/script文件夹,我们同时提供了多卡分布式训练的启动脚本。参数设置以单卡训练脚本train_1p_gpu.sh为例:如果想切换其他的TinyNet模型,只需在—model的位置将模型从tinynet_c更改即可。相关模型结构定义在/src/tinynet.py中:其中EfficientNet-B0为基线模型,它的输入图像分辨率,宽度和深度三维值为(1,1,1)。TinyNet模型沿用了EfficientNet的模块化设计,其中又分为DepthwiseSeparableConv , InvertedResidual,SqueezeExcite,DropConnect,这些模块等。每一个模块都衍生自mindspore.nn.Cell。这些模块统一在GenEfficientNet中被调用,并依据用户给出的图像分辨率,宽度和深度三个数值生成神经网络。MindSpore的网络定义请参考:https://www.mindspore.cn/tutorial/training/zh-CN/master/use/defining_the_network.html数据集的加载定义在了/src/dataset.py中,主要使用了MindSpore强大的数据集加载和处理工具mindspore.dataset。具体使用方法大家可以参考:https://www.mindspore.cn/tutorial/training/en/master/use/load_dataset_image.html模型权重的指数移动平均(Exponential Moving Average),模型精度验证和训练数据的记录定义在了/src/callback.py。利用mindspore.train.callback模块,用户可以灵活地选择每一步训练或每一轮epochs后希望进行的操作,例如模型验证,Loss打印,模型保存,权重平均等。具体使用方法大家可以参考:https://www.mindspore.cn/doc/api_python/zh-CN/master/mindspore/mindspore.train.html最后,我们使用MindSpore Lite工具转换了模型权重,并测试了EfficientNet和TinyNet在华为P40上的推理时延。TinyNet-A比EfficientNet-B0的运行速度快15%,但其精度与EfficientNet-B0相似。TinyNet-E与EfficientNet-B-4相比,在同等时延下,精度提升3.2%。端测模型转换,部署等请参考:https://link.zhihu.com/?target=https%3A//www.mindspore.cn/lite本文转自:https://zhuanlan.zhihu.com/p/326022740
  • [技术干货] MindSpore首发:诺亚NeurIPS 2020多篇轻量化技术端侧模型
    本文来源:https://mp.weixin.qq.com/s/H1zg3ezZDdXQ-IQ7ki0Mtw国际人工智能顶级会议NeurIPS 2020(Conference on Neural Information Processing Systems, 神经信息处理系统大会)在12月6日至12日举行。本届会议无论是论文投稿数量还是接受率都创下了历史记录。随着卷积神经网络的广泛使用和在视觉类应用的巨大成功,如何克服计算和存储资源限制将卷积神经网络部署到智能手机和穿戴设备等端侧设备的模型轻量化技术越发重要。本文将对华为诺亚方舟实验室入选NeurIPS 2020的模型轻量化技术工作进行介绍,涵盖了剪枝、结构蒸馏以及量化等几个方向,并且放出对应MindSpore首发端侧模型获取链接↓https://www.mindspore.cn/resources/hubSCOP:Scientific Control for Reliable Neural Network Pruning  现有的剪枝方法基于各种假设条件近似估计神经网络节点对整体网络的重要性然后进行节点剪枝,往往存在结果不可靠而导致网络精度下降。   华为诺亚方舟实验室和北京大学联合提出了一种科学控制机制最小化剪枝节点对网络输出的影响。采用这种剪枝方法,能够实现ImageNet数据集上仅损失ResNet101网络0.01%的top-1准确率,模型参数量和计算量分别减少57.8%和60.2%,显著优于SOTA方法[1]。 原理对于剪枝方法,最重要的过程是评估卷积神经网络节点的重要性,在尽量不影响预训练网络性能的前提下删除不重要的网络节点。一种典型的节点重要性评估假设是权重Norms越小节点重要性低进而被剪掉[2][3]。考虑到输入数据,有的剪枝方法评估网络节点和最终损失函数之间的关系并用泰勒展开进行近似,保留与最终损失函数关系更密切的节点[4]。但是这些方法都会不可避免的引入大量潜在影响因子,最终影响剪枝过程,例如不同信道之间的相互依赖可能误导基于权重Norms的方法,因为一些不含重要信息的节点权重Norms很大,基于输入数据的方法的权重重要性对数据很敏感,剪枝结果不稳定。结果将本文提出的SCOP在公开数据集ImageNet上进行实验,对ResNet系列网络预训练模型进行剪枝验证了SCOP的有效性,实验结果如下表1.1。相比于现有SOTA剪枝方法GAL[5]和PFP[6],SCOP方法得到的剪枝后网络无论是网络精度还是模型大小即参数量减少比例都表现出很大的优势。使用SCOP算法在Oxford-IIIT Pet数据集对ResNet50网络剪枝的网络resnet-0.65x_v1.0_oxford_pets已基于MindSpore首发,可分别从MindSpore modelzoo 和Hub获取训练代码和模型。论文链接:https://proceedings.neurips.cc/paper/2020/file/7bcdf75ad237b8e02e301f4091fb6bc8-Paper.pdf代码链接:https://gitee.com/mindspore/mindspore/tree/master/model_zoo/research/cv/resnet50_adv_pruning模型链接:https://www.mindspore.cn/resources/hub/details?noah-cvlab/gpu/1.0/resnet-0.65x_v1.0_oxford_pets ResNet通过引入残差连接,使得我们可以有效地训练几十到上百层的网络结构。但与此同时,也不可避免的引入了额外的计算消耗。比如当进行在线推理时,ResNet50中的残差占据了特征图整体内存消耗的大约40%,因为之前网络层的特征结果无法被释放,直到后续的残差计算结束。华为诺亚方舟实验室提出了一种新的CNN模型训练方法—基于残差蒸馏的联合训练框架Joint-training framework based on Residual Distillation(JointRD),希望在训练的时候引入残差连接保证训练效果,但在部署时去掉残差提升推理速度。通过在ImageNet/CIFAR10/CIFAR100等数据上的实验表明,利用JointRD训练得到的没有残差连接的plainCNN能够达到和ResNet相同精度的同时,性能提升1.4倍,内存消耗降低1.25倍。预训练plain-CNN在MIT 67和Caltech 101的fine-tuning结果也证明了特征的迁移泛化性。联合训练框架介绍 主要动机CNN模型当中引入残差连接的主要动机是避免梯度消失及降低优化难度,在最近的多篇研究中已经证明了残差连接在训练过程中对梯度的影响。因此我们认为没有残差的plain-CNN模型表现差是因为优化方法差而非模型本身的表达能力的限制。通过在mobile NPU上对比去掉残差的plain-CNN 50和保留残差的ResNet50内存消耗和时延,我们发现去掉残差后内存消耗降低19%,时延降低30%。基于以上结论,我们提出了一种可能的解决方案,利用ResNet为plain CNN的训练过程提供更好的梯度。因此我们提出了JointRD (Joint-training framework based on Residual Distillation),在这个框架中我们通过将plain CNN中的一个stage同时连接到它之后的stage和ResNet之后的stage达成上述训练目标。联合训练框架保证了残差连接使梯度更易反传的效果,但残差连接还有另外一个功能就是保护从前一层提取到的特征。为了达成相同的效果,我们采用Dirac delta初始化方法[8]来初始化student网络的权重。对于teacher网络的权重,我们使用预训练好的ResNet模型来进行初始化,并在整个训练过程中停止对这部分权重的更新。实验结果通过三种规模的网络plain-CNN18, plain-CNN34, plain-CNN50在CIFAR-10和CIFAR-100上的实验证明了联合训练方法JointRD有效性。如表2.1所示,JointRD可以将Plain-CNN训练达到和对应的ResNet相同的精度。同时我们还对比了单纯训练plain-CNN(见"Naive"列)以及只使用KD (MSE) loss和plain-CNN的交叉熵loss(见"KD (MSE) +Dirac"列)。在表2.2中,我们对比了利用JointRD训练得到的plain-CNN50,利用剪枝方法[9]剪枝40%后的ResNet50,以及ResNet50本身的精度、时延和内存消耗。可以看出在plain-CNN50在各个维度均优于直接剪枝(实验细节请参考论文原文[7])。目前由JointRD训练得到的plain-CNN18/ plain-CNN34/plain-CNN50 MindSpore端侧模型均已上线MindSpore Hub,感兴趣的可以下载体验。论文链接:https://proceedings.neurips.cc/paper/2020/file/657b96f0592803e25a4f07166fff289a-Paper.pdfPlain-CNN18模型链接:https://www.mindspore.cn/resources/hub/details?noah-cvlab/gpu/1.0/plain-CNN-resnet18_v1.0_cifar_10Plain-CNN34模型链接:https://www.mindspore.cn/resources/hub/details?noah-cvlab/gpu/1.0/plain-CNN-resnet34_v1.0_cifar10Plain-CNN50模型链接:https://www.mindspore.cn/resources/hub/details?noah-cvlab/gpu/1.0/plain-CNN-resnet50_v1.0_cifar10Searching for Low-Bit Weights in Quantized Neural Networks神经网络量化因为可以减少计算消耗和内存占用,在模型部署特别是端侧设备部署中被广泛应用,例如相较于传统的32-bit模型网络,二值化网络可以直接将模型压缩32倍,同时如果采用二值运算可以大大降低计算复杂度(如XNORNet 可以达到57倍加速[10])。 传统的量化方法通常不是直接可导的,而是通过近似梯度进行训练,这增加了量化网络的优化难度以及量化网络和原始网络间的精度差距。相较于全精度(32-bit 浮点数)权值,低比特权值只有很小的数值空间,如4-bit量化只有2^4=16种可能的量化取值。 因此,我们提出了一种全新的可导的量化方法Searching for Low-Bit Weights (SLB),将权值量化转变为可能量化取值的搜索。具体来讲就是将每个权值表示成所有可能取值空间的概率分布,在训练过程中优化这个概率分布,在推理过程中选取概率最大的值作为量化后的值。在图像分类和超分任务的多个benchmark上的实验证明,通过SLB方法量化后的网络性能超越已有SOTA结果。 方法介绍 实验结果表3.1和表3.2比较了我们的方法和其他SOTA量化方法BNN, XNORNet, DoReFa, DSQ, SQ, and LQ-Net在VGG-Small和ResNet20两个不同模型上的效果。如表中结果所示,W/A分别表示weight和activation的量化位宽,在不同量化位宽下,我们的方法都超越了其他SOTA方法。具体的实验细节请参考论文原文[12]。VGG-Small在CIFAR10上基于2-bit weight和2-bit activation的量化端侧模型目前已在MindSpore Hub开源首发,感兴趣的可以下载体验。论文链接:https://proceedings.neurips.cc/paper/2020/file/2a084e55c87b1ebcdaad1f62fdbbac8e-Paper.pdf模型链接:https://www.mindspore.cn/resources/hub/details?noah-cvlab/gpu/1.0/VGG-Small-low%20bit_cifar10参考文献[1] Yehui Tang,Yunhe Wang,Yixing Xu,Dacheng Tao, Chunjing Xu,Chao Xu,Chang Xu. SCOP:Scientific Control for Reliable Neural Network Pruning. In 34th Conference on Neural Information Processing Systems (NeurIPS 2020), 2020. [2] Hao Li, Asim Kadav, Igor Durdanovic, Hanan Samet, and Hans Peter Graf. Pruning filters for efficient convnets. In 5th International Conference on Learning Representations, ICLR 2017, Toulon, France, April 24-26, 2017, Conference Track Proceedings. OpenReview.net, 2017. [3] Yang He, Guoliang Kang, Xuanyi Dong, Yanwei Fu, and Yi Yang. Soft filter pruning for accelerating deep convolutional neural networks. In Proceedings of the 27th International Joint Conference on Artificial Intelligence, pages 2234–2240, 2018. [4] Pavlo Molchanov, Arun Mallya, Stephen Tyree, Iuri Frosio, and Jan Kautz. Importance estimation for neural network pruning. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pages 11264–11272, 2019. [5] Shaohui Lin, Rongrong Ji, Chenqian Yan, Baochang Zhang, Liujuan Cao, Qixiang Ye, Feiyue Huang, and David Doermann. Towards optimal structured cnn pruning via generative adversarial learning. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pages 2790–2799, 2019. [6] Lucas Liebenwein, Cenk Baykal, Harry Lang, Dan Feldman, and Daniela Rus. Provable filter pruning for efficient neural networks. In International Conference on Learning Representations, 2020. [7] Guilin Li, Junlei Zhang, Yunhe Wang, Chuanjian Liu, Matthias Tan, Yunfeng Lin, Wei Zhang, Jiashi Feng, Tong Zhang. Residual Distillation: Towards Portable Deep Neural Networks without Shortcuts. Accepted by NeurIPS 2020 [8] Sergey Zagoruyko and Nikos Komodakis. Diracnets: Training very deep neural networks without skip-connections. arXiv preprint arXiv:1706.00388, 2017. [9] Zhuang Liu, Jianguo Li, Zhiqiang Shen, Gao Huang, Shoumeng Yan, and Changshui Zhang. Learning efficient convolutional networks through network slimming. In Proceedings of the IEEE International Conference on Computer Vision, pages 2736–2744, 2017. [10] Mohammad Rastegari, Vicente Ordonez, Joseph Redmon, and Ali Farhadi. Xnor-net: Imagenet classification using binary convolutional neural networks. ECCV, 2016 [11] Matthieu Courbariaux, Yoshua Bengio, and Jean-Pierre David. Binaryconnect: training deep neural networks with binary weights during propagations. NeurIPS, 2015 [12] Zhaohui Yang, Yunhe Wang, Kai Han, Chunjing Xu, Chao Xu, Dacheng Tao, Chang Xu. Searching for Low-Bit Weights in Quantized Neural Networks. Accepted by NeurIPS 2020.
  • [其他] Atlas\CANN\MindSpore\MindX\Modelarts底座齐全呀
    作为先进的AI算力底座,昇腾AI基础软硬件平台包括Atlas系列硬件、异构计算架构CANN、全场景AI框架昇思MindSpore、昇腾应用使能MindX以及一站式开发平台ModelArts等,助力企业和开发者高效使用AI能力。用通俗的话来讲,昇腾人工智能平台可以使能人工智能计算中心生产“模型”,企业和机构借助“模型”最终生产产品;“模型”应用到手机里,就拥有图像分类等能力;应用到自动驾驶领域,车辆就拥有自动驾驶能力。当前在AI领域,“大模型+大数据+大算力”已成为迈向通用人工智能的一条可能路径。随着全球对人工智能算力需求的持续攀升,为了促进整个产业健康发展,各地政府有必要保障大量中小企业、科研机构获取充足的人工智能公共算力。从具体作用来看,建设人工智能计算中心无疑是一个一举多得的举措。满足基本算力需求后,人工智能计算中心还可以带动人工智能基础研究和共性技术的突破。通过建设新平台,能够为前沿理论研究提供强大算法、数据与算力支撑,为自适应学习、类脑智能计算、量子智能计算等跨领域基础理论提供国际顶尖的研究平台,有效推动技术发展,抢占人工智能科技创新制高点。在帮助产业智能化转型方面,人工智能计算中心可以降低AI的研发、使用门槛,将人工智能企业和优势产业有机结合,使能人工智能技术与产业深度融合,落实国务院《新一代人工智能发展规划》中“推动人工智能规模化应用,全面提升产业发展智能化水平”的要求。
  • [互动交流] volcano和mindspore serving的关系是什么
    好像都可以做推理,volcano也可以做训练。功能有些重叠。重叠部分各自的优势是什么。
  • [互动交流] mindspore实现遥感图像语义分割
    本人想用deeplabv3+实现遥感影像的分割,参考华为云提供的代码改写数据加载部分,然后报了如下错,改写unet中加载数据的代码,训练时也是加载数据出了错误,请问怎么才能实现加载遥感影像数据进行分割。
  • [<1024>活动] 【星云闪耀1024&lt;专家坐堂&gt;】昇思MindSpore初体验 ,参与话题互动抽取奖励!
    活动奖励在所有参与互动用户中抽取3个幸运奖,奖品为《ModelArts人工智能应用开发指南》书籍1本。 直播简介     AI到底是什么?AI能怎么玩?华为MindSpore带你走进AI的世界,在MindSpore框架我们希望带你完成一次AI初体验。通过项目成功案例了解MindSpore的好处和开源项目,快来感受MindSpore的AI之美!  直播时间10月22日  15:00活动时间10月22日—11月1日互动方式直播前您可以在本帖留下您感兴趣的问题,专家会在直播时为您解答。直播后您可以继续在本帖留言,与专家互动交流,我们会在全部活动结束后对参与互动的用户进行抽奖。活动规则本次活动结束后,将由华为云工作人员将符合抽奖条件的用户名单导入至巨公摇号平台(https://www.jugong.wang/random-portal/)内,抽取各奖项,并截屏公示抽奖过程。如您不同意此抽奖规则,请勿参加本次活动。 Tips1、请务必使用个人账号参与活动(IAM、企业账号等账号参与无效)。2、所有获得华为电子产品奖项的获奖用户,请于获奖后3日内完成实名认证,否则视为放弃奖励。
  • [活动公告] 初次见面,MindSpore v1.5诚邀体验!
    MindSpore新版本来啦,欢迎各位前来体验,分享技术干货还可获得精美礼品,还不快来试试嘛?活动时间:9月26日——10月8日活动详情:https://bbs.huaweicloud.com/forum/thread-157874-1-1.html奖品预览:
  • [技术干货] Mindspore的快速上手
    Mindspore快速上手本周末参加了华为mindspore深度学习框架的第三期训练营。在这次训练营中,mindspore由上次的0.3版本迅速的增加到了0.6版本。课程安排是这样的:第一天:1、快速上手mindspore指南2、学习mindspore训练yolov3模型。3、如何快速用Mindspore训练bert模型4、用Mindspore Serving完成模型部署第二天:1、用MIndspore训练ResNet50模型2、性能大杀器——如何用Mindspore实现量化训练3、用Mindspore实现Wide&Deep模型通过这两天的爆肝学习,学习到很多知识,但是还有许多不明白的地方。这一篇就写出快速上手指南嘞。一、环境部署Mindspore架构:使用环境:win10+anaconda+Mindspore步骤如下:安装配置如下:使用是Mindspore的0.5版本滴1、先创建虚拟环境先点击这个使用下面命令进行创建环境并进入环境conda create -n mindspore python=3.7.5 conda activate mindspore122、安装Mindspore框架conda install https://ms-release.obs.cn-north-4.myhuaweicloud.com/0.5.0-beta/MindSpore/cpu/windows_x64/mindspore-0.5.0-cp37-cp37m-win_amd64.whl1这里会自动安装MIndspore运行其他的包或者库的3.下载代码git clone https://github.com/mindspore-ai/docs.git14、进入目录,使用cd命令lenet.py文件在./doc/tutorials/tutorial_code目录下面,使用cd命令依次进入如图:5.结果、结束。————————————————原文链接:https://blog.csdn.net/weixin_45014634/article/details/107899341
  • [技术干货] 使用mindspore实现yoloV3
    mindspore是华为开源的深度学习框架,之前已经参加过两期训练营,8月8日又举办了第三期,继续参加学习。这次主要的作业是用mindspore实现yolo_v3,并在华为云的modelArts平台上实现。mindspore跑yolo_v3,其实在mindspore主仓的model_zoo里已经有了训练和测试的代码,可以到 官方gitee仓 里查看但是官方的代码是在本地跑的,要在modelArts上跑,需要做一些适当的调整首先,要把代码和数据集上传到云上,要在华为云上创建一个“对象储存服务obs”,将代码、数据集上传其次,要创建modelArts训练作业点击之后出现如下配置界面最重要的两个参数,一个是数据集目录,一个是模型保存位置,默认以data_url和train_url为参数名通过argparse传入启动程序,所以启动程序中一定要有解析这两个参数的功能,并将涉及数据集的目录用data_url替代,涉及模型保存的目录,用train_url代替。最后,上传数据的“对象储存服务”相当于云盘,modelArts相当于运行容器,训练的时候需要把数据从云盘复制到容器中,最后训练的模型,还要复制到云盘中才能使用。数据在云盘和容器间的复制操作需要moxing模块import moxing as moxlocal_data_url='/cache/data'local_train_url='/cache/train_url'#将obs中data_url目录拷贝到容器的local_data_url中mox.file.copy_parallel(args_opt.data_url,local_data_url)#模型训练完,还要将模型目录拷贝到obs中才能下载mox.file.copy_parallel(local_train_url,args_opt.train_url)一切改好后,就可以提交运行了,可以在日志中看到运行结果,如果运行失败就看看日志的错误提示逐一解决。熟悉了整个运行机制之后,就会发现这套系统非常简单,上传数据集,修改几行代码就搞定了!————————————————原文链接:https://blog.csdn.net/sinat_21902051/article/details/107899368
  • [技术干货] MindSpore-LeNet模型理解深度学习一般化过程
    深度学习一般化过程理解Mindspore docs工程代码:https://gitee.com/mindspore/docs.gitLeNet实例源码位置:*/docs/tutorials/tutorial_code/lenet    接续上一篇的实例实践,通过前面运行MindSpore的LeNet实例代码了解了一个经典的手写字体识别模型在框架中使用的情况,本篇尝试从该代码实例开始,围绕模型为核心来深入分析和总结深度学习的一般化过程以及需要重点掌握的知识点。    从实践来看深度学习的领域“模型”是核心,所有的操作最终都是围绕模型来建立的。通常深度学习应用过程抽象为以下一般过程。1)深度学习应用结构-“输入-处理-输出”    深度学习尽管本身是专属领域的范畴,但是其在应用过程中依然离不开IT通用的化的过程,任何的部署成可执行程序的模式基本的结构都是相通的。 “输入-处理-输出”的结构是通用IT应用的基本结构,对于人工智能的深度学习方法也是同样适用;不同之处人工智能的深度学习方法到能够落地应用通常分为两个关键步骤:模型学习训练(深度学习的学习就凸显在模型的学习训练上,通过规模数据训练学习输出符合要求的模型)模型的推理应用(其中推理会涉及应用的场景化部署,所以可能部署的方式各不同,比如数据中心、边缘等方式)2)核心围绕-“数据”    深度学习离不开数据,所有的模型训练即学习的过程,通过数据的输入处理不断的完善模型,在数据方面涉及规模数据的称呼为“数据集”。通常一个模型要能够到达应用的地步,离不开两类数据集:训练数据集(LeNet例子中MNIST数据集中的train-images-idx3-ubyte和train-labels-idx1-ubyte)测试数据集(LeNet例子中MNIST数据集中的t10k-images-idx3-ubyte和t10k-labels-idx1-ubyte)另外在模型训练完成后:会生成带有训练参数优化的输出的模型文件数据,比如MindSpore中提供的模型输出文件,后续会深入分析。实际部署应用中会涉及相应的模型验证评估和推理处理的请求和输出结果数据,比如图像识别中人脸识别应用,实时捕捉人脸数据作为服务“请求数据”进行识别,以及结果数据的输出。3)深度学习的两个关键过程“模型训练”和“模型推理”    深度学习的学习就体现在学习数据、训练模型上面,通过海量的数据输入结合特定的网络模型来进行训练和学习,最终输出具备一定精准度的模型文件,供后续推理使用。模型训练    在人工智能的深度学习方面,模型是核心,其中基于神经网络构建的模型是当前主流的模型方法,因此模型训练包括如下过程:        1)输入数据的准备;模型训练通常输入数据采用数据集的方式来管理,不同的数据集可能存在不同的格式,后续会介绍MindSpore在数据集处理上提供的核心能力。        2)模型训练过程,根据神经网络先选择定义匹配的网络,结合训练的数据集来训练相应的模型,这个模型是带有某种内置数学手段的输出物,最终会生成模型的文件(存放训练结果的数据)。        3)模型是一个训练的结果输出物,在MindSpore上采用了checkpoints的快照模式,来支持多次训练的输出或者中断时候恢复,同时MindSpore还提供了统一的模型文件MindIR格式,用于部署态不同云、边等环境统一部署。模型评估和推理模型评估    结合数据集和相应的神经网络等训练方法输出相应的模型数据,该模型数据如何评估其准确性和精度,就需要通过模型评估的方法,结合输入的测试数据集(如MNIST数据集中的测试数据集t10k-images-idx3-ubyte和t10k-labels-idx1-ubyte)    评估的结果往往是输出模型的精度,比如图片训练结合测试数据的识别度,精度往往可以通过选择不同的神经网络方法、包括网络参数的调整来提升。模型推理    当模型训练输出后,要进入应用场景时候,需要发布和部署成功输出的模型,通常如果要提供在线服务,都会部署成可以提供在线处理的服务模式,供在线应用。Mindspore框架的相应能力说明官方入门教程地址:https://www.mindspore.cn/tutorial/zh-CN/r1.2/quick_start.ht    MindSpore官方网站提供了以LeNet模型为开篇入门教程,总结了Mindspore作为一个深度学习框架在其提供的开放能力之上使用的一般过程。    这里我们借助这个过程来简单分析MindSpore为其使用者提供了哪些核心的能力来支持深度学习的一般化过程。    MindSpore中提供给用户使用的是最上层的高阶API,高阶的API虽然也有java和c++语言提供的,大多数情况下还是以python提供为主。    要完成一个基本的LeNet模型训练及推理,MindSpore中提供的几个基础核心能力应用即可:1)框架上下文(mindspore.context)    MindSpore框架的上下文封装,框架提供的相关图模式、PYNATIVE_MODE、并行计算相关的配置都在其中设定,比如前面实例指定LeNet在CPU上运行,默认模式device_target指定为CPU。context.set_context(mode=context.GRAPH_MODE, device_target=args.device_target)2)数据集(mindspore.dataset)    MindSpore在数据集方面提供了丰富的能力,dataset中针对不同的数据集的格式都有统一的封装,具体的说明如下。https://www.mindspore.cn/doc/api_python/en/r1.2/mindspore/mindspore.dataset.html    对于LeNet模型实例,选择对应的数据集封装使用“mindspore.dataset.MnistDataset”类即可。3)构建神经网络相关(mindspore.nn)    MindSpore在核心的神经网络模型的构建上通过Cell类的基本神经网络单元类来构建最终的网络。比如LeNet中,就采用继承mindspore.nn.Cell的方式来构建,在该类中可以定义各类具体的神经网络方法来训练相应的模型。比如在LeNet中采用Conv2d来定义卷积神经网络的方式来构建网络。class LeNet5(nn.Cell):    """Lenet network structure."""    # define the operator required    def __init__(self, num_class=10, num_channel=1):        super(LeNet5, self).__init__()        self.conv1 = nn.Conv2d(num_channel, 6, 5, pad_mode='valid')        self.conv2 = nn.Conv2d(6, 16, 5, pad_mode='valid')        ......4)模型训练、推理相关(mindspore.train)    其中主要的提供的模型训练、推理的核心API封装,LeNet实例中直接使用提供Model封装类即可完成大部分模型训练和推理的操作。比如在LeNet实例中封装的train_net训练模型、test_net评估模型、test_predict推理三个主要方法,内部核心都使用了Model类提供的方法。#提供模型训练APInetwork_model.train(epoch_size, ds_train, callbacks=[ckpoint_cb, LossMonitor()], dataset_sink_mode=sink_mode)#提供模型评估APInetwork_model.eval(ds_eval, dataset_sink_mode=False)#提供模型推理APInetwork_model.predict(Tensor(data['image']))5)输出模型文件相关    在MindSpore的输出模型文件方面,提供了两类核心能力:一类采用类似快照机制,输出训练的过程文件,用于多次训练能够回溯或者中断恢复之前的模型数据处理,在MindSpore中封装在回调mindspore.train.callback中,LeNet实例中如下。每次训练结束都输出一个checkpoint模型文件,可以用于推理处理。# save the network model and parameters for subsequence fine-tuningckpoint = ModelCheckpoint(prefix="checkpoint_lenet", config=config_ck)一类最终发布的模型文件,采用自定义的MindIR格式,目的是为了可以在不同的硬件体系,如云中心或者边缘、终端等体系直接运行。可以基于某个checkpoint模型文件来最终输出。def export_mr():    print("============== Export MindIR ==============")    resnet = LeNet5()    # load the parameter into net    param_dict = load_checkpoint("checkpoint_lenet-1_1875.ckpt")    load_param_into_net(resnet, param_dict)    input = np.random.uniform(0.0, 1.0, size=[32, 1, 32, 32]).astype(np.float32)    export(resnet, Tensor(input), file_name='checkpoint_lenet-2-1_1875', file_format='MINDIR')总结:    MindSpore是一个全场景的深度学习框架,全场景体现在其适应云端、边缘、终端等各类基础设施形态上运行;深度学习框架是其总结抽象了深度学习的一般化过程,通过可以被应用开发者使用的API方式开放其支持深度学习应用开发的能力。    下一篇结合LeNet模型实例,来尝试深入理解下神经网络模型是怎么回事。————————————————原文链接:https://blog.csdn.net/wangfengwf/article/details/117596887
  • [技术干货] MindSpore下载安装 - 简单上手使用 Ubuntu18.04
    MindSpore是华为开发的一款深度学习的开源框架,于2020年3月28号正式亮相,其与TensorFlow、PyTorch、PaddlePaddle 等流行深度学习框架对标,旨在大幅度降低 AI 应用开发门槛。MindSpore介绍安装Mindspore官方地址: https://www.mindspore.cn/下载地址:https://www.mindspore.cn/install操作系统是Ubuntu的,使用CPU跑,所以选择这样的安装指令。 如果是Windows系统的话就选择Windows-x64,然后也是使用pip安装。打开终端复制命令过来:这里就直接对着安装命令复制下载即可。好吧,下载时还要注意使用 sudo 给下载权限。。等待下载完后,会提示一个 Successfully installed .同时可以通过pip freeze 查看安装仓库有没有 Mindspore简单使用这里使用Mindspore简单定义一个三阶张量,这是一个比赛实训的安装任务:任务1嗯,不明白张量的童鞋需要先去了解一下张量(Tensor)————————————————原文链接:https://blog.csdn.net/qq_43332980/article/details/108060458
  • [技术干货] MindSpore+MindInsight安装-Ubuntu
    MindSpore+MindInsight安装-UbuntuMindSpore介绍和安装缘由MindSpore是华为开源自研AI框架,类似于Pytorch和Tensorflow。因为任务需求,需要将代码转换为MindSpore的版本,故学习和使用。由于现在还在发展中,这个框架还存在一些问题。在安装中我就遇到了一些问题,记录下来希望对其他人有所帮助。###安装MindSpore在尝试多种安装方式后,找到了快捷方便的方式。命令如下:pip install --upgrade mindspore-gpu1这个会安装最新且为GPU版本的MindSpore如我的安装后的版本信息:mindspore_gpu-1.2.0-cp38-cp38-manylinux1_x86_64.whl1官网给出的其他安装方式,其中pip方式我安装了没有成功,采用上述我提供的方式就会简单很多。验证是否成功安装由于官网给的测试代码是为了推自研的人工智能芯片Ascend,所以提供的测试代码需要修改一行,才符合我们一般的使用者。测试代码如下:import numpy as npfrom mindspore import Tensorimport mindspore.ops as opsimport mindspore.context as contextcontext.set_context(device_target="GPU")#这里不同,改成GPU了,表示使用GPU。如果是用CPU,这里改成“CPU”即可x = Tensor(np.ones([1,3,3,4]).astype(np.float32))y = Tensor(np.ones([1,3,3,4]).astype(np.float32))print(ops.add(x, y))结果是值全为2的矩阵,矩阵shape是[1,3,3,4]安装MindInsightMindInsight为MindSpore提供了简单易用的调优调试能力。在训练过程中,可以将标量、张量、图像、计算图、模型超参、训练耗时等数据记录到文件中,通过MindInsight可视化页面进行查看及分析。安装MindInsight其实是为了使用MindConverter(为MindInsight的子模块)。MindConverter可以将PyTorch、TensorFlow脚本转换到MindSpore脚本的工具。安装过程中依旧遇到了很多问题,希望我的解决方案能够帮助他人。官网给出的安装方式。其中pip方式依旧拉垮。可能是我设置不对,反正多种尝试后,均不行。后采用源码编译的方式安装。从代码仓下载源码git clone https://gitee.com/mindspore/mindinsight.git1编译和安装我采用以下方式cd mindinsightpip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simplepython setup.py install遇到的问题Cmake更新,Cmake版本过低问题pip install cmake --upgrade1这样就安装到最新版了。npm报错,会有各种报错。经过测试发现就是版本的问题或者npm没有安装。sudo apt-get install npmnpm install -g npm@4.0.0第一行是安装npm,第二行是调整npm的版本。我的MindInsight是1.2版本,经过测试npm是4.0.0就可以顺利解决了。如果依旧报npm的错,那么请调整npm的版本。修改npm@4.0.0后面的版本号即可。验证安装是否成功执行命令:mindinsight start1提示如下,说明安装成功:Web address: http://127.0.0.1:8080service start state: successMindConverter初体验。MindConverter是一款用于将PyTorch、TensorFlow脚本转换到MindSpore脚本的工具。为了方便我的代码迁移,想使用提供的工具。由于我的代码是Pytorch,就说一下我的体验和感受。转换pytorch代码命令如下,一次只能转换一个py文件。mindconverter --in_file ./my_model_train.py \              --output ./output \              --report ./output/report只需要修改"in_file"为你要转换的代码,output文件夹下就会出现转换后的代码。使用起来非常方便。report用来说明转换中那些是成功那些还不对的。截取我的转换结果如下:line 17:0: [UnConvert] 'from torch.utils.data import DataLoader' didn't convert. Please manual convert the code, along with the code associated with it.line 19:0: [UnConvert] 'from torch.autograd import Variable' didn't convert. Please manual convert the code, along with the code associated with it.line 20:0: [Convert] 'import torch.nn.functional as F' is converted to 'import mindspore.ops.operations as P'.line 21:0: [UnConvert] 'import torch.autograd as autograd' didn't convert. Please manual convert the code, along with the code associated with it.line 22:0: [UnConvert] 'import torch.utils.data as data' didn't convert. Please manual convert the code, along with the code associated with it.其中UnConvert就是没有转换成功的。这个工具看起来非常方便,但是由于逻辑的不同很多操作还是需要手动去修改。不推荐使用这个工具作为整体的转换推荐使用这个工具转换Net部分(如几层的卷积层),对于这部分转换还是很准确的。转换PyTorch算子的工具。————————————————原文链接:https://blog.csdn.net/u010277233/article/details/116050764
  • [技术干货] 开源框架mindspore学习
    最近的项目用到了mindspore框架,关于如何手把手在自己电脑上运行一个完整的例子,大家可以去官网中的教程中查看:https://www.mindspore.cn/tutorial/training/zh-CN/master/quick_start/quick_start.html你也可以直接跳过基础版,使用进阶版,如何利用华为载有Ascend(昇腾910,华为自研的人工智能芯片)的服务器上运行代码,大家按照这个例子来:https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/use_on_the_cloud.html#ai这里有几个问题需要大家注意一下:1.如何创建OBS桶;2.如何创建训练任务;3.深入认识--data_url和--train_url这两个参数,这两个参数需要你在自己的代码中进行一个重写,即你加载的数据集以及训练的输出是需要在代码中给出参数的,不必赋值(赋值在创建训练任务的的时候自动进行),写出即可:例://-----------------------------------------------------------------------------------------------------//下面是我在项目过程中遇到的一些问题和相应的解决方法:1.最开始,我是参照这个链接来运行(这是另一种使用服务器的方法,即不用在线创建训练作业)的,教你如何在Pycharm上使用相关toolkit使用modelarts(即华为的服务器平台),但是我忽略了一点,这个例子中使用的深度学习框架是MXNet,我仿照他的方式对我使用mindspore框架的源码进行修改,最关键的部分就是参考它是如何将 数据集路径 加载进来的,仿照他的方式改好后,产生了第一个令我头大的问题:ValueError: The folder s3://modelarts-zjw/Mnist_data/train/ does not exist or permission denied!,即我的路径是不存在的或者没有访问权限,我分别再代码里添加了1.os.file.exist(path),来检验是否存在,输出True2.os.access(path,R_OK),检验是否有权限读取,输出False事实证明,问题出现在了这里,这个问题我尝试解决了很久,但没有能够解决,因为是mindspore的源码报错,后来官方给的说法是,使用Pycharm这种方法确实不行,原因大概是,服务器在执行时,会在服务器本地创建一个桶的虚拟映射(类似缓存),进而达到访问桶中数据的目的,通过在网页上创建训练任务可以完成这种映射,但是在pycharm上不可以,目前只在使用mindspore框架时遇到了这种问题。所以建议大家不要用pycharm,还是直接在网页上创建训练任务比较靠谱。//------------------------------------------------------------------------------------------------------//1.自定义 callback 类我们可以理解为回调函数,正是通过这种回调函数可以实现我们对训练过程中的参数进行打印,举个例子: class EvalCallBack(Callback):    def __init__(self, batch_size):        super(EvalCallBack, self).__init__()        self.batch_size = batch_size        self.last_step = 0        self.epoch_begin_time = 0     def step_begin(self, run_context):        self.step_begin_time = time.time() #在每一个step开始时,获取当前时间     def step_end(self, run_context):        step_time = time.time() - self.step_begin_time #在每一个step结束时,计算每个step花费的时间        print(f'step time: {step_time}')     def epoch_begin(self, run_context):        self.epoch_begin_time = time.time() #在每一个epoch开始时,获取当前时间     def epoch_end(self, run_context):        params = run_context.original_args()        cost_time = time.time() - self.epoch_begin_time        train_steps = params.cur_step_num -self.last_step #获取epoch结束时一共经过了多少个step        print("----")        print(f'epoch {params.cur_epoch_num} cost time = {cost_time}, train step num: {train_steps}, '              f'one step time: {1000*cost_time/train_steps} ms, '              )        self.last_step = run_context.original_args().cur_step_num这里值得注意的是:step_num = len(dataset) // batch_size 还有loss,也可以通过回调来进行打印loss = LossMoniter()这样就可以实现每一个step结束后,打印这个step的loss值def epoch_end(self, run_context):        params = run_context.original_args()        cost_time = time.time() - self.epoch_begin_time        loss = params.net_outputs        train_steps = params.cur_step_num -self.last_step #获取epoch结束时一共经过了多少个step        print("----")        print(f'epoch {params.cur_epoch_num} cost time = {cost_time}, train step num: {train_steps}, '              f'one step time: {1000*cost_time/train_steps} ms, '              f'loss: {loss}'               )        self.last_step = run_context.original_args().cur_step_num2.自定义保存ckpt文件和计算图#这里解释一下这两个参数, 1.save_checkpoint_steps:每xx个step保存一次ckpt文件2.keep_checkpoint_max:最多保存多少个ckpt文件,从最后一个算起,最先保存的会被删掉 config_ck = CheckpointConfig(save_checkpoint_steps = 900, keep_checkpoint_max = 10) #1.prefix:ckpt文件的名称#2.directory:模型保存的位置,我们又见到了train_url这个参数#3.config_ck:配置方式 ckpoint_cb = ModelCheckpoint(prefix = "checkpoint_lenet", directory=args.train_url, config = config_ck)这里又有一个小问题,就是,我发现即使我的路径是完全没得问题的,但是当模型运行结束后,我去查看我桶中特定的路径,并没有发现保存的文件。于是我就采用了这样的方式import moxmox.file.shift('os', 'mox')#将原有的os文件操作替换为mox,(如果需要) print(f'Start save model')local_checkpoint_path = './cache/model_path' #在服务器上设置一个文件夹,用来暂时保存模型config_ck = CheckpointConfig(save_checkpoint_steps = 900, keep_checkpoint_max = 10)ckpoint_cb = ModelCheckpoint(prefix = "checkpoint_lenet", directory=local_checkpoint_path, config = config_ck)#注意这里将模型先保存在服务器中的文件夹mox.file.copy_parallel(src_url=local_checkpoint_path, dst_url=args.train_url)#再将服务器文件夹里的文件copy到桶里的文件夹注意:MoXing是华为云ModelArts团队自研的分布式训练加速框架,它构建于开源的深度学习引擎TensorFlow、MXNet、PyTorch、Keras之上。 相对于TensorFlow和MXNet原生API而言,MoXing API让模型代码的编写更加简单,允许用户只需要关心数据输入(input_fn)和模型构建(model_fn)的代码,即可实现任意模型在多GPU和分布式下的高性能运行,降低了TensorFlow和MXNet的使用门槛。另外,MoXing-TensorFlow还将支持自动超参选择和自动模型结构搜索,用户无需关心超参和模型结构,做到模型全自动学习。学习链接:https://github.com/huaweicloud/ModelArts-Lab/tree/master/docs/moxing_api_doc————————————————原文链接:https://blog.csdn.net/qq_41368074/article/details/109790513
  • [技术干货] MindSpore进行分布式训练
    分布式和并行计算,在计算机领域是非常重要的概念。对于一些行外人来说,总觉得这是一些很简单的工作,但是如果我们纵观计算机的硬件发展史,从CPU到GPU,再到TPU和华为的昇腾(NPU),乃至当下的热点量子计算机(QPU),其实就是一个分布式与并行计算的发展史。从简单的数据并行,到算法并行,到图的并行,最后是量子叠加所带来的物理并行。因此能否做好分布式与并行的技术,很大程度上决定了一个工具的性能上限,本文我们一起来研究一下MindSpore分布式训练的方法。环境部署在前面的博客中,我们探讨过用Docker和Singularity容器等方案来安装MindSpore的CPU版本和GPU版本,感兴趣的读者可以翻一翻这些历史博客。而这篇文章中,我们将默认已经在本地安装好一个MindSpore的GPU环境,以此为前提进行探讨在单机多GPU卡的环境下去使用MindSpore的分布式功能。比较完整的介绍可以参考这个官方地址,里面包含了完整的安装部署和使用的介绍。这里我们仅针对本地Ubuntu的环境介绍基本安装和使用方法。安装openmpi这里一共需要安装2个软件,我们都是采取了源码安装的方法,首先到这个MindSpore给出的下载链接中下载对应版本的源码:按照版本配套我们下载这个4.0.3的 tar.gz的压缩包:下载完成后可以大致的按照这里面的操作指导进行源码安装:安装成功的话运行 mpirun --version可以看到版本号。有这里面有两个需要提醒的点是:1. 解压缩不一定用这里面给出的指令,可以用自己的;2. 如果按照这个指引的prefix,后面需要在 LD_LIBRARY_PATH这个环境变量中加入 /usr/local/lib/这个路径,否则会有一些so库无法被识别。安装NCCLMindSpore在GPU上的分布式通信是采用了NCCL这个工具,同样的我们先去这里面给出的链接找源码包下载安装:这里推荐使用Local的安装方案:找到适配自己的系统版本的软件包之后,就可以按照下述的指引一步一步安装:其中如果在 apt-key这一步执行一次失败的话,可以多执行两次看看。环境测试安装成功后,openmpi和NCCL都安装成功后,可以用如下的初始化示例测试一下环境的部署情况:# test-init.py from mindspore import contextfrom mindspore.communication.management import init if __name__ == "__main__":    context.set_context(mode=context.GRAPH_MODE, device_target="GPU")    init("nccl")如果执行的结果如下所示,没有任何的报错信息,则说明环境部署成功:dechin@ubuntu2004:~/projects/mindspore/test$ mindspore test-init.py dechin@ubuntu2004:~/projects/mindspore/test$MindSpore分布式训练首先可能会有人好奇,上一个章节中最后用的mindspore是个啥指令?这其实是我自己在本地配置的一个mindspore-gpu版本的快捷命令:dechin@ubuntu2004:~/projects/$ cat ~/.bashrc | grep mindsporealias mindspore='singularity exec --nv /home/dechin/tools/singularity/mindspore-gpu_1.2.0.sif python'如果觉得还算方便的话,读者也可以按照自己的喜好去alias一个快捷命令。接下来我们要看一个实现的案例,这个代码来自于前面的这一篇博客,只是我们在这个代码基础之上,加入了上一个章节中的初始化代码init(),完整代码如下所示:# test_nonlinear.py from mindspore import contextfrom mindspore.communication.management import initcontext.set_context(mode=context.GRAPH_MODE, device_target="GPU")init()import numpy as npfrom mindspore import dataset as dsfrom mindspore import nn, Tensor, Modelimport timefrom mindspore.train.callback import Callback, LossMonitor def get_data(num, a=2.0, b=3.0, c=5.0):    for _ in range(num):        x = np.random.uniform(-1.0, 1.0)        y = np.random.uniform(-1.0, 1.0)        noise = np.random.normal(0, 0.03)        z = a * x ** 2 + b * y ** 3 + c + noise        yield np.array([[x**2], [y**3]],dtype=np.float32).reshape(1,2), np.array([z]).astype(np.float32) def create_dataset(num_data, batch_size=16, repeat_size=1):    input_data = ds.GeneratorDataset(list(get_data(num_data)), column_names=['xy','z'])    input_data = input_data.batch(batch_size)    input_data = input_data.repeat(repeat_size)    return input_data data_number = 160batch_number = 16repeat_number = 200 ds_train = create_dataset(data_number, batch_size=batch_number, repeat_size=repeat_number)dict_datasets = next(ds_train.create_dict_iterator()) class LinearNet(nn.Cell):    def __init__(self):        super(LinearNet, self).__init__()        self.fc = nn.Dense(2, 1, 0.02, 0.02)     def construct(self, x):        x = self.fc(x)        return x net = LinearNet()model_params = net.trainable_params()print ('Param Shape is: {}'.format(len(model_params)))for net_param in net.trainable_params():    print(net_param, net_param.asnumpy())net_loss = nn.loss.MSELoss() optim = nn.Momentum(net.trainable_params(), learning_rate=0.01, momentum=0.6)model = Model(net, net_loss, optim) epoch = 1model.train(epoch, ds_train, callbacks=[LossMonitor(10)], dataset_sink_mode=False) for net_param in net.trainable_params():    print(net_param, net_param.asnumpy())此时我们需要改成用mpirun去运行这个代码:dechin@ubuntu2004:~/projects/gitlab/dechin/src/mindspore$ mpirun -n 2 singularity exec --nv /home/dechin/tools/singularity/mindspore-gpu_1.2.0.sif python test_nonlinear.py运行过程中我们就可以看到,有两个python的任务分别跑在两个不同的GPU卡上:这个监控方式其实还是 nvidia-smi的指令,只不过为了长期监视GPU状态,我是使用了 watch -n 1 nvidia-smi的指令,每隔1s的时间就刷新一次 nvidia-smi的状态。但是这里需要注意的也有两点:1. 这个代码直接用mindspore指令也可以跑在单GPU卡上,但是如果要用mpirun来运行,那么我们就不能使用刚才alias的mindspore指令,而需要手动写上完整的指令,除非把新的指令再alias一个;2. 上述的代码因为只是初始化了一下,所以虽然跑在两张卡上,但是实际上训练过程并没有互相通信,是两个独立的任务。那么如果要构造一个完整的自动化的分布式训练,就需要像如下代码一样,再加入context.set_auto_parallel_context(parallel_mode=ParallelMode.DATA_PARALLEL)这样的一个字样,以及checkpoint中的一些配置,新的完整代码如下所示:# test_nonlinear.py from mindspore import contextfrom mindspore.communication.management import initcontext.set_context(mode=context.GRAPH_MODE, device_target="GPU")init() import numpy as npfrom mindspore import dataset as dsfrom mindspore import nn, Tensor, Modelimport timefrom mindspore.train.callback import Callback, LossMonitor, ModelCheckpoint, CheckpointConfigfrom mindspore.context import ParallelModeimport mindspore as msms.common.set_seed(0) start_time = time.time()def get_data(num, a=2.0, b=3.0, c=5.0):    for _ in range(num):        x = np.random.uniform(-1.0, 1.0)        y = np.random.uniform(-1.0, 1.0)        noise = np.random.normal(0, 0.03)        z = a * x ** 2 + b * y ** 3 + c + noise        yield np.array([[x**2], [y**3]],dtype=np.float32).reshape(1,2), np.array([z]).astype(np.float32) def create_dataset(num_data, batch_size=16, repeat_size=1):    input_data = ds.GeneratorDataset(list(get_data(num_data)), column_names=['xy','z'])    input_data = input_data.batch(batch_size)    input_data = input_data.repeat(repeat_size)    return input_data data_number = 160batch_number = 16repeat_number = 20 context.set_auto_parallel_context(parallel_mode=ParallelMode.DATA_PARALLEL)ds_train = create_dataset(data_number, batch_size=batch_number, repeat_size=repeat_number)dict_datasets = next(ds_train.create_dict_iterator()) class LinearNet(nn.Cell):    def __init__(self):        super(LinearNet, self).__init__()        self.fc = nn.Dense(2, 1, 0.02, 0.02)     def construct(self, x):        x = self.fc(x)        return x net = LinearNet()model_params = net.trainable_params()print ('Param Shape is: {}'.format(len(model_params)))for net_param in net.trainable_params():    print(net_param, net_param.asnumpy())net_loss = nn.loss.MSELoss() optim = nn.Momentum(net.trainable_params(), learning_rate=0.01, momentum=0.6)ckpt_config = CheckpointConfig()ckpt_callback = ModelCheckpoint(prefix='data_parallel', config=ckpt_config) model = Model(net, net_loss, optim) epoch = 10model.train(epoch, ds_train, callbacks=[ckpt_callback], dataset_sink_mode=True) for net_param in net.trainable_params():    print(net_param, net_param.asnumpy()) print ('The total time cost is: {}s'.format(time.time() - start_time))这个代码的运行结果如下所示:dechin@ubuntu2004:~/projects/gitlab/dechin/src/mindspore$ mpirun -n 2 singularity exec --nv /home/dechin/tools/singularity/mindspore-gpu_1.2.0.sif python test_nonlinear.py Param Shape is: 2Parameter (name=fc.weight, shape=(1, 2), dtype=Float32, requires_grad=True) [[0.02 0.02]]Parameter (name=fc.bias, shape=(1,), dtype=Float32, requires_grad=True) [0.02]Param Shape is: 2Parameter (name=fc.weight, shape=(1, 2), dtype=Float32, requires_grad=True) [[0.02 0.02]]Parameter (name=fc.bias, shape=(1,), dtype=Float32, requires_grad=True) [0.02][WARNING] ME(2528801:139843698521024,MainProcess):2021-06-10-09:45:37.603.010 [mindspore/train/callback/_checkpoint.py:428] OSError, failed to remove the older ckpt file /home/dechin/projects/gitlab/dechin/src/mindspore/data_parallel-1_200.ckpt.[WARNING] ME(2528799:139709496722368,MainProcess):2021-06-10-09:45:37.713.232 [mindspore/train/callback/_checkpoint.py:428] OSError, failed to remove the older ckpt file /home/dechin/projects/gitlab/dechin/src/mindspore/data_parallel-2_200.ckpt.[WARNING] ME(2528799:139709496722368,MainProcess):2021-06-10-09:45:37.824.271 [mindspore/train/callback/_checkpoint.py:428] OSError, failed to remove the older ckpt file /home/dechin/projects/gitlab/dechin/src/mindspore/data_parallel-3_200.ckpt.[WARNING] ME(2528799:139709496722368,MainProcess):2021-06-10-09:45:37.943.749 [mindspore/train/callback/_checkpoint.py:428] OSError, failed to remove the older ckpt file /home/dechin/projects/gitlab/dechin/src/mindspore/data_parallel-4_200.ckpt.[WARNING] ME(2528801:139843698521024,MainProcess):2021-06-10-09:45:38.433.85 [mindspore/train/callback/_checkpoint.py:428] OSError, failed to remove the older ckpt file /home/dechin/projects/gitlab/dechin/src/mindspore/data_parallel-5_200.ckpt.Parameter (name=fc.weight, shape=(1, 2), dtype=Float32, requires_grad=True) [[0.12186428 0.21167319]]Parameter (name=fc.bias, shape=(1,), dtype=Float32, requires_grad=True) [5.561276]The total time cost is: 8.412446737289429sParameter (name=fc.weight, shape=(1, 2), dtype=Float32, requires_grad=True) [[0.12186428 0.21167319]]Parameter (name=fc.bias, shape=(1,), dtype=Float32, requires_grad=True) [5.561276]The total time cost is: 8.439369916915894s虽然运行成功了,但是有一点需要注意的是,分布式的这个案例耗时为8.44s,而单卡的训练耗时为8.15s,分布式的训练速度甚至比单卡的要慢,我们在总结里面对这个现象进行一个解释。总结概要这篇文章我们主要探讨如何去部署一个基于MindSpore框架的分布式训练环境,在MindSpore环境已经配置好的情况下,我们只需要安装好openmpi和nccl这两个工具就可以实现分布式的训练,在文中我们已经给出了相应的示例。虽然分布式与并行技术的目的是为了提升性能,但不是说对所有的场景都能够起到加速的作用,比如文章中的案例就没有加速的效果。这其实是因为我们的用例场景太简单了,纵观整个训练过程,GPU的使用率不到10%,在这种情况下还要考虑上通信的开销,自然是没有放在同一个卡上去训练来得快。这也给我们一个启发,考虑使用分布式和并行计算的技术时,一定也要先评估好问题本身是否适用于并行化的处理,否则是达不到预期的加速的目的的。————————————————原文链接:https://blog.csdn.net/baidu_37157624/article/details/117801111