初探NIVIDIA GPU+CUDA+pyTorch

一些思考

现在市面上流行的NVIDIA的GPU还是比较多,我们知道NVIDIA基本自带CUDA数据包,也可以简单认为CUDA就是NIVIDIA的GPU驱动。用过P4,P100,V100的卡,感觉效果还是比较明显的,当然价格也更明显。其实选择什么样的卡来做训练和线上使用就得从架构上考虑了。从公司和个人的角度,需要考虑的处理能力,处理能力当然不是指的一个卡的运算能力,而是指服务器集群或者训练集群的处理能力。通常我们会考虑性价比,如果你有幸要做基于GPU的服务用于线上,就需要一个很好的架构师设计、测试及配置对应卡。不仅需要考虑的是GPU上的时间,同时也要考虑并发能力,当然并发的时候GPU就会成为瓶颈,特别是GPU的memory,相信用过GPU训练数据对out of memory with error(3)并不陌生。

其实在做服务的时候如果配置不当很容易会遇到GPU的out of memory的问题,那简单的解决方法,就是把batch变小(如果你batch size=1都支撑不了,那就考虑裁剪你的数据咯)或者通过优化神经网络及相关算法的中间变量的方法来减少GPU memory的使用。

当然如果你的输入数据大小不可控,我们还是需要考虑出现out of memory的情况,但是out of memory的时候,python没有被kill掉。我们的supervisor也监控不到不会重启,这个时候GPU的memory已经被占满了,无法自动释放,这个时候,我们需要考虑如何把数据释放掉。简单的方法,你需要有个ping test, 比如100ms发一次ping,如果连续两次失败,就可以远程发送指令重启服务(即kill掉你的服务的进程,比如python)

初探

看下CUDA基础上的pytorch基本几个知识点吧,我也是刚开始接触,不对的地方请指出。

1. 先搞一台GPU的机器,安装上python及pytorch之类的包。我这里是Centos的系统

2. 可以打开多个terminal,我这里是server,用的Xshell远程登录的,我这里会打开三个窗口。为什么需要三个窗口?可以方便看到监控信息。

初探NIVIDIA GPU+CUDA+pyTorch_第1张图片

3. 在第一个窗口安装htop,或者直接用自带的top也可以。具体效果参考第二步的第一个窗口

4. 在第二个窗口启动对GPU的监控,具体效果参考第二步的第一个窗口

watch -n 0.1 nvidia-smi

0.1秒刷新一次nvidia-smi命令

5. 第三个窗口,我们来输入命令。接下来看下怎么把数据load到GPU和CPU上,及内存和GPU存储的变化情况

6. 输入python,进入到python命令行 

初探NIVIDIA GPU+CUDA+pyTorch_第2张图片

7. 导入torch和variable

root@ALI-10-100-15-219:~# python
Python 3.6.3 |Anaconda custom (64-bit)| (default, Oct 13 2017, 12:02:49) 
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> from torch.autograd import Variable
>>> 

8. 在GPU的存储中生成变量,这里我们随机生成高斯分布的二维数组,量大点才能看到效果。

root@ALI-10-100-15-219:~# python
Python 3.6.3 |Anaconda custom (64-bit)| (default, Oct 13 2017, 12:02:49) 
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> from torch.autograd import Variable
>>> gpu_data = Variable(torch.randn(2000, 2000)).cuda()
>>> 

我们发现其实CPU和GPU的存储都变大了,也就是说数据分别放到内存和GPU存储上了。

初探NIVIDIA GPU+CUDA+pyTorch_第3张图片

9. cuda()函数中是接收参数的,默认是0,当然我们可以穿上1,指定到第二个GPU上。

root@ALI-10-100-15-219:~# python
Python 3.6.3 |Anaconda custom (64-bit)| (default, Oct 13 2017, 12:02:49) 
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> from torch.autograd import Variable
>>> gpu_data = Variable(torch.randn(2000, 2000)).cuda()
>>> gpu_data2 = Variable(torch.randn(2000, 2000)).cuda(1)

可以观察CPU的存储变的更大了,而且数据同时被load到了第二张卡上

初探NIVIDIA GPU+CUDA+pyTorch_第4张图片

10. 当然如果你不加后面的cuda()函数的话,数据就是加载到CPU上的了。

root@ALI-10-100-15-219:~# python
Python 3.6.3 |Anaconda custom (64-bit)| (default, Oct 13 2017, 12:02:49) 
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> from torch.autograd import Variable
>>> gpu_data = Variable(torch.randn(2000, 2000)).cuda()
>>> gpu_data2 = Variable(torch.randn(2000, 2000)).cuda(1)
>>> cpu_data2 = Variable(torch.randn(2000, 2000))
>>> 

初探NIVIDIA GPU+CUDA+pyTorch_第5张图片

11. 当然我们也可以把GPU的数据copy到CPU上,但是GPU上的数据并没有被释放。

root@ALI-10-100-15-219:~# python
Python 3.6.3 |Anaconda custom (64-bit)| (default, Oct 13 2017, 12:02:49) 
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> from torch.autograd import Variable
>>> gpu_data = Variable(torch.randn(2000, 2000)).cuda()
>>> gpu_data2 = Variable(torch.randn(2000, 2000)).cuda(1)
>>> cpu_data2 = Variable(torch.randn(2000, 2000))
>>> cpu_data = gpu_data.cpu()
>>> 
 

初探NIVIDIA GPU+CUDA+pyTorch_第6张图片

12. 当我们退出python命令行的时候,GPU存储上的数据及内存中的数据都会被释放掉了。

root@ALI-10-100-15-219:~# python
Python 3.6.3 |Anaconda custom (64-bit)| (default, Oct 13 2017, 12:02:49) 
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> from torch.autograd import Variable
>>> gpu_data = Variable(torch.randn(2000, 2000)).cuda()
>>> gpu_data2 = Variable(torch.randn(2000, 2000)).cuda(1)
>>> cpu_data2 = Variable(torch.randn(2000, 2000))
>>> cpu_data = gpu_data.cpu()
>>> exit()
root@ALI-10-100-15-219:~#

初探NIVIDIA GPU+CUDA+pyTorch_第7张图片

GPU管理小总结

我们通过nvidia-smi查看GPU的使用情况,很容易可以看到GPU的计算、存储、热度及使用程序,这个对应我们而言是非常方便的。

初探NIVIDIA GPU+CUDA+pyTorch_第8张图片

当然命令可以查看所有正常使用GPU的应用。

fuser -v /dev/nvidia*

初探NIVIDIA GPU+CUDA+pyTorch_第9张图片

应用自动退出或强行杀掉应用也就会释放GPU。

 

 

 

 

 

你可能感兴趣的:(初探NIVIDIA GPU+CUDA+pyTorch)