概要
Kaggle用にローカルPCで深層学習が実行できる環境構築にだいぶ苦労したので、それを備忘録の為にまとめる。
前提条件
- Hardware
- CPU : Intel(R) Core(TM) i7-10750H CPU
- Memory : 16GB
- GPU : NVIDIA GeForce GTX 1650
- memory : 12GB
- CPU : Intel(R) Core(TM) i7-10750H CPU
- OS
- default : Windows11 Home 64bit
- Linux: WSL2
-
Linux distribution: Ubuntu
- Version : 22.04
- NVIDIA CUDA(Compute Unified Device Architecture) Driver
- Application
- Docker Engine
- Nvidia Container Toolkit(CUDA toolkit)
インストールするもの
-
WSL2 : Dockerを動かすために必要
-
Ubuntu : Linuxのディストリビューション
-
NVIDIA CUDA(Compute Unified Device Architecture) Driver : GPUの並列処理能力を活用し、高性能な計算を実現するための低レベルのソフトウェアで、GPUとアプリケーション間のインターフェースを提供する。GPUに応じた特有のものをインストールしてやる必要がある。
-
Docker Engine : アプリケーションを構築して コンテナ化するためのオープンソースの コンテナ化技術。Docker クライアント(Docker CLI)、REST API、Dockerデーモンで構成されており、Docker クライアントがUNIXドメインソケット
/var/run/docker.sock
を介してREST APIが叩かれ、Dockerデーモンが実際にコンテナを立てたり、イメージビルド等の処理を行う。 -
NVIDIA Container Toolkit(CUDA toolkit) : CUDAアプリケーションを開発するための高レベルの開発ツールやライブラリを提供するソフトウェアパッケージ。TensorFlow、PyTorchがGPUを使うのに必要。
構築手順
-
クリーンナップ(仮に元から入っていた場合など)
- 「コントロールパネル」→「プログラム」→「プログラムをアンインストール」
- 「設定」→「インストール済みアプリ」→「アプリをアンインストール」★Windows10以降推奨
-
Windows上でWSL2を有効化
-
WSL2・Ubuntuをインストール
-
WSL**・Ubuntu**をコマンドプロンプトからインストール
wsl --install
-
ユーザー名・PWを作成
-
-
下記のサイトからWindows向けのNvidia driverのインストール(恐らく2とは順序不同)
-
https://www.nvidia.com/download/index.aspx
- GPUの製品名・バージョンを選択
- Download Typeは**「Studio Drivers」**を選択
-
インストーラー実行
-
-
WSL上 or Windows上にて以下のサイトを参考にdockerをインストール
- Docker Desktop WSL 2 backend on Windows
- Windows上からGUIにてDocker Desktop for Windowsをインストールしたほうが良い。
- 理由
- Docker Desktopの統合により、複雑な設定をすることなくGPUを利用できるから。
- Docker DesktopはWSL 2との統合により、NVIDIA GPUを利用するための公式サポートがあるため。
- 理由
-
WSL上でNvidia Container Toolkitをインストール
-
ディストリビューションとバージョンの情報を取得
-
GPGキーをgpg --dearmorでバイナリ形式に変換し、ダウンロードして保存
-
libnvidia-containerのリポジトリリストをダウンロードして設定し、sedを用いてリポジトリURLに手順5-2で保存したGPGキーで署名されていることを指定し、sudo teeを使って保存。
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \ && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \ && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
-
nvidia-container-toolkitのインストールして、GPUがコンテナから読み取れるか確認。以下のような画像が出れば成功。
sudo apt-get update sudo apt-get install -y nvidia-container-toolkit sudo docker run --rm --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
-
-
Dockerデーモンの起動
- CUDA toolkitを用いてNVIDIA コンテナー ランタイムを認識するように Docker デーモンを構成
sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker
-
実行環境となるコンテナを起動させる
-
任意のディレクトリ上でコンテナ起動だけでなく、Pythonや必要なライブラリインストールまで行ってくれる以下のdocker-compose.ymlファイルを作成する。
version: '3.8' services: pytorch-jupyter: image: nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04 container_name: pytorch-jupyter deploy: resources: reservations: devices: - capabilities: [gpu] environment: - NVIDIA_VISIBLE_DEVICES=all - NVIDIA_DRIVER_CAPABILITIES=compute,utility command: > /bin/bash -c "apt-get update && apt-get install -y python3 python3-pip && pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 && pip install jupyterlab && jupyter lab --ip='*' --port=8888 --no-browser --allow-root --NotebookApp.token='' --NotebookApp.password=''" ports: - "8888:8888" volumes: - ./target:/workspace working_dir: /workspace
-
docker composeでコンテナを起動する
docker-compose up
-
ブラウザ上からjupyterを開き、GPUの疎通が取れるか確認する。
import torch import torch.cuda as cuda # Check if GPU is available if torch.cuda.is_available(): print(f"CUDA is available. GPU name: {torch.cuda.get_device_name(0)}") # Get the device (GPU) properties device = torch.device("cuda") # Get current GPU memory usage total_memory = torch.cuda.get_device_properties(device).total_memory reserved_memory = torch.cuda.memory_reserved(device) allocated_memory = torch.cuda.memory_allocated(device) free_memory = reserved_memory - allocated_memory print(f"Total GPU memory: {total_memory / 1e9:.2f} GB") print(f"Reserved GPU memory: {reserved_memory / 1e9:.2f} GB") print(f"Allocated GPU memory: {allocated_memory / 1e9:.2f} GB") print(f"Free GPU memory: {free_memory / 1e9:.2f} GB") else: print("CUDA is not available. Running on CPU.")
-