Pytorch GPU的实现比Numpy慢得多



有人能向我解释一下为什么这个简单的操作需要这么多时间使用pytorch与GPU?我明白,也许这个方程对CPU (numpy代码)来说不是那么难,但是,当我使用pytorch处理更多样本的更难的问题时,0.6899似乎很可怕,它需要4ms。有没有办法让这个函数更有效率?谢谢你

import numpy as np
import torch
import time
# Define the functions to be tested
ndof = 2
x_dim = 20
n_samples = 1000
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
def NP_cost(x):
x_t_minus1 = np.concatenate((x[:, :ndof], x[:, :(x_dim - ndof)]), axis=1)
x_t_minus2 = np.concatenate((x_t_minus1[:, :ndof], x_t_minus1[:, :(x_dim - ndof)]), axis=1)
k_order = x + x_t_minus2 - 2 * x_t_minus1
return np.sum(k_order ** 2, axis=1)
def GPU_cost(x):
x_tensor = torch.tensor(x, dtype=torch.float32).to(device)
x_t_minus1 = torch.cat([x_tensor[:,:ndof], x_tensor[:, :(x_dim - ndof)]], dim=1)
x_t_minus2 = torch.cat([x_t_minus1[:,:ndof], x_t_minus1[:,:(x_dim - ndof)]], dim=1)
k_order = x_tensor + x_t_minus2 - 2*x_t_minus1
return torch.sum(k_order**2, dim=1).cpu().numpy()

# Generate a random input array
x = np.random.rand(n_samples, x_dim)
# Test the functions and measure execution time
start_time = time.time()
print(NP_cost(x)[0])    
print(f"NP_cost execution time: {time.time() - start_time:.4f} seconds")    # 0.0003 seconds
start_time = time.time()
print(GPU_cost(x)[0])
print(f"GPU_cost execution time: {time.time() - start_time:.4f} seconds")   # 0.6899 seconds

我不是这方面的专家,但我尝试了这段代码,它可能只是一堆来回复制,没有太多的gpu计算。用n_samples = 10000000试了一下,gpu做得更快了。

4.644260007225965
NP_cost执行时间:3.8376秒
4.6442604
GPU_cost执行时间:2.0928秒

Gpu执行需要将你的张量复制到设备上,进行计算,然后再复制回来。串联实际上只是另外几个拷贝。您所拥有的唯一真正的计算是一些加法、减法、平方和求和,这与您拥有的数据元素的数量相比并不多。我想听听有经验的人的意见。

感谢@balazon,我发现创建张量需要超过600ms,这是大多数时间。在代码的开头添加torch.cuda.synchronize()命令后,创建张量的速度很快。我无法解释……