我想在Ubuntu上使用nvidia-docker来创建PyTorch环境

在尝试实现机器学习论文时,可能需要使用多个版本的CUDA和PyTorch来切换使用。

本次我们将尝试使用 nvidia-docker 来构建多个版本的环境。

源代码

 

目录结构

    .
    ├── .devcontainer
    │   └── devcontainer.json
    ├── docker
    │   └── pytorch
    │       ├── Dockerfile.111
    │       ├── Dockerfile.171
    │       ├── Dockerfile.171.2
    │       └── requirements.txt
    ├── docker-compose.yml
    └── src
        └── pytorch

运动环境

Ubuntu 22.04 -> Ubuntu 22.04版本

英伟达GeForce RTX 3060 Ti

Docker 引擎(Docker 桌面版已不再推荐使用)

预备知识 (yù zhī shí)

在Ubuntu上安装Docker

 

关于Docker的使用方法的讨论

 

预备

公式文档

 

首先,安装Docker所需的用于识别GPU的包。

    sudo apt install nvidia-container-runtime
    # インストール確認
    which nvidia-contaier-runtime-hook

    sudo apt install nvidia-docker2

重新启动Docker守护进程

    sudo service docker restart

创建Docker镜像

选择要创建的环境的 nvidia-docker 镜像。

让我们从Docker Hub上选择所需的CUDA版本镜像。

image.png

由于我经常使用CUDA 11.1或CUDA 11.7,

    • nvidia/cuda:11.1.1-cudnn8-runtime-ubuntu20.04

 

    nvidia/cuda:11.7.1-cudnn8-runtime-ubuntu20.04

我尝试选择一下。

根据选择的图像创建Dockerfile。

  # サンプルファイル docker/pytorch/Dockerfile.111
  FROM nvidia/cuda:11.1.1-cudnn8-runtime-ubuntu20.04

  ENV DEBIAN_FRONTEND=noninteractive

  WORKDIR /app

  RUN apt update && \
      apt install -y \
      wget \
      bzip2 \
      build-essential \
      git \
      git-lfs \
      curl \
      ca-certificates \
      libsndfile1-dev \
      libgl1 \
      python3.8 \
      python3-pip

  COPY docker/pytorch/requirements.txt /app

  RUN pip3 install --no-cache-dir -U pip && \
      pip3 install --no-cache-dir -r requirements.txt

  RUN pip3 install --no-cache-dir torch==1.9.0+cu111 torchvision==0.10.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html

请尝试使用 Dockerfile 安装 PyTorch。

我們在 https://download.pytorch.org/whl/torch_stable.html 上尋找符合 CUDA 版本的 PyTorch。

我将列举一些例子。

CUDA11.1 = CUDA十一点一

由于存在cu111/torch-1.9.0%…和cu111/torchvision-0.10.0%…,请确保使用pip进行安装。

  pip3 install --no-cache-dir torch==1.9.0+cu111 torchvision==0.10.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html

CUDA11.7为以下内容提供了改进和新功能。

由于存在cu117/torch-1.13.0%…和cu117/torchvision-0.14.0%,请确保通过pip进行安装。

  pip3 install torch==1.13.0+cu117 torchvision==0.14.0+cu117 -f https://download.pytorch.org/whl/torch_stable.html

CUDA11.7,PyTorch 2.0的翻译为:

CUDA11.7,PyTorch 2.0

因为存在cu117/torch-2.0.0%…、cu117/torchvision-0.15.0%…,请使用pip进行安装。

  pip3 install torch==2.0.0+cu117 torchvision==0.15.0+cu117 -f https://download.pytorch.org/whl/torch_stable.html

在容器中分配 GPU资源

使用 Docker Compose 启动时分配 GPU

官方文件

 

在希望连接 GPU 的 Docker 服务中指定 deploy

  version: '3.3'

  services:

    pytorch_111:
      build:
        context: .
        dockerfile: docker/pytorch/Dockerfile.111
      container_name: 'nvidia-docker_111'
      stdin_open: true
      tty: true
      volumes:
        - ./:/app

    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
            - count: 1
            - capabilities: [gpu]

启动Docker容器

我认为已经可以通过docker compose up命令来启动了。

  docker compose up -d

我想要将容器附加到VSCode中

通过使用VSCode的扩展功能Remote Development和Docker,在容器内部可以通过VSCode进行工作(可以连接到VSCode)。

undefined
undefined

通过在VSCode的工作目录中创建.devcontainer/devcontainer.json文件,可以将容器连接到VSCode。

“devcontainer.json的示例”

在中国的本地语言中,指定Docker服务名称、docker-compose.yml文件的路径等

    "name": "PyTorch",
    "dockerComposeFile": "../docker-compose.yml",
    "service": "pytorch_111",
    "workspaceFolder": "/app",

使用快捷键ctrl + shift + P打开命令面板,然后执行”Dev Containers: Open Folder in Container…”命令。

undefined

打开终端,您可以确认已经进入容器。

undefined

我們將在 PyTorch 中確認是否能夠識別 GPU。

  >>> import torch
  >>> print(torch.cuda.get_device_name())
  NVIDIA GeForce RTX 3060 Ti

如果要退出容器,请点击左下角的Dev Container: Python,然后选择关闭远程连接。

undefined

以上视情况而定。

(Translation: The above is subject to change depending on the situation.)

赠品

我想在docker run命令中分配GPU资源。

在启动容器时,只需指定 –gpus all 即可。

我来试试看是否可以通过 nvidia-smi。

    docker build . -f docker/pytorch/Dockerfile.111 -t pytorch_111:1.0 # Dockerfileをビルドしてイメージを作成
    docker run -it --rm --gpus all pytorch_111:1.0 nvidia-smi # イメージからコンテナを起動

如果使用Docker Desktop的话。

当时我执行时遇到错误,所以我彻底删除了Docker桌面版,然后重新安装了Docker引擎。

广告
将在 10 秒后关闭
bannerAds