久しぶりにStable Diffusion使ったらエラーが出た件

PC・Linux

みなさん、こんにちは。
パノメゴン(@panomegon)です。

以前、こちらの記事でStable Diffusionをご紹介しました。

最初はローカルの仮想環境上で動かそうとしたものの、結局はGoogle Colaboratoryを使った方法に落ち着いたという話でした。

ただ、最近しばらくStable Diffusionで遊んでいなくて、久しぶりに実行したところエラーが出てしまったので、これについて書こうと思います。

エラーと解決方法

ライブラリのインストール、モデルの読み込みなどは今まで通りうまく実行できました。
しかし、実際に画像を生成する段階で下記のようなエラーが出てしまいました。

keyerror: ‘sample’

アップデートによって仕様が少し変更されてしまったようです。
とは言え、直し方は簡単です。


image = pipe(prompt)["sample"][0]

となっていた部分を次のように変えるだけです。


image = pipe(prompt).images[0]

こうすることで、今までのように画像生成することができます。

最新バージョンを利用する

Stable Diffusion自体、アップデートされ新しくなっていますので、以前紹介した時と比べ、少々仕様が異なっています。
例えば、高解像度化されていたり、アクセストークンが不要になっている点などが挙げられます。

ということで、Google ColaboratoryでStable Diffusionを使用する方法を改めて書いておこうと思います。
基本的な流れは前回と同じですので、適宜参照してください。

Google Colaboratoryでノートブックを作成したら、GPUを使用できるようにしておきましょう。
「編集」から「ノートブックの設定」を開き、「ハードウェアアクセラレータ」という項目からGPUに変更できます。

まずは、必要なライブラリのインストールです。


!pip install --upgrade diffusers[torch] transformers accelerate

accelerateは、以前は入れてませんでしたが、インストールするよう警告が出ていたので入れました。一応無くても動きます。

続いて、モデルの読み込み等を行います。


from diffusers import StableDiffusionPipeline, EulerDiscreteScheduler
import torch
from IPython.display import Image,display

model_id = "stabilityai/stable-diffusion-2-1"

scheduler = EulerDiscreteScheduler.from_pretrained(model_id, subfolder="scheduler")
pipe = StableDiffusionPipeline.from_pretrained(model_id, scheduler=scheduler,torch_dtype=torch.float16)
pipe.to("cuda")
#pipe.enable_attention_slicing()
!mkdir outputs

model_idのところに最新版のモデルを指定しています。
ここを変えることで、以前のモデルを使用したり、その他さまざまなモデルを使うことができます。

今回は生成した画像をその場で表示して確認できるよう、そのためのライブラリも読み込んでいます。

もし、次のステップで「CUDA out of memory.」のようなエラーが発生するようであれば、以下のコメントアウトを外してください。速度を犠牲にする代わりに、メモリ不足を解消できるようです。


#pipe.enable_attention_slicing()

それでは、実際に画像を生成してみましょう。


prompt = "a cat"
for i in range(5):
    image = pipe(prompt, height=768, width=768).images[0]
    image.save(f"outputs/stable-diffusion-image{i:03}.png")
    display(Image(f"outputs/stable-diffusion-image{i:03}.png"))
    print(f"stable-diffusion-image{i:03}")

promptの部分に呪文を入れます。

一度に複数枚生成したいので、forループで5回繰り返し処理しています。
ここの数字を変更することで、一度に生成できる画像の枚数を変えられます。

最後に

ということで、Stable Diffusionのエラーを修正するとともに、最新バージョンにも触れてみました。

より高解像度で出力でき、楽しかったです。
アクセストークンがなくても動作するようになり、気軽に試せるようになったので、皆さんも挑戦してみてください。

最後までありがとうございました。

タイトルとURLをコピーしました