Skip to content
Published on

ディープラーニング向け Linux GPU サーバー完全構築ガイド

Authors
  • Name
    Twitter

1. ディープラーニング GPU サーバーのハードウェア選択ガイド

ディープラーニングサーバーを構築する前に、最初に決定すべきことはハードウェア構成である。ワークロードの規模と予算に応じて選択肢が変わる。

1.1 GPU の選択

GPU はディープラーニングサーバーの核となるコンポーネントである。選択時には VRAM 容量Tensor Core 世代メモリ帯域幅を重点的に考慮する必要がある。

GPUVRAM用途おおよその価格帯
RTX 409024GB GDDR6X個人研究、中小規模の学習~$1,600
RTX 509032GB GDDR7個人研究、大型モデルの Fine-tuning~$2,000
RTX A6000 / RTX 6000 Ada48GB GDDR6プロダクション、ECC メモリ対応~$4,000+
A100 (80GB PCIe/SXM)80GB HBM2e大規模学習、NVLink 対応~$10,000+
H100 (80GB SXM)80GB HBM3最大規模の LLM 学習~$25,000+
H200141GB HBM3eLong-context LLM、メモリボトルネック解消~$30,000+

実用的な推奨:

  • 個人/小規模ラボ: RTX 4090 または RTX 5090。24〜32GB の VRAM で 7B〜13B パラメータモデルの Fine-tuning が可能。
  • 企業/研究所: A100 80GB または H100。NVLink を利用したマルチ GPU 学習が必須の環境ではデータセンター級 GPU が必要。
  • マルチ GPU を検討する場合: PCIe スロットの間隔、NVLink 対応の有無、電源供給容量を必ず確認すること。

1.2 CPU、RAM、ストレージ

コンポーネント推奨スペック理由
CPUAMD EPYC または Intel Xeon(コア数 16 以上)Data loading ボトルネック防止、PCIe レーン確保
RAMGPU VRAM の 2 倍以上(最低 64GB、推奨 128GB+)大規模データセットの前処理、DataLoader ワーカーメモリ
OS ストレージNVMe SSD 500GB+高速起動、パッケージキャッシュ
データストレージNVMe SSD 2TB+ または RAID 構成学習データ I/O ボトルネック防止
PSU1200W+(マルチ GPU 時 1600W+)RTX 4090 1 台で 450W、余裕のある電力が必須

CPU は GPU に比べて相対的に重要度は低いが、PCIe レーン数がマルチ GPU 環境でボトルネックになる可能性があるため、サーバー級プラットフォーム(AMD EPYC、Intel Xeon)を推奨する。デスクトッププラットフォーム(AM5、LGA1700)でもシングル GPU 環境では十分である。


2. Ubuntu 22.04/24.04 のインストールと初期設定

ディープラーニングサーバーの OS には Ubuntu 22.04 LTS または Ubuntu 24.04 LTS が最も広く使われている。NVIDIA ドライバー、CUDA、各種ディープラーニングフレームワークのサポートが最優先で行われるためである。

2.1 インストール後の基本設定

# システムアップデート
sudo apt update && sudo apt upgrade -y

# 必須ビルドツールのインストール
sudo apt install -y build-essential gcc g++ make cmake

# カーネルヘッダーのインストール(NVIDIA ドライバーのビルドに必要)
sudo apt install -y linux-headers-$(uname -r)

# ネットワークツール
sudo apt install -y net-tools curl wget git vim htop

# タイムゾーン設定
sudo timedatectl set-timezone Asia/Seoul

2.2 Secure Boot の無効化

NVIDIA ドライバーはカーネルモジュールをロードする必要があるため、BIOS で Secure Boot を無効にすることが推奨される。Secure Boot が有効な状態でも MOK(Machine Owner Key)を登録して使用できるが、設定が複雑になる可能性がある。

# Secure Boot の状態確認
mokutil --sb-state

3. NVIDIA ドライバーのインストール

NVIDIA 公式ドキュメントでは大きく 2 つのインストール方式を案内している:パッケージマネージャー(apt)方式.run ファイル方式である。サーバー環境では管理の利便性から apt リポジトリ方式が推奨される。

3.1 方法 1:apt リポジトリ方式(推奨)

NVIDIA 公式ドライバーインストールガイド(https://docs.nvidia.com/datacenter/tesla/driver-installation-guide/index.html)に従い、Ubuntu では以下のようにインストールする。

既存ドライバーの削除

# 既存の NVIDIA 関連パッケージを完全に削除
sudo apt-get purge nvidia* -y
sudo apt-get autoremove -y
sudo apt-get autoclean

ubuntu-drivers による自動インストール

Ubuntu では ubuntu-drivers ツールを使用してシステムに適したドライバーを自動でインストールできる。

# 利用可能なドライバー一覧の確認
sudo ubuntu-drivers devices

# 推奨ドライバーの自動インストール
sudo ubuntu-drivers autoinstall

NVIDIA 公式リポジトリによる手動インストール

特定バージョンのドライバーが必要な場合、NVIDIA の公式 apt リポジトリを追加してインストールする。

# NVIDIA 公式リポジトリのキーとソースを追加
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:graphics-drivers/ppa -y
sudo apt update

# 特定バージョンのインストール(例:550 バージョン)
sudo apt install -y nvidia-driver-550

# 再起動
sudo reboot

インストールの確認

nvidia-smi

正常にインストールされていれば、GPU 名、ドライバーバージョン、対応 CUDA バージョンなどが表示される。

3.2 方法 2:.run ファイル方式

NVIDIA ホームページから直接 .run ファイルをダウンロードしてインストールする方式。特殊なカーネル環境やカスタムビルドが必要な場合に使用する。

# Nouveau ドライバーの無効化
sudo bash -c "echo 'blacklist nouveau' >> /etc/modprobe.d/blacklist-nouveau.conf"
sudo bash -c "echo 'options nouveau modeset=0' >> /etc/modprobe.d/blacklist-nouveau.conf"
sudo update-initramfs -u
sudo reboot

# GUI 環境の停止(サーバーにデスクトップ環境がある場合)
sudo systemctl stop gdm3
# または
sudo systemctl stop lightdm

# .run ファイルの実行
chmod +x NVIDIA-Linux-x86_64-550.120.run
sudo ./NVIDIA-Linux-x86_64-550.120.run

.run ファイル方式の欠点:カーネル更新時にドライバーが壊れる可能性があり、パッケージマネージャーで管理されないためアップデートや削除が不便。サーバー運用環境では apt 方式を強く推奨する。


4. ドライバーバージョン選択戦略

NVIDIA はデータセンター/サーバー用ドライバーに対して 2 つのブランチを運営している。

4.1 Production Branch vs New Feature Branch

区分Production Branch (PB)New Feature Branch (NFB)
安定性高い(広範なテスト完了)相対的に低い
新機能リリース後の新機能追加なし最新 GPU サポート、新機能を含む
アップデート方針バグ修正とセキュリティパッチのみ定期的に新機能を含むリリース
推奨環境プロダクションサーバー、安定性最優先開発/テスト、最新 GPU 使用

実務ガイドライン:

  • プロダクション環境:Production Branch を使用。例えば 550.xx シリーズが PB に指定された場合、そのシリーズ内でのみバグ修正アップデートが提供される。
  • 最新 GPU(例:Blackwell アーキテクチャ):New Feature Branch を使用する必要がある場合が多い。最新ハードウェアのサポートは NFB で先に提供されるため。
  • サーバーでは -server パッケージを使用nvidia-driver-550-server のように -server サフィックスが付いたパッケージは Enterprise Ready Driver (ERD) であり、サーバー環境に最適化されている。
# 利用可能なサーバー用ドライバーの確認
apt list --installed 2>/dev/null | grep nvidia-driver
apt-cache search nvidia-driver | grep server

5. CUDA Toolkit のインストール

CUDA Toolkit は NVIDIA GPU で並列計算を行うための開発環境である。NVIDIA 公式インストールガイド(https://docs.nvidia.com/cuda/cuda-installation-guide-linux/)に従ってインストールする。

5.1 インストール前の確認事項

# CUDA 対応 GPU の確認
lspci | grep -i nvidia

# gcc のインストール確認
gcc --version

# カーネルヘッダーの確認
uname -r
sudo apt install -y linux-headers-$(uname -r)

5.2 ネットワークリポジトリ方式でのインストール(推奨)

# CUDA keyring パッケージのインストール
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

# CUDA Toolkit のインストール(最新バージョン)
sudo apt-get install -y cuda-toolkit

# または特定バージョンのインストール
sudo apt-get install -y cuda-toolkit-12-6

5.3 環境変数の設定

# ~/.bashrc または ~/.zshrc に追加
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

# 適用
source ~/.bashrc

5.4 複数 CUDA バージョンの管理

実務ではプロジェクトごとに異なる CUDA バージョンが必要になることが頻繁にある。/usr/local/ 配下に複数の CUDA バージョンをインストールし、update-alternatives で管理できる。

# 複数バージョンのインストール(例:12.4 と 12.6)
sudo apt-get install -y cuda-toolkit-12-4
sudo apt-get install -y cuda-toolkit-12-6

# /usr/local/ 配下のインストール確認
ls /usr/local/ | grep cuda
# cuda -> cuda-12.6(シンボリックリンク)
# cuda-12.4
# cuda-12.6

# update-alternatives でバージョン切り替えを登録
sudo update-alternatives --install /usr/local/cuda cuda /usr/local/cuda-12.4 10
sudo update-alternatives --install /usr/local/cuda cuda /usr/local/cuda-12.6 20

# バージョン切り替え
sudo update-alternatives --config cuda

update-alternatives --config cuda を実行すると対話型メニューが表示され、目的の CUDA バージョンを選択できる。この方式を使用すると /usr/local/cuda シンボリックリンクが選択したバージョンを指すように変更される。

# インストール確認
nvcc --version

6. CUDA バージョンとドライバーの互換性マトリクス

CUDA Toolkit と NVIDIA ドライバー間には最低ドライバーバージョンの要件が存在する。NVIDIA 公式 CUDA Toolkit Release Notes(https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html)で互換性表を確認できる。

6.1 主要互換性表(Linux x86_64 基準)

CUDA Toolkit バージョン最低ドライバーバージョン(Linux)
CUDA 12.0>= 525.60.13
CUDA 12.1>= 530.30.02
CUDA 12.2>= 535.54.03
CUDA 12.3>= 545.23.06
CUDA 12.4>= 550.54.14
CUDA 12.5>= 555.42.02
CUDA 12.6>= 560.28.03
CUDA 13.0>= 570.86.15
CUDA 13.1>= 575.51.03

重要nvidia-smi に表示される「CUDA Version」は、そのドライバーがサポートする最大 CUDA Runtime バージョンである。実際にインストールされている CUDA Toolkit のバージョンとは異なる場合がある。実際の CUDA Toolkit バージョンは nvcc --version で確認する。

6.2 CUDA Forward/Minor Compatibility

NVIDIA の CUDA Compatibility ドキュメント(https://docs.nvidia.com/deploy/cuda-compatibility/)によると、CUDA 12.x 以降は Minor Version Compatibility がサポートされている。つまり、CUDA 12.0 用ドライバーがインストールされていても、CUDA 12.6 でコンパイルされたアプリケーションを制限付きで実行できる。

# ドライバーがサポートする CUDA バージョンの確認
nvidia-smi | head -3

# 実際にインストールされている CUDA Toolkit バージョンの確認
nvcc --version

7. cuDNN のインストールと設定

cuDNN(CUDA Deep Neural Network library)はディープラーニングに最適化された GPU アクセラレーションライブラリである。Convolution、Pooling、Normalization、Activation などの演算を高度に最適化しており、PyTorch や TensorFlow などのフレームワークが内部的に使用している。

NVIDIA 公式 cuDNN インストールガイド(https://docs.nvidia.com/deeplearning/cudnn/installation/latest/linux.html)に基づいてインストールする。

7.1 apt リポジトリ方式でのインストール(推奨)

# CUDA keyring が既にインストールされていれば cuDNN パッケージを直接インストールできる
sudo apt-get install -y cudnn

# 特定 CUDA バージョン用の cuDNN インストール
sudo apt-get install -y cudnn-cuda-12

7.2 Tarball 方式でのインストール

特定バージョンが必要な場合やシステムパッケージマネージャーを使用したくない場合は tarball を使用する。

# NVIDIA Developer サイトからダウンロード後
tar -xvf cudnn-linux-x86_64-9.x.x.x_cudaXX-archive.tar.xz

# ファイルコピー
sudo cp cudnn-linux-x86_64-9.x.x.x_cudaXX-archive/include/cudnn*.h /usr/local/cuda/include
sudo cp -P cudnn-linux-x86_64-9.x.x.x_cudaXX-archive/lib/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*

7.3 インストール確認

# cuDNN バージョン確認(apt インストール時)
dpkg -l | grep cudnn

# またはヘッダーファイルから直接確認
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

8. Conda/Mamba 環境構成

システムレベルの CUDA Toolkit とは別に、Conda/Mamba 仮想環境内で PyTorch や TensorFlow をインストールすると CUDA バージョンの競合を防ぐことができる。最近の PyTorch と TensorFlow は独自の CUDA Runtime をバンドルしており、システム CUDA バージョンとは独立して動作する。

8.1 Miniforge(Mamba)のインストール

# Miniforge のインストール(Mamba を含む)
wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh
bash Miniforge3-Linux-x86_64.sh -b -p $HOME/miniforge3

# 環境変数の設定
$HOME/miniforge3/bin/mamba init bash
source ~/.bashrc

8.2 PyTorch のインストール

# ディープラーニング環境の作成
mamba create -n dl python=3.11 -y
mamba activate dl

# PyTorch のインストール(CUDA 12.4 基準 - 公式サイトで最新コマンドを確認)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
# インストール確認
import torch
print(f"PyTorch version: {torch.__version__}")
print(f"CUDA available: {torch.cuda.is_available()}")
print(f"CUDA version: {torch.version.cuda}")
print(f"cuDNN version: {torch.backends.cudnn.version()}")
print(f"GPU: {torch.cuda.get_device_name(0)}")

8.3 TensorFlow のインストール

# TensorFlow のインストール(GPU サポート付き)
pip install tensorflow[and-cuda]
# インストール確認
import tensorflow as tf
print(f"TensorFlow version: {tf.__version__}")
print(f"GPU devices: {tf.config.list_physical_devices('GPU')}")

ヒント:PyTorch と TensorFlow を同一環境にインストールすると CUDA ライブラリのバージョン競合が発生する可能性がある。可能な限り別々の Conda 環境を使用することを推奨する。


9. Docker + NVIDIA Container Toolkit の設定

Docker を使用するとディープラーニング環境をコンテナ単位で隔離して管理できる。NVIDIA Container Toolkit(https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html)をインストールすると Docker コンテナ内で GPU を使用できる。

9.1 Docker のインストール

# Docker 公式リポジトリの設定
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 現在のユーザーを docker グループに追加(sudo なしで使用)
sudo usermod -aG docker $USER
newgrp docker

9.2 NVIDIA Container Toolkit のインストール

NVIDIA 公式ドキュメントに従ったインストール手順である。

# NVIDIA Container Toolkit リポジトリの設定
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/stable/deb/nvidia-container-toolkit.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

# パッケージのインストール
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

# Docker ランタイムの設定
sudo nvidia-ctk runtime configure --runtime=docker

# Docker の再起動
sudo systemctl restart docker

9.3 GPU Docker テスト

# GPU アクセステスト
docker run --rm --gpus all nvidia/cuda:12.6.0-base-ubuntu22.04 nvidia-smi

# 特定の GPU のみ使用
docker run --rm --gpus '"device=0"' nvidia/cuda:12.6.0-base-ubuntu22.04 nvidia-smi

# すべての GPU を使用して PyTorch コンテナを実行
docker run --rm --gpus all -it pytorch/pytorch:2.5.1-cuda12.4-cudnn9-runtime python -c \
  "import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))"

9.4 Docker Compose での GPU 使用

# docker-compose.yml
services:
  training:
    image: pytorch/pytorch:2.5.1-cuda12.4-cudnn9-runtime
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all # または特定の数:1、2 など
              capabilities: [gpu]
    volumes:
      - ./data:/workspace/data
      - ./models:/workspace/models
    shm_size: '8g' # PyTorch DataLoader の共有メモリ

注意shm_size を設定しないと、PyTorch の DataLoader で num_workers > 0 の場合に共有メモリ不足エラーが発生する可能性がある。


10. nvidia-smi、nvtop モニタリングツール

GPU サーバー運用においてモニタリングは必須である。GPU 使用率、メモリ使用量、温度などをリアルタイムで確認できる必要がある。

10.1 nvidia-smi

nvidia-smi は NVIDIA ドライバーと共にインストールされるデフォルトのモニタリングツールである。

# 基本的な状態確認
nvidia-smi

# リアルタイムモニタリング(1 秒間隔)
watch -n 1 nvidia-smi

# 特定情報のクエリ
nvidia-smi --query-gpu=name,temperature.gpu,utilization.gpu,memory.used,memory.total --format=csv

# プロセス別 GPU 使用量
nvidia-smi pmon -s um -d 1

# Persistence Mode の有効化(サーバー環境推奨)
sudo nvidia-smi -pm 1

Persistence Mode を有効にすると GPU ドライバーが常にロードされた状態を維持し、GPU を初めて呼び出す際に発生する初期化遅延(数秒程度)を排除できる。サーバー環境では必ず有効にすべきである。

10.2 nvtop

nvtophtop と似たインターフェースを持つ GPU モニタリングツールである。複数 GPU の使用率、メモリ、温度、プロセス情報を 1 つの画面でリアルタイムに確認できる。

# インストール
sudo apt install -y nvtop

# 実行
nvtop

10.3 gpustat

簡潔な出力を好む場合は gpustat も便利である。

pip install gpustat

# リアルタイムモニタリング
gpustat -i 1 --color

11. SSH リモート開発環境

GPU サーバーはほとんどの場合リモートでアクセスして使用する。効率的なリモート開発環境を構成する。

11.1 SSH サーバーの設定

# OpenSSH サーバーのインストール
sudo apt install -y openssh-server

# SSH サービスの開始と自動起動設定
sudo systemctl enable ssh
sudo systemctl start ssh

11.2 VS Code Remote - SSH

VS Code の Remote - SSH 拡張機能を使用すると、ローカルの VS Code からリモートサーバーのファイルを直接編集し、リモートターミナルを使用できる。

クライアント(ローカル)側の SSH config 設定:

# ~/.ssh/config
Host gpu-server
    HostName 192.168.1.100
    User username
    Port 22
    IdentityFile ~/.ssh/id_ed25519
    ForwardAgent yes

11.3 tmux によるセッション維持

SSH 接続が切断されても学習が継続実行されるよう tmux を使用する。

# tmux のインストール
sudo apt install -y tmux

# 新しいセッションの作成
tmux new -s training

# セッションのデタッチ:Ctrl+b, d

# セッションへの再接続
tmux attach -t training

# セッション一覧の確認
tmux ls

必須 tmux ショートカット:

  • Ctrl+b, d:セッションのデタッチ(学習は継続実行)
  • Ctrl+b, c:新しいウィンドウ
  • Ctrl+b, n/p:次/前のウィンドウ
  • Ctrl+b, %:水平分割
  • Ctrl+b, ":垂直分割

11.4 ポートフォワーディング

Jupyter Notebook や TensorBoard などをローカルブラウザからアクセスするための SSH ポートフォワーディング設定。

# Jupyter Notebook ポートフォワーディング(リモート 8888 -> ローカル 8888)
ssh -L 8888:localhost:8888 gpu-server

# TensorBoard ポートフォワーディング(リモート 6006 -> ローカル 6006)
ssh -L 6006:localhost:6006 gpu-server

# 複数ポートの同時フォワーディング
ssh -L 8888:localhost:8888 -L 6006:localhost:6006 gpu-server

12. セキュリティ設定

GPU サーバーがネットワークに公開されている場合、基本的なセキュリティ設定は必須である。

12.1 SSH 鍵認証の設定

# クライアントで鍵を生成
ssh-keygen -t ed25519 -C "your_email@example.com"

# サーバーに公開鍵をコピー
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@gpu-server

# サーバーでパスワード認証を無効化
sudo vim /etc/ssh/sshd_config

/etc/ssh/sshd_config で以下の項目を変更する:

PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
# SSH サービスの再起動
sudo systemctl restart sshd

12.2 UFW ファイアウォールの設定

# UFW のインストールと有効化
sudo apt install -y ufw

# デフォルトポリシー:受信トラフィック拒否、送信トラフィック許可
sudo ufw default deny incoming
sudo ufw default allow outgoing

# SSH を許可
sudo ufw allow ssh

# 特定 IP からのみ SSH を許可(より安全)
sudo ufw allow from 192.168.1.0/24 to any port 22

# ファイアウォールの有効化
sudo ufw enable

# 状態の確認
sudo ufw status verbose

12.3 fail2ban の設定

SSH ブルートフォース攻撃を防御するために fail2ban をインストールする。

# インストール
sudo apt install -y fail2ban

# 設定ファイルのコピー
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# /etc/fail2ban/jail.local の [sshd] セクションを修正
sudo vim /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
# fail2ban の起動
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

# 状態の確認
sudo fail2ban-client status sshd

13. 自動化:Ansible Playbook の例

サーバーが複数台ある場合や環境構成を繰り返し行う必要がある場合、Ansible を使用して設定プロセス全体を自動化できる。

13.1 Ansible Inventory

# inventory.ini
[gpu_servers]
gpu-server-01 ansible_host=192.168.1.101
gpu-server-02 ansible_host=192.168.1.102

[gpu_servers:vars]
ansible_user=ubuntu
ansible_ssh_private_key_file=~/.ssh/id_ed25519

13.2 GPU サーバー Setup Playbook

# gpu_server_setup.yml
---
- name: GPU Server Initial Setup
  hosts: gpu_servers
  become: true
  vars:
    nvidia_driver_version: '550'
    cuda_keyring_url: 'https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb'

  tasks:
    # ===== システム基本設定 =====
    - name: Update and upgrade apt packages
      apt:
        update_cache: yes
        upgrade: dist
        cache_valid_time: 3600

    - name: Install essential packages
      apt:
        name:
          - build-essential
          - gcc
          - g++
          - make
          - cmake
          - linux-headers-{{ ansible_kernel }}
          - curl
          - wget
          - git
          - vim
          - htop
          - tmux
          - nvtop
          - net-tools
          - software-properties-common
        state: present

    - name: Set timezone to Asia/Seoul
      community.general.timezone:
        name: Asia/Seoul

    # ===== NVIDIA ドライバーのインストール =====
    - name: Purge existing NVIDIA drivers
      apt:
        name: 'nvidia*'
        state: absent
        purge: yes
      ignore_errors: yes

    - name: Add NVIDIA PPA
      apt_repository:
        repo: ppa:graphics-drivers/ppa
        state: present

    - name: Install NVIDIA driver
      apt:
        name: 'nvidia-driver-{{ nvidia_driver_version }}'
        state: present
        update_cache: yes

    # ===== CUDA Toolkit のインストール =====
    - name: Download CUDA keyring
      get_url:
        url: '{{ cuda_keyring_url }}'
        dest: /tmp/cuda-keyring.deb

    - name: Install CUDA keyring
      apt:
        deb: /tmp/cuda-keyring.deb

    - name: Install CUDA Toolkit
      apt:
        name: cuda-toolkit
        state: present
        update_cache: yes

    # ===== cuDNN のインストール =====
    - name: Install cuDNN
      apt:
        name: cudnn-cuda-12
        state: present

    # ===== Docker のインストール =====
    - name: Install Docker prerequisites
      apt:
        name:
          - ca-certificates
          - curl
          - gnupg
        state: present

    - name: Add Docker GPG key
      shell: |
        install -m 0755 -d /etc/apt/keyrings
        curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
        chmod a+r /etc/apt/keyrings/docker.gpg
      args:
        creates: /etc/apt/keyrings/docker.gpg

    - name: Add Docker repository
      shell: |
        echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
      args:
        creates: /etc/apt/sources.list.d/docker.list

    - name: Install Docker
      apt:
        name:
          - docker-ce
          - docker-ce-cli
          - containerd.io
          - docker-buildx-plugin
          - docker-compose-plugin
        state: present
        update_cache: yes

    - name: Add user to docker group
      user:
        name: '{{ ansible_user }}'
        groups: docker
        append: yes

    # ===== NVIDIA Container Toolkit のインストール =====
    - name: Add NVIDIA Container Toolkit GPG key
      shell: |
        curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
      args:
        creates: /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

    - name: Add NVIDIA Container Toolkit repository
      shell: |
        curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
      args:
        creates: /etc/apt/sources.list.d/nvidia-container-toolkit.list

    - name: Install NVIDIA Container Toolkit
      apt:
        name: nvidia-container-toolkit
        state: present
        update_cache: yes

    - name: Configure Docker runtime for NVIDIA
      command: nvidia-ctk runtime configure --runtime=docker

    - name: Restart Docker
      systemd:
        name: docker
        state: restarted

    # ===== セキュリティ設定 =====
    - name: Install security packages
      apt:
        name:
          - ufw
          - fail2ban
        state: present

    - name: Configure UFW - deny incoming
      ufw:
        direction: incoming
        policy: deny

    - name: Configure UFW - allow outgoing
      ufw:
        direction: outgoing
        policy: allow

    - name: Configure UFW - allow SSH
      ufw:
        rule: allow
        name: OpenSSH

    - name: Enable UFW
      ufw:
        state: enabled

    - name: Enable fail2ban
      systemd:
        name: fail2ban
        enabled: yes
        state: started

    # ===== GPU Persistence Mode =====
    - name: Enable NVIDIA Persistence Mode
      command: nvidia-smi -pm 1
      ignore_errors: yes

  handlers:
    - name: Reboot server
      reboot:
        reboot_timeout: 300

13.3 Playbook の実行

# Ansible のインストール
pip install ansible

# Playbook の実行
ansible-playbook -i inventory.ini gpu_server_setup.yml

# ドライラン(実際に実行せず確認)
ansible-playbook -i inventory.ini gpu_server_setup.yml --check

14. まとめ:インストール手順の全体要約

ディープラーニング GPU サーバー構築の全体フローをまとめると以下のとおりである。

1. ハードウェア組み立てと BIOS 設定(Secure Boot 無効化)
    |
2. Ubuntu 22.04/24.04 のインストールと基本パッケージ設定
    |
3. NVIDIA ドライバーのインストール(apt 方式推奨)
    |
4. CUDA Toolkit のインストール(必要なバージョンごとに複数インストール可能)
    |
5. cuDNN のインストール
    |
6. Conda/Mamba 環境構成 -> PyTorch/TensorFlow のインストール
    |
7. Docker + NVIDIA Container Toolkit のインストール
    |
8. セキュリティ設定(SSH Key、UFW、fail2ban)
    |
9. モニタリングツールのインストール(nvtop、gpustat)
    |
10. リモート開発環境の構成(VS Code Remote、tmux)

このガイドで取り上げた内容を順番に進めれば、NVIDIA ドライバーから Docker GPU 環境まで完全なディープラーニング開発サーバーを構築できる。各段階で問題が発生した場合は NVIDIA 公式ドキュメントを参照してトラブルシューティングすることを推奨する。


References