「ホストPCへのCUDAインストール」という悪夢
CUDAドライバーの設定に手こずって、深夜2時まで起きていたことはありませんか?私はあります。Deep Learningの勉強を始めたばかりの頃、最新のLLMモデルを試そうとCUDA 11.2から12.0へアップグレードを試みた結果、Ubuntu環境をめちゃくちゃにしてしまいました。ドライバーの競合が発生し、いわゆる「ブラックスクリーン(Black screen of death)」に陥り、OSを丸ごと再インストールするために日曜日を丸一日潰してしまったのです。
ワークスペースを完全にDockerへ移行して6ヶ月が経ちますが、これは最高の決断だったと断言できます。DockerはPCを保護するだけでなく、個人のPCから会社のサーバー、あるいはAWS EC2のようなクラウドインスタンスまで、環境を完全に統一するための「究極の武器」になります。ここでは、GPUをサポートした非常に軽量なJupyterLabコンテナの構築方法を紹介します。
クイックスタート:5分でJupyterLab CUDAを起動する
すでにDockerとNVIDIA Container Toolkitがインストールされている場合は、この<a href="https://itfromzero.com/ja/docker-ja/docker-compose%e3%81%ae%e6%9c%80%e9%81%a9%e5%8c%96%ef%bc%9ayaml-anchors%e3%81%a8merge-keys%e3%81%a7%e3%80%8c%e3%82%b3%e3%83%bc%e3%83%89%e3%81%ae%e9%87%8d%e8%a4%87%e3%80%8d%e3%82%92%e4%b8%80%e6%8e%83.html">docker-compose.yml</a>ファイルを試してみてください。その利便性をすぐに実感できるはずです。
services:
jupyterlab:
image: nvidia/cuda:12.1.0-base-ubuntu22.04
container_name: ds_workspace
runtime: nvidia
environment:
- NVIDIA_VISIBLE_DEVICES=all
ports:
- "8888:8888"
volumes:
- ./notebooks:/home/jovyan/work
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
docker compose up -dコマンドを実行するだけで、クリーンな環境が整います。ただし、実際の業務で活用するには、Pythonや必要なライブラリを追加でインストールするためにDockerfileをカスタマイズする必要があります。
なぜデータサイエンスにDockerが必要なのか?
私はホストPCに直接Pythonライブラリをインストールすることを完全にやめました。それには3つの実用的な理由があります。
- 競合の管理:プロジェクトAでは古いPyTorch 1.10が必要で、プロジェクトBでは最新の2.1が必要ということがあります。Dockerを使えば、各プロジェクトを独立した「島」にでき、互いに干渉することはありません。
- 再現性 (Reproducibility):同僚がコードを
git cloneした際、コマンドを1つ実行するだけで全く同じ環境が手に入ります。「自分の環境では動くのに、そっちではエラーが出る」という不毛なやり取りはもう不要です。 - 高速なクリーンアップ:プロジェクトが終了したら、
docker rmiコマンド一つで数GBもの不要なライブラリを削除でき、ストレージを常にクリーンに保てます。
Machine Learningに最適化されたDockerfileの構築
あらかじめ用意された巨大すぎるイメージを使うのは避けましょう。私は通常、イメージサイズを制御するためにNVIDIAのUbuntuイメージをベースに自作しています。
# 容量を最適化するためにCUDA runtimeイメージを使用
FROM nvidia/cuda:12.1.1-cudnn8-runtime-ubuntu22.04
# ビルド中の対話的なプロンプトを無効化
ENV DEBIAN_FRONTEND=noninteractive
# Pythonとシステムツールのインストール
RUN apt-get update && apt-get install -y \
python3-pip python3-dev git wget \
&& rm -rf /var/lib/apt/lists/*
# pipのアップグレードと主要ライブラリのインストール
RUN pip3 install --no-cache-dir --upgrade pip
RUN pip3 install jupyterlab pandas scikit-learn matplotlib torch torchvision
WORKDIR /workspace
# クイックテスト用にパスワードなしでJupyterLabを起動
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root", "--NotebookApp.token=''"]
知っておくべき重要なテクニック:
- Runtime版 vs Devel版:
runtime版はdevel版より1〜2GBほど軽量ですが、学習(training)を実行するには十分です。NVCCを使ってC++コードをコンパイルする必要がある場合にのみdevel版を使用してください。 - aptキャッシュの削除:
rm -rf /var/lib/apt/lists/*コマンドは非常に重要です。これにより、イメージサイズを即座に数百MB削減できます。
Docker Composeの設定:共有メモリ (Shared Memory) を忘れずに
DockerでDeep Learningを行う際の重要なポイントは、shm_sizeパラメータにあります。これを設定しないと、非常に厄介なエラーに遭遇することになります。
version: '3.8'
services:
ml-env:
build: .
shm_size: '16gb' # PyTorchの学習時にBus Errorを回避するための秘策
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
volumes:
- .:/workspace
ports:
- "8889:8888"
なぜ16GBのSHMが必要なのか? PyTorchのDataLoaderは、データのロードに共有メモリを使用します。Dockerのデフォルト設定はわずか64MBであり、Computer Visionタスクには不十分です。ここを調整しないと、学習開始直後にコンテナがクラッシュ (Bus Error) してしまいます。
実践から得たTips
Dockerを長年使い続ける中で、いくつかの重要な経験則を得ました。
1. すぐにGPUを確認する
コードがエラーになるまで待たないでください。コンテナが起動したらすぐにJupyterLabのターミナルを開き、nvidia-smiを実行しましょう。GPUのステータスが表示されれば、90%は成功したも同然です。
2. requirements.txtでライブラリを管理する
個別にインストールするのではなく、すべてをrequirements.txtにまとめましょう。新しいライブラリが必要になったらファイルを更新してイメージを再ビルドするだけです。これにより、環境を厳密に管理できます。
3. 賢いボリュームマウント
大容量のデータセットは常に専用のフォルダに置き、コンテナにマウントするようにしましょう。データを直接Dockerイメージの中にコピーしてはいけません。イメージサイズが数十GBに膨れ上がり、移動や管理が困難になります。
おわりに
Dockerへの移行は最初は少し戸惑うかもしれません。しかし、それによって得られるシステムの安定性は計り知れない価値があります。ドライバーの更新や新しいライブラリのインストールに怯える必要があります。自分好みのワークスペースを構築し、モデルのトレーニングに100%集中できる環境を整えましょう!

