• [公告] MSG企业行·AI+医疗专场成功举办!!昇思MindSpore助力智慧医疗深度发展!
    【MSG企业行·AI+医疗】11月19日下午,【MSG企业行·AI+医疗】线上交流会成功举办!昇思MindSpore开源社区联合大连人工智能生态创新中心、深圳大学、武汉理工大学、摩赛恩科技、连心医疗、众享未来融合研究院,邀请到了5人工智能与医疗行业嘉宾,基于AI技术在医疗领域的深度发展和突破,进行了议题分享与交流。本次【MSG企业行·AI+医疗】专场活动,阿里、字节、百度、复旦大学、上海市东方医院、中山大学肿瘤防治中心、中南大学、中国科学技术大学、福建医科大学等700+知名企业、高校、研究院所均报名参与,其中300+位领先企业代表线上参会!在智能影像诊疗、医学数据挖掘、智能问诊、药物挖掘等医疗领域中广泛应用,进行了热烈的探讨与交流!本次活动在【MindSpore官方】B站、思否官网、CSDN官网、示说官网等多个平台同步直播。精彩回顾1MindSpore在通用医学影像分割标注中的创新实践深圳大学生物医学工程学院助理教授,MindSpore医疗影像AI SIG领衔成员杨鑫:分享了如何基于MindSpore构建和部署医学影像分割模型,以及如何在Pair标注软件中基于MindSpore实现通用的、轻量化的智能分割标注,大幅提高标注效率和质量。2武汉理工大学计算机与人工智能学院副教授段鹏飞:基于国产化MindSpore深度学习平台,以快捷轻便的皮肤病诊断为研究重点深入挖掘,运用团队所研究的小样本分类、自然语言处理和知识图谱技术,分享了基于MindSpore的轻量级移动平台皮肤病辅助诊断系统。3摩赛恩科技技术专家丁岗:面向质谱数据处理与管理过程中存在的共性难题,聚焦分子智能识别检测技术,针对高分辨质谱仪器产生的浩瀚数据,分享了如何实现从质谱峰检测、峰对齐、差异分析、分子鉴定、样本智能识别,到数据库自建的完整功能。从组学研究的全流程,特别是算法与质谱数据处理、挖掘的角度探讨组学数据分析的痛点和难点,分享了质谱数据处理的若干实践案例。4连心医疗董事长章桦:分享了基于人工智能的器官自动勾画、靶区勾画、自动放疗计划、放疗质控等技术工具和云服务;同时基于互联网和云服务平台,分享了为广大放疗医生和物理师群体用户提供的专业远程协作和放疗运营网络。5众享未来融合研究院高级研究员李扬:以乳腺癌和心磁为例,分享了AI如何与医疗结合,结合人工进行医学诊断。包括图像分类,病灶定位,专家系统,算法融合等方法。近年来,人工智能与医疗产业进行了快速的融合,将传统医疗迭代进了智慧医疗时代。AI+医疗的快速发展,将为我国医疗行业发展和变革带来新的机遇。昇思MindSpore开源社区聚焦各地核心科技板块,赋能行业应用落地,推动AI各行业领域的创新发展,打造开发共赢的产业生态圈。
  • [热门活动] 【昇思生态城市行】南京站重磅开启,精彩内容抢先看!
    昇思MindSpore行业与技术论坛暨昇思生态城市行即将于11月22日下午在南京举办,活动以“昇腾万里 · 智赋江苏”为主题,围绕昇思MindSpore生态进展、技术创新展开,并将举行大模型签约、昇思MindSpore技术方案认证授牌及重磅AI解决方案发布仪式,携手产业界共同繁荣人工智能产业生态。大模型重磅合作签约南京高校云集、科研院所众多,本地人工智能产业也在快速成长,科研创新正是产业发展的源头。南京大学、南京先进计算产业发展有限公司(南京人工智能计算中心)、华为三方将联合研究孵化金陵.女娲大模型,并在本次活动中举行签约仪式。昇思携手伙伴发布产业级AI解决方案活动中,北联国芯、云问科技、奥看科技将重磅发布基于昇腾AI、昇思MindSpore的最新成果。昇思MindSpore致力于携手伙伴推动产业生态建设,共同构建行业解决方案,为行业智能化升级提供加速度。昇思MindSpore技术方案认证授牌仪式在大算力的支撑下,昇思MindSpore赋能多家合作伙伴实现技术突破,打造核心解决方案,共建人工智能产业软硬件生态。活动中,华为将为小视科技、云化科技、多伦科技等10余位合作伙伴颁发昇思MindSpore技术方案认证,认证合作伙伴将获得更多相关技术和推广支持。本次活动由江苏省科学技术厅指导,华为技术有限公司、南京江北新区产业技术研创园、南京江北新区科技投资集团共同主办,江苏鲲鹏·昇腾生态创新中心、南京集成电路培训基地承办。详细议程如下:现场参会或者更多合作扫码私信小助手
  • [其他问题] 在云产品上modelarts训练网络报错为'device_target' type cpu, but got Ascend.
    在云产品上modelarts训练网络报错为'device_target' type cpu, but got Ascend.完整的报错信息为ValueError: For 'context.set_context', package type mindspore support 'device_target' type cpu, but got Ascend。大概意思就是当前的版本支持cpu而得到的是Ascend我的资源环境是,我选择的是ascend
  • [功能调试] Construct内报错和定位解决
    1 系统环境硬件环境(Ascend/GPU/CPU): CPUMindSpore版本: 1.9执行模式: 静态图Python版本: 3.7.5操作系统平台: linux2 报错信息2.1 问题描述有一个模型,在construct里进行了一些计算,计算完毕后想删除某个tensor2.2 报错信息(代码格式)Traceback (most recent call last): File "D:/cons.py", line 11, in <module> m(1, 2) File "D:\python3.7\lib\site-packages\mindspore\nn\cell.py", line 622, in __call__ out = self.compile_and_run(*args) File "D:\python3.7\lib\site-packages\mindspore\nn\cell.py", line 1007, in compile_and_run self.compile(*inputs) File "D:\python3.7\lib\site-packages\mindspore\nn\cell.py", line 979, in compile jit_config_dict=self._jit_config_dict) File "D:\python3.7\lib\site-packages\mindspore\common\api.py", line 1147, in compile result = self._graph_executor.compile(obj, args_list, phase, self._use_vm_mode())RuntimeError: Unsupported statement 'Delete'.More details please refer to syntax support at https://www.mindspore.cn----------------------------------------------------- The Traceback of Net Construct Code:----------------------------------------------------# In file D:/cons.py:9 del a ^----------------------------------------------------- C++ Call Stack: (For framework developers)----------------------------------------------------mindspore\ccsrc\pipeline\jit\parse\parse.cc:772 mindspore::parse::Parser::ParseStatementProcess finished with exit code 12.3 脚本代码(代码格式,可上传附件)from mindspore import nnimport mindspore as msms.set_context(mode=ms.GRAPH_MODE)class Model(nn.Cell): def construct(self, x, y): a = x + 1 y = a + y del a return ym = Model()m(1, 2)3 根因分析在Graph模式下,Python代码并不是由Python解释器去执行,而是将代码编译成静态计算图,然后执行静态计算图。由于语法解析的限制,当前在编译构图时,支持的数据类型、语法以及相关操作并没有完全与Python语法保持一致,部分使用受限。具体参考:https://www.mindspore.cn/docs/zh-CN/r1.8/note/static_graph_syntax_support.html出错的代码https://gitee.com/mindspore/mindspore/blob/master/mindspore/ccsrc/pipeline/jit/parse/parse.cc从说明文档和代码上都能看出del不被支持4 解决方案不用del,将变量置Nonefrom mindspore import nnimport mindspore as msms.set_context(mode=ms.GRAPH_MODE)class Model(nn.Cell): def construct(self, x, y): a = x + 1 y = a + y a = None return ym = Model()m(1, 2)
  • [调试调优] [MindInsight算子性能分析]想问一下mindInsight展示出来的指标代表什么
    如图,可以看到通过Profiler记录的LeNet中卷积算子的数据。我想请问一下,为什么op77的op_total_time比cuda_activity_cost_time大这么多?这两个数据分别代表什么?
  • [功能调试] 报错:construct() missing 1 required positional argument:`label`和定位解决
    1 系统环境硬件环境(Ascend/GPU/CPU): GPUMindSpore版本: mindspore=2.0.0执行模式(动态图):PYNATIVEPython版本: Python=3.7.5操作系统平台: linux2 报错信息2.1 问题描述TypeError: construct() missing 1 required positional argument:'label'2.2 报错信息TypeError: construct() missing 1 required positional argument:'label'2.3 脚本代码def __init__(self, optimizer): ”””入参有两个:训练网络,优化器””” super(CustomTrain0neStepCell, self).__init__(auto_prefix=False) seLf.network = network # 定义前向网络 self.network.set_grad() # 构建反向网络 self.optimizer = optimizer # 定义优化器 self.weights = self.optimizer .parameters #待更新参数 self.grad = ops.Grad0peration(get_by_list=True,sens_param=True) 3 根因分析如果开启sens_param为True,正常在情况调用GradOperation复制需要传入sens的值,但此问题是因为在调用GradOperation中未传入sens值具体可以参考官网:cid:link_04 解决方案a. 把sens_param改为Falseb. 传入label目前选择传入label1. 复现问题, 未传入sense output = self._run_construct(args, kwargs)_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _self = CustomWithLossCell< (_backbone): LinearNet< (fc): Dense > (_loss_fn): L1LossForMultiLabel<> >cast_inputs = (Tensor(shape=[16, 1], dtype=Float32, value=[[-8.12028599e+00], [ 6.15144587e+00], [-6.11542606e+00], ... [-6.07206774e+00], [-7.80574739e-01], [ 4.12322092e+00]]),)kwargs = {} def _run_construct(self, cast_inputs, kwargs): """Run the construct function""" if self._enable_forward_pre_hook: cast_inputs = self._run_forward_pre_hook(cast_inputs) if self._enable_backward_hook: output = self._backward_hook_construct(*cast_inputs) elif hasattr(self, "_shard_fn"): output = self._shard_fn(*cast_inputs, **kwargs) else:> output = self.construct(*cast_inputs, **kwargs)E TypeError: construct() missing 1 required positional argument: 'label1'/root/miniconda3/envs/wys/lib/python3.7/site-packages/mindspore/nn/cell.py:413: TypeError2. 代码修改:from mindspore.ops.composite import GradOperationfrom mindspore.ops import operations as Pimport numpy as npfrom mindspore import Parameter, Tensorimport mindspore.ops as opsimport mindspore as msfrom mindspore.train import LossMonitorfrom ...share.dataset.create_dataset_mnist import create_dataset_mnistimport osimport mindspore.dataset as dsimport mindspore.ops as opsimport mindspore.nn as nnimport mindspore as msfrom mindspore.nn import LossBasefrom mindspore.common.initializer import Normaldef test_mmm(): class LinearNet(nn.Cell): """定义线性回归网络""" def __init__(self): super().__init__() self.fc = nn.Dense(1, 1, Normal(0.02), Normal(0.02)) def construct(self, x): return self.fc(x) def get_multilabel_data(num, w=2.0, b=3.0): """生成多标签数据,产生一组数据x对应一个标签y1""" for _ in range(num): x = np.random.uniform(-10.0, 10.0) noise1 = np.random.normal(0, 1) noise2 = np.random.normal(-1, 1) y1 = x * w + b + noise1 y2 = x * w + b + noise2 yield np.array([x]).astype(np.float32), np.array([y1]).astype(np.float32) def create_multilabel_dataset(num_data, batch_size=16): """生成多标签数据集,一个数据data对应1个标签label1""" dataset = ds.GeneratorDataset(list(get_multilabel_data(num_data)), column_names=['data', 'label1']) dataset = dataset.batch(batch_size) return dataset class L1LossForMultiLabel(LossBase): """自定义多标签损失函数""" def __init__(self, reduction="mean"): super(L1LossForMultiLabel, self).__init__(reduction) self.abs = ops.Abs() def construct(self, base, target1): """输入有三个,分别为预测值base,真实值target1和target2""" x1 = self.abs(base - target1) x2 = self.abs(base - target1) return self.get_loss(x1) / 2 + self.get_loss(x2) / 2 class CustomWithLossCell(nn.Cell): """连接前向网络和损失函数""" def __init__(self, backbone, loss_fn): """输入有两个,前向网络backbone和损失函数loss_fn""" super(CustomWithLossCell, self).__init__(auto_prefix=False) self._backbone = backbone self._loss_fn = loss_fn def construct(self, data, label1): output = self._backbone(data) # 前向计算得到网络输出 return self._loss_fn(output, label1) # 得到多标签损失值 multi_train_dataset = create_multilabel_dataset(num_data=160) # 构建线性回归网络 net = LinearNet() opt = nn.Momentum(net.trainable_params(), learning_rate=0.005, momentum=0.9) # 多标签损失函数 loss = L1LossForMultiLabel() # 连接线性回归网络和多标签损失函数 loss_net = CustomWithLossCell(net, loss) class CustomTrainOneStepCell(nn.Cell): """自定义训练网络""" def __init__(self, network, optimizer, sens=1.0): """入参有三个:训练网络,优化器和反向传播缩放比例""" super(CustomTrainOneStepCell, self).__init__(auto_prefix=False) self.network = network # 定义前向网络 self.network.set_grad() # 构建反向网络 self.optimizer = optimizer # 定义优化器 self.weights = self.optimizer.parameters # 待更新参数 self.grad = ops.GradOperation(get_by_list=True, sens_param=True) # 反向传播获取梯度 def construct(self, *inputs): loss = self.network(*inputs) # 执行前向网络,计算当前输入的损失函数值 grads = self.grad(self.network, self.weights)(*inputs, loss) # 进行反向传播,计算梯度 loss = ops.depend(loss, self.optimizer(grads)) # 使用优化器更新梯度 return loss multi_train_ds = create_multilabel_dataset(num_data=160) # 手动构建训练网络 train_net = CustomTrainOneStepCell(loss_net, opt) # 构建训练网络 model = ms.Model(train_net) # 执行模型训练 model.train(epoch=1, train_dataset=multi_train_ds, callbacks=[LossMonitor()])重点修改代码, 加了一个label1:def get_multilabel_data(num, w=2.0, b=3.0):"""生成多标签数据,产生一组数据x对应一个标签y1"""for _ in range(num):x = np.random.uniform(-10.0, 10.0)noise1 = np.random.normal(0, 1)noise2 = np.random.normal(-1, 1)y1 = x * w + b + noise1y2 = x * w + b + noise2yield np.array([x]).astype(np.float32), np.array([y1]).astype(np.float32)def create_multilabel_dataset(num_data, batch_size=16):"""生成多标签数据集,一个数据data对应1个标签label1"""dataset = ds.GeneratorDataset(list(get_multilabel_data(num_data)), column_names=['data', 'label1'])dataset = dataset.batch(batch_size)return dataset最后结果:
  • [执行问题] ModelArts云上环境多卡分布式训练时asnumpy报错
    ↵运行环境NPU:Ascend-910(32GB)CPU:ARM 24 核Memory:96GB镜像:Ascend-Powered-Engine | mindspore_1.7.0-cann_5.1.0-py_3.7-euler_2.8.3-aarch64错误描述多卡分布式训练时,任何Tensor.asnumpy的调用都会报错。报错信息- Case 1[ERROR] DEVICE(222,ffffb7464010,python):2022-11-17-17:25:09.728.545 [mindspore/ccsrc/plugin/device/ascend/hal/device/ascend_kernel_runtime.cc:626] TaskFailCallback] Execute TaskFailCallback failed. task_fail_info or current_graph_ is nullptr[ERROR] DEVICE(222,ffffb7464010,python):2022-11-17-17:25:09.738.262 [mindspore/ccsrc/plugin/device/ascend/hal/device/ascend_kernel_runtime.cc:1116] SyncStream] Call runtime rtStreamSynchronize error.[CRITICAL] DEVICE(222,ffffb7464010,python):2022-11-17-17:25:09.738.349 [mindspore/ccsrc/plugin/device/ascend/hal/device/ascend_device_address.cc:202] SyncStream] Sync stream error!Traceback (most recent call last):无论File "/home/ma-user/modelarts/user-job-dir/Code/train.py", line 406, inMonitorCallBack(model, datasets, Logs_dict)]File "/home/ma-user/anaconda/lib/python3.7/site-packages/mindspore/train/model.py", line 906, in trainsink_size=sink_size)File "/home/ma-user/anaconda/lib/python3.7/site-packages/mindspore/train/model.py", line 87, in wrapperfunc(self, *args, **kwargs)File "/home/ma-user/anaconda/lib/python3.7/site-packages/mindspore/train/model.py", line 548, in _trainself._train_dataset_sink_process(epoch, train_dataset, list_callback, cb_params, sink_size)File "/home/ma-user/anaconda/lib/python3.7/site-packages/mindspore/train/model.py", line 642, in _train_dataset_sink_processlist_callback.epoch_end(run_context)File "/home/ma-user/anaconda/lib/python3.7/site-packages/mindspore/train/callback/_callback.py", line 216, in epoch_endcb.epoch_end(run_context)File "/home/ma-user/modelarts/user-job-dir/Code/train.py", line 73, in epoch_endCM = self.model.eval(dataset)["CM"]File "/home/ma-user/anaconda/lib/python3.7/site-packages/mindspore/train/model.py", line 1090, in evalreturn self._eval_dataset_sink_process(valid_dataset, list_callback, cb_params)File "/home/ma-user/anaconda/lib/python3.7/site-packages/mindspore/train/model.py", line 982, in _eval_dataset_sink_processself._update_metrics(outputs)File "/home/ma-user/anaconda/lib/python3.7/site-packages/mindspore/train/model.py", line 358, in _update_metricsmetric.update(*outputs)File "/home/ma-user/modelarts/user-job-dir/Code/train.py", line 269, in updatecm = np.bincount(self.n_class * Label + Prediction, minlength=self.n_class*self.n_class).reshape(self.n_class, self.n_class)File "/home/ma-user/anaconda/lib/python3.7/site-packages/mindspore/numpy/math_ops.py", line 4652, in bincountlength = int(maximum(F.reduce_max(x.astype(mstype.float32)), minlength - 1).asnumpy()) + 1File "/home/ma-user/anaconda/lib/python3.7/site-packages/mindspore/common/tensor.py", line 523, in asnumpyreturn Tensor_.asnumpy(self)RuntimeError: mindspore/ccsrc/plugin/device/ascend/hal/device/ascend_device_address.cc:202 SyncStream] Sync stream error!报错信息- Case 2[ERROR] DEVICE(220,ffffb0498010,python):2022-11-17-16:55:40.054.814 [mindspore/ccsrc/plugin/device/ascend/hal/device/ascend_kernel_runtime.cc:626] TaskFailCallback] Execute TaskFailCallback failed. task_fail_info or current_graph_ is nullptr [ERROR] DEVICE(220,ffffb0498010,python):2022-11-17-16:55:40.055.902 [mindspore/ccsrc/plugin/device/ascend/hal/device/ascend_kernel_runtime.cc:1116] SyncStream] Call runtime rtStreamSynchronize error. [CRITICAL] DEVICE(220,ffffb0498010,python):2022-11-17-16:55:40.055.970 [mindspore/ccsrc/plugin/device/ascend/hal/device/ascend_device_address.cc:202] SyncStream] Sync stream error! Traceback (most recent call last):   File "/home/ma-user/modelarts/user-job-dir/Code/train.py", line 402, in <module>     MonitorCallBack(model, datasets, Logs_dict)]   File "/home/ma-user/anaconda/lib/python3.7/site-packages/mindspore/train/model.py", line 906, in train     sink_size=sink_size)   File "/home/ma-user/anaconda/lib/python3.7/site-packages/mindspore/train/model.py", line 87, in wrapper     func(self, *args, **kwargs)   File "/home/ma-user/anaconda/lib/python3.7/site-packages/mindspore/train/model.py", line 548, in _train     self._train_dataset_sink_process(epoch, train_dataset, list_callback, cb_params, sink_size)   File "/home/ma-user/anaconda/lib/python3.7/site-packages/mindspore/train/model.py", line 642, in _train_dataset_sink_process     list_callback.epoch_end(run_context)   File "/home/ma-user/anaconda/lib/python3.7/site-packages/mindspore/train/callback/_callback.py", line 216, in epoch_end     cb.epoch_end(run_context)   File "/home/ma-user/modelarts/user-job-dir/Code/train.py", line 72, in epoch_end     CM = self.model.eval(dataset)["CM"]   File "/home/ma-user/anaconda/lib/python3.7/site-packages/mindspore/train/model.py", line 1090, in eval     return self._eval_dataset_sink_process(valid_dataset, list_callback, cb_params)   File "/home/ma-user/anaconda/lib/python3.7/site-packages/mindspore/train/model.py", line 982, in _eval_dataset_sink_process     self._update_metrics(outputs)   File "/home/ma-user/anaconda/lib/python3.7/site-packages/mindspore/train/model.py", line 358, in _update_metrics     metric.update(*outputs)   File "/home/ma-user/modelarts/user-job-dir/Code/train.py", line 208, in update     Label = data[1].copy().asnumpy().astype(int).flatten()   File "/home/ma-user/anaconda/lib/python3.7/site-packages/mindspore/common/tensor.py", line 523, in asnumpy     return Tensor_.asnumpy(self) RuntimeError: mindspore/ccsrc/plugin/device/ascend/hal/device/ascend_device_address.cc:202 SyncStream] Sync stream error!
  • [API使用] MindSpore Callback方法是否提供网络输出结果?
    run_context.original_args()中是否能获取训练输出的结果,例如是否能输出语义分割的pred_label数组,想用这些结果计算训练阶段的precision、recall等,注意是训练阶段的指标,而不是验证阶段。cb_param.net_outputs只能得到loss值。或者有计算训练阶段指标的其他方法吗?
  • [基础知识] 【MindSpore易点通】深度学习中的微分
    简介古希腊人将一个多边形分割成多个三角形,并将这些三角形的面积相加,进而得出多边形的面积。为了找到弯曲形状的面积,比如一个圆,古希腊人刻了这种形状的多边形。使用内接等边多边形近似圆,该方法也称为穷举法。什么是微分呢?上面例子中的穷举法就是微分的起源。为什么要使用微分?微分经常被用在求最优解当中,最优解恰好也是在深度学习中避不开的问题。神经网络是非常多个函数的组成的,假设一个简单的例子,我们把一个神经网络看作是一个函数,题目如下:·条件1:当x=2时,y=3;当x=3时,y=4。·条件2:条件1符合函数:y=wx+b。·求解:w,b。如上述问题,在深度学习中会怎么求解w,b呢,过程如下:·(1)初始化给定参数,让w=0.1,b=0.1。·(2)然后把x=2带入y=0.1*2+0.1=0.3;y=0.1*3+0.1=0.4比真实值要小。·(3)调大w,b,让x=b=0.5,y=0.5*3+0.5=2;y=0.5*2+0.5=1.5,比刚才接近真实值。·(4)继续调整w,b,以此求取函数不断地调整w,b无线接近满足条件的函数,这就是神经网络求解的基本过程,类比古希腊人计算圆的面积,都使用了穷举法。此时大家可能会有疑问,上面的例子也没有看到微分的身影呀,这是因为我们简化了计算过程,正如上面所述,神经网络是非常多个函数组成的。y=(((w1x1+w2x2)w3x3)...)我们就要用到链式求导法则了,让网络自己更新w,b。成熟的网络要学会自己更新!导数与微分在深度学习中,我们要选择对模型参数可导的损失函数。这意味着对于模型中的每个参数,如果我们增加或减少一个无限小的数值h,就能够计算出损失值增加或减少的速度有多快。假设存在函数f:R→R,输入和输出均为标量,那么导数的定义如下:假设极限存在,那么f'(a)是x=a处的导数。如果f在某个区间内每一点都可导,称为该区间可导。我们可以将导数f'(x)称为是f(x)在x的瞬时速度。所谓瞬时速度的变化依赖于h(h→0) 在x处的变化。这里引出来了导数,我们举例一个函数为:y=f(x)=3x2−4x。当x=1,让h取极小值趋近于0。此时f(x+h)−f(x)/h的值为2,证明如下同时也等价于现在我们再尝试计算y=f(x)在x=1的导数,y′=f′(x)=6x-4u 当x=1时,y'=2,这与上面的数值结果一致。到目前为止,我们只了解了单变量函数的微分。偏导数在深度学习的神经网络当中,会包含有很多的可变参数。因此,我们需要将微分推广到多变量函数。假设函数y=f(x1,x2,⋯,xn)具有n个可变参数,那么函数y关于第i个变量xi的偏导数定义形式如下:在计算∂y/∂xi过程中,我们需要将x1,...,xi-1,xi+1,...,xn当作是常量,然后计算y相对于xi的导数。那么就等价于:到此,我们也就计算出来了每个可变参数的梯度了,也打通了网络模型的任督二脉啦,此时的网络就能够进行前向传播和反向传播计算了。可参考【MindSpore易点通】模型训练中的前向传播和反向传播终于圆上了!!!总结本次给大家分享了微分在深度学习中的应用,微分可用于神经网络训练中的优化问题,也可以求取可变参数在某一刻的瞬时值,也就是梯度。同时也引出了导数和偏导数用于计算复合函数的梯度,计算出了网络的优化方向。欢迎浏览,如有不正确的地方欢迎留言指正~
  • [基础知识] 【MindSpore易点通】深度学习中的概率
    简介为什么会用到概率呢?因为在深度学习中经常会需要处理随机的数据,或者包含随机性的任务,随机性也来自非常多的方面,所以在存在不确定性的情况下,都需要用到概率。本次就和大家聊一聊深度学习中的概率随机变量首先我们来认识下随机变量。变量我们应该都很熟悉,例如在Python语言中,变量会关联并表示一个固定的值;那么随机变量也很好理解,就是可以随机的表示不同值的变量,例如x1和x2都是随机变量X可能取到的值,这种情况而言,一个随机变量只是对可能状态的描述,并且这个描述必须搭配一个概率分布来表达每个取值的可能性。随机变量可以可以分为两种情况:连续的和离散的。连续的随机变量伴随着实数值;离散的随机变量拥有有限或者可数无限多的状态,这些状态并不一定是整数形式,也可以是一些被命名的状态而没有数值。这也是连续随机变量和离散随机变量的区别。概率分布介绍完了随机变量,那么随机变量如何表示呢?答案是概率分布。概率分布就是用来表示连续随机变量或者离散随机变量其中一段中,每个可能取到的值的可能性大小,描述概率分布的方式也取决于随机变量是连续的还是离散的。下面我们就分析这两种情况下的概率分布。连续型随机变量:当我们面对的是连续型随机变量时,这时会用到概率密度函数,那么什么是概率密度函数呢,我们假设一个函数P,那么P需要满足以下三个条件。·p的定义范围必须是X所有可能状态的集合;·p(x)≥0,但并不一定要p(x)≤1;·∫p(x)d(x)=1。连续型随机变量的概率密集型函数p(x)不会直接给出不同状态下的概率,而是通过计算p(x)所在区域面积的值表示概率,因此可以对概率密度函数求积分计算出特定状态下的真实概率质量。x落在集合S中的概率可以通过对这个集合积分得到,那么在单变量的例子中,x落在[a,b]的概率则是∫[a,b]p(x)d(x)。离散型随机变量:如果我们面对的是离散型变量的概率分布,那么就可以用概率质量函数进行计算,这里用大写P表示。一般每一个随机变量都会有一个不同的概率质量函数,并且必须根据随机变量推断出所使用的概率质量函数。概率质量函数把随机变量可以取得的每一个值映射到随机变量取得该状态的概率,X=x的概率用P(x)进行表示。·P(x)=1表示X=x是一定发生的;·P(x)=0表示X=x是不可能发生的。概率质量函数可以同时作用在多个随机变量。多个变量的概率分布也可以称为联合概率分布。P(X=x,Y=y)表示的X=x和Y=y同时发生的概率,这也可以简写为P(x,y)。如果函数P是随机变量X的概率质量函数,函数需要满足以下三个条件。·P的定义范围必须是X所有可能状态的集合;·0≤P(x)≤1,不可能发生的事件概率为0,一定发生的概率为1;·∑P(x)=1,保障某一个状态概率不会大于1。假设一个离散型随机变量X有k个不同的取值,我们可以假设X属于均匀分布的,也就是取得每一个值的可能性是相同的,因此推断出概率质量函数为:P(X=xi)=1/k该函数对所有的i都成立,符合成为概率质量函数的条件。边缘概率:在我们知道一组变量的联合概率分布,但是想要了解其中一个子集的概率分布。这种定义在子集上的概率分布被称为边缘概率计算。假设有离散型随机变量x和y,并且我们知道P(x,y),如果我们需要计算P(x),那么可以通过求和的办法进行计算。将X=x时,Y=y1、y2、…yi…yn的概率累加求出来。总结本次内容给大家分享了深度学习中的概率,分析了概率的两种分布类型:连续型和离散型,以及两种概率分布函数要满足的条件和计算方法。欢迎大家浏览讨论,谢谢支持~
  • [网络构建] Mindspore网络构建
    网络构建神经网络模型是由神经网络层和Tensor操作构成的,mindspore.nn提供了常见神经网络层的实现,在MindSpore中,Cell类是构建所有网络的基类,也是网络的基本单元。一个神经网络模型表示为一个Cell,它由不同的子Cell构成。使用这样的嵌套结构,可以简单地使用面向对象编程的思维,对神经网络结构进行构建和管理。构建Mnist数据集分类的神经网洛import mindsporefrom mindspore import nn, ops个人理解:在代码层面也就是直接调用模块,通过模块来实现我们想要达成的效果。定义模型类定义神经网络时,可以继承nn.Cell类,在__init__方法中进行子Cell的实例化和状态管理,在construct方法中实现Tensor操作。class Network(nn.Cell): def __init__(self): super().__init__() self.flatten = nn.Flatten() self.dense_relu_sequential = nn.SequentialCell( nn.Dense(28*28, 512), nn.ReLU(), nn.Dense(512, 512), nn.ReLU(), nn.Dense(512, 10) ) def construct(self, x): x = self.flatten(x) logits = self.dense_relu_sequential(x) return logits #构建完成后,实例化Network对象,并查看其结构。 model = Network()print(model)Network< (flatten): Flatten<> (dense_relu_sequential): SequentialCell< (0): Dense (1): ReLU<> (2): Dense (3): ReLU<> (4): Dense >> #我们构造一个输入数据,直接调用模型,可以获得一个10维的Tensor输出,其包含每个类别的原始预测值。X = ops.ones((1, 28, 28), mindspore.float32)logits = model(X)print(logits) pred_probab = nn.Softmax(axis=1)(logits)y_pred = pred_probab.argmax(1)print(f"Predicted class: {y_pred}")模型层分解上节构造的神经网络模型中的每一层。input_image = ops.ones((5, 15, 18), mindspore.float32)print(input_image.shape) #输出结果 (5, 15, 18) #nn.Flatten层的实例化 flatten = nn.Flatten()flat_image = flatten(input_image)print(flat_image.shape) #nn.Dense全链层,权重和偏差对输入进行线性变换layer1 = nn.Dense(in_channels=20*20, out_channels=20)hidden1 = layer1(flat_image)print(hidden1.shape) #nn.ReLU层,网络中加入非线性的激活函数print(f"Before ReLU: {hidden1}\n\n")hidden1 = nn.ReLU()(hidden1)print(f"After ReLU: {hidden1}") #nn.SequentialCell容器配置seq_modules = nn.SequentialCell( flatten, layer1, nn.ReLU(), nn.Dense(15, 10)) logits = seq_modules(input_image)print(logits.shape) #nn.Softmax全链层返回的值进行预测softmax = nn.Softmax(axis=1)pred_probab = softmax(logits) 参数模型网络内部神经网络层具有权重参数和偏置参数print(f"Model structure: {model}\n\n") for name, param in model.parameters_and_names(): print(f"Layer: {name}\nSize: {param.shape}\nValues : {param[:2]} \n")内置神经网络(mindspore.nn)1.基本构成单元接口名概述mindspore.nn.CellMindSpore中神经网络的基本构成单元。mindspore.nn.GraphCell运行从MindIR加载的计算图。mindspore.nn.LossBase损失函数的基类。mindspore.nn.Optimizer用于参数更新的优化器基类。2.循环神经网络层接口名概述mindspore.nn.RNN循环神经网络(RNN)层,其使用的激活函数为tanh或relu。mindspore.nn.RNNCell循环神经网络单元,激活函数是tanh或relu。mindspore.nn.GRUGRU(Gate Recurrent Unit)称为门控循环单元网络,是循环神经网络(Recurrent Neural Network, RNN)的一种。mindspore.nn.GRUCellGRU(Gate Recurrent Unit)称为门控循环单元。mindspore.nn.LSTM长短期记忆(LSTM)网络,根据输出序列和给定的初始状态计算输出序列和最终状态。mindspore.nn.LSTMCell长短期记忆网络单元(LSTMCell)。3.嵌入层接口名概述mindspore.nn.Embedding嵌入层。mindspore.nn.EmbeddingLookup嵌入查找层。mindspore.nn.MultiFieldEmbeddingLookup根据指定的索引和字段ID,返回输入Tensor的切片。4.池化层接口名概述mindspore.nn.AdaptiveAvgPool1d对输入的多维数据进行一维平面上的自适应平均池化运算。mindspore.nn.AdaptiveAvgPool2d二维自适应平均池化。mindspore.nn.AdaptiveAvgPool3d三维自适应平均池化。mindspore.nn.AdaptiveMaxPool1d对输入的多维数据进行一维平面上的自适应最大池化运算。mindspore.nn.AdaptiveMaxPool2d二维自适应最大池化运算。mindspore.nn.AvgPool1d对输入的多维数据进行一维平面上的平均池化运算。mindspore.nn.AvgPool2d对输入的多维数据进行二维的平均池化运算。mindspore.nn.MaxPool1d对时间数据进行最大池化运算。mindspore.nn.MaxPool2d对输入的多维数据进行二维的最大池化运算。5. 图像处理层接口名概述mindspore.nn.CentralCrop根据指定比例裁剪出图像的中心区域。mindspore.nn.ImageGradients计算每个颜色通道的图像渐变,返回为两个Tensor,分别表示高和宽方向上的变化率。mindspore.nn.MSSSIM多尺度计算两个图像之间的结构相似性(SSIM)。mindspore.nn.PSNR在批处理中计算两个图像的峰值信噪比(PSNR)。mindspore.nn.ResizeBilinear使用双线性插值调整输入Tensor为指定的大小。mindspore.nn.SSIM计算两个图像之间的结构相似性(SSIM)。因为篇幅原因,这里就不全部介绍了,后面会继续更新
  • [应用实践] Mindspore-训练模型
    前言MindSpore:新一代AI开源计算框架。创新编程范式,AI科学家和工程师更易使用,便于开放式创新;该计算框架可满足终端、边缘计算、云全场景需求,能更好保护数据隐私;可开源,形成广阔应用生态。2020年3月28日,华为在开发者大会2020上宣布,全场景AI计算框架MindSpore在码云正式开源。MindSpore着重提升易用性并降低AI开发者的开发门槛,MindSpore原生适应每个场景包括端、边缘和云,并能够在按需协同的基础上,通过实现AI算法即代码,使开发态变得更加友好,显著减少模型开发时间,降低模型开发门槛。通过MindSpore自身的技术创新及MindSpore与华为昇腾AI处理器的协同优化,实现了运行态的高效,大大提高了计算性能;MindSpore也支持GPU、CPU等其它处理器。一、训练模型(1)步骤构建数据集。定义神经网络模型。定义超参、损失函数及优化器。输入数据集进行训练与评估。(2)开发前提我们在使用这个框架进行模型训练的时候,我们必须在数据集和网络构建中加载一些代码,这是为了后面测试的时候可以更好地针对性训练,也是对数据训练更完整做了一个前提准备的过程。 import mindspore from mindspore import nn from mindspore import ops from mindspore.dataset import vision, transforms from mindspore.dataset import MnistDataset # Download data from open datasets from download import download url = "https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/" \ "notebook/datasets/MNIST_Data.zip" path = download(url, "./", kind="zip", replace=True) def datapipe(path, batch_size): image_transforms = [ vision.Rescale(1.0 / 255.0, 0), vision.Normalize(mean=(0.1307,), std=(0.3081,)), vision.HWC2CHW() ] label_transform = transforms.TypeCast(mindspore.int32) dataset = MnistDataset(path) dataset = dataset.map(image_transforms, 'image') dataset = dataset.map(label_transform, 'label') dataset = dataset.batch(batch_size) return dataset train_dataset = datapipe('MNIST_Data/train', 64) test_dataset = datapipe('MNIST_Data/test', 64) class Network(nn.Cell): def __init__(self): super().__init__() self.flatten = nn.Flatten() self.dense_relu_sequential = nn.SequentialCell( nn.Dense(28*28, 512), nn.ReLU(), nn.Dense(512, 512), nn.ReLU(), nn.Dense(512, 10) ) def construct(self, x): x = self.flatten(x) logits = self.dense_relu_sequential(x) return logits model = Network()(3)配置参数这里我们就必须要提到另外一个概念,就是超参超参是可以调整的参数,可以控制模型训练优化的过程,不同的超参数值可能会影响模型训练和收敛速度。目前深度学习模型多采用批量随机梯度下降算法进行优化,随机梯度下降算法的原理经常使用的超参训练轮次(epoch):训练时遍历数据集的次数。这里我补充一下,这就是相当于我们在数钱的时候,数一张大拇指动一下,那么我们数多少张,大拇指所动的次数,大概就是这样的一个道理。批次大小(batch size):数据集进行分批读取训练,设定每个批次数据的大小。batch size过小,花费时间多,同时梯度震荡严重,不利于收敛;batch size过大,不同batch的梯度方向没有任何变化,容易陷入局部极小值,因此需要选择合适的batch size,可以有效提高模型精度、全局收敛。学习率(learning rate):如果学习率偏小,会导致收敛的速度变慢,如果学习率偏大,则可能会导致训练不收敛等不可预测的结果。梯度下降法被广泛应用在最小化模型误差的参数优化算法上。梯度下降法通过多次迭代,并在每一步中最小化损失函数来预估模型的参数。学习率就是在迭代过程中,会控制模型的学习进度。(4)训练流程模拟训练也就是对模型的流程大致的做一个预想方案,按照流程进行操作训练:迭代训练数据集,并尝试收敛到最佳参数。验证/测试:迭代测试数据集,以检查模型性能是否提升。(5)损失函数损失函数或代价函数是将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的“风险”或“损失”的函数。在应用中,损失函数通常作为学习准则与优化问题相联系,即通过最小化损失函数求解和评估模型。例如在统计学和机器学习中被用于模型的参数估计,在宏观经济学中被用于和决策 ,在控制理论中被应用于最优控制理论。(6)开始训练代码放在下面 def train_loop(model, dataset, loss_fn, optimizer): # Define forward function def forward_fn(data, label): logits = model(data) loss = loss_fn(logits, label) return loss, logits # Get gradient function grad_fn = ops.value_and_grad(forward_fn, None, optimizer.parameters, has_aux=True) # Define function of one-step training def train_step(data, label): (loss, _), grads = grad_fn(data, label) loss = ops.depend(loss, optimizer(grads)) return loss size = dataset.get_dataset_size() model.set_train() for batch, (data, label) in enumerate(dataset.create_tuple_iterator()): loss = train_step(data, label) if batch % 100 == 0: loss, current = loss.asnumpy(), batch print(f"loss: {loss:>7f} [{current:>3d}/{size:>3d}]") def test_loop(model, dataset, loss_fn): num_batches = dataset.get_dataset_size() model.set_train(False) total, test_loss, correct = 0, 0, 0 for data, label in dataset.create_tuple_iterator(): pred = model(data) total += len(data) test_loss += loss_fn(pred, label).asnumpy() correct += (pred.argmax(1) == label).asnumpy().sum() test_loss /= num_batches correct /= total print(f"Test: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \n") loss_fn = nn.CrossEntropyLoss()optimizer = nn.SGD(model.trainable_params(), learning_rate=learning_rate) epochs = 3for t in range(epochs): print(f"Epoch {t+1}\n-------------------------------") train_loop(model, train_dataset, loss_fn, optimizer) test_loop(model, test_dataset, loss_fn)print("Done!") 二、扩展这里我熟悉了这个数据的训练之后,我做了一个有关模型训练的实际操作红酒分类代码如下:
  • [推理经验] Mindspore 众智项目ONNX推理经验分享
    2022.8月 - 2022.10月我开始了华为的众智计划的开发,我主要负责CenterNet和FairMOT两个模型的ONNX推理任务,按照任务指导,开发流程是首先结合权重文件将模型转为MINDIR模型,然后将MINDIR文件使用MindSpore Lite解密为ms文件,上传到Netron 在线官网对模型可视化对算子经行分析。如果需要映射算子,就经行映射任务。然后导出onnx模型,最后进行onnx模型推理使精度和ckpt文件的精度保持一致。模型导出但是两个模型在使用MindSpore Lite时都出现了算子不支持的错误,而且两个模型均涉及到GaterD算子,原因是GatherD算子在MindSpore Lite-1.7版本都不支持,在使用了所有版本进行尝试后仍然无果,最后在等待一段时间后,社区推出了1.8测试版本,在开源版1.8版本转换成功,并进行了算子可视化分析。算子映射对算子经行了分析后发现有多个算子均需要映射,但同时,值得庆幸的是两个模型有部分算子是通用的。CenterNet模型中最复杂的映射工作是GatherD算子,要将MindSpore的GatherD算子映射为ONNX的GatherDElements算子(MindSpore的GatherD算子和ONNX的GatherDElements功能一致,但是输入和参数不一致),需要将他们的输入和维度参数相互映射一下,映射过后可以编译,但是其他算子受到影响,需要在其他受到影响的算子加入更多的索引判断条件。最后一样的流程完成其他算子的映射。但是在FairMOT算子映射时,发现L2Normalize算子没有在ONNX算子库里实现,在ONNX算子库找到最接近的算子是LayerNormalization算子,但是在编译结束后,进行推理的过程中出现许多报错,在与对接人吴逸群工程师和其他优秀的开发者(感谢他们的帮助)交流出两种方案,1. 通过在python中自己实现一个Normalize规避,替换掉ops.L2Normalize的调用 2. 使用onnx算子库中的LpNormalization算子分析精度变化, 但是没法指定epsilon数值。我首先采取了算子调试,输入相同数据如果结果差异比较明显,那就只能自己实现一个norm,把框架的norm替换掉,但是实现函数的时候必须调用框架算子实现,不然得自己自定义反向传播,这样难度又增加了。最后我使用直接映射的方法,将L2Normalize算子直接一对一映射到LpNormalization算子,在最后的实验中,精度并不会受到影响。这样就完成了全部算子的映射工作。ONNX推理在ONNX推理过程中,均遇到了各种问题,首先是CenterNet模型,CenterNet模型使用的是MS COCO2017数据集经行推理,但是模型输入的时候只支持静态输入,也就是对数据集中的图片输入到网络的时候,ONNX中的图片大小是固定的,当大小不一致的图片输入ONNX图的时候,就会报错。经过查询发现是MindSpore不支持动态输入的类型,但是我发现武汉理工大学团队提交的许多模型中有许多是动态输入的类型(这里感谢武汉理工大学团队的杜闯同学,为我提供了许多建议和帮助)。具体做法是通过export的时候,根据不同shape导出对应的onnx,eval_onnx在不同图片推理的时候分别调用到对应onnx就可以了,在导出的时候输出张量的图片宽高变量,并将高宽命名为onnx模型名字,在推理的时候保存张量的图片宽高变量,从根目录通过宽高调取onnx文件,此时命名一致。在一个for循环中根据宽高调用不同的onnx推理文件并将推理结果写入一个txt文件中,最后评估器调用txt文件中的推理结果,得到和ckpt文件推理结果一致的精度。其次是FairMOT模型的推理工作,FairMOT和其他模型不一样的地方在于ckpt文件不是通过MindSpore官网下载得到,而是根据训练过后的pth文件通过权重转换的方式将它转为ckpt文件,通过转换后的ckpt文件可以正常导出MINDIR和ONNX文件,但是推理精度不对,开始我认为是多目标跟踪领域跟踪结果需要上传服务器的问题,将本地ckpt文件推理结果上传到MOT challenge评估服务器后,得到的结果依然是空值(onnx推理结果依然是空值)。在经过多次尝试后分析,判断是预训练权重的问题,但是ckpt文件必须自己训练,而FairMOT需要的训练数据集高达70个G,可能需要训练非常久的时间,但是可以通过加载预训练权重的方式训练,结果在训练过程中发现作者并没有提供训练文件,比如MOT20.train、MOT20.val的文件,我使用Github仓库原FairMOT作者提供的gen-labels-20.py代码中生成出训练文件,再通过加载预训练权重的方式训练30个epochs,最后使用第30轮epoch进行推理,推理结果在本地显示,ckpt和onnx精度均达标。
  • [安装经验] Mindspore安装教程
    目录一、Mindspore简介1.介绍2.昇思MindSpore的优势(1)简单的开发体验(2)灵活的调试模式(3)充分发挥硬件潜能(4)全景快速部署二、安装MindSpore1.获取安装命令(1)选择需要下载的配置(2)命令安装(3)安装conda(4)安装cource三、小结一、Mindspore简介1.介绍​MindSpore是由华为于2019年8月推出的新一代全场景AI计算框架,2020年3月28日,华为宣布MindSpore正式开源。昇思MindSpore总体架构如下图所示:昇思MindSpore作为全场景AI框架,所支持的有端(手机与IOT设备)、边(基站与路由设备)、云(服务器)场景的不同系列硬件,包括昇腾系列产品、英伟达NVIDIA系列产品、Arm系列的高通骁龙、华为麒麟的芯片等系列产品。2.昇思MindSpore的优势(1)简单的开发体验官方说明:帮助开发者实现网络自动切分,只需串行表达就能实现并行训练,降低门槛,简化开发流程。个人理解: 也就是相对开发的便捷度上面是有提高的,这个我们后面会专门介绍(2)灵活的调试模式官方说明:具备训练过程静态执行和动态调试能力,开发者通过变更一行代码即可切换模式,快 速在线定位问题。个人理解: 也就是说在我们对代码调试的时候,可以快速定位存在bug的地方,着对于开发者来说是一件求之不得的事情,我们每一个开发对于代码的测试和调试都是很头疼的,这个功能真是太香了。(3)充分发挥硬件潜能官方说明:最佳匹配昇腾处理器,最大程度地发挥硬件能力,帮助开发者缩短训练时间,提升推理性能。个人理解: 也就是说我们在硬件做好之后,因为昇腾的处理器很强大,不需要大量的模拟测试和训练,可以大大提高我们的开发效率。(4)全景快速部署官方说明:支持云、边缘和手机上的快速部署,实现更好的资源利用和隐私保护,让开发者专注于AI应用的创造。个人理解: 这个就是说存在良好的生态,并且可以在移动设备或者云端快速的部署项目,我们可以更安全、更专注的做AI的开发二、安装MindSpore1.获取安装命令官网下载网址MindSpore官网(1)选择需要下载的配置这里我选择的是1.8.1版本、python选择的是3.9版本这里需要注意一点------windows必须为win10 64位(2)命令安装打开python输入官网给的安装下载命令命令:pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.7.1/MindSpore/cpu/x86_64/mindspore-1.7.1-cp39-cp39-win_amd64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple验证是否安装成功pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.7.1/MindSpore/cpu/x86_64/mindspore-1.7.1-cp39-cp39-win_amd64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple这里如果输出版本号说明安装成功MindSpore version: 版本号The result of multiplication calculation is correct, MindSpore has been installed successfully!(3)安装conda确认环境win10 -64版本选择conda适配版本​通过命令安装MindSpore(4)安装cource需要安装这里要注意一点:也是要配置环境变量,一样的方式安装git工具安装GCC7.3这里同上,需要配置环境变量安装Cmake3.18版本这里同上,需要配置环境变量安装ActiviPerl 5.28.1版本安装wheel从代码仓中下载源码源码编译进行最后的MindSpore安装验证是否安装成功出现以上的版本信息说明成功三、小结总的来说,这玩意搭建太费劲了,按照我用华为的产品来看,基本上都是前期搭建很麻烦,但是熟悉之后,效率是真的很高,产品也是真的好用!!!
  • [软件平台] 使用mindspore框架训练出的mindir格式模型在MDC610上做推理任务部署问题
    用mindspore框架训练出的mindir格式模型进行推理任务开发,看了 https://www.mindspore.cn/tutorials/experts/zh-CN/r1.8/infer/ascend_310_mindir.html 此篇中的开发环境准备-参考安装指导准备Ascend环境与MindSpore,在实际MDC环境安装Ascend-cann-toolkit_5.1.RC2_linux-aarch64.run时出现下面问题:​从上面看应该是空间资源有限,不让安装Ascend-cann-toolkit。请问mindir格式模型能否直接转成om格式文件,在MDC上无需搭建mindspore框架直接部署,如可以有相关案例可以参考吗?请指导,谢谢!