はじめに
最近AIが絵を描いてくれるツール流行っていますよね。
Stable Diffusionがすごいとかなんとか・・
無料で使えるサービスもあるのですが(DreamStudio, お絵描きばりぐっどくんなど)、すぐ制限にかかってしまい使えなくなってしまいます。
じゃあローカルで実行できるようにしよう!
ってことで
→ ネットの記事を調べてみる
→ 大抵がGPUを使う前提の記事
→ 自分のよわよわ intel CPU じゃ使えないのか..😭
→ 「ん?そもそも本当にGPUありじゃないと使えないのか?よわよわPCでもいけるんじゃない?」
ということを検証してみようと、この記事を書くに至りました。
記事の対象者
GPUが搭載されていない/機械学習向きでないPCで無料でStable Diffusionを使うことを検討している人。
筆者の環境
Stable Diffusionついて
Stable Diffusionとは、キーワードに沿って人間が描いたような画像を生み出すAIのことです。
Stable Diffusionを用いた技術としては下記のようなものがあります。
- txt2img(text to image) ... テキストから画像を生成
- img2img(image to image) ... テキストと画像から新たな画像を生成
- inpainting ... 指定範囲をテキストで指示して画像修復
様々な環境で実行して比較してみた
今回は特に txt2img に絞って、様々な環境で速度や完成度を比較してみました。
- 公式のStable Diffusionをローカルで実行
- CPU最適化されたStable Diffusionをローカルで実行
- 公式のStable DiffusionをGoogle Colab (無料)上で実行
txt2imgに渡すテキスト(呪文)は下記。
チームラボプラネッツの作品名をそのまま使ってみました。
https://planets.teamlab.art/tokyo/jp/ew/universe_fireparticles/
Universe of Fire Particles on the Water’s Surface art by teamLab
ステップ数は 3, 5, 10, 50 の4つで試しました。
ステップ数が多い方が精度は高くなりますが、その分時間はかかります。
1. 公式のStable Diffusionをローカルで実行
まずは、試しに公式の Stable Diffusion をインストールして動かしてみます。
python の実行環境を整え、diffusers というライブラリを利用します。
以下のようなコードを書きます。
import os
from diffusers import StableDiffusionPipeline
dir_name = "images"
prompt = "Universe of Fire Particles on the Water's Surface art by teamLab"
steps = 50
if not os.path.exists(dir_name):
os.mkdir(dir_name)
pipe = StableDiffusionPipeline.from_pretrained(
"CompVis/stable-diffusion-v1-4",
revision="fp16",
use_auth_token=os.getenv("SD_TOKEN")
).to("cpu")
file_name = f"{dir_name}/{prompt}-step_{steps}.png"
print(file_name)
image = pipe(prompt, num_inference_steps=steps)["sample"][0]
image.save(file_name)
SD_TOKEN
には Hugging Fase から取得したトークン入れます。
↓の画像を出力するのに 25分以上かかりました。
生成された画像について表にまとめます。画像は縮小しています。
ステップ数 | 生成された画像 | 実行時間 |
---|---|---|
3 | 2分 | |
5 | 3分 | |
10 | 5分27秒 | |
50 | 25分18秒 |
2. CPU最適化されたStable Diffusionをローカルで実行
下記リポジトリを使って進めていきます。
OpenVINOを使っており、Intel CPUでもStable Diffusionが行えるよう最適化されています。
https://github.com/bes-dev/stable_diffusion.openvino
1. 環境構築
- Python 3.8 以上をインストールしておく
- 下記コマンドで環境構築
git clone git@github.com:bes-dev/stable_diffusion.openvino.git
cd stable_diffusion.openvino
python3 -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt
2. ステップ数を変えて実行
実行コマンド:
python3 demo.py --prompt "Universe of Fire Particles on the Water’s Surface art by teamLab" --num-inference-steps 10
上記の--num-inference-steps
でステップ数を調整します。
各ステップごと生成された画像は下記。画像は縮小しています。
ステップ数 | 生成された画像 | 実行時間 |
---|---|---|
3 | 27秒 | |
5 | 39秒 | |
10 | 1分19秒 | |
50 | 6分43秒 |
3. 公式のStable DiffusionをGoogle Colab (無料)上で実行
下記をColabノートに書いていきます。
1. 事前準備
TOKEN にはHugging Faceで発行したトークンを指定します。
!pip install transformers scipy ftfy diffusers
import torch
from torch import autocast
from diffusers import StableDiffusionPipeline
TOKEN = "{{Hugging Faceで発行したトークン}}"
pipe = StableDiffusionPipeline.from_pretrained(
"CompVis/stable-diffusion-v1-4",
revision="fp16",
torch_dtype=torch.float16,
use_auth_token=TOKEN
).to("cuda")
2. 実行
prompt
に呪文を指定します。
steps
にステップ数を指定します。
import os
import time
dir_name = "images"
prompt = "Universe of Fire Particles on the Water’s Surface art by teamLab"
os.mkdir(dir_name)
steps = 3
os.mkdir(f"{dir_name}/{steps}steps")
for i in range(5):
print("i: ", end="")
with autocast("cuda"):
time_sta = time.time()
image = pipe(prompt, guidance_scale=7.5, num_inference_steps=steps)["sample"][0]
elapsed = round(time.time() - time_sta, 1)
image.save(f"{dir_name}/{steps}steps/{i}it_{elapsed}seconds.png")
print(elapsed)
各ステップごと生成された画像は下記。画像は縮小しています。
ステップ数 | 生成された画像 | 実行時間 |
---|---|---|
3 | 1.6秒 | |
5 | 2.2秒 | |
10 | 3.8秒 | |
50 | 15.6秒 |
結果比較
ステップ数 | 公式 | OpenVINO | Google Colab | 精度 |
---|---|---|---|---|
3 | 2分 | 27秒 | 1.6秒 | 抽象画のようになる |
5 | 3分 | 39秒 | 2.2秒 | ステップ数3近い |
10 | 5分27秒 | 1分19秒 | 3.8秒 | 比較的リアルになった |
50 | 25分18秒 | 6分43秒 | 15.6秒 | ステップ数10よりさらにリアルになった |
所感
おそらく Stable Diffusion 自体は GPU を使用することを前提に設計されており、これをそのまま CPU で使おうとするととんでもない時間がかかってしまいました。
Intel CPU で Stable Diffusion を使いたい場合は OpenVINO を使うのが良さそうです。
1枚画像を生成するのにかかる時間が約 1 / 5 ぐらいになりました。
幸い OpenVINO で Stable Diffusion を実装したリポジトリがあったので、それを使えばコマンド一発で画像生成できて便利でした。
また、ステップ数がデフォルトで 50 になっていますが、生成にかかる時間を短くするにはここを調整する選択肢もあると思います。
ステップ数を下げた分だけ質も落ちてしまいますが、例えばステップ数を 10 にすると OpenVINO で 1分程度で出力できるので、試行錯誤のループが早くなって良いこともあります。
このように色々な工夫をすることで Intel CPU でも画像生成させることが可能ではありました。
ただ、まあ実際あえて CPU を使うメリットもあまりないので、よわよわ PC しか持っていない方は普通に Google Colab を使う方が良いと思います。