mindspore.ops.tensordump
- mindspore.ops.tensordump(file_name, tensor, mode='out')[源代码]
将Tensor保存为Numpy的npy格式的文件。
在并行的场景下,该算子会保存不同计算卡上的数据分片。
在昇腾平台的静态图并行模式下,代码 算子A –> 算子B 可能会被编译为 算子A –> 重排算子 –> 算子B。
注:重排算子指在静态图并行场景中,由于设备间通信,算子切分策略而引入的算子。
对于 算子A –> 算子B 的情况,算子A计算结果的输出等于算子B的输入。
然而对于算子A –> 重排算子 –> 算子B这样的情况,由于重排算子的插入,导致算子A的输出不再等价于算子B的输入。
假设一种情况是算子A的计算结果既作为算子B的输入,也作为tensordump算子的输入。则在该情况下, 通过设置mode参数可以实现不同的保存数据的需求:
如果mode参数设置为'out',保存的数据仅包含算子A的输出分片。
如果mode参数设置为'all',保存的数据将包含算子A的输出分片以及算子B的输入分片。
如果mode参数设置为'in',保存的数据将仅包含算子B的输入分片。
当mode参数被配置为'all'或'in'时,生成的输入分片所对应的npy文件命名格式为:id_fileName_cNodeID_dumpMode_rankID_dtype.npy。
当mode参数被配置为'all'或'out'时,生成的输出分片所对应的npy文件命名格式为:id_filename_dtype.npy。
id:一个自增的ID。
fileName:参数file_name的值 (若该参数传入时是一个使用者指定的路径,则fileName的值为路径的最后一级)。
cNodeID:该tensordump节点在step_parallel_end.ir文件中的节点编号
dumpMode:mode参数的值。
rankID:逻辑卡号。
dtype:原始的数据类型。bfloat16类型数据保存在.npy文件中会被转换成float32类型。
说明
当前该算子不支持在控制流中使用。
如果当前的并行模式为STAND_ALONE,参数mode只能设置为'out'。
如使用该算子时不设置参数mode,其默认值为'out'。
- 参数:
file_name (str) - npy文件的保存路径。
tensor (Tensor) - 输入的张量。
mode (str,可选) - 控制tensordump行为模式的参数,可选的值为 ['out', 'in', 'all'] 中的一个,默认值:
out
。
- 异常:
TypeError - file_name 不是一个str类型。
TypeError - tensor 不是一个Tensor类型。
TypeError - mode 不是一个str类型。
ValueError - mode 的值不是 ['out', 'in', 'all'] 之中的一个。
- 支持平台:
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 numpy as np >>> import mindspore as ms >>> from mindspore import nn, Tensor, ops, context >>> from mindspore.ops import operations as P >>> from mindspore.communication import init, get_rank >>> init() >>> rank_id = get_rank() >>> dump_path = f'dumps/rank_{rank_id}/mul1_mul2.npy' >>> class Net(nn.Cell): ... def __init__(self, strategy1, strategy2): ... super(Net, self).__init__() ... self.matmul1 = P.MatMul().shard(strategy1) ... self.matmul2 = P.MatMul().shard(strategy2) ... ... def construct(self, x, y, b): ... out1 = self.matmul1(x, y) ... ops.tensordump(dump_path, out1, 'all') ... out2 = self.matmul2(out1, b) ... return out2 ... >>> ms.set_context(mode=ms.GRAPH_MODE, 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 = Tensor(0.1 * np.random.randn(64, 64).astype(np.float32)) >>> y = Tensor(0.1 * np.random.randn(64, 64).astype(np.float32)) >>> b = Tensor(0.1 * np.random.randn(64, 64).astype(np.float32)) >>> out = net(x, y, b) >>> print(f"out shape is: {out.shape}") >>> matmul1_output_slice = np.load('0_mul1_mul2_Float32.npy') # load matmul1's output slice >>> matmul2_input_slice = np.load('1_mul1_mul2_CNode_64_all_rank_0_Float32.npy') # load matmul2's input slice