LoginSignup
30
27

More than 1 year has passed since last update.

【StableDiffusion】よわよわMacBookでもAIに絵を描かせたい!

Last updated at Posted at 2022-10-17

はじめに

最近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 に絞って、様々な環境で速度や完成度を比較してみました。

  1. 公式のStable Diffusionをローカルで実行
  2. CPU最適化されたStable Diffusionをローカルで実行
  3. 公式の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分以上かかりました。

Universe of Fire Particles on the Water's Surface art by teamLab-step_50-25m33s

生成された画像について表にまとめます。画像は縮小しています。

ステップ数 生成された画像 実行時間
3 generated 2分
5 generated 3分
10 generated 5分27秒
50 generated 25分18秒

2. CPU最適化されたStable Diffusionをローカルで実行

下記リポジトリを使って進めていきます。
OpenVINOを使っており、Intel CPUでもStable Diffusionが行えるよう最適化されています。
https://github.com/bes-dev/stable_diffusion.openvino

1. 環境構築

  1. Python 3.8 以上をインストールしておく
  2. 下記コマンドで環境構築
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 generated 27秒
5 generated 39秒
10 generated 1分19秒
50 generated 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 generated 1.6秒
5 generated 2.2秒
10 generated 3.8秒
50 generated 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 を使う方が良いと思います。

30
27
3

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
30
27