通过LXD搭建实验室共享GPU服务器

进行深度学习实验时,经常需要使用 GPU 服务器。在不同的实验中,对 CUDA 版本等要求各不相同。为了解决这一问题,可以通过 Docker 技术从而实现多套环境随意使用。但让所有用户都能够深入理解 Docker 可能较为困难,因此需要寻求其他方案。直觉的解决方法便是利用虚拟化技术给每位同学提供一个虚拟机。但鉴于虚拟化技术的性能损耗和 GPU 共用方面的困难,因此不太现实。

LXD 这一系统容器方案恰好可以实现这一目标。它基于容器技术,开销小,支持 GPU 共享,因此极为适合这一场景。通过这一技术还带来了一些额外的优势,如:用户所有操作均在容器中进行,避免了对宿主机系统的破坏;提供快照功能,可以在误操作导致容器损坏时恢复。

下面对搭建过程整理后汇总如下,作为记录。宿主系统为从 Ubuntu 14.04 LTS 持续升级达到的 Ubuntu 20.04 LTS ,中间经过大量安装软件等操作。若在全新安装的系统上出现无法定位包等情况,需要逐个解决。搭建过程中的踩坑过程略过,其中的操作可能有前后相关性,不能单独查看某一部分而直接进行复现。

LXD安装与初始化

  1. 通过 snap 安装 LXD ,需要注意的是 Ubuntu Server 版本系统自带 LXD 软件包,无需再次安装

    1
    sudo snap install lxd
  2. 初始化 LXD 服务

    1
    2
    3
    4
    5
    sudo lxd init
    # 根据需要调整选项(大多数选项使用默认值即可)
    # Name of the storage backend to use (dir, lvm, zfs, ceph, btrfs) [default=zfs]: dir
    # What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 192.168.10.66/24
    # What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: none
  3. 将当前用户添加到 lxd 用户组

    1
    2
    sudo adduser $(whoami) lxd
    newgrp lxd
  4. 添加腾讯云镜像源,也可以使用清华等其他镜像源

    1
    lxc remote add qcloud-images https://mirrors.cloud.tencent.com/lxc-images/ --protocol=simplestreams --public

宿主机显卡驱动和CUDA工具包安装

  1. 卸载驱动并重启宿主机系统

    1
    2
    3
    sudo apt remove --purge *nvidia* *cublas* *cuda*
    lsmod | grep nouveau
    # sudo reboot

    若上述命令输出中包含 nouveau ,则将需要将下列内容添加到 /etc/modprobe.d/blacklist.conf 中再重启

    1
    2
    3
    4
    5
    6
    blacklist amd76x_edac #this might not be required for x86 32 bit users.
    blacklist vga16fb
    blacklist nouveau
    blacklist rivafb
    blacklist nvidiafb
    blacklist rivatv
  2. 安装驱动后重启系统,并通过 nvidia-smi 检查安装结果。若安装正常,nvidia-smi 命令会输出系统中的显卡信息

    1
    2
    3
    4
    # 若安装过程发现dmks相关的错误,在/var/lib/dkms/中删除nvida相关的文件夹,并重新执行"卸载-安装"的流程即可
    sudo ubuntu-drivers install
    sudo reboot
    # nvidia-smi
  3. 若所有用户都通过 LXD 容器或 Docker 容器使用系统,宿主机配置到这一步就完成了。下面的步骤一是为了让部分直接使用宿主机的用户能够直接使用,二是对容器中的安装过程进行测试,形成配置方案。

  4. 安装 CUDA 工具包。为了简化容器中安装 CUDA 的工作,这里在宿主机安装大部分版本的 CUDA ,完成后将文件汇总后作为公共资源挂载到容器中。容器中需要安装时只需复制文件并配置相关的环境变量即可使用,无需重新安装。若使用 ZFSCopy-On-Write 存储后端,所有用户的 CUDA 文件只占用一份空间。这里传入 --silent --toolkit 参数保证安装过程中只安装 cuda-toolkit 而不安装驱动和示例文件,传入 --override 参数则忽略对 gcc 版本等的检查,保证文件能正常生成。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # 安装依赖
    sudo apt install -y perl
    # 下载cuda安装包文件并执行安装(注意不要安装其中的驱动)
    # Note: 若空间不足可将目录移动至其他分区中,在原来的位置放置软链接
    sudo sh cuda_11.4.2_470.57.02_linux.run --silent --toolkit --override
    sudo sh cuda_11.3.1_465.19.01_linux.run --silent --toolkit --override
    sudo sh cuda_11.2.2_460.32.03_linux.run --silent --toolkit --override
    sudo sh cuda_11.1.1_455.32.00_linux.run --silent --toolkit --override
    sudo sh cuda_11.0.3_450.51.06_linux.run --silent --toolkit --override
    sudo sh cuda_10.2.89_440.33.01_linux.run --silent --toolkit --override
    sudo sh cuda_10.1.105_418.39_linux.run --silent --toolkit --override
    sudo sh cuda_10.0.130_410.48_linux --silent --toolkit --override
    sudo sh cuda_9.2.148_396.37_linux --silent --toolkit --override
    sudo sh cuda_9.1.85_387.26_linux --silent --toolkit --override
    sudo sh cuda_9.0.176_384.81_linux-run --silent --toolkit --override
    sudo sh cuda_8.0.61_375.26_linux-run --silent --toolkit --override
    # 配置一个默认的CUDA版本
    sudo rm /usr/local/cuda
    sudo ln -s /usr/local/cuda-10.0 /usr/local/cuda
  5. 配置环境变量,使用不带参数的方式执行安装时可以发现输出中有这样的内容:

    1
    2
    3
    # Please make sure that
    # - PATH includes /usr/local/cuda-11.4/bin
    # - LD_LIBRARY_PATH includes /usr/local/cuda-11.4/lib64, or, add /usr/local/cuda-11.4/lib64 to /etc/ld.so.conf and run ldconfig as root

    我们在 /etc/profile 文件中追加内容来添加环境变量

    1
    2
    export PATH=/usr/local/cuda/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

    添加完成后重新登录即可看到对应的环境变量已生效

  6. 安装各版本 gcc 供编译 CUDA 程序时使用,下面的方法中将各版本优先级设为版本号,因此默认使用版本号的 gcc-9g++-9

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 通过update-alternatives可以快速切换gcc版本
    sudo apt install -y gcc-5 g++-5 gcc-6 g++-6 gcc-7 g++-7 gcc-8 g++-8 gcc-9 g++-9
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 5
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 6
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 7
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 8
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 9
    sudo update-alternatives --display gcc
    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 5
    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-6 6
    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 7
    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 8
    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 9
    sudo update-alternatives --display g++
  7. CUDA 版本对应的 gccg++ 链接到 CUDA 目录中,完成后宿主机切换 CUDA 版本无需更新 gccg++ 默认版本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    # 下文的容器使用 Ubuntu 18.04 作为基础,其软件仓库中有5到8版本的 gcc 和 g++
    # 因此需要使用 gcc-4 的 cuda-8.0 内容已注释
    # CUDA 11.4 等可以使用更高版本 gcc 的也只链接到 gcc-8
    sudo ln -s /usr/bin/gcc-8 /usr/local/cuda-11.4/bin/gcc
    sudo ln -s /usr/bin/gcc-8 /usr/local/cuda-11.3/bin/gcc
    sudo ln -s /usr/bin/gcc-8 /usr/local/cuda-11.2/bin/gcc
    sudo ln -s /usr/bin/gcc-8 /usr/local/cuda-11.1/bin/gcc
    sudo ln -s /usr/bin/gcc-8 /usr/local/cuda-11.0/bin/gcc
    sudo ln -s /usr/bin/gcc-8 /usr/local/cuda-10.2/bin/gcc
    sudo ln -s /usr/bin/gcc-8 /usr/local/cuda-10.1/bin/gcc
    sudo ln -s /usr/bin/gcc-7 /usr/local/cuda-10.0/bin/gcc
    sudo ln -s /usr/bin/gcc-7 /usr/local/cuda-9.2/bin/gcc
    sudo ln -s /usr/bin/gcc-6 /usr/local/cuda-9.1/bin/gcc
    sudo ln -s /usr/bin/gcc-6 /usr/local/cuda-9.0/bin/gcc
    #sudo ln -s /usr/bin/gcc-4 /usr/local/cuda-8.0/bin/gcc
    sudo ln -s /usr/bin/g++-8 /usr/local/cuda-11.4/bin/g++
    sudo ln -s /usr/bin/g++-8 /usr/local/cuda-11.3/bin/g++
    sudo ln -s /usr/bin/g++-8 /usr/local/cuda-11.2/bin/g++
    sudo ln -s /usr/bin/g++-8 /usr/local/cuda-11.1/bin/g++
    sudo ln -s /usr/bin/g++-8 /usr/local/cuda-11.0/bin/g++
    sudo ln -s /usr/bin/g++-8 /usr/local/cuda-10.2/bin/g++
    sudo ln -s /usr/bin/g++-8 /usr/local/cuda-10.1/bin/g++
    sudo ln -s /usr/bin/g++-7 /usr/local/cuda-10.0/bin/g++
    sudo ln -s /usr/bin/g++-7 /usr/local/cuda-9.2/bin/g++
    sudo ln -s /usr/bin/g++-6 /usr/local/cuda-9.1/bin/g++
    sudo ln -s /usr/bin/g++-6 /usr/local/cuda-9.0/bin/g++
    #sudo ln -s /usr/bin/g++-4 /usr/local/cuda-8.0/bin/g++
  8. 安装 cuDNN 。由于 CUDAcuDNN 版本并不一一对应,宿主机不进行安装,此处只作为原始安装方法的记录。可以看到其安装方式可以简单理解为”解压-复制-添加可运行标志”的步骤。因此,同样可以下载常用版本并作为资源挂载到用户容器中供用户快速安装。

    1
    2
    3
    4
    tar -xzvf cudnn-x.x-linux-x64-v8.x.x.x.tgz
    sudo cp cuda/include/cudnn*.h /usr/local/cuda/include
    sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda/lib64
    sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*

LXD容器模板配置(Ubuntu/18.04)

  1. 创建容器的公共 profile 。 将添加 GPU 设备、挂载共享文件夹等内容放在 profile 中以便快速配置用户容器。注意添加共享文件夹时可以传入 readonly=true 来防止容器中对公共内容进行修改。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    lxc profile create profile-template
    # 添加显卡设备
    lxc profile device add profile-template gpu gpu
    # 添加nvidia运行时(与security.privileged冲突,不要使用)
    #lxc profile set profile-template nvidia.runtime=true
    # 设置为特权容器
    lxc profile set profile-template security.privileged=true
    # 允许容器嵌套(运行docker容器等)
    lxc profile set profile-template security.nesting=true
    # 添加公共目录
    lxc profile device add profile-template common-resource disk source=<common-resource> path=/common-resource readonly=true
    lxc profile device add profile-template common-path disk source=<common-share> path=/common-share
    # 添加banner文件以实现用户登录时输出引导信息
    lxc profile device add profile-template lxd-banner disk source=<banner-file> path=/etc/motd readonly=true
  2. 启动一个容器作为模板。后面将在这一容器上进行软件包安装等修改,用户容器将以容器模板的一个快照作为基础进行创建。容器启动后将公共 profile 附加到容器上。

    1
    lxc launch qcloud-images:ubuntu/18.04 -p default -p profile-template vm-template
  3. 对容器进行一些简单的配置。需要注意的是 lxc exec 命令下方的命令不能继续执行。因此如果以复制的方式执行,复制的内容中若有 lxc exec 命令,就需要将 lxc exec 作为单次复制的最后一行。后面的内容需要下一次再复制后贴进终端中执行。从下面的内容中可以看出 LXD 容器中是可以安装图形界面的,但存在一些问题需要修复。(文章 shenuiuin/LXD_GPU_SERVER: 实验室GPU服务器的LXD虚拟化 中提供了安装图形界面的可行方案,可由用户自行完成。)本文中不进行图形界面的安装。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    # 配置腾讯云镜像源
    wget https://mirrors.cloud.tencent.com/repo/ubuntu18_sources.list -O sources.list.tmp
    lxc file push sources.list.tmp vm-template/etc/apt/sources.list
    lxc exec vm-template -- chown root:root /etc/apt/sources.list
    rm -f sources.list.tmp
    # 设置时区
    lxc exec vm-template -- timedatectl set-timezone Asia/Shanghai
    # 更新仓库缓存
    lxc exec vm-template -- apt update
    # 安装SSH服务
    lxc exec vm-template -- apt install -y ssh
    # 安装远程桌面(存在一定的问题,如:Dock不能正常展示。不安装)
    #lxc exec vm-template -- apt install -y --no-install-recommends ubuntu-desktop xrdp
    #lxc exec vm-template -- adduser xrdp ssl-cert
    # 安装常用的软件包(libjpeg8-dev,zliblg-dev为python的matplotlib包的依赖)
    lxc exec vm-template -- apt install -y python3 python3-dev python3-pip python3-venv python3-wheel libjpeg8-dev zlib1g-dev
    # 配置PyPI镜像
    cat > pip.conf.tmp << "EOF"
    [global]
    index-url = https://mirrors.aliyun.com/pypi/simple/

    [install]
    trusted-host=mirrors.aliyun.com
    EOF
    lxc exec vm-template -- mkdir /home/ubuntu/.pip
    lxc file push pip.conf.tmp vm-template/home/ubuntu/.pip/pip.conf
    lxc exec vm-template -- chown -R ubuntu:ubuntu /home/ubuntu/.pip
    rm pip.conf.tmp
  4. 为容器安装与宿主机相同版本的显卡驱动。需要注意的是,宿主机更新显卡驱动时需要将所有容器的驱动版本一同更新。若不需要在 Docker 容器中使用 GPU ,也可以将容器配置为 security.privileged = false nvidia.runtime=true 从而直接使用宿主机驱动而不需要在容器中再进行驱动的安装。

    1
    2
    3
    4
    5
    6
    7
    # 获取显卡驱动版本
    apt list --installed | grep nvidia-driver
    # nvidia-driver-470/focal-security,now 470.63.01-0ubuntu0.20.04.2 amd64 [installed]
    # 根据上面得到的驱动版本从NVidia官网下载相同版本的驱动安装文件。如上面的输出表示当前版本为 470.63.01 .则从Nvidia官网得到如下下载链接
    # https://cn.download.nvidia.com/XFree86/Linux-x86_64/470.63.01/NVIDIA-Linux-x86_64-470.63.01.run
    # 下面已经将驱动安装文件放到 common-resource 中
    lxc exec vm-template -- bash /common-resource/packages/NVIDIA-Linux-x86_64-470.63.01.run --silent --no-kernel-module
  5. 配置 CUDA 相关内容。可以看到其中主要有软件安装和坏境变量配置两部分。部分版本的 CUDA 安装文件需要 perl 才能运行,这里为用户进行安装以方便部分自行安装 CUDA 的用户。而 gccg++ 则为安装时会进行检查的软件包,且上面的 CUDA 目录中已添加了链接,因此在容器中也进行安装,以免出现损坏的软链接。环境变量与上面宿主机安装一致,为添加 PATH 变量和 LD_LIBRARY_PATH 变量。需要注意的是,部分版本的 CUDA中附带了 CUPTI 等额外包,也需要配置到 LD_LIBRARY_PATH 变量中,这里不进行配置,由用户自行配置。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 安装相关软件包
    lxc exec vm-template -- apt install -y perl gcc-6 g++-6 gcc-7 g++-7 gcc-8 g++-8
    # 配置CUDA相关的环境变量
    lxc file pull vm-template/etc/profile profile.tmp
    cat >> profile.tmp << "EOF"
    export PATH=/usr/local/cuda/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
    EOF
    lxc file push profile.tmp vm-template/etc/profile
    rm profile.tmp
    lxc exec vm-template -- chown root:root /etc/profile
  6. 安装 DockerNvidia-Docker 。利用 Docker 可以快速启动一些应用,省去了复杂的配置过程。

    1
    2
    3
    4
    5
    6
    lxc exec vm-template -- apt install -y ca-certificates curl gnupg lsb-release
    lxc exec vm-template -- bash -c 'curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg'
    lxc exec vm-template -- bash -c 'echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null'
    lxc exec vm-template -- bash -c 'distribution=$(. /etc/os-release;echo $ID$VERSION_ID) && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | apt-key add - && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | tee /etc/apt/sources.list.d/nvidia-docker.list'
    lxc exec vm-template -- apt update
    lxc exec vm-template -- apt install -y docker-ce docker-ce-cli containerd.io nvidia-docker2
  7. 进入容器环境执行一些简单的配置。这里主要是对用户密码进行了配置。这里应该也是可以在直接在容器外进行操作的,但个人尝试时未成功,因此采用进入容器进行修改的方式。

    1
    2
    3
    4
    5
    6
    lxc exec vm-template bash
    # 配置密码
    (echo ubuntu; echo ubuntu) | passwd ubuntu
    # 密码过期(下次登录强制修改密码)
    passwd -e ubuntu
    exit
  8. 创建快照。快照创建后可以关闭容器以节省系统资源,这里不写入相关内容。

    1
    lxc snapshot vm-template snap-initial
  9. 将上一步生成的模板容器快照发布为容器模板,后续可以以此为模板创建用户容器。

    1
    lxc publish vm-template/snap-initial --alias vm-template

用户容器创建

  1. 创建用户私有目录用于挂载到容器中。用户在使用容器时应当将文件放入挂载的目录中,避免快照时保存不必要的文件占用过多空间。

    1
    mkdir ~/lxd-workplace
  2. 创建用户私有 profile 。其中进行了用户私有目录的挂载,并将容器中的 ubuntu 用户映射为宿主机中的用户,因此在容器内部和外部均可进行读写,没有权限问题。另外,将容器中的部分端口映射到了宿主机上。若宿主机拥有公网 IP ,用户即可直接登录容器。若宿主机在内网中,通过 SSH 隧道方式访问,则省去了一层 SSH 隧道。配置中端口均以 PORT_BASE + x 的形式形成,可以给用户分配一个端口范围,避免用户间端口冲突。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    lxc profile create profile-$(whoami)
    # 挂载私有目录
    lxc profile device add profile-$(whoami) workplace disk source=$HOME/lxd-workplace path=/home/ubuntu/workplace
    # 设置用户id映射实现目录互通(特权容器不需要,也不会生效)
    lxc profile set profile-$(whoami) raw.idmap="both $(id -u) $(id -u)"
    # 设置端口起点环境变量用于配置端口映射
    export PORT_BASE=31000
    # 映射SSH端口
    lxc profile device add profile-$(whoami) proxy-ssh proxy listen=tcp:0.0.0.0:`expr $PORT_BASE + 22` connect=tcp:127.0.0.1:22
    # 映射RDP端口
    lxc profile device add profile-$(whoami) proxy-xrdp proxy listen=tcp:0.0.0.0:`expr $PORT_BASE + 89` connect=tcp:127.0.0.1:3389
    # 映射JupyterLab
    lxc profile device add profile-$(whoami) proxy-jupyter proxy listen=tcp:0.0.0.0:`expr $PORT_BASE + 88` connect=tcp:127.0.0.1:8888
  3. 从模板创建用户容器,并将公共 profile 添加到容器。并将容器中的ubuntu用户 uid gid 修改至与宿主机用户一致。

    1
    2
    3
    lxc launch vm-template -p default -p profile-template vm-$(whoami)
    lxc exec vm-$(whoami) -- usermod -u $(id -u) ubuntu
    lxc exec vm-$(whoami) -- groupmod -g $(id -g) ubuntu
  4. 将用户私有profile添加到容器

    1
    lxc profile add vm-$(whoami) profile-$(whoami)
  5. 重启容器使配置生效

    1
    lxc restart vm-$(whoami)

用户使用教程

用户登录系统时,通过自己的 SSH 端口号,以 ubuntu 用户登录到容器系统中。

第一次登录成功后,按系统提示输入当前密码(ubuntu)和新密码对密码进行修改(输入时无提示,输入完回车即可)。修改完成后自动断开连接,使用新密码重新登录即可正常使用。

使用系统时,可以简单地理解为使用虚拟机。可以自由地进行软件安装、删除等操作。可以感知的区别主要有下面几点:1. 网络。容器中可以正常上网,但经过了多层 NAT ,外部不能直接连接。2. 内核。无法对 Linux Kernel 进行修改,因此虚拟机等软件可能无法使用。

容器中目录的说明:1. /common-resource. 此目录为只读的共享资源目录,其中提供了 CUDAcuDNN 和一些数据集等。2. /common-share. 此目录为可读写的共享资源目录,可用于与其它用户共享资源,注意及时清理。3. ~/workplace. 此目录为用户的主要工作目录,进行实验时应将数据、环境等放在此目录中。

下面对一些软件配置进行举例:

安装 CUDAcuDNN

共享资源目录中提供了一些常见的 CUDAcuDNN 版本。若所需版本列在下面的表格中,只需按表格中的命令依次安装 CUDAcuDNN 即可。容器中已在 /etc/profile 中配置了 PATHLD_LIBRARY_PATH 环境变量。如果安装 tensorflow 等软件时对环境变量的要求与 cuda-toolkit 不一致,修改后重新登录即可。

Note: tensorflow 2.6.0 要求将 CUPTI 也添加到 LD_LIBRARY_PATH 环境变量中

CUDA版本 CUDA安装命令
11.4 sudo rm -rf /usr/local/cuda && sudo cp -r /common-resource/cuda-local/cuda-11.4 /usr/local/cuda
11.3 sudo rm -rf /usr/local/cuda && sudo cp -r /common-resource/cuda-local/cuda-11.3 /usr/local/cuda
11.2 sudo rm -rf /usr/local/cuda && sudo cp -r /common-resource/cuda-local/cuda-11.2 /usr/local/cuda
11.1 sudo rm -rf /usr/local/cuda && sudo cp -r /common-resource/cuda-local/cuda-11.1 /usr/local/cuda
11.0 sudo rm -rf /usr/local/cuda && sudo cp -r /common-resource/cuda-local/cuda-11.0 /usr/local/cuda
10.2 sudo rm -rf /usr/local/cuda && sudo cp -r /common-resource/cuda-local/cuda-10.2 /usr/local/cuda
10.1 sudo rm -rf /usr/local/cuda && sudo cp -r /common-resource/cuda-local/cuda-10.1 /usr/local/cuda
10.0 sudo rm -rf /usr/local/cuda && sudo cp -r /common-resource/cuda-local/cuda-10.0 /usr/local/cuda
9.2 sudo rm -rf /usr/local/cuda && sudo cp -r /common-resource/cuda-local/cuda-9.2 /usr/local/cuda
9.1 sudo rm -rf /usr/local/cuda && sudo cp -r /common-resource/cuda-local/cuda-9.1 /usr/local/cuda
9.0 sudo rm -rf /usr/local/cuda && sudo cp -r /common-resource/cuda-local/cuda-9.0 /usr/local/cuda
CUDA版本 cuDNN版本 cuDNN安装命令
11.4 8.2.2.26 export cudnn_path=/common-resource/cudnn-local/cudnn-11.4-v8.2.2.26
sudo cp $cudnn_path/include/cudnn*.h /usr/local/cuda/include && sudo cp -P $cudnn_path/lib64/libcudnn* /usr/local/cuda/lib64 && sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
11.2 8.1.1.33 export cudnn_path=/common-resource/cudnn-local/cudnn-11.2-v8.1.1.33
sudo cp $cudnn_path/include/cudnn*.h /usr/local/cuda/include && sudo cp -P $cudnn_path/lib64/libcudnn* /usr/local/cuda/lib64 && sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
11.0 8.0.5.39 export cudnn_path=/common-resource/cudnn-local/cudnn-11.0-v8.0.5.39
sudo cp $cudnn_path/include/cudnn*.h /usr/local/cuda/include && sudo cp -P $cudnn_path/lib64/libcudnn* /usr/local/cuda/lib64 && sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
10.2 8.2.2.26 export cudnn_path=/common-resource/cudnn-local/cudnn-10.2-v8.2.2.26
sudo cp $cudnn_path/include/cudnn*.h /usr/local/cuda/include && sudo cp -P $cudnn_path/lib64/libcudnn* /usr/local/cuda/lib64 && sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
10.1 7.6.5.32 export cudnn_path=/common-resource/cudnn-local/cudnn-10.1-v7.6.5.32
sudo cp $cudnn_path/include/cudnn*.h /usr/local/cuda/include && sudo cp -P $cudnn_path/lib64/libcudnn* /usr/local/cuda/lib64 && sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
10.0 7.4.1.5 export cudnn_path=/common-resource/cudnn-local/cudnn-10.0-v7.4.1.5
sudo cp $cudnn_path/include/cudnn*.h /usr/local/cuda/include && sudo cp -P $cudnn_path/lib64/libcudnn* /usr/local/cuda/lib64 && sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
9.1 7 export cudnn_path=/common-resource/cudnn-local/cudnn-9.1-v7
sudo cp $cudnn_path/include/cudnn*.h /usr/local/cuda/include && sudo cp -P $cudnn_path/lib64/libcudnn* /usr/local/cuda/lib64 && sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*

Python 虚拟环境创建与使用

通过虚拟环境,可以在系统中维护多套 Python 运行环境,对于需要运行多套代码等场景非常有用。

1
2
3
4
5
python3 -m venv <venv-path>
# 每次登录后需要进入虚拟环境前都需要执行一次
source <venv-path>/bin/activate
# 以下命令可退出虚拟环境
deactive

Jupyterlab 安装与使用

由于已经添加了端口映射,用户只需连接到宿主机的对应端口即可使用设定的密码登录 Jupyterlab 进行使用。若宿主机本身就不能直接连通,则仍需配置 SSH 隧道。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
python3 -m venv ~/workplace/system-venv
source ~/workplace/system-venv/bin/activate
pip install --upgrade pip
pip install wheel
pip install jupyterlab
jupyter-lab password
cd ~/workplace
jupyter-lab --no-browser
# 配置为系统服务,实现自动启动和重启(无法正常使用GPU)
#cat > jupyter.service.tmp << "EOF"
#[Unit]
#Description=Jupyter Notebook
#[Service]
#Type=simple
#PIDFile=/run/jupyter.pid
#ExecStart=/bin/bash -c ". /home/ubuntu/workplace/system-#venv/bin/activate;jupyter-lab --no-browser"
#User=ubuntu
#Group=ubuntu
#WorkingDirectory=/home/ubuntu/workplace
#Restart=always
#RestartSec=10
#[Install]
#WantedBy=multi-user.target
###EOF
##sudo mv jupyter.service.tmp /etc/systemd/system/jupyter.service
#sudo systemctl daemon-reload
#sudo systemctl enable --now jupyter.service

参考资料

Containers - lxd | Ubuntu

lxc-images

LXC/LXD端口映射到主机_tcliuwenwen的博客-程序员宅基地_lxc 端口映射 - 程序员宅基地

lxc - How to remove default LXD storage? - Stack Overflow

How to Install Remote Desktop (Xrdp) on Ubuntu 18.04 | E2E Networks Knowledgebase

GPU data processing inside LXD | Ubuntu

CUDA Toolkit 11.4 Update 2 Downloads | NVIDIA Developer

Broken Nvidia driver or: clean up old DKMS modules

CUDA incompatible with my gcc version - Stack Overflow

ubuntu-设置系统环境变量 - 简书

Fail during installation of Pillow (Python module) in Linux - Stack Overflow

容器与云|LXD 2.0 系列(十一):LXD 和 OpenStack

搭建多人共用的GPU服务器 - 坯子

为实验室建立公用GPU服务器 - 知乎

AdaptiveScale/lxdui: LXDUI is a web UI for the native Linux container technology LXD/LXC

NVIDIA Container Runtime | NVIDIA Developer

Enabling GPUs in the Container Runtime Ecosystem | NVIDIA Developer Blog

利用LXD容器构建共享的GPU服务器 - Deserts

Install LXD on Ubuntu 20.04 LTS using apt - nixCraft

搭建实验室公共 GPU 服务器 | SHEN’s BLOG

GPU data processing inside LXD | Ubuntu

shenuiuin/LXD_GPU_SERVER: 实验室GPU服务器的LXD虚拟化