介绍
如何检查CUDA的可用性?
如何获取有关cuda设备的更多信息?
如何存储张量并在GPU上运行模型?
如果有多个GPU,如何选择和使用GPU?
数据并行
数据并行性比较
torch.multiprocessing
参考文献
在本文中,我将展示如何使用torch和pycuda检查、初始化GPU设备,以及如何使算法更快。
PyTorch是建立在torch之上的机器学习库。它得到了Facebook AI研究小组的支持。在最近开发之后,由于它的简单性,动态图以及本质上是pythonic,它已经获得了很大的普及。它的速度仍然不会落后,在许多情况下甚至可以超越其表现。
pycuda允许您从python访问Nvidia的CUDA并行计算API。
Sydney Rae在《 Unsplash》上创作的“沙滩上的棕色干树叶”
要检查Torch是否可以使用cuda设备,您可以简单地运行:
import torch
Rawpixel在Unsplash上发布的“黑色智能手机”
要获取设备的基本信息,可以使用torch.cuda。但是,要获取有关设备的更多信息,可以使用pycuda,这是CUDA库周围的python包装器。您可以使用类似:
import torch
或者
torch.cuda.get_device_name(0) # Get name device with ID '0'
我编写了一个简单的类来获取有关您的cuda兼容GPU的信息:
要获取当前的内存使用情况,可以使用pyTorch的函数,例如:
mport torch
运行应用程序后,可以使用简单的命令清除缓存:
# Releases all unoccupied cached memory currently held by
但是,使用此命令不会通过张量释放占用的GPU内存,因此它无法增加可用于PyTorch的GPU内存量。
这些内存方法仅适用于GPU。
使用 .cuda
如果要在cpu上存储内容,可以简单地写:
a = torch.DoubleTensor([1., 2.])
此向量存储在cpu上,您对其执行的任何操作都将在cpu上完成。要将其传输到gpu,您只需执行.cuda:
a = torch.FloatTensor([1., 2.]).cuda()
或者
这将为其选择默认设备,该默认设备可通过命令查看
torch.cuda.current_device()
也可以这样:
a.get_device()
您也可以将模型发送到GPU设备。例如,考虑一个由nn.Sequential组成的简单模块:
sq = nn.Sequential(
要将其发送到GPU设备,只需执行以下操作:
model = sq.cuda()
# From the discussions here: discuss.pytorch.org/t/how-to-check-if-model-is-on-cuda
在这些Tensor上执行任何操作时,无论选择哪个设备,都可以执行该操作,结果将与Tensor保存在同一设备上。
x = torch.Tensor([1., 2.]).to(cuda2)
如果您有多个GPU,则可将应用程序在多个设备上工作,但是它们之间会产生通信开销。但是,如果您不需要太多中继信息,则可以尝试一下。其实还有一个问题。在PyTorch中,默认情况下,所有GPU操作都是异步的。尽管在CPU和GPU或两个GPU之间复制数据时确实进行了必要的同步,但是如果您仍然使用torch.cuda.Stream()命令创建自己的流,那么您将必须自己照顾指令的同步 。从PyTorch的文档中举一个例子,这是不正确的:
cuda = torch.device('cuda')
如果您想充分利用多个GPU,可以:1.将所有GPU用于不同的任务/应用程序,2.将每个GPU用于集合或堆栈中的一个模型,每个GPU都有数据副本(如果可能),因为大多数处理是在训练模型期间完成的,3.在每个GPU中使用带有切片输入和模型副本。每个GPU都会分别计算结果,并将其结果发送到目标GPU,然后再进行进一步的计算等。
阿比盖尔·基南(Abigail Keenan)在《 Unsplash》上的“森林中的树木摄影”
在数据并行中,我们将从数据生成器获得的数据(一个批次)分割为较小的小型批次,然后将其发送到多个GPU进行并行计算。在PyTorch中,数据并行是使用torch.nn.DataParallel实现的。我们将看到一个简单的示例来了解实际情况。为此,我们必须使用nn.parallel的一些功能,即:1.复制:在多个设备上复制模块。2.分散:在这些设备中的第一维上分配输入。3.收集:从这些设备收集和连接第一维的输入。4.parallel_apply:要将从Scatter获得的一组分布式输入s,应用于从Replicate获得的相应分布式Module集合。
# Replicate module to devices in device_ids
或者,更简单
model = nn.DataParallel(model, device_ids=device_ids)
[他的github存储库最新更新:(2018年6月19日)]。PyTorch 1.0,Tensorflow 2.0的发布以及新的GPU可能已经改变了这一点……]因此,您可以看到,即使必须在开始和结束时与主设备进行通信,并行处理也绝对有帮助。在多GPU情况下,PyTorch的结果要比Chainer及其他所有结果都快。通过一次调用DataParallel,Pytorch也使其变得简单。
Unsplash 上Matthew Hicks作品torch.multiprocessing是Python多处理模块的包,其API与原始模块100%兼容。因此,您可以在此处使用Python的多处理模块中的Queue,Pipe,Array等。此外,为了使其更快,他们添加了一个方法share_memory_(),该方法使数据进入任何进程时都可以直接使用,因此将数据作为参数传递给不同的进程将不会复制该数据。
您可以在此处的“池和进程”部分中使用上面的方法,并且要获得更快的速度,可以使用share_memory_()方法在所有进程之间共享张量,而无需复制数据。您也可以使用机器集群。有关更多信息,请参见此处。
感谢您的阅读!
via https://towardsdatascience.com/speed-up-your-algorithms-part-1-pytorch-56d8a4ae7051