mindspore.ops.tensordump

查看源文件
mindspore.ops.tensordump(file_name, tensor, mode='out')[源代码]

将tensor保存为npy格式的文件。

警告

  • 参数 mode 将不再支持参数值为'all'。

在并行的场景下,该算子会保存不同计算卡上的数据分片。

在昇腾平台的静态图并行模式下,代码 算子A –> 算子B 可能会被编译为 算子A –> 重排算子 –> 算子B。

注:重排算子指在静态图并行场景中,由于设备间通信,算子切分策略而引入的算子。

对于 算子A –> 算子B 的情况,算子A计算结果的输出等于算子B的输入。

然而对于算子A –> 重排算子 –> 算子B这样的情况,由于重排算子的插入,导致算子A的输出不再等价于算子B的输入。

假设一种情况是算子A的计算结果既作为算子B的输入,也作为tensordump算子的输入。则在该情况下, 通过设置 mode 参数可以实现不同的保存数据的需求:

  • 如果 mode 参数设置为'out',保存的数据仅包含算子A的输出分片。

  • 如果 mode 参数设置为'in',保存的数据将仅包含算子B的输入分片。

mode 参数被配置为'in'时,生成的输入分片所对应的npy文件命名格式为:fileName_dumpMode_dtype_id.npy。

mode 参数被配置为'out'时,生成的输出分片所对应的npy文件命名格式为:fileName_dtype_id.npy。

  • fileName:参数 file_name 的值 (若该参数传入时是一个使用者指定的路径,则fileName值为路径的最后一级)。

  • dumpMode:参数 mode 的值。

  • dtype:原始的数据类型。bfloat16类型数据保存在.npy文件中会被转换成float32类型。

  • id:一个自增的ID。

说明

  • 在Ascend平台上的graph mode下,可以通过设置环境变量 MS_DUMP_SLICE_SIZEMS_DUMP_WAIT_TIME 解决在输出大tesnor或输出tensor比较密集场景下算子执行失败的问题。

  • 当前该算子不支持在控制流中使用。

  • 如果当前的并行模式为STAND_ALONE,参数 mode 只能设置为'out'。

  • 此函数用于调试。

参数:
  • file_name (str) - npy文件的保存路径。

  • tensor (Tensor) - 输入的张量。

  • mode (str,可选) - 控制tensordump行为模式的参数,可选的值为 ['out', 'in'] 中的一个,默认 out

支持平台:

Ascend

样例:

说明

使用msrun命令运行下面的例子:msrun --worker_num=2 --local_worker_num=2 --master_port=11450 --log_dir=msrun_log --join=True --cluster_time_out=300 tensordump_example.py

>>> import os
>>> import numpy as np
>>> import mindspore
>>> from mindspore import nn, context
>>> from mindspore.communication import init, get_rank
>>> init()
>>> rank_id = get_rank()
>>> dump_path = f'rank_{rank_id}_mul1_mul2.npy'
>>> class Net(nn.Cell):
...     def __init__(self, strategy1, strategy2):
...         super(Net, self).__init__()
...         self.matmul1 = mindspore.ops.MatMul().shard(strategy1)
...         self.matmul2 = mindspore.ops.MatMul().shard(strategy2)
...
...     def construct(self, x, y, b):
...         out1 = self.matmul1(x, y)
...         mindspore.ops.tensordump(dump_path, out1, 'out')
...         out2 = self.matmul2(out1, b)
...         return out2
...
>>> mindspore.set_context(mode=mindspore.GRAPH_MODE)
>>> os.environ["MS_DEV_SAVE_GRAPHS"] = "2"
>>> context.set_auto_parallel_context(parallel_mode='semi_auto_parallel', full_batch=True)
>>> strategy1 = ((1, 2), (2, 1))
>>> strategy2 = ((1, 2), (2, 1))
>>> net = Net(strategy1, strategy2)
>>> x = mindspore.tensor(0.1 * mindspore.ops.randn(64, 64), mindspore.float32)
>>> y = mindspore.tensor(0.1 * mindspore.ops.randn(64, 64), mindspore.float32)
>>> b = mindspore.tensor(0.1 * mindspore.ops.randn(64, 64), mindspore.float32)
>>> out = net(x, y, b)
>>> print(f"out shape is: {out.shape}")
>>> # out shape is (64, 64)
>>> matmul1_output_slice = np.load(f'rank_{rank_id}_mul1_mul2_float32_0.npy')      # load matmul1's output slice
>>> print(f"matmul1_output_slice is loaded, shape is: {matmul1_output_slice.shape}")
>>> # matmul1_output_slice is loaded, shape is: (64, 64)