💻

55万円のオンプレ環境でAI開発

2024/07/21に公開

1.はじめに

AIの研究や開発、データ分析をするときにはGPU環境が必要になります。クラウドでGPUを使う方法も良いですが、今回はオンプレミスでGPU環境を構築したいと思います。オンプレミスのGPU環境の導入を検討されている方の一助になれば幸いです。

また、OSはUbuntu Desktop 24.04 LTSを使用し、PCにインストール済みのところから始めます。

2.自作PCのパーツ一覧

番号 パーツ名 品名 金額(円)
1 グラボ Palit GeForce RTX 4090 GameRock OC 24GB 297,000
2 マザーボード ASUS TUF GAMING H770-PRO WIFI 26,980
3 CPU Intel Core i7 13700 BOX 59,980
4 メモリ G.SKILL Flare X5シリーズ DDR5 RAM 64GB(2x32GB)
(F5-5600J3636D32GX2-FX5)
32,400
5 メモリ G.SKILL Flare X5シリーズ DDR5 RAM 64GB(2x32GB)
(F5-5600J3636D32GX2-FX5)
32,400
6 SSD WD Black SN770 WDS500G3X0E (M.2 Gen4 500GB) 9,980
7 SSD WD Black SN770 WDS200T3X0E (M.2 Gen4 2TB) 24,570
8 HDD WD WD60EZAX (SATA3 6TB 5400rpm 256MB) 14,480
9 CPUクーラ Noctua NH-D15 14,570
10 PCケース DeepCool CH510 9,980
11 ケースファン Noctua NF-P14s redux-1500 PWM 2,190
12 ケースファン Noctua NF-P14s redux-1500 PWM 2,190
13 電源 DeepCool PX1200G 22,580
合計 - - 549,300

3.SSD, HDDのマウント

データ保存用の2TBのSSDと6TBのHDDをそれぞれ/mnt/ssd2tbと/mnt/hdd6tbにマウントするための作業を進めていきます。

3.1.作業前の確認

デバイスの確認をします。

$ lsblk -o NAME,SIZE,ROTA,FSTYPE,MOUNTPOINT,MODEL
NAME          SIZE ROTA FSTYPE   MOUNTPOINT                MODEL
... (省略) ...
sda           5.5T    1                                    WDC WD60EZAX-00C8VB0
nvme0n1     465.8G    0                                    WD_BLACK SN770 500GB
├─nvme0n1p1     1G    0 vfat     /boot/efi                           
└─nvme0n1p2 464.7G    0 ext4     /                                   
nvme1n1       1.8T    0                                    WD_BLACK SN770 2TB

nvme1n1(NAME列)の行が2TBのSSDで、sda(NAME列)の行が6TBのHDDです。それぞれ確認することができました。ちなみにROTA列はrotational deviceの意味で、1であればHDDを、0であればSSDを表しています。

現在のSSD,HDDのパーティションの状況を確認します。

■ SSDのパーティションの確認

$ sudo gdisk -l /dev/nvme1n1
... (省略) ...

Number  Start (sector)    End (sector)  Size       Code  Name

■ HDDのパーティションの確認

$ sudo gdisk -l /dev/sda
... (省略) ...

Number  Start (sector)    End (sector)  Size       Code  Name

SSD,HDDにパーティションが存在しないことを確認しました。

3.2.パーティションの作成

パーティションを作成します。

■ SSDのパーティションの作成

$ sudo gdisk /dev/nvme1n1
... (省略) ...

Command (? for help): n
Partition number (1-128, default 1): 
First sector (34-3907029134, default = 2048) or {+-}size{KMGTP}: 
Last sector (2048-3907029134, default = 3907028991) or {+-}size{KMGTP}: 
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): 
Changed type of partition to 'Linux filesystem'

Command (? for help): p

... (省略) ...

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048      3907028991   1.8 TiB     8300  Linux filesystem

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/nvme1n1.
The operation has completed successfully.

■ HDDのパーティションの作成

$ sudo gdisk /dev/sda
... (省略) ...

Command (? for help): n
Partition number (1-128, default 1): 
First sector (34-11721045134, default = 2048) or {+-}size{KMGTP}: 
Last sector (2048-11721045134, default = 11721043967) or {+-}size{KMGTP}: 
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): 
Changed type of partition to 'Linux filesystem'

Command (? for help): p

... (省略) ...

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048     11721043967   5.5 TiB     8300  Linux filesystem

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sda.
The operation has completed successfully.

SSD,HDDのパーティションができたか実際に確認してみます。

$ lsblk -o NAME,SIZE,ROTA,FSTYPE,MOUNTPOINT,MODEL
NAME          SIZE ROTA FSTYPE   MOUNTPOINT                MODEL
... (省略) ...
sda           5.5T    1                                    WDC WD60EZAX-00C8VB0
└─sda1        5.5T    1                                              
nvme0n1     465.8G    0                                    WD_BLACK SN770 500GB
├─nvme0n1p1     1G    0 vfat     /boot/efi                           
└─nvme0n1p2 464.7G    0 ext4     /                                   
nvme1n1       1.8T    0                                    WD_BLACK SN770 2TB
└─nvme1n1p1   1.8T    0                                              

新たにnvme1n1p1,sda1ができていることを確認できました。

3.3.ファイルシステムのタイプ設定

ファイルシステムのタイプを設定します。

$ sudo mkfs.ext4 /dev/nvme1n1p1
$ sudo mkfs.ext4 /dev/sda1

3.4.SSD,HDDのマウント

SSD,HDDをマウントします。

$ cd /mnt
$ sudo mkdir ssd2tb hdd6tb
$ sudo mount /dev/nvme1n1p1 /mnt/ssd2tb/
$ sudo mount /dev/sda1 /mnt/hdd6tb/
$ lsblk -o NAME,SIZE,ROTA,FSTYPE,MOUNTPOINT,MODEL
NAME          SIZE ROTA FSTYPE   MOUNTPOINT                MODEL
... (省略) ...
sda           5.5T    1                                    WDC WD60EZAX-00C8VB0
└─sda1        5.5T    1 ext4     /mnt/hdd6tb              
nvme0n1     465.8G    0                                    WD_BLACK SN770 500GB
├─nvme0n1p1     1G    0 vfat     /boot/efi                           
└─nvme0n1p2 464.7G    0 ext4     /                                   
nvme1n1       1.8T    0                                    WD_BLACK SN770 2TB
└─nvme1n1p1   1.8T    0 ext4     /mnt/ssd2tb 

自動マウントの設定をします。

$ sudo vi /etc/fstab

下記をファイルに保存し終了します。

/dev/nvme1n1p1 /mnt/ssd2tb ext4 defaults 0 0
/dev/sda1 /mnt/hdd6tb ext4 defaults 0 0

/etc/fstabファイルの設定でマウントします。

$ sudo mount -a

ディレクトリの所有者とグループを現在のユーザーに変更します。

$ sudo chown $USER:$USER /mnt/ssd2tb
$ sudo chown $USER:$USER /mnt/hdd6tb

4.Docker,GPUの環境構築

4.1.Dockerのインストール

# パッケージリストの更新
$ sudo apt-get update
# パッケージのインストール
$ sudo apt-get install ca-certificates curl
# ディレクトリの作成とパーミッションの設定
$ sudo install -m 0755 -d /etc/apt/keyrings
# DockerのGPG公開鍵をダウンロードし指定された場所に保存(ASCII-armored形式)
$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
# DockerのGPG公開鍵ファイルに対して全ユーザーに読み取り権限を付与
$ sudo chmod a+r /etc/apt/keyrings/docker.asc

# DockerのAPTリポジトリの追加
$ echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] 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
# Dockerパッケージのインストール
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Dockerの動作確認
$ sudo docker run hello-world
# ユーザをグループに追加
$ sudo gpasswd -a $USER docker
$ newgrp docker

https://docs.docker.com/engine/install/ubuntu/

4.2.GPU

4.2.1.Nouveauドライバの無効化

Nouveauドライバを無効化しておきます。

$ lsmod | grep -i nouveau

何か表示されたらNouveauドライバが有効です。無効化するためにファイルを作成し編集します。

$ vi /etc/modprobe.d/blacklist-nvidia-nouveau.conf

以下の内容で保存し終了します。

blacklist nouveau
options nouveau modset=0

Nouveauドライバが無効であることを確認します。

$ lsmod | grep -i nouveau

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

Ubuntuで利用可能なハードウェアドライバをリストアップします。

$ ubuntu-drivers devices
... (省略) ...

driver   : nvidia-driver-535 - distro non-free recommended

... (省略) ...

recommendedのNVIDIAドライバをインストールします。

$ sudo apt install nvidia-driver-535

NVIDIAドライバの確認をします。

$ nvidia-smi
Thu Jul 11 01:29:47 2024       
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.183.01             Driver Version: 535.183.01   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 4090        Off | 00000000:01:00.0 Off |                  Off |
|  0%   38C    P8              10W / 450W |     11MiB / 24564MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|    0   N/A  N/A      2668      G   /usr/lib/xorg/Xorg                            4MiB |
+---------------------------------------------------------------------------------------+

4.2.3. NVIDIA Container Toolkitのインストール

# GPG公開鍵をダウンロードしバイナリ形式に変換し指定された場所に保存
$ 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
# リポジトリ情報の更新
$ sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list
# パッケージリストの更新
$ sudo apt-get update
# NVIDIA Container Toolkitのインストール
$ sudo apt-get install -y nvidia-container-toolkit

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

4.2.4. コンテナからnvidia-smiコマンドでGPUを確認

$ docker pull nvidia/cuda:12.2.0-runtime-ubuntu22.04
$ docker images
REPOSITORY    TAG                          IMAGE ID       CREATED        SIZE
nvidia/cuda   12.2.0-runtime-ubuntu22.04   5f87b1ee9f9a   8 months ago   1.97GB
# コンテナ内でnvidia-smiコマンド実行
$ docker run --gpus all nvidia/cuda:12.2.0-runtime-ubuntu22.04 nvidia-smi
# コンテナ内でBashシェルを起動
$ docker run --gpus all -it nvidia/cuda:12.2.0-runtime-ubuntu22.04 /bin/bash
root@ef0afa37a455:/# nvidia-smi
root@ef0afa37a455:/# exit

https://hub.docker.com/r/nvidia/cuda/

5.Docker,Jupyter,PyTorchでGPUを確認

5.1.イメージの作成

Dockerfile
FROM nvidia/cuda:12.2.0-runtime-ubuntu22.04

RUN apt-get update && apt-get install -y python3-pip python3-dev && \
    rm -rf /var/lib/apt/lists/* && \
    pip3 install --no-cache-dir jupyter && \
    pip3 install --no-cache-dir torch==2.3.0+cu121 torchvision==0.18.0+cu121 torchaudio==2.3.0 --index-url https://download.pytorch.org/whl/cu121

EXPOSE 8888

CMD ["jupyter", "notebook", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root"]
$ docker build -t cuda-jupyter-pytorch .

5.2.コンテナの起動

$ docker run --gpus all -p 8888:8888 cuda-jupyter-pytorch
import torch
print(torch.cuda.is_available())
print(torch.cuda.get_device_name())

おわりに

AI開発に取り組む最低限の環境を構築できたのではないでしょうか。あとは各自で必要に応じて追加の環境構築をすると良いと思います。

Discussion