Featured image of post 在远程服务器上安装 CUDA CuDNN Pytorch Jupyter 等深度学习环境

在远程服务器上安装 CUDA CuDNN Pytorch Jupyter 等深度学习环境

使用腾讯云 Ubuntu 20.04.4 LTS GPU 服务器安装支持远程访问的深度学习环境

由于去年从腾讯某人才培养计划中白嫖到 5000 元 GPU 服务器资源,想着怎么说也要花掉这些代金卷,便有了这篇文章(其实早就应该写了,咕咕咕)

由于代金卷的时效性,我没法选择按使用时间付费,必须按月购买,而我在 2-5 月其实并没有多少时间炼丹,与其让机器没用几天就过期,不如选个垃圾点的配置一直蹲着,于是我便选择了图中 GN7.LARGE20 款机型,直接购买到了今年 9 月份左右

创建好服务器后,其实一般来说会帮你安装好显卡驱动和诸如 nvida-smi 这类管理工具。

但是 CUDA 版本可能不高,或者有 CUDA 没有 CuDNN 的情况,我们可以在安装 python 和基础炼丹工具后通过以下代码检查我们的环境

Check CUDA, cuDNN, PyTorch Versions

# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
import numpy as np
import os
import subprocess
import sys
from collections import defaultdict
import PIL
import torch
import torchvision
from tabulate import tabulate

__all__ = ["collect_env_info"]


def collect_torch_env():
    try:
        import torch.__config__

        return torch.__config__.show()
    except ImportError:
        # compatible with older versions of pytorch
        from torch.utils.collect_env import get_pretty_env_info

        return get_pretty_env_info()


def collect_env_info():
    data = []
    data.append(("sys.platform", sys.platform))
    data.append(("Python", sys.version.replace("\n", "")))
    data.append(("Numpy", np.__version__))

    data.append(get_env_module())
    data.append(("PyTorch", torch.__version__))
    data.append(("PyTorch Debug Build", torch.version.debug))
    try:
        data.append(("torchvision", torchvision.__version__))
    except AttributeError:
        data.append(("torchvision", "unknown"))

    has_cuda = torch.cuda.is_available()
    data.append(("CUDA available", has_cuda))
    if has_cuda:
        devices = defaultdict(list)
        for k in range(torch.cuda.device_count()):
            devices[torch.cuda.get_device_name(k)].append(str(k))
        for name, devids in devices.items():
            data.append(("GPU " + ",".join(devids), name))

        from torch.utils.cpp_extension import CUDA_HOME

        data.append(("CUDA_HOME", str(CUDA_HOME)))

        if CUDA_HOME is not None and os.path.isdir(CUDA_HOME):
            try:
                nvcc = os.path.join(CUDA_HOME, "bin", "nvcc")
                nvcc = subprocess.check_output("'{}' -V | tail -n1".format(nvcc), shell=True)
                nvcc = nvcc.decode("utf-8").strip()
            except subprocess.SubprocessError:
                nvcc = "Not Available"
            data.append(("NVCC", nvcc))

        cuda_arch_list = os.environ.get("TORCH_CUDA_ARCH_LIST", None)
        if cuda_arch_list:
            data.append(("TORCH_CUDA_ARCH_LIST", cuda_arch_list))
    data.append(("Pillow", PIL.__version__))

    try:
        import cv2

        data.append(("cv2", cv2.__version__))
    except ImportError:
        pass
    env_str = tabulate(data) + "\n"
    env_str += collect_torch_env()
    return env_str


if __name__ == "__main__":
    print(collect_env_info())

数据结果示例如下:

-------------------  ---------------------------------------------------
sys.platform         linux
Python               3.8.10 (default, Nov 26 2021, 20:14:08) [GCC 9.3.0]
Numpy                1.22.3
PyTorch              1.10.2+cu102
PyTorch Debug Build  False
torchvision          0.11.3+cu102
CUDA available       True
GPU 0                GRID T4-4C
CUDA_HOME            None
Pillow               9.0.1
-------------------  ---------------------------------------------------
PyTorch built with:
  - GCC 7.3
  - C++ Version: 201402
  - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications
  - Intel(R) MKL-DNN v2.2.3 (Git Hash 7336ca9f055cf1bfa13efb658fe15dc9b41f0740)
  - OpenMP 201511 (a.k.a. OpenMP 4.5)
  - LAPACK is enabled (usually provided by MKL)
  - NNPACK is enabled
  - CPU capability usage: AVX512
  - CUDA Runtime 10.2
  - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70
  - CuDNN 7.6.5
  - Magma 2.5.2
  - Build settings: BLAS_INFO=mkl, BUILD_TYPE=Release, CUDA_VERSION=10.2, CUDNN_VERSION=7.6.5, CXX_COMPILER=/opt/rh/devtoolset-7/root/usr/bin/c++, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_KINETO -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DSYMBOLICATE_MOBILE_DEBUG_HANDLE -DEDGE_PROFILER_USE_KINETO -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, LAPACK_INFO=mkl, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, TORCH_VERSION=1.10.2, USE_CUDA=ON, USE_CUDNN=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON,

可以看到 CUDA 和 CuDNN 被正常安装,但是 CUDA 版本是相对较低的,奈何菜狗如我,Linux 我是实在玩不明白,格了 114514 遍机器后还是装不上新驱动,所以干脆用腾讯云装好的驱动和 CUDA 版本了。

接下来是 Jupyter 和一些远程使用的小技巧,当装好 Jupyer Core,Notebook,Lab 等多个组件之后,我们需要设置 ~/.bashrc,在其中添加

export PATH=$PATH:~/.local/bin

然后编辑 ~/.bash_profile,在其中加入

if test -f .bashrc ; then
source .bashrc
fi

意思就是,如果存在 .bashrc 文件,就在终端启动时自动运行 source .bashrc

然后输入 jupyter notebook 便可以启动 Jupyter 笔记本,但是由于其前台阻塞性,我们通过 screen 包可以让其切换到后台运行

而由于在中国,没有备案的机器是不能在公网直接被访问的,所以我们可以通过 SSL Tunnel,映射端口来解决这个问题。

推荐使用 Termius 来管理多个 SSH 连接和 Tunnel

直接点击上面的 + New 按钮添加就可以完成对端口转发的配置

以我的 Jupyter Web 为例

随后前往 http://localhost:8888/ 便可以直接访问 Jupyter Web 笔记本

当然,更优雅和快捷的方式是通过 Visual Studio Code 的 Remote SSH 系列拓展插件

配置好后可以直接连接远程主机使用 VS Code 内嵌的 Jupyter GUI 进行开发

comments powered by Disqus