ふと、生成AIを試してみたくなりました。
二年前に自分でStable Diffusionを動かしたときは、Stable Diffusion Web UI(AUTOMATIC1111)を使っていました。
しかし、最近のhuggingfaceを見ていると、多くのモデルがHow to useにComfyUI上での動作を上げています。
実際、ComfyUIの画面は、AUTOMATIC1111のWeb UIと違って、ノードベースで処理が表現されていて、いくつかの手順を踏む生成画像の場合には、向いていそうです。
そこで、今回はリモートのUbuntu上のDockerにComfyUI環境を整備し、AnimateDiff-lightningで動画を生成してみたいと思います。
環境構築
dev-containerを使いました。以下、ディレクトリ構成です。
comfyui_server
├── .devcontainer
| ├── Dockerfile
| ├── devcontainer.json
| └── docker-compose.yml
ComfyUI(これはgit cloneします)
Dockerfile
imageはpytorch/pytorch:2.3.0-cuda12.1-cudnn8-runtimeをベースにしました。また、ComfyUIのレポジトリにあるrequriements.txtを参考にライブラリを入れました。
FROM pytorch/pytorch:2.3.0-cuda12.1-cudnn8-runtime
ENV DEBIAN_FRONTEND=noninteractive
ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=$USER_UID
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm
RUN apt-get update \
&& groupadd --gid $USER_GID $USERNAME \
&& useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USERNAME \
&& apt-get install -y sudo \
&& echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \
&& chmod 0440 /etc/sudoers.d/$USERNAME \
&& apt-get -y install locales \
&& localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
RUN apt-get -y install git
RUN apt-get -y install libopencv-dev
RUN pip install einops \
transformers>=4.25.1 \
safetensors>=0.3.0 \
aiohttp \
pyyaml \
Pillow \
scipy \
tqdm \
psutil \
kornia>=0.7.1 \
spandrel \
torchsde \
torchvision \
GitPython \
opencv-python \
imageio-ffmpeg
ComfyUIの拡張機能で動画を表示するのにopencv-pythonやimageio-ffmpegが必要でした。また、libopencv-devはタイムゾーンを設定していないと、設定を強要されてコンパイルが止まります。ENV DEBIAN_FRONTEND=noninteractiveを入れると、入力待ちになりません。
devcontainer.json
名前とサービス名を決定してください。また、必要な拡張機能を入れてください。今回は、dev-containerを使いますが、プログラムを弄りたいわけではないので、拡張機能は入れなくても大丈夫です。
{
"name": "comfyui-server",
"service": "comfyui-server",
"dockerComposeFile": "docker-compose.yml",
"remoteUser": "vscode",
"workspaceFolder": "/work",
"customizations": {
"vscode": {
"extensions": [
"ms-python.python",
"ms-toolsai.jupyter"
]
}
}
}
docker-compose.yml
設定したサービス名を間違えないでください。
また、GPUを使うので、GPUが使えるようにdeployを書き足します。
version: '3'
services:
comfyui-server:
container_name: 'comfyui-server-container'
hostname: 'comfyui-server-container'
build: .
restart: always
working_dir: '/work'
tty: true
volumes:
- type: bind
source: ..
target: /work
ulimits:
memlock: -1
stack: -1
shm_size: '10gb'
deploy:
resources:
reservations:
devices:
- capabilities: [gpu]
ComfyUIの実行
コンテナをビルドして、中に入ったらComfyUIをcloneします。
git clone https://github.com/comfyanonymous/ComfyUI.git
その後、クローンしたディレクトリに移動します。main.pyをpythonで実行することでサーバーが動作します。
python main.py
特段、エラーログが表示されなければ成功です。
URLが表示されるので、クリックすればWeb上にComfyUIの画面が表示されます。
Starting server
To see the GUI go to: http://127.0.0.1:8188
ComfyUI-Managerのインストール
拡張機能はComfyUI-Managerを使うのが良いです。
Installationに次のように書いてあるので、従います。
https://github.com/ltdrdata/ComfyUI-Manager installation
- goto
ComfyUI/custom_nodes
dir in terminal(cmd)git clone https://github.com/ltdrdata/ComfyUI-Manager.git
- Restart ComfyUI
ComfyUIを再起動すると、画面の右サイドバーにManagerのボタンが追加されています。
拡張機能のインストール
拡張機能の入れ方は、Managerボタンを押した後、「install Custom Nodes」を押します。
その後、次の2つを検索ボックスに入れて、installします。
インストールが成功すれば、「install Custom Nodes」には次のように表示されます。
モデルのダウンロード
ベースモデルのダウンロード
まず、Stable Diffusionのベースとなるモデルをダウンロードします。
今回は、アニメ風のMistoon_animeにしました。
これをダウンロードした後、ComfyUI/models/checkpoints
へ入れます。
AnimateDiff-Lightingのダウンロード
次に、AnimateDiff-Lightningのモデルをダウンロードします。
今回は、8stepのモデルをダウンロードしました。
これを、ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved/models
へと入れます。
ワークフローのロード
基本のワークフロー(ComfyUIの処理の流れのこと)をAnimateDiff-Lightningが公開しているので、これをダウンロードします。
ダウンロード後、ComfyUIの右のサイドバーから、Loadを選択し、ダウンロードしたワークフローを読み込みます。
エラーがあれば、表示されます。
モデルの設定と実行
各種、設定項目を変更します。
- Load Checkpointにあるベースのモデルを、ダウンロードしたモデルへ変更します。矢印を押すとmodels内のモデルが表示されるので、mistoonAnime_v30.safetensorsにします
- AnimateDiff Loaderのモデルも変更します。矢印をおすと、ダウンロードしたanimatediff_lightning_8step_comfyui.safetensorsに変更されます。
- KSamplerのstepsを8にします。
設定項目を入力したら、右サイドバーのQueue Promptを押すと、処理が始まります。
出力は、ComfyUI/output
に吐き出されています。
今回の結果は次の動画が生成されました。
動画にはなっていますが、ほとんど動きはありません。
Control NetやMotion LoRAを組み合わせると、動きのある動画が生成されやすいようです。
興味が続いたら、今後やってみます。
今回の記事はここまでです。