刚入门深度学习的同学可能经常听到"GPU加速"这个词,但未必真正理解它的重要性。简单来说,GPU就像是一个超级计算器,能够同时处理大量简单的数学运算。我在第一次训练神经网络时,用CPU跑了整整一天,后来切换到GPU环境后,同样的任务20分钟就完成了,这种速度提升是实实在在的。
PyTorch作为当前最流行的深度学习框架之一,其GPU版本可以充分利用NVIDIA显卡的CUDA核心进行并行计算。不过要启用这个功能,我们需要搭建一个完整的环境链:Anaconda提供Python环境管理,CUDA是显卡的计算平台,cuDNN则是针对深度学习的加速库。这三者版本必须严格匹配,否则就会出现各种奇怪的错误。
在开始安装前,我们需要先确认自己的显卡是否支持CUDA。打开NVIDIA控制面板(右键桌面即可看到),点击"系统信息",在"组件"选项卡中查看"NVCUDA.DLL"对应的CUDA版本。这是我的RTX 3060显卡显示的信息:
bash复制NVCUDA.DLL
11.7.99
这个数字表示显卡驱动支持的最高CUDA版本是11.7。记住这个数字,我们后续安装的CUDA工具包版本不能超过它。如果你的电脑是笔记本,还要注意有些机型会同时配备集成显卡和独立显卡,确保PyTorch运行时调用的是NVIDIA显卡。
我们需要准备以下安装包:
建议提前把这些安装包都下载好,避免安装过程中频繁切换页面。特别是cuDNN,需要注册NVIDIA开发者账号才能下载,这个过程可能需要几分钟时间。
Anaconda的安装过程比较简单,但有几点需要注意:
bash复制conda --version
python --version
如果看到版本号输出,说明安装成功。我建议创建一个专门的PyTorch环境,这样可以避免与其他项目的依赖冲突:
bash复制conda create -n pytorch_gpu python=3.9
conda activate pytorch_gpu
由于默认的conda源下载速度可能很慢,我们可以配置清华镜像源来加速:
bash复制conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
conda config --set show_channel_urls yes
配置完成后,可以使用conda info命令查看当前channel配置是否生效。
在NVIDIA官网下载对应版本的CUDA Toolkit时,建议选择exe(local)安装包。安装过程中有几个关键选项:
安装完成后,我们需要验证CUDA是否安装成功。打开cmd,输入:
bash复制nvcc -V
这会显示安装的CUDA版本。然后可以运行官方提供的deviceQuery示例程序来测试CUDA功能是否正常。
cuDNN的安装其实是将下载的压缩包解压后,将其中的文件复制到CUDA安装目录对应的文件夹中。具体步骤是:
例如,我的CUDA安装在C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7,就需要把cuDNN的文件复制到这里。完成后,可以运行一些深度学习示例程序来验证cuDNN是否正常工作。
PyTorch官网提供了安装命令生成器。选择正确的配置后,它会给出类似这样的命令:
bash复制conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
这个命令会安装PyTorch及其相关库,并自动处理依赖关系。不过在实际使用中,我发现conda安装有时会遇到网络问题,导致下载速度很慢甚至失败。
当网络环境不理想时,我们可以手动下载whl文件进行安装。具体步骤是:
bash复制pip install torch-1.12.1+cu117-cp39-cp39-win_amd64.whl
手动安装通常只需要几分钟,比在线安装快很多。安装完成后,我们可以编写一个简单的测试脚本:
python复制import torch
print(f"PyTorch版本: {torch.__version__}")
print(f"CUDA可用: {torch.cuda.is_available()}")
print(f"GPU数量: {torch.cuda.device_count()}")
print(f"当前GPU: {torch.cuda.current_device()}")
print(f"GPU名称: {torch.cuda.get_device_name(0)}")
如果输出显示CUDA可用,并且能正确识别你的GPU型号,说明安装成功。
最常见的错误就是版本不匹配。PyTorch、CUDA、cuDNN和显卡驱动四者版本必须兼容。我整理了一个常见版本的兼容性表格:
| PyTorch版本 | 推荐CUDA版本 | cuDNN版本 | 最低驱动版本 |
|---|---|---|---|
| 1.12 | 11.6-11.7 | 8.5 | 512.78 |
| 1.13 | 11.7 | 8.6 | 516.94 |
| 2.0 | 11.7-11.8 | 8.7 | 522.06 |
当遇到"CUDA不可用"的错误时,首先检查这四者的版本是否匹配。
有时候即使安装了正确的版本,PyTorch仍然找不到CUDA。这可能是因为环境变量没有正确设置。确保以下路径被添加到系统PATH中:
code复制C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\libnvvp
可以在cmd中输入echo %PATH%来检查这些路径是否已经包含在环境变量中。
在代码开头添加以下设置可以提升训练速度:
python复制torch.backends.cudnn.benchmark = True
torch.backends.cudnn.enabled = True
这个设置会让cuDNN自动寻找最适合当前配置的算法,但会稍微增加内存消耗。如果你的输入尺寸是固定的,这个设置可以带来明显的性能提升。
现代GPU都支持混合精度计算,可以显著减少显存占用并提高训练速度。PyTorch中可以通过amp模块实现:
python复制from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()
with autocast():
outputs = model(inputs)
loss = criterion(outputs, targets)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
在我的测试中,使用混合精度可以将训练速度提升1.5-2倍,同时显存占用减少约30%。
PyCharm需要手动指定conda环境路径:
C:\Users\<用户名>\anaconda3\envs\pytorch_gpu如果你习惯使用Jupyter Notebook,可以先激活conda环境,然后安装ipykernel:
bash复制conda activate pytorch_gpu
conda install ipykernel
python -m ipykernel install --user --name pytorch_gpu --display-name "PyTorch GPU"
这样在Jupyter中就可以选择PyTorch GPU环境作为内核了。我建议在notebook开头也添加GPU检测代码,确保运行时使用的是GPU版本。
在真实项目中,环境配置只是第一步。我发现很多初学者会遇到模型无法利用GPU的问题,这通常是因为没有正确地将数据和模型转移到GPU上。正确的做法是:
python复制device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)
data = data.to(device)
另外,当使用DataLoader加载数据时,设置pin_memory=True可以加速CPU到GPU的数据传输:
python复制train_loader = DataLoader(dataset, batch_size=32, shuffle=True,
num_workers=4, pin_memory=True)
在多GPU环境下,可以使用nn.DataParallel或nn.DistributedDataParallel来并行化模型。不过要注意,数据并行会增加显存消耗,可能需要减小batch size。