🤖

Ubuntu22.04.3LTSのdevcontainerでGPUを使う

2024/03/18に公開

目標

  • Ubuntu22.04.3LTSでdevcontainerを使ってDockerコンテナを作成し、さらにコンテナでGPU(RTX 2070 x 2)を使えるように設定する

事前準備

  • dockerに関する知識を頭に叩き込む。以下の記事をすべて読む
  • devcontainerについて学ぶ
  • aptコマンドの基礎知識を学ぶ

STEP 1 nvidiaのドライバ類のインストール

initialize

  • 以下のコマンドでドライバを削除する
    sudo apt-get purge nvidia-* 
    sudo apt-get purge cuda-*
    

install

  • cuda-toolkitをインストールする。

  • 以下のコマンドを実行してaptリポジトリの署名検証用のGPGキーを保存する
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-4
  • 以下のコマンドを実行してcudaとnvidianのドライバーをインストールする
sudo apt-get install -y cuda-drivers
  • 最後にnvidia-smiを実行してGPUの一覧が出力されれば成功

STEP 2 Dockerのインストール

docker engineのインストール

  • docker engineをインストールする。

post-installation step

  • ユーザとグループの追加を行う。
  • docker run hello-worldを実行してhello-worldが出力されれば成功

STEP 3 nvidia-container-toolkitのインストール

  • nvidia-containe-toolkitはdockerコンテナとホストマシンのGPUの割り当てを行う
  • https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html を参考にインストールする。
  • インストールが終わったら、Docker hubからdockerイメージをpullする。この際、develのついたイメージをダウンロードしないと、nvccが動作しないので注意。
  • 以下のコマンドを実行した後に、bashでnvidia-smiを実行し、GPUが表示されれば成功。
docker run -it -d gpus all [image-name]
  • うまくいかなかった場合は、docker dameonの再起動やPCの再起動を試すこと。

STEP 4 Dockerのコンテナの作成

  • .devcontainer ディレクトリを作成し、その中にDockerfile docker-compose.yml requirements.txt devcontainer.jsonを作成する。
.devcontainer
├ Dockerfile
├ docker-compose.yml
├ devcontainer.json
└ requirements.txt

Dockerfile

FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04
RUN apt update -y \
    && apt install -y --no-install-recommends \
    git \
    wget \
    build-essential libssl-dev zlib1g-dev \
    libbz2-dev libreadline-dev libsqlite3-dev curl \
    libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev \
    libgdbm-dev libdb-dev uuid-dev tar

WORKDIR /workspace/app
COPY ./requirements.txt /workspace/app
RUN apt install -y python3 pip3
#pythonの新しいバージョンを使いたい場合は、公式サイトからtarをwgetで取得して来てください
RUN yes | pip3 install -r requirements.txt
RUN yes | pip3 install ipykernel

RUN mkdir -p /workspace/app
mambaを使いたい場合
RUN wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh
RUN bash Miniforge3-Linux-x86_64.sh -b -p /workspace/miniforge3 
RUN rm -r Miniforge3-Linux-x86_64.sh
ENV PATH /workspace/miniforge3/bin:$PATH

docker-compose.yml

version: '3.3'
services:
  app:
    build: .
    deploy:
      resources:
        reservations:
          devices:
            - capabilities:
                - gpu
              driver: nvidia
              count: 2
    networks:
      default: null
    stdin_open: true
    tty: true

devcontainer.json

{
    "name":"gpu_env",
    "dockerComposeFile": "./docker-compose.yml",
    "workspaceFolder": "/workspace/app",
    "service": "app",
    "shutdownAction": "stopCompose",
    "init": true,
    "mounts": [
    {
      "source": "${localWorkspaceFolder}/app",
      "target": "/workspace/app",
      "type": "bind"
    }
    ],
    "customizations": {
        "vscode": {
            "settings": {
                "python.formatting.provider": "none",
                "python.linting.pylintEnabled": false,
                "python.linting.lintOnSave": true,
                "python.defaultInterpreterPath": "/opt/conda/bin/python",
                "[python]": {
                    "editor.formatOnPaste": true,
                    "editor.defaultFormatter": "ms-python.black-formatter",
                    "editor.formatOnSave": true,
                    "editor.codeActionsOnSave": {
                        "source.fixAll": true
                    },
                    "explorer.confirmDragAndDrop": false,
                    "editor.glyphMargin": false,
                    "editor.minimap.enabled": false,
                    "terminal.integrated.fontSize": 16,
                    "debug.console.fontSize": 16,
                    "editor.mouseWheelZoom": true,
                    "explorer.openEditors.visible": 1,
                    "workbench.colorTheme": "Kawaine Theme",
                    "workbench.statusBar.visible": true,
                    "workbench.iconTheme": "catppuccin-macchiato",
                    "editor.formatOnPaste": true,
                    "editor.autoIndent": "advanced",
                    "indentRainbow.errorColor": "",
                    "editor.bracketPairColorization.enabled": true,
                    "workbench.colorCustomizations": {
                        "editorBracketHighlight.foreground1": "#FF0000", // 赤
                        "editorBracketHighlight.foreground2": "#FFBF3F", // 橙
                        "editorBracketHighlight.foreground3": "#FFFF00", // 黄
                        "editorBracketHighlight.foreground4": "#3FFF3F", // 緑
                        "editorBracketHighlight.foreground5": "#3F7FFF", // 青
                        "editorBracketHighlight.foreground6": "#FF7FFF", // 紫
                        "notebook.cellEditorBackground": "#181818",
                        "notebook.cellBorderColor":"#a0a0a0",
                        "notebook.focusedCellBackground":"#585858c9",
                        "notebook.focusedCellBorder":"#ff4693",
                        "notebook.focusedEditorBorder":"#ff4693",
                        "notebook.cellToolbarSeparator":"#00f7ff",
                        "notebook.cellHoverBackground":"#585858c9"
                    },
                    "indentRainbow.colors": ["rgba(102, 74, 179,0.7)", "rgba(162, 71, 168,0.7)", "rgba(159, 97, 195,0.7)", "rgba(144, 116,217,0.7)"],
                    "indentRainbow.ignoreLinePatterns": ["/[ \t]* [*]/g", "/[ \t]+[/]{2}/g"],
                    "editor.detectIndentation": false,
                    "editor.guides.bracketPairs": "active",
                    "indentRainbow.tabmixColor": "rgba(128,32,96,1)",
                    "editor.inlineSuggest.enabled": true,
                    "security.workspace.trust.untrustedFiles": "open",
                    "editor.formatOnSave": true,
                    "explorer.confirmDelete": false,
                    "workbench.tree.indent": 24,
                    "explorer.compactFolders": false,
                    "material-icon-theme.folders.theme": "none",
                    "editor.cursorSmoothCaretAnimation": "on",
                    "editor.cursorBlinking": "expand",
                    "editor.cursorStyle": "block",
                    "material-icon-theme.activeIconPack": "react",
                    "editor.smoothScrolling": true,
                    "workbench.list.smoothScrolling": true,
                    "terminal.integrated.smoothScrolling": true
                },
            },
            "extensions": [
				"ms-python.python",
				"ms-python.black-formatter",
				"KevinRose.vsc-python-indent",
				"njpwerner.autodocstring",
				"Gruntfuggly.activitusbar",
				"sazumiviki.kawaine-theme",
				"PKief.material-icon-theme",
				"GitHub.copilot",
				"oderwat.indent-rainbow",
				"GitHub.copilot-chat",
				"ms-vsliveshare.vsliveshare",
				"ms-toolsai.jupyter"
			]
        }
    }
}

コンテナの立ち上げ

  • vscodeを開き、.devcontainerの親ディレクトリ上ででコマンドパレットから"開発コンテナー:キャッシュなしでリビルドし、コンテナで再度開く"を実行

  • コンテナが立ち上がったら、nvidia-smiでGPUが認識されているか確認する

Discussion