和 torch 相比,Conv2d 执行时间较慢
环境
- GPU:nvidia 5880 ada
- mindspore 版本:2.6.0.dev20250323
- torch 版本:2.5.1+cu124
具体问题
在相同输入,相同模型网络情况下,mindspore 的执行时间较慢,不知道升腾设备上是否会这样。
以下为复现代码。
def compare_conv2d():
import torch
import torch.nn as tnn
import mindspore as ms
import mindspore.nn as mnn
import numpy as np
import time
gpu_id = 3
ms.set_context(device_id=gpu_id, mode=ms.PYNATIVE_MODE,device_target="GPU")
device = torch.device(f'cuda:{gpu_id}' if torch.cuda.is_available() else 'cpu')
# 参数设置
batch_size, h, w = 16, 256, 256
in_channels, out_channels, kernel_size = 3, 8, 3
epochs = 500000
# 输入数据,全为1.5
torch_input = (torch.ones((batch_size, in_channels, h, w)) * 1.5).to(device)
ms_input = ms.Tensor(np.ones((batch_size, in_channels, h, w), dtype=np.float32) * 1.5)
# 网络定义
torch_conv = tnn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=1, bias=True).to(device)
ms_conv = mnn.Conv2d(in_channels, out_channels, kernel_size, stride=1, pad_mode='pad', padding=1, has_bias=True)
# 权重和偏置同步
with torch.no_grad():
torch_conv.weight.fill_(0.5)
torch_conv.bias.fill_(0.1)
ms_conv.weight.set_data(ms.Tensor(np.full(ms_conv.weight.shape, 0.5, dtype=np.float32)))
ms_conv.bias.set_data(ms.Tensor(np.full(ms_conv.bias.shape, 0.1, dtype=np.float32)))
# 循环进行多次前向计算
start_time = time.time()
for i in range(epochs):
torch_out = torch_conv(torch_input)
print(f"Torch 共 {epochs} 次推理时间: {time.time() - start_time}")
start_time = time.time()
for i in range(epochs):
ms_out = ms_conv(ms_input)
print(f"MindSpore 共 {epochs} 次推理时间: {time.time() - start_time}")
以下为运行结果:
Torch 共 500000 次推理时间: 87.73985862731934
MindSpore 共 500000 次推理时间: 99.30602216720581
如果 epoch 较小,ms 和 torch 之间的执行时间差异会更大。
好像是 ms 会做预编译?当 epoch 为 1 时,时间差异最大,ms的单次执行时间最大。随着 epoch 增大,ms 的单次执行时间也减小了。
需求
这个是 gpu 特有的问题吗?有办法设置像torch这样没有预编译的吗?或者说,能够加速执行时间的。我的项目中epoch数较小,时间耗费较大。