🤖
Ubuntu22.04.3LTSのdevcontainerでGPUを使う
目標
- 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