PyNative 调试体验

  • 1、环境准备
  • 2、PyNative简介
  • 3、断点调试

1、 环境准备

准备的是一台x86 ascend机器

Linux localhost.localdomain 4.18.0-147.5.2.1.h579.eulerosv2r10.x86_64 #1 SMP Sat Jul 31 09:58:46 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

python -3.7.5

cke_6594.png

安装的是mindspore master 版本

commit_id = ‘[sha1]:4a7eaf1b,[branch]:(HEAD,origin/master,origin/HEAD,master)’

2、PyNative简介

1. pynative是通过ms.set_context(mode=ms.PYNATIVE_MODE)设置的。

图模式分为动态图和静态图两种,静态图使用JIT编译优化执行,使用静态语法,在语法上有较多限制, 相对于静态图来说动态图更加灵活,

它通过解释执行,具有动态语法亲和性。

动态图逐语句执行Python指令,因此每条Python指令执行完,都能够得到执行结果。

3、 断点调试

加入pdb.set_trace()脚本,就会停住,等待输入pdb指令

import numpy as np  
import mindspore as ms  
import mindspore.ops as ops  
import mindspore.nn as nn  
import pdb  
  
ms.set_context(device_target="Ascend", mode=ms.PYNATIVE_MODE)  
  
class PrintDemo(nn.Cell):  
    def __init__(self):  
        super(PrintDemo, self).__init__()  
        self.add1 = ops.Add()  
        self.add2 = ops.Add()  
  
    def construct(self, x, y):  
        out = self.add1(x, y)  
        pdb.set_trace()  
        out = self.add2(out, x)  
        return x  
  
x = ms.Tensor(np.ones([2, 1]).astype(np.int32))  
y = ms.Tensor(np.ones([2, 2]).astype(np.int32))  
net = PrintDemo()  
output = net(x, y)  

cke_54909.png

1 打印变量y的取值 p y

cke_70605.png

2. 查看程序调用栈 bt

(Pdb) bt  
  /home/test/test.py(24)<module>()  
-> output = net(x, y)  
  /root/miniconda3/envs/torch_1.12_op3.7/lib/python3.7/site-packages/mindspore/nn/cell.py(660)__call__()  
-> output = self._run_construct(args, kwargs)  
  /root/miniconda3/envs/torch_1.12_op3.7/lib/python3.7/site-packages/mindspore/nn/cell.py(444)_run_construct()  
-> output = self.construct(*cast_inputs, **kwargs)  
> /home/test/test.py(18)construct()  
-> out = self.add2(out, x)  
(Pdb)  

3 查看脚本上下文 l 1, 30 查看1-30行

4 执行代码,直到下一个断点 c

cke_135674.png

断点调试是网络调试必不可少的调试方法。