Pytorch学习2 - 使用GPU加速运算

/ 技术文章 / 0 条评论 / 1610浏览

Pytorch学习2 - 使用GPU加速运算

之前写了一个简单的图片分类器来区分图片中的内容。但是运行之后就发现,训练过程是在是太慢了,下面是默认使用CPU的运行结果。

Files already downloaded and verified
Files already downloaded and verified
[1,  2000] loss: 2.196
[1,  4000] loss: 1.882
[1,  6000] loss: 1.703
[1,  8000] loss: 1.588
[1, 10000] loss: 1.511
[1, 12000] loss: 1.452
[2,  2000] loss: 1.396
[2,  4000] loss: 1.347
[2,  6000] loss: 1.323
[2,  8000] loss: 1.341
[2, 10000] loss: 1.295
[2, 12000] loss: 1.261
Finished Training, cost 188.4 seconds
GroundTruth:    cat  ship  ship plane

训练大约12,000张图片(两轮)需要使用大约188.4秒,大概3分多钟,而且训练期间风扇狂转,CPU飙高,可能是我机器不行。 Pytoch是支持将张量放到GPU上并行计算的,因此只要是有NVIDIA或者AMD GPU的电脑并且支持CUDA就可以利用GPU加速计算。

关于如何安装CUDA可以参考之前写过的一篇笔记中的环境安装

启用GPU加速

It’s very easy to use GPUs with PyTorch. You can put the model on a GPU: 在Pytorch中使用GPU很简单,首先将模型放入GPU

device = torch.device("cuda:0")
model.to(device)

然后将张量也放入GPU计算

mytensor = my_tensor.to(device)

需要注意的是,my_tensor.to(device)会返回一份张量的复制,并不会修改原本的张量, 因此把张量放入GPU时需要复制给一个新的变量。

默认情况下Pytorch仅使用一张GPU执行前馈和反馈操作,如果需要使用多张GPU并行操作,需要使用DataParallel方法

model = nn.DataParallel(model)

修改原本代码

原先的模型默认运行在CPU上

net = Net()

根据上面的教程,可将其运行在GPU上

net = Net()
# 判断是否有可用的GPU,没有则使用CPU
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

# 判断是否存在多张GPU,如果存在,则使用DataParallel,并行计算
if torch.cuda.device_count() > 1:
  print("Let's use", torch.cuda.device_count(), "GPUs!")
  net = nn.DataParallel(net)

net.to(device)

兼容问题

我的笔记本式2013年买的神州笔记本,使用的是NVIDIA GT645M独显,买的时候还算不错,但现在就有些不够看了。 运行的时候Pytorch给我跑了个错(感觉被鄙视了)

    Found GPU0 GeForce GT 645M which is of cuda capability 3.0.
    PyTorch no longer supports this GPU because it is too old.
    The minimum cuda capability that we support is 3.5.

上网搜索了一下,说是使用安装包安装的Pytorch就会有这个问题,解决方法是从源码安装

从源码安装Pytorch

首先,先要卸载原先从安装包安装的Pytorch

pip uninstall torch

然后,要安装一些编译环境,Windows7的话要安装VS2015,Windows10要安装VS2017以上,我本地安装的是VS2019. 确保CUDA环境已经安装,以及一些其他的依赖包

pip install ninja numpy pyyaml mkl mkl-include setuptools cmake cffi typing

下载源码并编译安装

git clone --recursive https://github.com/pytorch/pytorch
cd pytorch
# if you are updating an existing checkout
git submodule sync
git submodule update --init --recursive

# set CMAKE_GENERATOR=Visual Studio 15 2017
set CMAKE_GENERATOR=Ninja
set CMAKE_GENERATOR_TOOLSET_VERSION=14.22
set CUDAHOSTCXX=
set CC=cl.exe
set CXX=cl.exe
set DISTUTILS_USE_SDK=1
set CUDNN_INCLUDE_DIR="C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include"
set CUDNN_LIBRARY="C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\lib\x64"
for /f "usebackq tokens=*" %i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -version [15^,16^) -products * -latest -property installationPath`) do call "%i\VC\Auxiliary\Build\vcvarsall.bat" x64 -vcvars_ver=%CMAKE_GENERATOR_TOOLSET_VERSION%
# "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat"  x64 -vcvars_ver=14.22
python setup.py install

验证

import torch
torch.cuda.is_available()

提示:期间可能需要科学上网,最近正值祖国母亲的生日,科学上网遇到了一些问题,最后没能成功。

参考