あけましておめでとうございます。今年1本目のブログです。
なんてことを思っていたらもう1月も下旬とは速いですね。
今回は、去年の年末にちょっと話題になってた?StreamDiffusionのリポジトリが公開されていたのでちょっと遊んでみた内容について書いていきます。
そうです、みんな大好き?GPU有効活用シリーズの第4弾です。
環境構築
- CPU: Ryzen5 3600
- メモリ: DDR4 32GB
- GPU: Geforce RTX 4070(VRAM 12GB)
- OS: Windows 11
- Docker Desktop(Docker compose)
もちろん、相も変わらずDockerで環境を用意していきます。
まずはリポジトリをクローンしてきます。
Dockerfileもすでに用意されており、READMEに実行方法も書いてくれてるのですが、個人的にDockerコンテナの操作はすべてdocker composeで行いたいので、compose.ymlを用意します。
version: '3'
x-base_service: &base_service
tty: true
deploy:
resources:
reservations:
devices:
- driver: nvidia
capabilities: [ gpu ]
name: streamdiffusion
services:
examples:
<<: *base_service
profiles: [ "examples" ]
container_name: streamdiffusion_examples
build: ./
working_dir: /app/examples
volumes:
- ./:/app
- ./.cache:/root/.cache
t2i_demo:
<<: *base_service
profiles: [ "t2i_demo" ]
build: ./demo/realtime-txt2img
container_name: streamdiffusion_t2i_demo
environment:
- PYTHONPATH=/app
ports:
- 9090:9090
volumes:
- ./:/app
- ./.cache:/home/user/.cache
i2i_demo:
<<: *base_service
profiles: [ "i2i_demo" ]
build: ./demo/realtime-img2img
container_name: streamdiffusion_i2i_demo
environment:
- ENGINE_DIR=/data
- HF_HOME=/data
volumes:
- ./demo/realtime-img2img/.cache:/data
ports:
- 7860:7860
Demo1
まずはexamplesディレクトリにあるコードを動かしてみます。
docker compose --profile examples up -d
でコンテナを起動したら、コンテナに入りexamplesにあるREADMEに従って実行します。
今回は以下のコマンドでtxt2imgの複数枚同時生成を実行してみました。
python txt2img/multi.py --output ./output --prompt "A cat with a hat"
結果
生成はされるのですが、毎回pipeline componentsとやらをロードするらしくこれに数分かかり1度に生成されるのは3枚でした。
それならモデルの指定とかも楽にできるStableDiffusionで生成した方が速いような気がしちゃいます。
Demo2
demoディレクトリに別の、txt2imgを行えるコードがあるのでこれを試してみます。
ただそのままでは動かなかったり、最速ではなかったりするので以下の部分を書き換えます。
demo/realtime-txt2img/config.pyの
- accelerationをtensorrtに変更
- hostを0.0.0.0に変更
demo/realtime-txt2img/requirements.txtに
- torchvisionを追記
Dockerfileも別のものを使うのでコンテナを起動するコマンドも別のものになります。
docker compose --profile t2i_demo up -d
webサーバが立ち上がったらブラウザでlocalhost:9090にアクセスするとページが開きます。
結果
プロンプト自体は以前のVtuberになるブログで使ったもののうち品質向上系のプロンプトを除いたものを使ったのですが、入力する度にリアルタイムで新しく生成されていくのが分かります。
強いて難点を上げるとすれば
- モデルやLoraなどの変更はリアルタイムで行えないので都度再起動する必要がある。
- 生成した画像はどこかに保存されるわけではないので、手動で保存する必要がある。
ぐらいです。
Demo3
Demo2でリアルタイムに生成できることは確認できました。
それと以前のVtuberになるブログを組み合わせて1つ思いついたことがあります。
生成したイラストを動かす手法では可動域に限界があり、少し傾くぐらいが限界でしたが
リアルタイム生成できれば真横とかも向ける完璧なVtuberになれるのでは!?
正直これがやりたくてStreamDiffusionを触りました。
というわけでやってみましょう。
入力にWebカメラを使えるデモが用意されてるのでそれを使ってみます。
これはまた別のDockerfileが用意されているので、そちらを使ってコンテナを起動します。
docker compose --profile i2i_demo up -d
webサーバが立ち上がったらブラウザでlocalhost:7860にアクセスするとページが開きます。
左下のstartを押してカメラを許可すると生成が始まります。
Demo2と同様にプロンプトを書き換えるとリアルタイムで生成内容も変わります。
結果
がっつり顔や部屋が映るので動画はありませんが、デフォルトでプロンプトに入っているジョーカー(白塗りの顔)にはなれました。
ただ、あまりに激しく動くと生成が追いつかないし、派手な改変はできないようです。
イメージとしては、映っている物体の上から新しく塗るという感じなのか、髪を伸ばしたり服を派手にするのは現状では難しそうです。
また、ちゃんと原因はわからないのですがOBSを起動した状態だとカメラが映りませんでした。
なのでStreamDiffusionでお手軽超美麗3DVtuber!っていうのはなかなか厳しそうですね。
最後に
今年は月1本目標にするぞー とか思ってたら1月も終わりかけでしたがギリギリ間に合ってよかったです。
来月はもうちょっと早めに出せるといいですね。