55万円のオンプレ環境でAI開発
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
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
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
5.Docker,Jupyter,PyTorchでGPUを確認
5.1.イメージの作成
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