9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[StableDiffusion on GCP]GCEでも新GPUのNVIDIA L4がしたい!

Last updated at Posted at 2023-06-18

StableDiffusionを使いたい、けどPCは買いたくない、どうせなら古いT4じゃなくて新しいL4が使いたい
よろしい、ならばクラウドでマシン立てれば良いよね、ってことでGCEでStable-diffusion-webui automatic1111 を立てたので手順を書いておきます。

GPUどれ使えば良いの問題

自分でマシンを買うならビデオカードはNVIDIAの4090Xが一番良いらしく、4080とか3080とか番号でだいたいスペックの良し悪しさは見当がつきますしたくさんの記事があります。

ところがサーバー用のGPUとなるとGPUが使えるインスタンス情報や価格表はあるものの
T4, A100, V100, k80, P100 ... どれを使えば良いのかよくわかりません。

(↓一応公式のドキュメントはあるが、、、)

一番安いのは T4 ですしググると出てくるのはT4がほとんどです。
(以前、gstreamerでGKEでGPUエンコードするプログラムを動かした時もT4を使っていました。というかGKEではT4のみだったはず)

しかし他のGPUでコスパが良くてそこそこ使える物はないのでしょうか。

サーバー用GPUの状況まとめ記事があった!

大変ありがたいことにこちらの記事にスペックがまとまっていました。
世代別と性能のリストが載っているので全体像が掴みやすいです。
ハイエンドはH100(まだ普及してない) -> A100 -> V100 -> P100 -> K80 の流れですね。

T4よりもL4を使ってみたい

廉価なGPUの系列はT4→A10→L4になっています。

上の方が新しい世代なので、普段は L4 を使えは良さそうです。

GCEでインスタンスを立てる

さて、T4であれば Deep Learning VM というドライバやら一通り入っている公式のVMがあるんですが、これのドライバのバージョンが少し古くて使えません。 (L4は530が必要)
なので Debian11 で自分で環境を作る必要があります。

課金を有効にしてGPU割り当てをする

あらかじめプロジェクトの課金設定と、IAM -> 割り当て からGPUの割り当て数を1にして申請しておきます。
用途は For machine larning としておいたら数分くらいで承認されました。

フィルタ項目は 割り当て -> GPUs(all region) で項目を選択し、右上の「割り当てを編集」ボタンを押すと申請できます。(少し分かりづらい)

ファイアウォールを開ける

7860ポートを自分のIPだけ開けるルールを追加します。

インスタンスを作成する

Compute Engine からインスタンス作成を始めます。
GPU選択が分かりづらいのでスクショ貼っときます。

インスタンスタイプは GPUタブから選ぶ

まずはリージョンより先にすぐ下の「マシンの構成」のGPUタブを選んで NVIDIA L4 を選択しておきます。
そうするとリージョンを選択したときに対応しているかいないかがわかります。

リージョンはかなり限られるので、us-central1-a (もしくはb) が良いかと思います。
起動してみるとGPUがリソース枯渇していることがよくあります。

まだ設定は続きます。

ブートディスクからDebianを選択

ブートディスクの変更からOSとディスク容量を設定します。
OSは Deep Learning VM ではなく Debian 11 にします。
要領はすぐに足りなくなるので100GB以上にします。

あとは先ほどファイアフォールに追加したネットワークラベルを適用しておきます。

インストール手順

やること自体は少ないですが、ハマると時間が溶けます😭

依存パッケージ

基本的にはパッケージマネジャーで管理します。

$ sudo apt-get update
$ sudo apt-get install build-essential

### これを入れないと nvidia-smi しても認識されない
### カーネルがアップデートされたらこちらも忘れずに!
$ sudo apt-get install linux-headers-$(uname -r)

$ sudo apt-get install apt-file
$ sudo apt-file update
$ sudo apt-get install -y software-properties-common
$ sudo apt-add-repository contrib

docker を入れる

docker と compose ブラグインをインストールします。
docker-compose は公式のプラグインに取り込まれたようです。
この辺りはしょっちゅう変わる気がするので下手にぐぐるより素直に公式の手順に従いましょう。

NVIDA ドライバー (CUDA)インストール

nvidiaのドライバーをインストールします。
ググるとドライバーをウェブサイトからインストールする手順が多いですが、nvidiaのパッケージを使います。

公式の物凄くわかりづらいインストール手順があるのでそれに従いましょう。
なんかびっくりするほど見辛くてわかりづらいですが、やっていることは下記のコマンドだけなんです。

(↓わかりづらい公式ペーシなので次のリンクを参照)

こっちは環境を選択していくとコマンドを生成してくれます。
バージョンはすぐに変わるのでむしろここをみた方が良いです。

Debian12の場合は以下を追加します
sudo vim /etc/apt/sources.list

deb http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware
deb-src http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware
sudo apt-key del 7fa2af80
wget https://developer.download.nvidia.com/compute/cuda/repos/debian11/x86_64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring_1.0-1_all.deb
sudo apt-get -y install cuda

nvidia-docker2を入れる

サイトによっては nvidia-container-toolkit だったりしますが、nvidia-docker2 をパッケージインストールします。

公式ぺーじはここですが、、

結局これを叩けばOK

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && 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/$distribution/libnvidia-container.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 update
sudo apt install -y nvidia-docker2

Python 3.11.3

stable-diffusionを動かすだけならpythonインストールは不要だが(dockerに入っているので)、ツール類で使うので入れておく。

$ wget https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tgz
$ tar xvf Python-3.11.3.tgz
$ cd Python-3.11.3/
$ ./configure --enable-optimizations
$ make altinstall -j 8

stable-diffusion-webui-dockerを起動する

git clone https://github.com/AbdBarho/stable-diffusion-webui-docker
cd stable-diffusion-webui-docker
docker compose --profile download up --build
docker compose --profile auto up --build

アクセスして確認

ブラウザから グローバルIP:7860 でアクセスできればOK

おまけ

データを置くディレクトリがローカル版と少し違うので参考まで。

モデルなどのインストール

modelはここにおきます。

cd stable_diffusion/stable-diffusion-webui-docker/data/StableDiffusion

controlnetのモデルはここ。

cd stable_diffusion/stable-diffusion-webui-docker/data/config/auto/extensions/sd-webui-controlnet/models

sudo wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_canny.pth
sudo wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11f1p_sd15_depth.pth
sudo wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_openpose.pth
sudo wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_seg.pth
sudo wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_softedge.pth

出力した画像はここ

$ ls -l ~/stable-diffusion-webui-docker/output

drwxr-xr-x 2 root root 4096 Jun 16 15:43 extras
drwxr-xr-x 6 root root 4096 Jun 18 11:45 img2img
drwxr-xr-x 4 root root 4096 Jun 18 07:40 txt2img

img2img などでバッチ処理する場合、入力先と出力先を自分で指定できるので、docker-compose.yml にマウント情報を追記しておくと良いでしょう。

docker-compose.yml
version: '3.9'

x-base_service: &base_service
    ports:
      - "7860:7860"
    volumes:
      - &v1 ./data:/data
      - &v2 ./output:/output
      - &v2 ./movies:/stable-diffusion-webui/movies
      # ↑ ここを追加

LoRaとかLycorisとかembemdedingとかはdataフォルダの下におきます。

ls -l ~/stable-diffusion-webui-docker/data

drwxr-xr-x 2 root root 4096 Jun 13 11:49 Lora
drwxr-xr-x 2 root root 4096 Jun 13 11:49 LyCORIS
drwxr-xr-x 2 root root 4096 Jun 13 11:49 VAE
drwxr-xr-x 2 root root 4096 Jun 14 01:07 embeddings

トラブルシューティング : 再起動したらGPUを認識しなくなった😢

libcudann8 を入れたりなんやかんやしているとGPUを認識しなくなることがあります。

$ sudo nvidia-smi
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.

そんな場合は一度アンインストールして再インストールすると治ります。

# アンインストール
$ sudo apt-get --purge remove nvidia-*
$ sudo apt-get --purge remove cuda-*
$ sudo apt-get --purge remove nvidia-docker2
$ sudo apt-get --purge remove libcudnn8
$ sudo apt-get autoremove

autoremove までやると完全に削除できます。

ドライバなどをインストール

$ sudo apt-get install linux-headers-$(uname -r)
$ sudo apt-get -y install cuda
$ sudo apt-get install nvidia-docker2

# 念のため再起動
$ sudo reboot

これでGPUを認識してくれます。

$ sudo nvidia-smi
Sun Jun 18 05:19:44 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.30.02              Driver Version: 530.30.02    CUDA Version: 12.1     |
|-----------------------------------------+----------------------+----------------------+
| 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 L4                       On | 00000000:00:03.0 Off |                    0 |
| N/A   63C    P8               18W /  75W|      0MiB / 23034MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

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

カーネルバージョンが上がった場合は古い物は削除しておくと空き容量の節約になります。

# カーネルバージョンを確認
$ uname -r

# インストールされているカーネルを確認
$ dpkg --get-selections |grep linux

# 削除
$ sudo apt-get --dry-run autoremove --purge linux-{headers,image}-5.10.0-22

すみません。去年10月は「StableDiffusionはまだまだ使えない」とか言ってました😅

新しい技術や話題のものを試すときによくあることでずか、
新しすぎる技術は少し試してみて、「まだまだ実用にならない」「エラーばがりで使い物にならない」と判断してしまうことがよくあります。

実は去年の10月頭にGoogle ColabでStableDiffusionを試していて、
「まあこんなもんか」と思ってました。
そのときに作った画像がこちら↓

00001.png

まだ WebUIとかもなくパラメータの存在も知らず、ただ school girl とか入れて何回か回してまともに出てきたのがこれでした。
どうやってこんな品質の画像を実用化するんだろうか、と。

で、今回Deforumで適当に作った画像がこれです↓

まだまだ、ひまわりの背丈が短かったり調整できそうなところも多いですが、割と簡単にこのクオリティのものができゃいます。
再現してみたい方は以下のパラメータでできると思います。

key value
model anything-v4-5
positive prompt masterpiece, best quality, cute girl with calm expression, ahoge., shorcut brown hair, walking to forward, full body, profile, left foot forward, white onepiece, big straw hat, surrounded by sunflowers, Afterglow,
negative prompt EasyNegativeV2:1.2, nsfw, nude
seed 2403522789
9
5
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
9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?