MindSpore功能调试

举报
孙小北 发表于 2022/05/15 23:32:37 2022/05/15
【摘要】 网络调试 网络调试的基本流程(1)网络流程调试成功,网络执行整体不报错,正确输出loss值,且正常完成参数更新。打印Checkpoint文件中的权重值,查看两个step的权重是否发生改变,并完成更新。(2)网络多轮迭代执行输出loss值,且loss值具有基本的收敛趋势。(3)网络精度调试,超参调优。 用PyNative模式进行流程调试PyNative模式支持执行单算子、普通函数和网络,以及...

网络调试

网络调试的基本流程

(1)网络流程调试成功,网络执行整体不报错,正确输出loss值,且正常完成参数更新

  • 打印Checkpoint文件中的权重值,查看两个step的权重是否发生改变,并完成更新。

(2)网络多轮迭代执行输出loss值,且loss值具有基本的收敛趋势

(3)网络精度调试超参调优

用PyNative模式进行流程调试

  • PyNative模式支持执行单算子、普通函数和网络,以及单独求梯度的操作。在PyNative模式下,可以方便地设置断点,获取网络执行的中间结果,也可以通过pdb的方式对网络进行调试。
  • 在默认情况下,MindSpore处于Graph模式,可以通过set_context(mode=PYNATIVE_MODE)设置为PyNative模式

精度调试工具

  • Callback 功能:ModelCheckpoint、LossMonitor、SummaryCollector等Callback类用于保存模型参数、监控loss值、保存训练过程信息等功能
  • Metrics 功能:评估训练结果的好坏,accuracylossprecisionrecallF1等。
  • 自定义训练、学习率、优化函数
  • 使用MindOptimizer进行超参调优

案例

  • 设置动态图
import numpy as np
import mindspore.ops as ops
import mindspore.nn as nn
from mindspore import Tensor, set_context, PYNATIVE_MODE, dtype as mstype

# 设置运行模式为动态图模式
set_context(mode=PYNATIVE_MODE)
  • 定义加法算子
add = ops.Add()
x = Tensor(np.array([1, 2]).astype(np.float32))
y = Tensor(np.array([3, 5]).astype(np.float32))
z = add(x, y)
print("x:", x.asnumpy(), "\ny:", y.asnumpy(), "\nz:", z.asnumpy())

  • 自定义函数
add = ops.Add()

def add_func(x, y):
    z = add(x, y)
    z = add(z, x)
    return z

x = Tensor(np.array([1, 2]).astype(np.float32))
y = Tensor(np.array([3, 5]).astype(np.float32))
z = add_func(x, y)
print("x:", x.asnumpy(), "\ny:", y.asnumpy(), "\nz:", z.asnumpy())

image-20220515232821052.png

  • 自定义网络
class Net(nn.Cell):
    def __init__(self):
        super(Net, self).__init__()
        self.mul = ops.Mul()

    def construct(self, x, y):
        return self.mul(x, y)

net = Net()
x = Tensor(np.array([1.0, 2.0, 3.0]).astype(np.float32))
y = Tensor(np.array([4.0, 5.0, 6.0]).astype(np.float32))
z = net(x, y)

print("x:", x.asnumpy(), "\ny:", y.asnumpy(), "\nz:", z.asnumpy())

image-20220515232800472.png

  • 自定义反向传播
# 自定义nn.Cell对象的反向传播(计算)函数,从而控制nn.Cell对象梯度计算的过程,定位梯度问题。

set_context(mode=PYNATIVE_MODE)

class Net(nn.Cell):
    def construct(self, x, y):
        z = x * y
        z = z * y
        return z

    def bprop(self, x, y, out, dout):
        x_dout = x + y
        y_dout = x * y
        return x_dout, y_dout

grad_all = ops.GradOperation(get_all=True)
output = grad_all(Net())(Tensor(1, mstype.float32), Tensor(2, mstype.float32))
print(output)

  • 自定义同步执行
    • 为了提升性能,算子在device上使用了异步执行方式,因此在算子执行错误的时候,错误信息可能会在程序执行到最后才显示。针对这种情况,MindSpore增加了一个pynative_synchronize的设置来控制算子device上是否使用异步执行。
    • 当算子执行失败时,可以方便地通过调用栈看到出错的代码位置。
from mindspore import dtype as mstype

# 通过设置pynative_synchronize来使算子同步执行
set_context(mode=PYNATIVE_MODE, pynative_synchronize=True)

class Net(nn.Cell):
    def __init__(self):
        super(Net, self).__init__()
        self.get_next = ops.GetNext([mstype.float32], [(1, 1)], 1, "test")

    def construct(self, x1,):
        x = self.get_next()
        x = x + x1
        return x

set_context()
x1 = np.random.randn(1, 1).astype(np.float32)
net = Net()
output = net(Tensor(x1))
print(output.asnumpy())

image-20220515232548368.png

loss值对比检查

  • 对比对标脚本跑出的loss值与MindSpore脚本跑出的loss值,以验证整体网络结构和算子精度的正确性。
  • (1) 保证输入相同: 使用相同数据集进行计算
  • (2)去除网络中随机性因素的影响: 设置相同的随机性种子,关掉数据shuffle,修改代码去除dropout、initializer等网络中具有随机性的算子的影响等
  • (3) 保证相关超参数的设置相同
  • (4) 运行网络,比较输出的loss值,一般loss值误差在1‰左右,因为算子本身存在一定精度误差,随着step数增大,误差会有一定累加。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。