📦

Visual Studio Code Dev Containers でシンプルに Python w/ CUDA を動かす

2024/11/23に公開

はじめに

なるべく少ない設定でDev Container上でPythonを動かす方法を検討してみました。

2024年11月末現在、Python 環境のセットアップには uv を使うのがよさそうな雰囲気です。そこで、Dev Container 側では uv をセットアップするにとどめ、Python やそのパッケージのインストールは uv に任せる方針にします。

Dev Container の設定

ベースコンテナは Microsoft が公開している devcontainers-base を使いました。以下のように .devcontainer/devcontainer.json を作成します:

// .devcontainer/devcontainer.json`

{
	"name": "CUDA + uv",
	"image": "mcr.microsoft.com/devcontainers/base:bookworm",
	"onCreateCommand": "wget -qO- https://astral.sh/uv/install.sh | sh",
	"containerEnv": {
		"UV_LINK_MODE": "copy"
	},
	"runArgs": [
		"--device",
		"nvidia.com/gpu=all"
	]
}

Dev Container の設定としてはこれで全てです。

uv がコンテナ内でファイルシステムを跨いだハードリンクを作成しようとして警告が出るので、 UV_LINK_MODE を指定してあります。とはいえ、現状キャッシュはDev Containerの再構築で捨てられてしまうので、Caching の項にあるようにうまいこと残るようにすると良さそうです。

Dev Container を使ってみる

それでは、試しにこの環境に PyTorch をセットアップしてみましょう。

VS Code で開き、Dev Container を起動します。

初回は uv のプロジェクトをセットアップする必要があります。

vscode ➜ /workspaces/demo $ uv init
Initialized project `demo`

numpytorch パッケージをインストールしてみましょう:

vscode ➜ /workspaces/demo (main) $ uv add numpy torch
Using CPython 3.13.0
Creating virtual environment at: .venv
(略)

ちゃんと動くでしょうか。試しに以下のようなコードを用意します。

import torch

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"Using device: {device}")

x = torch.tensor([1.0, 2.0, 3.0], device=device)
y = torch.tensor([4.0, 5.0, 6.0], device=device)

z = x + y
print(f"Result on GPU: {z}")
vscode ➜ /workspaces/demo (main) $ uv run main.py 
Using device: cuda
Result on GPU: tensor([5., 7., 9.], device='cuda:0')

いいですね、無事GPU上で計算できているようです。

まだ「動いた」というレベルで、使い込んではいないので、これから色々試してみたいところです。

uv sync

ところで、 onCreateCommanduv をセットアップしたあと、 uv sync するようにしてもよいかもしれません。

"onCreateCommand": "wget -qO- https://astral.sh/uv/install.sh | sh && uv sync",

pyproject.toml が無いと(つまり uv init する前)uv sync が失敗するので、以下のようにしてもよいかもしれません。

"onCreateCommand": "wget -qO- https://astral.sh/uv/install.sh | sh && [ -f pyproject.toml ] && uv sync",

検証環境

私は NixOS 24.05 上で試しました。

❯ docker --version
Docker version 25.0.6, build v25.0.6
❯ code --version
1.92.0
b1c0a14de1414fcdaa400695b4db1c0799bc3124
x64

おわりに

なるべく少ない設定で CUDA と uv をセットアップするための Dev Container 設定と、その上でPyTorch を利用する方法を紹介しました。

Discussion