6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ゼロからの深層学習用PC最速セットアップ

Last updated at Posted at 2020-09-11

はじめに

何度となく深層学習用PCのセットアップをやってきたが、やっては忘れ、やっては忘れの繰り返し。今後も何度も同じことをやることになるはずなので、将来の自分のために作業メモを残すことにした。

(2023.10.6) だいぶ古くなってきたので更新。Anacondaは自分でも使うことがなくなってきたので削除。

この記事は、深層学習用にGPUを積んだLinuxマシンを最速でセットアップするためのメモである。目的は

  • NVIDIA Dockerを使わない環境の構築 (Anaconda, PyTorch, TensorFlow)
  • NVIDIA Dockerのセットアップ

の2つである。もちろん、両方でもどちらかでも構わない。

なお、設置するのは大学内で、残念なことに今どきプロキシ環境。以下の説明にはプロキシの設定が何ヶ所かで出てくるが、プロキシが不要な幸運な読者は、読み飛ばして問題なし。

OSイメージのダウンロード

深層学習用なので、OSはUbuntuの一択。これまではデスクトップ版を使ってきたが、別にデスクトップは要らないのでサーバ版の方がインストールが早いかも。と考え、今回はサーバ版にする。

今回はUbuntuの最新版20.04ではなく、枯れた版である18.04をインストールするため、Alternative downloadsページのPast releases and other flavoursから20.04のSelect an imageページに行く。

CPUがIntel Core i7なので、64-bit PC (AMD64) server install imageを選択してダウンロード。

ブート用のUSBメモリの準備

UbuntuチュートリアルのCreate a bootable USB stick on Ubuntuに出ている Etcher は以前動かなかったので、やや力技だが dd でイメージをUSBメモリにコピーする。以下を実行する前に、USBメモリデバイスの正しいパスを diskutil list で調べておくこと! 自分の場合はたまたま /dev/disk2 だったけど、よく確認しないで eraseDisk をやって、大事なデータを失っても知らんよ。

sudo diskutil eraseDisk FAT32 NAME MBRFormat /dev/disk2
diskutil unmountdisk /dev/disk2
sudo dd if=$HOME/Downloads/ubuntu-20.04.6-live-server-amd64.iso \
  of=/dev/rdisk2 bs=2m conv=sync

実行が終わると、ディスクユーティリティから読めないぞと怒られるが、読めなくて当然なので気にしなくてよい。

PCをUSBメモリからブート

PCに電源ケーブルとネットワークケーブルをつなぎ、USBメモリを刺した状態で電源を入れる。F11か何かを押してブートメニューを出し、USBメモリに入ったインストールディスクからブートする。自分の場合は、まごまごしているうちに、勝手にUSBメモリから起動して結果オーライだった。

起動した後は、だいたい【Ubuntu 18.04 LTS Server】インストールするに書いてある通り。ここでプロキシの設定をやっておくと、aptのプロキシ設定まで済んだ状態にインストールしてくれるので楽。あと、ここでOpenSSHを入れておくと、この後リモートで作業できて都合が良い。

論理ボリュームの容量変更

Ubuntu Server 20.04 をデフォルトでインストールすると、/ (ルートボリューム) がなぜか100GBしか確保されない。LVMを設定して、ディスク目一杯使えるようにしておく。Ubuntu Server 18.04 LVM out of space with improper default partitioning

プロキシ関連環境変数の設定

インストール時にプロキシサーバは指定しているが、環境変数の設定は別途必要。エディタで /etc/environment というファイルを開き、以下を追加する。

/etc/environment
HTTP_PROXY=http://プロキシサーバのアドレス:ポート/
HTTPS_PROXY=http://プロキシサーバのアドレス:ポート/
FTP_PROXY=http://プロキシサーバのアドレス:ポート/
ALL_PROXY=http://プロキシサーバのアドレス:ポート/
http_proxy=http://プロキシサーバのアドレス:ポート/
https_proxy=http://プロキシサーバのアドレス:ポート/
ftp_proxy=http://プロキシサーバのアドレス:ポート/

以上の設定を反映させるため、ログインし直す。

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

NVIDIA Docker って今どうなってるの? (20.09版)の「NVIDIA ドライバのインストール」に従う。

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.2.2/local_installers/cuda-repo-ubuntu2004-12-2-local_12.2.2-535.104.05-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2004-12-2-local_12.2.2-535.104.05-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2004-12-2-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda-drivers

インストールできたら、sudo reboot としてリブートする。

再度ログインして、nvidia-smi を実行して確認する。

+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.104.05             Driver Version: 535.104.05   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 GTX 1080        On  | 00000000:03:00.0 Off |                  N/A |
|  0%   56C    P8              18W / 240W |      1MiB /  8192MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
|   1  NVIDIA GeForce GTX 1080        On  | 00000000:04:00.0 Off |                  N/A |
|  0%   47C    P8              10W / 240W |      1MiB /  8192MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

Minicondaのダウンロードとインストール

以下ではシステムに Miniconda をインストールするが、これはあくまで各自が conda コマンドで独自の環境を作る目的のためだけである。

なお、Miniconda は別にシステムに入れる必要もなく、各自が自分のホームの下に入れても良い。

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
sudo sh Miniconda3-latest-Linux-x86_64.sh -p /usr/local/miniconda3 -s -b

Conda による環境構築

各ユーザは、自分のホーム直下の設定ファイルに以下を追加しておく。これで conda コマンドが使えるようになる。

.bash_profile
. /usr/local/miniconda3/etc/profile.d/conda.sh

PyTorch環境の構築

公式の INSTALL PYTORCH の手順に従う。あらかじめ CUDA とか cuDNN とかをインストールする必要はない。

condaコマンドで、自分だけのPyTorch環境を作る。名前は mytorch にしておいた。

conda create -n mytorch pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia

新しい環境ができたら、アクティベートする。

conda activate mytorch

テストのため、【Diffusers】Stable Diffusion v2モデルの利用方法 を実行してみる。

pip install --upgrade git+https://github.com/huggingface/diffusers.git transformers accelerate scipy
import torch
from diffusers import StableDiffusionPipeline, EulerDiscreteScheduler
 
model_id = "stabilityai/stable-diffusion-2"
 
scheduler = EulerDiscreteScheduler.from_pretrained(model_id, subfolder="scheduler")
pipe = StableDiffusionPipeline.from_pretrained(model_id, scheduler=scheduler, revision="fp16",
                                               torch_dtype=torch.float16, safety_checker=None)
pipe = pipe.to("cuda")
# pipe.enable_attention_slicing() 
 
prompt = "A cuty pussycat sleeping"
image = pipe(prompt, height=768, width=768).images[0]
 
image.save("cat.png")

かわいい猫の画像を堪能したら終了。

TensorFlow環境の構築

conda install のみでTensorFlowとGPU環境(CUDA、cuDNN)を構築するの内容。あらかじめ CUDA とか cuDNN とかをインストールする必要がない。

conda create -n tf2 tensorflow=2.8.2=gpu_py39hc0c9373_0

NVIDIA Dockerのセットアップ

このセクションは、全般にNVIDIA Docker って今どうなってるの? (20.09 版)を参考にした。

Dockerそのもののインストール

ここに従う。

sudo apt-get update
sudo apt-get install 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 docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Dockerのプロキシ設定

Configure the daemon with systemdにやり方が書いてある。

以下の手順で /etc/systemd/system/ の下に docker.service.d というディレクトリを作り、その下に http-proxy.conf というファイルを作る。

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo vi /etc/systemd/system/docker.service.d/http-proxy.conf
http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://プロキシサーバのアドレス:ポート/" "HTTPS_PROXY=http://プロキシサーバのアドレス:ポート/" "NO_PROXY=localhost,127.0.0.1,.lab"

設定を有効化するために Docker を再起動する。

sudo systemctl daemon-reload
sudo systemctl restart docker

Dockerのテスト

ここまでうまく行ったか、Docker Hub から hello-world イメージをダウンロードして実行してみる。

sudo docker run hello-world

それっぽいメッセージが出ればOK。

NVIDIA Container Toolkitのインストール

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker

以下を実行する。nvidia-smi の出力が出ればOK。

sudo docker run --rm --gpus all nvidia/cuda:12.1.0-base-ubuntu20.04 nvidia-smi

非rootユーザでDockerを実行できるようにする

sudo usermod -aG docker `whoami`

一度 sudo reboot で再起動した後、非rootで docker コマンドを実行できるかテスト。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

NVIDIA Docker のテスト

Tacotron 2 And WaveGlow v1.10 For PyTorch を実行してみる。

プロキシ環境の場合、scripts/docker/build.sh 実行時に環境変数HTTP_PROXY等を引き継ぐ設定が必要。

#!/bin/bash

docker build --build-arg http_proxy --build-arg https_proxy . --rm -t tacotron2
git clone https://github.com/NVIDIA/DeepLearningExamples.git
cd DeepLearningExamples/PyTorch/SpeechSynthesis/Tacotron2
bash scripts/prepare_dataset.sh
bash scripts/docker/build.sh

以下のコマンドで、Docker の環境に入る。

bash scripts/docker/interactive.sh

前処理

bash scripts/prepare_mels.sh

後は学習だが、自分の環境だとGPUのメモリ不足で落ちてしまうので、scripts/train_tacotron2.sh のバッチサイズを指定するところを -bs 32 に書き換えておいた。

bash scripts/train_tacotron2.sh

時間がかかるので、100エポックくらい進んだら ctrl+C で止めてしまった。

合成のテスト。WaveGlow のモデル学習はせず、学習済みのものをダウンロードして使った。以下のコマンドで、output の下に合成音声 audio_0_.wav ができる。

python inference.py --tacotron2 output/checkpoint_Tacotron2_last.pt --waveglow waveglow_1076430_14000_amp --wn-channels 256 -o output/ -i phrases/phrase.txt --fp16

おわりに

深層学習用PCのセットアップでは、実は CUDA や cuDNN のインストールは要らないことがわかった。深層学習用の環境は、各ユーザが独自 conda 環境の中に整備したり、Dockerを利用すればよく、逆にシステムに CUDA や cuDNN を入れると、バージョン問題で運用が大変になる。すっきりした。

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?