CDA数据分析师(CDA.cn)——真本事,心舒适
加快Python算法的四个方法(一)PyTorch
相信大家在做一些算法经常会被庞大的数据量所造成的超多计算量需要的时间而折磨的痛苦不已,接下来我们围绕四个方法来帮助大家加快一下Python的计算时间,减少大家在算法上的等待时间。下面为大家讲述有关PyTorch的内容。
1.介绍
在PyTorch模块中,我将展示如何使用torch和检查、初始化GPU设备pycuda,以及如何使算法更快。
PyTorch是建立在torch的机器学习库。它得到了Facebook AI研究小组的支持。在最近开发之后,由于它的简单性,动态图形以及它本质上是Python,它在被开发出来之后变得非常流行。它的速度仍然没有落后,在很多情况下可以说是表现的非常好的。 pycuda允许你从python访问Nvidia的CUDA并行计算API。
2.如何检查cuda的可用性?
要检查是否有cuda可用的设备Torch,可以简单地运行一下下面的代码:
CDA数据分析师(CDA.cn)——真本事,心舒适
import torch
torch.cuda.is_available()
# True
3.如何获取有关你的cuda设备的更多信息?
要获取设备的基本信息,可以使用torch.cuda。但是,要获取有关设备的更多信息,可以使用
pycuda,这是一个围绕CUDA库开发的python包装器。你可以使用: import torch
import pycuda.driver as cuda cuda.init()
##获取默认设备的Id
torch.cuda.current_device()
# 0
cuda.Device(0).name() # '0'是你的GPU的id
# Tesla K80
或者你可以这么用:
torch.cuda.get_device_name(0)#获取ID为'0'的名称设备 #'Tesla K80'
我编写了一个简单的类来获取有关cuda兼容GPU的信息:
#一个简单的类来了解你的cuda设备
import pycuda.driver as cuda
import pycuda.autoinit #必须使用它的功能 cuda.init() # 需要使用它的功能
class aboutCudaDevices(): def __init__(self): pass
def num_devices(self): \返回连接的设备数量.\ return cuda.Device.count()
def devices(self):
CDA数据分析师(CDA.cn)——真本事,心舒适
\获取所有连接设备的信息.\ num = cuda.Device.count() print(\%num) for i in range(num):
print(cuda.Device(i).name(), \%i)
def mem_info(self):
\获得所有设备的可用内存和总内存.\ available, total = cuda.mem_get_info()
print(\%(available/1e9, total/1e9))
def attributes(self, device_id=0): \获取设备Id的属性 = device_id\
return cuda.Device(device_id).get_attributes()
def __repr__(self):
\类表示为连接到它们的设备的数量.\ num = cuda.Device.count() string = \
string += (\%num) for i in range(num):
string += ( \%((i+1),cuda.Device(i).name(),i))
string += (\%(cuda.Device(i).total_memory()/1e9)) return string
# 你可以通过输入它的名字来打印输出(__repr__):
aboutCudaDevices()
# 1 设备(年代): # 1) Tesla K80 (Id: 0) # Memory: 12.00 GB
要获取当前的内存使用情况,你可以使用pyTorch的函数:
import torch
#返回当前的GPU内存使用
# 一个给定设备的容量(以字节为单位)
CDA数据分析师(CDA.cn)——真本事,心舒适
torch.cuda.memory_allocated()
#函数管理的当前的GPU内存 #以字节为给定设备缓存的分配器
torch.cuda.memory_cached()
在运行应用程序后,可以使用一个简单的命令来清除缓存:
# 释放缓存分配器当前持有的所有为占用的缓存内存 # 以便这些内存可以在其他GPU应用程序中可以使用 # 并且可以在NVIDIA-SMI中可以进行查看
torch.cuda.empty_cache()
但是,使用这个命令不会通过张量释放占用的GPU内存,因此它无法增加可用于PyTorch的GPU内存量。
这些内存方法仅适用于GPU。所以这才是真正需要它的地方。
4.如何存储张量并在GPU上运行模型?
使用.cuda函数。
如果你想要在CPU上存储一些内容,可以简单地编写代码:
a = torch.DoubleTensor([1., 2.])
这个向量是存储在CPU上的,你对它执行的任何操作都是在CPU上执行完成的。而要将其转移到GPU上,你只需要执行以下操作.cuda:
a = torch.FloatTensor([1., 2.]).cuda()
或者,
a = torch.cuda.FloatTensor([1., 2.])
这将为它选择默认设备,该默认设备可通过以下命令查看:
torch.cuda.current_device() #0
或者,你也可以执行以下操作:
a.get_device() #0
CDA数据分析师(CDA.cn)——真本事,心舒适
你也可以将一个模型发送到GPU设备。例如,考虑一个简单的模块nn.Sequential:
sq = nn.Sequential( nn.Linear(20,20), nn.ReLU(), nn.Linear(
20,4 ),nn.Softmax() )
要将其发送到GPU设备,只需执行以下操作:
model = sq.cuda()
你可以检查它是否在GPU设备上,为此,你必须检查它的参数是否在GPU设备上,例如:
#可以在这里进行讨论: discuss.pytorch.org/t/how-to-check-if-model-is-on-cuda
next(model.parameters()).is_cuda
# True
5.如果有多个GPU,如何选择和使用GPU?
你可以为当前应用/存储选择一个GPU,该GPU可以与你上一个应用/存储选择的GPU不同。 正如在第(2)部分中已经看到的那样,我们可以获得所有与cuda兼容的设备及其Id使用
pycuda的情况,在此我们就不再赘述了。
考虑到你有3个cuda兼容的设备,你可以初始化和分配tensors到一个特定的设备,就像这样。
cuda0 = torch.device('cuda:0') cuda1 = torch.device('cuda:1') cuda2 = torch.device('cuda:2')
# 如果你只使用 'cuda' , 张量/型号将会被发送到默认(当前)设备。(默认值= 0)
x = torch.Tensor([1., 2.], device=cuda1)
# 或者
x = torch.Tensor([1., 2.]).to(cuda1)
# 或者
x = torch.Tensor([1., 2.]).cuda(cuda1)
# 笔记:
# 如果你想改变默认设备,那么请使用: