ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MindSpore后端运行类

2021-01-24 08:01:42  阅读:179  来源: 互联网

标签:loss 缓存 后端 self MindSpore net 共享内存 运行


MindSpore后端运行类

Q:如何在训练过程中监控loss在最低的时候并保存训练参数?

A:可以自定义一个Callback。参考ModelCheckpoint的写法,此外再增加判断loss的逻辑:

class EarlyStop(Callback):

def __init__(self):

    self.loss = None

def step_end(self, run_context):

     loss =  ****(get current loss)

     if (self.loss == None or loss < self.loss):

         self.loss = loss

         # do save ckpt

Qmindspore/tests下怎样执行单个ut用例?

A:ut用例通常需要基于debug版本的MindSpore包,官网并没有提供。可以基于源码使用sh build.sh编译,然后通过pytest指令执行,debug模式编包不依赖后端。编译选项sh build.sh -t on,用例执行可以参考tests/runtest.sh脚本。

Q:使用nn.Conv2d时,怎样获取期望大小的feature map

A:Conv2d shape推导方法可以参考这里,Conv2d的pad_mode改成same,或者可以根据Conv2d shape推导公式自行计算pad,想要使得shape不变,一般pad为(kernel_size-1)//2。

QMindSpore安装完成,执行训练时发现网络性能异常,权重初始化耗时过长,怎么办?

A:可能与环境中使用了scipy 1.4系列版本有关,通过pip list | grep scipy命令可查看scipy版本,建议改成MindSpore要求的scipy版本。版本第三方库依赖可以在requirement.txt中查看。 https://gitee.com/mindspore/mindspore/blob/{version}/requirements.txt

其中version替换为MindSpore具体的版本分支。

Q:使用MindSpore可以自定义一个可以返回多个值的loss函数?

A:自定义loss function后还需自定义TrainOneStepCell,实现梯度计算时sens的个数和network的输出个数相同。具体可参考:

net = Net()

 

loss_fn = MyLoss()

 

loss_with_net = MyWithLossCell(net, loss_fn)

 

train_net = MyTrainOneStepCell(loss_with_net, optim)

 

model = Model(net=train_net, loss_fn=None, optimizer=None)

QMindSpore如何实现早停功能?

A:可以自定义callback方法实现早停功能。 例子:当loss降到一定数值后,停止训练。

class EarlyStop(Callback):

    def __init__(self, control_loss=1):

        super(EarlyStep, self).__init__()

        self._control_loss = control_loss

 

    def step_end(self, run_context):

        cb_params = run_context.original_args()

        loss = cb_params.net_outputs

        if loss.asnumpy() < self._control_loss:

            # Stop training

            run_context._stop_requested = True

 

stop_cb = EarlyStop(control_loss=1)

model.train(epoch_size, ds_train, callbacks=[stop_cb])

Q:请问自己制作的黑底白字28*28的数字图片,使用MindSpore训练出来的模型做预测,报错提示wrong shape of image是怎么回事?

A:首先MindSpore训练使用的灰度图MNIST数据集。所以,模型使用时,对数据是有要求的,需要设置为28*28的灰度图,就是单通道才可以。

Q:在Ascend平台上,执行用例有时候会报错run task error,如何获取更详细的日志帮助问题定位?

A:可以通过开启slog获取更详细的日志信息以便于问题定位,修改/var/log/npu/conf/slog/slog.conf中的配置,可以控制不同的日志级别,对应关系为:0:debug、1:info、2:warning、3:error、4:null(no output log),默认值为1。

Q:使用ExpandDims算子报错:Pynative run op ExpandDims failed。具体代码:

context.set_context(

mode=cintext.GRAPH_MODE,

device_target='ascend')

input_tensor=Tensor(np.array([[2,2],[2,2]]),mindspore.float32)

expand_dims=ops.ExpandDims()

output=expand_dims(input_tensor,0)

A:这边的问题是选择了Graph模式却使用了PyNative的写法,所以导致报错,MindSpore支持两种运行模式,在调试或者运行方面做了不同的优化:

  • PyNative模式:也称动态图模式,将神经网络中的各个算子逐一下发执行,方便用户编写和调试神经网络模型。
  • Graph模式:也称静态图模式或者图模式,将神经网络模型编译成一整张图,然后下发执行。该模式利用图优化等技术提高运行性能,同时有助于规模部署和跨平台运行。

用户可以参考官网教程选择合适、统一的模式和写法来完成训练。

Q:使用Ascend平台执行训练过程,出现报错:Out of Memory!!! total[3212254720] (dynamic[0] memory poll[524288000]) malloc[32611480064] failed! 如何解决?

A:此问题属于内存占用过多导致的内存不够问题,可能原因有两种:

  • batch_size的值设置过大。解决办法:将batch_size的值设置减小。
  • 引入了异常大的Parameter,例如单个数据shape为[640,1024,80,81],数据类型为float32,单个数据大小超过15G,这样差不多大小的两个数据相加时,占用内存超过3*15G,容易造成Out of Memory。解决办法:检查参数的shape,如果异常过大,减少shape。
  • 如果以上操作还是未能解决,可以上官方论坛发帖提出问题,将会有专门的技术人员帮助解决。

QMindSpore执行GPU分布式训练报错如下,如何解决:

Loading libgpu_collective.so failed. Many reasons could cause this:

1.libgpu_collective.so is not installed.

2.nccl is not installed or found.

3.mpi is not installed or found

A:此问题为MindSpore动态加载集合通信库失败,可能原因如下:

  • 执行环境未安装分布式训练依赖的OpenMPI以及NCCL。
  • NCCL版本未更新至v2.7.6:MindSpore v1.1.0新增GPU P2P通信算子,该特性依赖于NCCL v2.7.6,若环境使用的NCCL未升级为此版本,则会引起加载失败错误。

Q:启动缓存服务器时,若提示找不到libpython3.7m.so.1.0文件,应如何处理?

A:尝试在虚拟环境下查找其路径并设置LD_LIBRARY_PATH变量:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:{path_to_conda}/envs/{your_env_name}/lib

Q:缓存服务器异常关闭如何处理?

A:缓存服务器使用过程中,会进行IPC共享内存和socket文件等系统资源的分配。若允许溢出,在磁盘空间还会存在溢出的数据文件。一般情况下,如果通过cache_admin --stop命令正常关闭服务器,这些资源将会被自动清理。

但如果缓存服务器被异常关闭,例如缓存服务进程被杀等,用户需要首先尝试重新启动服务器,若启动失败,则应该依照以下步骤手动清理系统资源:

  • 删除IPC资源。
  1. 检查是否有IPC共享内存残留。

一般情况下,系统会为缓存服务分配4GB的共享内存。通过以下命令可以查看系统中的共享内存块使用情况。

$ ipcs -m

------ Shared Memory Segments --------

key        shmid      owner      perms      bytes      nattch     status

0x61020024 15532037   root       666        4294967296 1

其中,shmid为共享内存块id,bytes为共享内存块的大小,nattch为链接到该共享内存块的进程数量。nattch不为0表示仍有进程使用该共享内存块。在删除共享内存前,需要停止使用该内存块的所有进程。

  1. 删除IPC共享内存。

找到对应的共享内存id,并通过以下命令删除。

ipcrm -m {shmid}

  • 删除socket文件。

一般情况下,socket文件位于/tmp/mindspore/cache。进入文件夹,执行以下命令删除socket文件。

rm cache_server_p{port_number}

其中port_number为用户创建缓存服务器时指定的端口号,默认为50052。

  • 删除溢出到磁盘空间的数据文件。

进入启用缓存服务器时指定的溢出数据路径。通常,默认溢出路径为/tmp/mindspore/cache。找到路径下对应的数据文件夹并逐一删除。

 

标签:loss,缓存,后端,self,MindSpore,net,共享内存,运行
来源: https://www.cnblogs.com/wujianming-110117/p/14319991.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有