gpu pytorch代码比cpu代码慢?

数据挖掘 Python 火炬 朱庇特
2022-02-18 17:53:08

我在 jupyter 笔记本中有以下 pytorch 代码:

import torch
t_cpu = torch.rand(500,500,500)
%timeit t_cpu @ t_cpu

哪个输出:

422 ms ± 3.93 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

下面的代码花费了大约 100 倍的时间:

import torch
t_gpu = torch.rand(500,500,500).cuda()
%timeit t_gpu @ t_gpu

输出:

31.8 ms ± 550 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

显然,gpu 版本花费更长的原因是因为它每个循环 1000 次

鉴于我根本没有指定,为什么它每个循环 1000 次?

附言。附带问题:“%timeit t_cpu @ t_cpu”中的“@t_cpu”做了什么?

1个回答

TL;博士

GPU 运行速度比 CPU 快(31.8ms < 422ms)。

你的结果基本上说:“你的 CPU 语句的平均运行时间是 422 毫秒,你的 GPU 语句的平均运行时间是 31.8 毫秒”。

第二个实验运行 1000 次,因为您根本没有指定它。如果您检查文档,它会说:

-n:循环执行给定语句的次数。如果未提供,则确定以获得足够的准确性。

运行次数

%timeit函数估计语句的运行时间。它通过多次执行该语句并测量它的平均运行时间来做到这一点。

它运行实验的次数是N×R, 在哪里N是循环数和R是它重复的次数。

如果您不指定NR, 默认R7N可能会有所不同。在您的情况下,您没有指定任何内容。所以,在第一个实验中,你有R=7N=1. 第二个实验是R=7N=1000.

N取决于运行单个循环所需的时间。如果你的语句很耗时,%timeit将执行更少的循环,而快速语句会更频繁地执行。之所以如此,是因为它可以使您的语句的实际运行时间更加准确。

结果

您不应根据运行%timeit函数所需的时间来考虑运行语句的时间。正如您所注意到的,循环的数量可能会有所不同。相反,请尝试解释打印输出。

例如,您有:

422 ms ± 3.93 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

422 ms ± 3.93 ms per loop: 这是运行您的语句一次所需的平均平均时间和标准偏差A是您的语句的单次执行。您的声明是您在调用函数时定义的(在您的情况下是)。loopt_cpu

of 7 runs, 1 loop each:这是%timeit运行语句以计算平均执行时间的次数。如果你认为跑步是t_cpu唯一的7时间不够可靠,无法估计422ms那么你可能会增加NR.

文档

我真的不介意在这里回答你的问题。但是,如果您想更快地澄清您的答案,一个很好的阅读资源通常是函数本身的文档。

%timeit函数的文档可以在这里找到。