Stable Diffusion APIを開発する調査メモ
目的
Stable DiffusionをAPI化して、Slackや各種Bot系と連携したい。
要件
Stable Diffusionは、画像生成するため、GPU が必要
With its 860M UNet and 123M text encoder, the model is relatively lightweight and runs on a GPU with at least 10GB VRAM
※ https://github.com/CompVis/stable-diffusion
API化するシステム設計案
Stable DiffusionをAPI化するためのシステム設計案は、次のものです。
Docker化は、stable-diffusion-docker が良さそうです。
- Google Colaboratory で API を提供
- Stable Diffusion を VMインスタンス(GCE with GPU)で 起動させ、APIを提供
- Stable Diffusion を Docker化し、Cloud Run for Anthos(GPU based k8s)で 起動させ、APIを提供
- Stable Diffusion を Docker化し、Cloud Batchで実行させる。API (なんでも) → Cloud Workflow → Cloud Batch で連動させる
- stability.ai APIを使う
※ 筆者は、GCPを普段よく使います。
結論から言うと、コスト面から 5番を選びます。元々は、4番を構想していたのですが、コストや起動時間が長くて断念しました。
Google Colaboratory で API を提供
Google Colaboratoryは、無料でGPU を使うことができます。
そのため、Stable Diffusion を動かすことができます。具体的な例は、こちら です。
Google Colaboratory 自体は、調べた内容をノートのようにまとめておくような用途で、私は使っていました。それとは別に、WebアプリやAPIとして使うことができます。
ただし、制約として、Google Colaboratory の 最大使用時間が12時間 になります。
愚直な回避として、例えば、(何でも良いですけど) Virtual Desktop でGoogle Colaboratory をブラウザから開いておいて、定期的に Google Colaboratory を開くブラウザ操作を組めば、やれないことは、ないかなと思います。
そこまでして、やりたいか?と思いますし、本来のGoogle Colaboratoryの使い方とは違うような気がしてきて、うーんってなります。
GCP と GPU
GCPで GPU を使うには、GCE で GPU を選ぶようです。
そのため、次のような選択肢があります。
- GCE で直接使う
- GCE テンプレート で GPU を定義して、GCEテンプレートを使うサービス を使う
- Cloud Run For Anthos で GCE インスタンス (GPU) を使う
Stable Diffusion を VMインスタンス(GCE with GPU)で 起動させ、APIを提供
雑にGPUを使ったGCEインスタンスを毎日起動していたとして、費用を調べてみます。
Total Estimated Cost: USD 2,039.05 per 1 month
ざっと月に2千ドルぐらいかかります。もちろん、最適化してコスト削減できると思いますが、GPU ってのが高価 なので、月数ドルとかには落とせないかなと思います。
こちらの記事で、GCPでStable Diffusionを動かしていると書かれていて、お金かけているのかな〜とエスパーしてしまいます。
Stable Diffusion を Docker化し、Cloud Run for Anthos(GPU based k8s)で 起動させ、APIを提供
GKE を使う時点で、お手軽さがないので、諦めます...。
Stable Diffusion を Docker化し、Cloud Batchで実行させる。API (なんでも) → Cloud Workflow → Cloud Batch で連動させる
一番、最初に考えていた設計です。
Stable Diffusion で画像処理するのはAPIサービスとは別に分けたいと思っていました。
そのため、Cloud Batch というバッチ処理ができるサービスでStable Diffusionを動かしたいです。
Cloud Batch を起動させるトリガーは、今の所 Cloud API しかありません。Cloud APIと手軽に連携できるサービスは、Cloud Workflow があります。Cloud Workflowは、PubSubで連携できます。
システム設計としては、
API (Cloud RunとかCloud Functionとかなんでも)
↓
PubSub
↓
Cloud Workflows
↓
Cloud Batch
の流れで繋げれます。
試してみた
cloud batch を submit するためのテンプレートファイルを、次のもの(stable-diffusion-template.json)にします。
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"container": {
"imageUri": "gcr.io/<GCP_PROJECT>/<Stable Diffusion Docker Image>",
"commands": ["<Prompt>"]
}
}
]
},
"taskCount": 1,
"parallelism": 1
}
],
"allocationPolicy": {
"instances": [
{
"instanceTemplate": "<GCE TEMPLATE NAME WITH GPU>"
}
]
},
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}
$ gcloud beta batch jobs submit <job_name> \
--location us-central1 \
--config stable-diffusion-template.json
で、submitすると、、、30分以上実行されませんでした ...
Dockerイメージサイズが、11Gだったのが、よくなかったのかな ...。諦めました。
stability.ai APIを使う
beta.dreamstudio.ai というサイトで、Stable Diffusion を使っています。このサイトでは、課金制でAPIも提供されています。
-
stability-sdk
- python製
内部のソースコードを見ると、gRPCで通信しているようです。protoファイルと、エンドポイントが分かるので、javascriptのsdkも書けそうです。(誰か作って)
気になる課金ですが、£10 で 1kの生成ができるようです。
If you are interested in using the API at scale, we provide the ability to buy generations at bigger volumes. For more information, refer to our Developer Documentation
- £10
- 1k generations
- £100
- 10k generations
- £500
- 50k generations
- £1000
- 100k generations
※ https://beta.dreamstudio.ai/membership
£10は、日本円で 1,621.36 円 ぐらいのようです (執筆時点で)。1kの生成とは、単純な生成回数ではなく、パラメータを色々いじって、生成のポイント数値が増減します。https://beta.dreamstudio.ai/membership を見ると分かると思います。(たぶん)
どれぐらい使うかにも寄るんですが、£10 を月一回購入するぐらいで十分なら、SDKを使うで良さそうです。
結論
利用頻度が少ないなら (個人レベル)、 stability-sdk を使うでよさそうです。
Stable Diffusion GPUなし版を発見。