« イオンモバイルで5G回線に変更する方法 | トップページ | Raspberry PiでUSBマイクから連続録音させる »

2022年8月26日 (金)

高精度な画像生成AI「Stable Diffusion」を自分のPCで動かす方法(+ google colab)

実は我が家では動かなかったのですが、その理由は後述。動作可能にするところまではいけました。

先日、Midjournyというお絵描きAIを試してみた: EeePCの軌跡という記事を書きましたが、Midjournyをも超える文章からの画像生成AIが正式リリースされたとのことで、ネット界隈が騒然としております。

それが「Stable Diffusion」というやつなのですが、特徴としては、

・オープンソースで、自分のPC上でも利用可能(つまり無料で使うことができる)

・生成画像の商用利用も可能

とのことで、お手軽具合は確かにMidjourny以上です。

こいつを自分のPC上で使えたら本当に自由自在です。

しかも、かなりいい出来の画像を返すとのことで、期待が高まります。

下記のサイトを参考に、構築してみました。

[Stable Diffusion] AIでテキストから画像を生成する[Python] - TeDokology

このサイトでは、Google Colaboratoryでの利用を前提に書いてますが、ここのコードをPC上でも使うためのやり方を残しておきます。

うちでは、Windows版python 3.7.9をインストール済み、という前提です。

で、まずHuggingFaceのアカウントを作ります。

Hugging Face – The AI community building the future.

このサイトでまず、アカウントを作ってください。

で、アカウント作成後にログインし、以下のページにアクセス。

CompVis/stable-diffusion-v1-4 · Hugging Face

するとここで、以下のような文章が出てきます。

Stablediffushion01

一番下にあるチェックを入れて、Access repositoryをクリックします。

で、その後に、右上にある丸いアイコンをクリックすると、以下のようなメニューが出てきます。

Stablediffushion01a

その中の「Settings」をクリックし、現れるメニューの中から「Access Tokens」をクリック。

Stablediffushion01b

すると黒丸の文字列が出てくるので、横の「Show」をクリックして文字列を表示し、テキストファイルにでも貼り付けておきます。

このトークンは、後ほど使います。

さて、続いてWindows PowerShellを開き、そこで、

pip install diffusers==0.2.4 transformers scipy ftfy

を実行します。必要なライブラリがインストールされるので、以下のコードをコピペで持っていきます。


#%cd /content
#!pip install diffusers==0.2.4 transformers scipy ftfy

from diffusers import StableDiffusionPipeline
import matplotlib.pyplot as plt

access_tokens="HuggingFaceで作ったAccessTokenをここに入れます" # @param {type:"string"}
     
# load pretrain model
model = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", use_auth_token=access_tokens)
model.to("cuda")

prompt = "A silver-haired girl standing in front of a giant Gundam-style robot" #@param {type:"string"}
     
num = 5
     
for i in range(num):
    # モデルにpromptを入力し画像生成
    image = model(prompt)["sample"][0]
    # 保存
    image.save(f"test_{i:04}.png")
     
for i in range(num):
    plt.imshow(plt.imread(f"test_{i:04}.png"))
    plt.axis('off')
    plt.show()

これを「stable_diff.py」という名前でも付けて保存。

なお、このコード内の「access_tokens=」の後ろは、先ほどゲットしたAccess Tokensの文字列を入れておいてください。

さて、ちょっと厄介なのですが、Windows上ではこのままでは動きません。

多分、普通に

> python stable_diff.py

エラーが出てくるはずです。

で、いろいろ調べた結果、管理者権限で起動したWindows PowerShellを使わないとダメらしいです。

Stablediffushion02

はい、Windows PowerShellのアイコンを右クリックして「管理者として実行」を選んで起動します。

その後に「 python stable_diff.py」とやれば、動くはずです。

Stablediffushion03

モデルのダウンロードが開始されて、いよいよ動き出します。

が、我が家ではこの後、動かなくなりました。

Stablediffushion04

こんなエラーを出して、終了。

簡単にいうと、

GPUのメモリーが足らんのじゃボケェ!

と言われました。

はい、我が家のGTX1650Tiは4GB。で、どうやら10GB以上のメモリーを搭載したGPUじゃないとダメっぽいです。

これでは、取りつく島もありません。

一応、少ないGPUメモリーのマシンで動かす方法もないわけでもないですが、

話題のStable Diffusionがオープンソース化されたのでローカルで動かしてみる

(この中のコメントでfloat16でも動かす方法というのを見る)

めんどくさそうなので、とりあえず私はさっさと諦めてGoogle Colaboratoryに行きました。

Stablediffushion05

なお、こっちで動かすためには、先のコードの先頭2行の「#」を消しておいてください。

かつ、Google Colaboratoryの中の「ランタイムのタイプを変更」‐「ハードウェアアクセラレーター」をNoneからGPUに変えておいてください。

ちなみに、上のコードをそのまま実行すると「ガンダム風巨大ロボットの前に立つ銀髪の女の子」の画像が作成されようとします。

他の画像がご所望の方は、「prompt=」の後ろの英文を変えてください(英語で)。

上のコードを実行すると、一気に5枚まで作ってくれます。Google Colaboratoryなら大体1、2分で完了しました。

で、できた画像はこんなの。

Test_0003

うん、確かに「ガンダム風巨大ロボットの前に立つ銀髪の女の子」です。

何度かやりましたが、たまに作画崩壊気味の画像も出てきました。

が、結構はっきりとした画像が生成されることが多くて、なかなかいい感じです。

他にも、

「銀河英雄伝説の戦艦」

Index3

「中世風の街に立つ娘」

Index5

(いずれも、Google翻訳で日本語 → 英語に変えてからコードに入れてます)

Midjournyと比べると、かなりくっきりとした画像が得られるというのが個人的な印象。

確かに精度もMidjourny以上だと言われると、その通りですね。

なかなか遊べます。ほんと、AIの進化ってやつには驚くばかりです。

※追記

アップ直前になって、少ないGPUメモリーのPCでも動かせるコードができたので、参考までに載せておきます。

公式のサイトの以下の記事

CompVis/stable-diffusion-v1-4 · Hugging Face

をよく読んでいたら、GPUメモリーが少ないPC向けのfp16版のコードができたので、それを残しておきます。


from diffusers import StableDiffusionPipeline, LMSDiscreteScheduler
import torch
from torch import autocast

access_tokens="HuggingFaceで作ったAccessTokenをここに入れます" # @param {type:"string"}

model_id = "CompVis/stable-diffusion-v1-4"
# Use the K-LMS scheduler here instead
scheduler = LMSDiscreteScheduler(beta_start=0.00085, beta_end=0.012, beta_schedule="scaled_linear", num_train_timesteps=1000)
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16, revision="fp16", use_auth_token=access_tokens)
pipe = pipe.to("cuda")

prompt = "A silver-haired girl standing in front of a giant Gundam-style robot"
with autocast("cuda"):
    image = pipe(prompt, guidance_scale=7.5)["sample"][0]  
   
image.save("test.png")

これを「stable_diff_l.py」という名前で保存し、

> python stable_diff_l.py

と実行すると、10GB以下のGPUメモリーのPCでも実行できるかも、とのことです。

ただし、動作は未確認。我が家の4GBじゃどのみちダメでした・・・


Midjourney 入力テキスト&出力画像コレクション 1: イメージ通りの画像を生成するためのヒントを得よう! Midjourney 入力・出力コレクション

« イオンモバイルで5G回線に変更する方法 | トップページ | Raspberry PiでUSBマイクから連続録音させる »

数値解析系」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« イオンモバイルで5G回線に変更する方法 | トップページ | Raspberry PiでUSBマイクから連続録音させる »

当ブログ内検索

スポンサード リンク

ブログ村

無料ブログはココログ