VSCodeからリモートdockerコンテナのpython開発環境に接続

モチベーション

これまで、GPUを搭載したリモートのワークステーションでJupyterLabコンテナを起動し、手元のMacBook Airからブラウザで接続して、pythonコードを開発して来た。例えばこの記事。 最近はVSCodeを良く使っているので、VSCodeから同じようにGPU搭載のリモートワークステーション上のpython開発環境に接続するようにしてみた。

情報源

いつもは、ネットの情報を参考に試しているが、今回はClaudeに聞きなが構築した。 そうは言ってもCUDAバージョンとtorchインストールとの整合性確認のため、PyTorchのページは参考にした。

最初は、次のようなプロンプトから始めた。

GPU搭載(NVIDIA driver version:580.95.05)のubuntuサーバで、dockerコンテナにuvでpython環境を構築したい。フレームワークはpytorchとして、docker コンテナを作成するDockerfileを提示してください。

pythonのパッケージ管理ツールとしてuvを使っている。

構築

サーバ側

Dockerfile

Claudeの回答を参考に以下のDockerfileを作成した。

# NVIDIA CUDAベースイメージを使用
FROM nvidia/cuda:12.4.0-runtime-ubuntu22.04

# 環境変数の設定
ENV DEBIAN_FRONTEND=noninteractive \
    PYTHONUNBUFFERED=1 \
    HOME=/root

# 作業ディレクトリの設定
WORKDIR /workspace

# 必要なパッケージのインストール
RUN apt-get update && apt-get install -y \
    curl \
    git \
    build-essential \
    ca-certificates \
    wget \
    && rm -rf /var/lib/apt/lists/*

# uvのインストール
RUN curl -LsSf https://astral.sh/uv/install.sh | sh

# Pythonのインストール(フルパス指定で確実に)
RUN /root/.local/bin/uv python install 3.11

# 仮想環境の作成
RUN /root/.local/bin/uv venv /opt/venv --python 3.11

# PATHを一度にまとめて設定(これが重要)
ENV PATH="/opt/venv/bin:/root/.local/bin:/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" \
    VIRTUAL_ENV="/opt/venv"

# インストール確認
RUN uv --version && python --version

# PyTorchとその依存関係をインストール
RUN uv pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

# よく使うライブラリもインストール
RUN uv pip install \
    numpy \
    pandas \
    matplotlib \
    jupyter \
    ipython \
    tqdm \
    scikit-learn \
    scipy \
    seaborn \
    plotly

# Jupyter Notebookのポートを公開
EXPOSE 8888

# .bashrcに仮想環境のアクティベートを追加
RUN echo 'source /opt/venv/bin/activate' >> /root/.bashrc

CMD ["/bin/bash"]

コンテナをビルド

Dockerfileのあるディレクトリで次を実行して、dockerコンテナを作成。

sudo docker build -t pytorch-uv ./

コンテナを起動

次のコマンで、ビルドしたコンテナを起動。以下はシェルプロにしている。NB_DIRは各々の環境に応じて変更して欲しい。

export NB_DIR=/mnt/nfs2
export CUDA_VISIBLE_DEVICES=0
sudo docker run --gpus all -it --rm  -v ${NB_DIR}:/workspace -p 8888:8888 pytorch-uv:latest

クライアント側

クライアント側での作業の前提として、VS Codeは既にインストール済みであり、サーバ側とはsshで接続できる状態であること。

VS Code拡張機能をインストール

VSCodeに次の拡張機能をインストールする。

  • Remote-SSH
  • Docker
  • Dev Containers

SSH接続の設定

VS Codeを起動し、次の手順でSSH接続の設定(~/.ssh/configに)する。

  1. コマンドパレットを開く(Cmd+Shift+p)
  2. Remote-SSH: Connect to Host…(Remote-SSH: ホストに接続する)を選ぶ
  3. Configure SSH Hosts…(SSHホストを構成する)を選択して、~/.ssh/configを編集する
Host host-name
    HostName IP-address
    User user-name
    IdentityFile ~/.ssh/id_rsa
    Port 22
    ForwardAgent yes

host-name、IP-addressとuser-nameの部分は、各自の環境に合わせて欲しい。

ホストに接続

VS Code上で、次の手順でホストに接続する。

  1. コマンドパレットで、Remote-SSH: Connect to Host…(Remote-SSH: ホストに接続する)を選ぶ
  2. 上記で設定したhost-nameを選択
  3. sshでホストに接続しようとして、パスワードを求められるので、パスワードを入力
  4. 新しいVS Codeウィンドウが開く

コンテナに接続

  1. コマンドパレットで、Dev Containers: Attach Running Container…(実行中のコンテナにアタッチ)を選ぶ
  2. 起動中の目的のコンテナを選択
  3. 新しいVS Codeウィンドウが開き、コンテナ内部に接続される

pythonバージョンの確認・変更

Dockerfileで構築したpythonが使われていない場合(自分は、ここでハマった)は、次の手順で、コンテナのpythonを使うようにする。

  1. VS Code右下のpythonバージョン表示をクリック
  2. /opt/venv/bin/pythonを選択

まとめ

Claudeをお供にpython開発環境を構築した。ネットを調べる代わりに、エラーが出たらその状況を正確にClaudeに伝えると、解決策が提示されるので、比較的簡単に環境構築が出来た。

次に、この開発環境を使って、昨年の今頃取り組んでいたPINNを実行してみる。


も参照してください