EC2でDocker対応GPU環境を構築｜リミット上限緩和申請+NVIDIAドライバ・Container Toolkitのインストール

## はじめに
EC2 の GPU 環境で Docker を利用できるようにする手順をまとめました。  

**リミット上限緩和申請 → EC2 インスタンス作成 → Docker & NVIDIA ドライバ & Nvidia Container Toolkit のセットアップ** の流れを紹介します。

## 目次
1. [リミット上限緩和申請](#リミット上限緩和申請)
2. [EC2でGPUインスタンス作成](#gpuインスタンス作成)
3. [Dockerインストール](#dockerインストール)
4. [NVIDIAドライバインストール](#nvidiaドライバインストール)
5. [NVIDIA Container Toolkitインストール](#nvidia-container-toolkitインストール)

---
## 1. リミット上限緩和申請
EC2 ではデフォルトで GPU インスタンスが使用できないため、**リミットの引き上げ申請** が必要です。  
手続き自体は簡単ですが、AWS の UI は変更されることがあり、古い記事の手順ではうまくいかないことがあります。  
ここでは、**2025年3月7日現在の最新の手順** を紹介します。

リミット申請の詳細は、AWS 公式ドキュメントも参考にしてください。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-resource-limits.html

今回は **g4dn.xlarge** インスタンスを利用できるように申請を行います。

### **リミット申請の手順**
1. AWSコンソールで[Service Quotas](https://console.aws.amazon.com/servicequotas/home/services/ec2/quotas/) を開く 
2. 画面右上のナビゲーションバーから、使用する **リージョンを選択**（例: Oregon）  
3. 検索窓に **`Running On-Demand G and VT instances`** と入力し、検索結果をクリック  
   - **g4dn.xlarge** を利用する場合はこれを選択  
   - **他のインスタンスを使う場合は、それに合った「Running On-Demand 〇〇」を選択**  
4. 右上の **「Request increase at account level」** をクリック  
5. **「Increase quota value」** に **必要な vCPU 数を入力** して申請  
   - **g4dn.xlarge は 1 インスタンスあたり vCPU を 4 個使用する** → **`4` を入力**  
6. **承認のメールを待つ**  
   - 私の場合、**申請から約 30 分後に承認メールが届きました。**

これで、AWS EC2 で GPU インスタンスを使用する準備が整いました。

---
## 2. EC2でGPUインスタンス作成

AWS EC2 で GPU インスタンスを利用するための手順を説明します。  
ここでは **g4dn.xlarge** インスタンスを例に、セットアップを進めます。

---
1. AWS EC2 コンソールを開く
2. 画面右上のナビゲーションバーから、**リミット申請時に選択したリージョンを選択**（例: Oregon）
3. **「Launch instance」** をクリック
4. **インスタンスの設定を行う（必要に応じて変更可能）**
   - **Name and tags（インスタンスの名前）**  
     - 任意の名前を入力（例: `gpu-instance`）
   - **Application and OS Images（Amazon Machine Image, AMI）**  
     - 「Quick Start」から **Ubuntu** を選択
   - **Instance type（インスタンスタイプ）**  
     - 検索窓で **`g4dn.xlarge`** と入力して選択
   - **Key pair（SSH キーペアの作成）**  
     - **「Create key pair」** をクリック  
     - **「Key pair name」** に任意の名前（例: `gpukey`）を入力  
     - 自分の `~/.ssh` に合わせた **Key pair type** を選択  
     - `.pem` を選択し、**「Create key pair」** をクリック  
     - ダウンロードした `.pem` ファイルを `~/.ssh/` に保存し、適切な権限を設定  
       ```bash
       chmod 400 ~/.ssh/gpukey.pem
       ```
   - **Configure storage（ストレージ設定）**  
     - **30 GiBまで無料（変更しなくてもOK）**
5. 設定が完了したら、**「Launch instance」** をクリック  
   - ここから課金が開始されます（**g4dn.xlarge の場合、約 0.5 ドル/時間**）。

---

### **EC2 インスタンスへのSSH接続**
インスタンスの作成が完了したら、以下の手順で SSH 接続を行います。

1. Public IPv4 DNS をコピー
- AWS EC2 コンソールの **Instances** に移動
- 作成したインスタンスにチェックを入れる
- **Public IPv4 DNS** をコピー（例: `ec2-12-34-56-78.us-west-2.compute.amazonaws.com`）

2.ターミナルで SSH 接続
以下のコマンドを実行し、EC2 インスタンスに接続します。

```bash
ssh -i ~/.ssh/gpukey.pem ubuntu@ec2-12-34-56-78.us-west-2.compute.amazonaws.com
```

3.初回接続時の確認
最初の接続時に以下のようなメッセージが表示されます。

```bash
Are you sure you want to continue connecting (yes/no/[fingerprint])?  
```
`yes` と入力して Enter を押してください。

4.接続完了
ターミナルに以下のように表示されれば、SSH 接続が成功しています。

```bash
ubuntu@ip-192-168-1-100:~$  
```
これで、EC2 インスタンス内で操作が可能になります。

## 3. Dockerインストール

EC2 インスタンスに Docker をインストールします。
以下の手順でセットアップを進めます。

**パッケージリストの更新**

```bash 
sudo apt-get update  
``` 

**Docker のインストール**

```bash
sudo apt-get install -y docker.io  
```


**ユーザーを Docker グループに追加**
通常、Docker は root 権限が必要ですが、非 root ユーザー（例: `ubuntu`）でも使用できるようにするために、`docker` グループに追加します。

```bash  
sudo gpasswd -a ubuntu docker  
```

**Docker のインストール確認**
最後に、Docker が正しくインストールされたことを確認します。

```bash  
docker --version  
```

実行すると、以下のように Docker のバージョンが表示されます。

```bash  
Docker version 20.10.12, build e91ed57  
```

これで Docker のインストールは完了です。

## 4. Nvidiaドライバインストール

GPU を利用するために、NVIDIA ドライバをインストールします。  
`ubuntu-drivers devices` で簡単にインストールすることができます。

**ubuntu-drivers devicesのインストール**

```bash  
sudo apt install -y ubuntu-drivers-common  
``` 

**推奨ドライバの確認**

```bash  
ubuntu-drivers devices  
```

このコマンドを実行すると、次のような結果が表示されます。

```bash  
modalias : pci:v000010DEd00001EB8sv000010DEsd000012A2bc03sc02i00  
vendor   : NVIDIA Corporation  
model    : TU104GL [Tesla T4]  
driver   : nvidia-driver-535 - distro non-free recommended  
driver   : nvidia-driver-470-server - distro non-free  
driver   : nvidia-driver-570-server - distro non-free  
driver   : nvidia-driver-535-server - distro non-free  
driver   : nvidia-driver-470 - distro non-free  
driver   : xserver-xorg-video-nouveau - distro free builtin  
```

いくつかのドライバが表示されますが、`recommended`のマークが付いているものをインストールします。  

**推奨ドライバのインストール**
推奨ドライバ（`nvidia-driver-535`）をインストールします。

```bash  
sudo apt install -y nvidia-driver-535  
```

**インストール後の確認**
ドライバのインストールが完了したら、サーバーを再起動します。

```bash  
sudo reboot  
``` 

再起動したら、InstancesでPublic IPv4 DNS をコピーし直してもう一度ssh接続します。  
以下のコマンドを実行し、ドライバが正しくインストールされたか確認します。

```bash  
nvidia-smi  
``` 

## 5. NVIDIA Container Toolkitインストール

Docker で GPU を使用できるようにするために、NVIDIA Container Toolkit をインストールします。

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html

**「With apt: Ubuntu, Debian」** の項目に記載されている方法でインストールを行います。

```bash  
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  
```  


```bash  
sudo apt-get update  
```

```bash  
sudo apt-get install -y nvidia-container-toolkit  
``` 

---
**Dockerを再起動**
```bash  
sudo systemctl restart docker
```

**Docker で GPU が使えるか確認**
```bash  
docker run --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi  
``` 

正常に動作していれば、GPU 情報が表示されます。


これで、Docker 上で GPU が利用可能になりました。