在GPU云服务器上进行深度学习模型训练

本地电脑的配置达不到深度学习模型训练的要求,GPU云服务器按使用时间计费,配置灵活,为我们训练复杂模型提供了一个解决办法。

下面以《Dive into Deep Learning》(动手学深度学习)第2版 第7.1小节 《深度卷积神经网络(AlexNet)》 为例,介绍如何在GPU云服务器上训练模型,并参考第5.5小节《读写文件》,将训练好的模型参数保存到文件,供以后使用。

  1. 准备GPU云服务器
    选择云服务器硬件配置,根据具体任务选择CPU,内存大小,硬盘容量,显卡种类和显存大小
    操作系统选择ubuntu 24.04(一般提供的都是linux,因为免费。选1个自己熟悉的发行版)
    运行nvidia-smi,确认已经安装了cuda。
  2. 安装环境和依赖
    下载并安装miniconda
    wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
    bash Miniconda3-latest-Linux-x86_64.sh

    conda命令已经加入PATH,为了使其生效,执行:
    source ~/.bashrc

    同意tos
    conda tos accept –override-channels –channel https://repo.anaconda.com/pkgs/main
    conda tos accept –override-channels –channel https://repo.anaconda.com/pkgs/r


    创建环境并激活
    conda create –n py39 python=3.9 -y
    注意:有时候会报错。复制粘贴以上命令后,-和=,这些符号需要在命令行删除后重新打字!

    conda activate py39

    安装依赖
    conda install pytorch==1.12.0 torchvision==0.13.0 cudatoolkit=11.3 -c pytorch
    pip install d2l==0.17.6


    conda install -c conda-forge mkl=2024.0.0 -y
    否则会报错:
    ImportError: /root/miniconda3/envs/py39/lib/python3.9/site-packages/torch/lib/libtorch_cpu.so: undefined symbol: iJIT_NotifyEvent


    pip install numpy==1.26.4
    pip uninstall numpy==1.26.4
    pip install numpy==1.21.5

• 3. 新建python文件并执行
新建一个目录并进入
mkdir pytorch_train && cd $_
vim alexnet.py,内容如下:

# 7.1 AlexNet

import matplotlib
# Patch the missing private method to match the standard public .get method
if not hasattr(matplotlib.rcParams, '_get'):
matplotlib.rcParams._get = matplotlib.rcParams.get

import torch
from torch import nn
from d2l import torch as d2l
import matplotlib.pyplot as plt

net = nn.Sequential(
# 这里使用一个11*11的更大窗口来捕捉对象。
# 同时,步幅为4,以减少输出的高度和宽度。
# 另外,输出通道的数目远大于LeNet
nn.Conv2d(1, 96, kernel_size=11, stride=4, padding=1), nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2),
# 减小卷积窗口,使用填充为2来使得输入与输出的高和宽一致,且增大输出通道数
nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2),
# 使用三个连续的卷积层和较小的卷积窗口。
# 除了最后的卷积层,输出通道的数量进一步增加。
# 在前两个卷积层之后,汇聚层不用于减少输入的高度和宽度
nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(),
nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(),
nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Flatten(),
# 这里,全连接层的输出数量是LeNet中的好几倍。使用dropout层来减轻过拟合
nn.Linear(6400, 4096), nn.ReLU(),
nn.Dropout(p=0.5),
nn.Linear(4096, 4096), nn.ReLU(),
nn.Dropout(p=0.5),
# 最后是输出层。由于这里使用Fashion-MNIST,所以用类别数为10,而非论文中的1000
nn.Linear(4096, 10))


X = torch.randn(1, 1, 224, 224)
for layer in net:
X=layer(X)
print(layer.__class__.__name__,'output shape:\t',X.shape)


batch_size = 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)

lr, num_epochs = 0.01, 10
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())
plt.show()
plt.savefig("alexnet_train.png")
# save model params
torch.save(net.state_dict(), "alexnet.params")





执行程序,标准输出和错误输出都定向到文件并在后台执行(防止ssh连接意外断开时程序未执行完就退出)
nohup python alexnet.py > output.log  2>&1  &
查看执行情况:
tail -f output.log

执行完毕,可以看到生成的损失和正确率的绘图文件alexnet_train.png和模型参数文件alexnet.params。

在Windows电脑上使用Nvidia显卡运行《Dive into Deep Learning》中的深度学习代码

《Dive into Deep Learning》教程中的《安装》这一小节,安装的是cpu版本的pytorch,即使电脑上已经安装了Nvidia显卡,也无法运行后面章节中某些使用GPU运行的代码。下面就说一下如何配置环境来使用Nvidia显卡来运行这些代码。

  1. 从nvidia官网下载驱动并安装。
    我下载的文件是:582.66-notebook-win10-win11-64bit-international-dch-whql.exe
    安装完,打开命令行输入:nvidia-smi,能显示信息说明驱动安装成功。
  2. 安装miniconda3。
    官网下载最新版本Miniconda3-latest-Windows-x86_64.exe,安装。
  3. 创建env并安装依赖
    windows桌面左下角菜单里,打开Anaconda Prompt, 先同意3个terms of service,执行下面3条命令:
    conda tos accept –override-channels –channel https://repo.anaconda.com/pkgs/main
    conda tos accept –override-channels –channel https://repo.anaconda.com/pkgs/r
    conda tos accept –override-channels –channel https://repo.anaconda.com/pkgs/msys2

创建一个新环境:conda create –name d2l python=3.9 -y
激活上面创建的环境:conda activate d2l

d2l教程上安装的torch的版本是1.12.0,torchvision版本是0.13.0。
在pytorch官网https://pytorch.org/get-started/previous-versions/ 我们能找到下面的这行:
conda install pytorch==1.12.0 torchvision==0.13.0 torchaudio==0.12.0 cudatoolkit=11.3 -c pytorch
我们只需要pytorch和torchvision,不需要torchaudio,所以我们执行:

conda install pytorch==1.12.0 torchvision==0.13.0 cudatoolkit=11.3 -c pytorch
注意:这里我们安装了cudatoolkit,就不需要从nvidia官网下载安装CUDA了。

pip install d2l==0.17.6

  1. 安装vscode
    下载最新版vscode并安装。
    打开vscode,安装python插件。
    ctrl + shift +p ,输入python: select interpreter,选择刚才创建的d2l环境。
    电脑上新建一个目录,作为python工程的目录。
    vscode里打开上面创建的目录。
    新建py文件,粘贴d2l教程里的代码,如6.6小节 卷积神经网络(LeNet)的代码。
  2. 遇到的问题
    运行时遇到以下问题:
    backend = matplotlib.rcParams._get(“backend”)
    AttributeError: ‘RcParams’ object has no attribute ‘_get’

我们在文件最开始加入下面几行就能解决。

import matplotlib
# Patch the missing private method to match the standard public .get method
if not hasattr(matplotlib.rcParams, '_get'):
    matplotlib.rcParams._get = matplotlib.rcParams.get

在使用了M系列芯片的Mac电脑上搭建 《Dive into Deep Learning》(动手学深度学习)代码运行环境

  1. 安装miniforge
    不要用文档上说的miniconda。
    下载最新版mac系统arm版本的miniforge,比如:Miniforge3-26.3.2-2-MacOSX-arm64.sh。
    执行bash ./Miniforge3-26.3.2-2-MacOSX-arm64.sh, 默认会安装到/Users/xxx/miniforge3,安装过程中可以自定义安装路径。
  2. 新建1个虚拟环境并激活
    安装miniforge完成后,关闭终端,重新打开一个终端。
    conda create -n d2l python=3.10
    conda activate d2l
    这里,python版本选择3.10,其它版本会报错。
  3. 安装依赖
    conda install pytorch torchvision torchaudio -c pytorch
    pip install d2l
  4. 下载代码并运行
    按照文档,执行以下命令。
    mkdir d2l-zh && cd d2l-zh
    curl https://zh-v2.d2l.ai/d2l-zh-2.0.0.zip -o d2l-zh.zip
    unzip d2l-zh.zip && rm d2l-zh.zip
    cd pytorch
    jupyter notebook
    Web浏览器中打开http://localhost:8888(通常会自动打开)。