🤖

AI絵師をローカルにお手軽に降臨させる!: Windows 11 + Docker + VSC

2022/12/15に公開約4,800字

こんにちはみなさん。

かっこいい絵、可愛い絵、イカシタ絵を描きたい!でも、自分に絵心はない。。。
そんな人類の救世主がAIによる画像生成です。
まあ、一昔前も頑張ってAIで画像生成してたことはありますが、とても重かったり精度が悪かったりと、一般で使えるようなものではありませんでした。
しかし、ここ最近、stable-diffusion なるアルゴリズムが生まれ、AIによる画像生成がいよいよ本格的になってきました。
Google colabo で動くやつも用意されていて、随分と盛況になってきましたが、今回はこのAI絵師君をローカルに作ってしまおうっていう魂胆ですね。
いや、colaboでもいいんですが、googleさんの匙加減とか限界時間とかあるんでね。ローカルのほうが安全じゃん?

stable-diffusion

いくつかのキーワードから、画像を生成させる機械学習モデルです。私は詳しいことを知らないのですが、すでに派生のモデルが大量にあり、用途に応じて使い分けられます。
画像生成用の呪文(prompt)の研究も進んでいますし、また、発展しているものでもあります。

まあ、詳しいことはわからんので、俺でもいい感じの絵が描ける賢いAI君っていう認識でいいんじゃないですかね?

AI絵師を降臨させる

環境準備

題名にもありますが、今回はローカルの環境を使います。
今回はGPUを使うので、Nvidia製のGPU(RTX2080 とか)が必要です。
ない人は…すいません!
とりあえずチェックリストを。

  • Windows 11である。Windows 10 の人はアップグレードしてください。自分もやりました
  • Nvidia製のGPUを搭載している。自分はRTX2080 SUPERだった。多分、他のでも行ける
  • driverを突っ込む。
  • docker desktop on WSL2を用意しておく
    • docker desktop 入れると大体はこうなっているのでは?hyper-Vでの動作確認はしてないです

ここが一番面倒くさいところですね。
さらばWindows 10...

作業場所を作る

作業用のディレクトリを作りましょう。
一部VSCode のdev container を使っていますので、VSCを宗教上の理由で使えない人は、適宜dockerのコマンドに置き換えてください。
私は面倒なのでVSC使っちゃいます。

maker
  - .devcontainer
      devcontainer.json

超適当ですが、こんな感じです。

devcontainer.jsonはこんな感じです。

{
    "name": "waifu-diffusion-python-mode",
    "image": "nvcr.io/nvidia/pytorch:21.12-py3",
    "runArgs": [ "--gpus", "all" ]
}

pytorchのバージョンは最新のもので大丈夫かなと思います。
不安なら、この辺(https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch)で確かめておけばいいかなって。

さて、それでは今作ったディレクトリ、makerをVSCのdev containerで開いてみましょう。

...やたらとイメージのDLに時間がかかりますが、あきらめてください。

できたら次進みます。

VSCのdev containerが開いたら、ターミナルに入ってコマンドを打ちます。

# nvidia-smi
Wed Dec 14 23:50:48 2022       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.65       Driver Version: 527.56       CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| 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 ...  On   | 00000000:01:00.0  On |                  N/A |
| 18%   47C    P0    58W / 250W |   3016MiB /  8192MiB |      4%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A        24      G   /Xwayland                       N/A      |
|    0   N/A  N/A        27      G   /Xwayland                       N/A      |
+-----------------------------------------------------------------------------+

こうなってればオーケーです。
エラーが出ると、うまくGPUをつかめていない感じです。
Windows10ではだめでした。

何はともあれ画像生成!

さて、VSCで作業スペースに入り込みました。
まずは必要なパッケージをダウンロードしましょう。

pip install transformers scipy ftfy "ipywidgets>=7,<8" datasets diffusers accelerate

次に、ファイルと画像出力用のディレクトリを作っておきます。

maker
  - .devcontainer
      devcontainer.json
  - outputs
  create_img.py

create_img.pyは次のようにします。

import torch
import os
import subprocess
from torch import autocast
from diffusers import StableDiffusionPipeline

# Original
model_id = "CompVis/stable-diffusion-v1-4"
branch_name= "fp16"
device = "cuda"


pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16, revision=branch_name)
pipe = pipe.to(device)

# 画像生成数
num_samples = 1

# 呪文
prompt = "standing swordman under the full moon in arena, highres"

with autocast("cuda"):
    images = pipe([prompt] * num_samples, guidance_scale=7.5)["images"]

outpath = './outputs'
i = len(os.listdir(outpath)) + 1
for image in images:
    image.save(f'./outputs/{i:04}.png')
    i = i+1

num_samplesは自分の環境と相談して決めてください。
私の環境では1が限界でした。

また、promptは画像生成の呪文になっています。

では実行しましょう。

python create_img.py

初期状態ではモデルをとってくるため、めっちゃ時間かかりますが、これは最初だけです。
我慢しましょう。

さて、結果がoutputsに格納されていますので、見に行きましょう。

誰ですか、あなた?

...うむ!

まとめ

ローカルでnvidiaのGPUを使っているWindows11ユーザーっていうそれなりにメジャーな方々が、ローカルで画像生成するための環境をとりあえず作れるようにしてみました。
作業時間の大半はモデルやイメージのダウンロードに費やされるので、実質的には作業数は大したことありません。

といっても、ここはただの入り口です。
ここから prompt の沼が待っています。

今回はこんなところです。

参考

https://note.com/npaka/n/ned44e0242ac0

Discussion

ログインするとコメントできます