Stable Diffusion API 開発

Stable Diffusion は、文章を渡すと画像を生成してくれる AI で OSS です。 これを自分の PC で動かそうとすると、GPU が必要になります。 (CPU で動かせるstable_diffusion.openvino というのもあります)

できれば、どの PC でも使えるように、かつ、Slack などサービスと連携できるよう API がほしいなと思いました。 そこで、Stable Diffusion の API を開発しました。

結論

beta.dreamstudio.aiSDKstability-sdkを使いました。

成果物は、次のリポジトリに置いています。

ローカル環境でも、Docker コンテナでも、動きます。

動かすには、beta.dreamstudio.aiAPI Key が必要になります。 Docker で動くので、Docker をデプロイできるサービスなら、どこでも動きます。(GPU は不要です)

私は、GCP が好きなので、CloudRun というサービスにデプロイしました。 API は、とりあえず、<url>/?prompt=<text> というパラメータを受け取り、画像を返却します。

Slack で使ってみると、こんな感じになりました。

stable-diffusion-api-on-slack

ひとまず、API で Stable Diffusion を動かせました。

GPU と設計

stability-sdkを使う前までは、自前で Stable Diffusion を動かす環境を用意しようと設計を考えました。設計の調査メモは、次のリンクにメモを残しています。

具体的に、次のようなパターンを考えました。

  1. Google Colaboratory の GPU を使って Stable Diffusion を動かし、簡易な API で公開する
  2. サーバー(GCE や CloudRun など) で GPU を使って Stable Diffusion を動かし、簡易な API で公開する
  3. バッチ(Cloud Batch)で GPU を使って Stable Diffusion を動かし、必要なときに動かす。(API からバッチ処理をキックする)

1 番目は、Google Colaboratory の利用は 12 時間制限というのがあり、そこを回避する何かが必要なります。ただし、本来の用途と外れていると思うので、却下しました。

2 番目は、金銭的に数万~数十万円以上のランニングコストが発生するので却下です。

3 番目は、一番最初の構想したものです。2 番目のような GPU のサーバを常時起動しているとめちゃくちゃもったいないので、 バッチ処理として 3 番目の案を考えていました。3 番目で実際に構築してみると、(何が原因か深く調べていないですが) 起動に 30 分以上かかってしまい、使い物にならなさそうでした。

で、悩んだ結果、stability-sdk がメンテナンスやランニングコストも不要で、シュッとできそうだったことに気づきました。

もちろん、デメリットはあります。

  • SDK に依存するので、自身がコントロールできない(img2img できない)
  • 課金制

しかし、個人レベルで利用するという前提でしたので、デメリットよりもメリットの方が大きいと判断しました。

stability-sdk

beta.dreamstudio.ai は、Stable Diffusion を使っています。 API として、stability-sdk を公開しています。 使うには、Python で書く必要があります。 ソースコードを読むと、gRPC を使っているため、別言語で SDK を書くのは比較的簡単だと思います。 私は、Python でシュッと書けるので、flask と stability-sdk を使いました。

ひとまず、Prompt だけを受け付ける超絶シンプルな API を書きました。 stability-sdkは、様々パラメータがあるので、それも受け付けられるようにしようかなと思ったり、Midjourney の discord のボットのようなモノを書いても面白そうだなと思いました。

終わりに

マークダウンで、画像を読み込むときに、今回開発した API を指定すると、マークダウンを開いたタイミングで画像が毎回変わります。 prompt と seed を指定すれば固定できるんですけど、こういうのも面白いなと思っています。