見出し画像

【Modal】 入門画像生成AI 【ComfyUI】

本記事は、ModalとComfyUIで画像生成をしたい人に向けたものです。
また、Modal上のcomfyuiでcomfyui_controlnet_auxが上手く動かなかった人への解決策も提示しています。

なお、ComfyUI自体の使い方は解説しておりません。
今後記事を書く予定ですが、ComfyUIそのものの使い方については有用な記事がたくさんあるので、そちらをご参照いただければ幸いです。


前書き

Modalとは?

クラウドコンピューティングサービスの一つ。
画像生成AIの初期、GPUを持たない人は Google Colab や Paperspace を利用する人が多かったがそれらと似た類のサービス。

値段
毎月30ドル分は無料で使えます

CPU
Physical core (2 vCPU equivalent):$0.192 / core / h
GPU
Nvidia H100:$7.65 / h
Nvidia A100, 80 GB:$5.59 / h
Nvidia A100, 40 GB:$3.73 / h
Nvidia A10G:$1.10 / h
Nvidia L4:$1.05 / h
Nvidia T4:$0.59 / h
Memory
$0.024 / GiB / h

Google Colab、Paperspaceのどちらも良いサービスですが、ColabはStable Diffusion WebUIの締め出しがあったり、Paperspace はなかなかGPUが利用できなかったりした。
Modalは、LLMやStable Diffusion向けのテンプレが用意されていたり、料金も比較的良心的だったため、おすすめしたい。

ComfyUIとは?

画像生成モデルをGUIで扱うためのソフトウェア。
AUTOMATIC1111/stable-diffusion-webui と同じ類のもの。

知名度としてはWebUIに劣るかもしれないが、個人的にはComfy UIの方が圧倒的に使いやすかった。

準備

Modalの準備

準備といっても特に難しいことはなく、サインアップした後はチュートリアルをなぞるだけです。
以下のページの右のサイドバーにTry This on Modal!とあるので、これの通りに進めてください。

以下、公式の内容を抜粋

  1. アカウントを作成

  2. Modalの設定をする

pip install modal
modal setup

これで完了です。
もしうまくいかない場合はコメント等いただければ幸いです。

ComfyUIの準備

こちらも非常に簡単で、Modalがすでにテンプレを用意してくれています。

modalが用意したサンプルリポジトリをクローンしてこればすぐに使えます。
(ただ。このテンプレに設定されていたWorkflowはうまく動かなかったので、ComfyUI起動後に好きなWorkflowに書き換えます)

git clone https://github.com/modal-labs/modal-examples
cd modal-examples
modal run 06_gpu_and_ml/comfyui/comfy_ui.py

modal-examplesの中にはそのほかにもたくさんのサンプルプロジェクトが含まれています。不要な方は、comfyuiフォルダだけ別な場所にコピーして他は消してしまっても問題ないです。

comfyuiフォルダの中身は以下のようになってます。

├── __init__.py
├── comfy_api.py
├── comfy_ui.py
├── comfyui-hero.png
├── workflow_api.json
└── workflow_api.py

重要なのは comfy_ui.py です。

実行

comfyuiフォルダ内で以下のコマンドを実行すれば、ComfyUIが動いているサーバーが立ち上がります。

modal run comfy_ui.py

これで実行自体はできますが、今後のためにコードの理解と書き換えをしておくと良いです。

サンプルコード解説

 comfy_ui.py はシンプルなコードではありますが、Pythonに慣れてない人にとっては少しわかりにくいかもしれません。
最後に私がカスタマイズしたPythonファイルを貼るので、解説が不要な人はそこまで飛ばして、コピペしてください。

CHECKPOINTS

CHECKPOINTS = [
    "https://huggingface.co/stabilityai/stable-diffusion-2-inpainting/resolve/main/512-inpainting-ema.ckpt"
]

画像生成AIのモデルの場所をここに追加します。
リダイレクトするURLではなく、直接モデルが置いてある場所のリンクを書いてください。
Animagin XLならhttps://huggingface.co/cagliostrolab/animagine-xl-3.0/tree/mainの animagine-xl-3.0.safetensors のダウンロードボタンのリンク。
CivitAIのダウンロードリンクはリダイレクトリンクなので注意。

PLUGINS

PLUGINS = [
    {
        "url": "https://github.com/coreyryanhanson/ComfyQR",
        "requirements": "requirements.txt",
    }
]

ComfyUIのプラグインはここで追加できます。
urlのみで良いプラグインは url だけ書けば大丈夫です。
requirements.txtが必要なプラグインは、 requirements まで書いてください(リポジトリのREADMEに書いているはず)
私は、ComfyUI ManagerとComfyUI ComfyUI's ControlNet Auxiliary Preprocessorsを使っているので、以下のようになってます。

PLUGINS = [
    {
        "url": " https://github.com/Fannovel16/comfyui_controlnet_aux",
        "requirements": "requirements.txt",
    },
    {
        "url": "https://github.com/ltdrdata/ComfyUI-Manager",
    },
]

stub.function

@stub.function(
    gpu="any",
    # Allows 100 concurrent requests per container.
    allow_concurrent_inputs=100,
    # Restrict to 1 container because we want to our ComfyUI session state
    # to be on a single container.
    concurrency_limit=1,
    keep_warm=1,
    timeout=1800,
)

ここは、お金に関わるのでとても重要です。
gpu="any"とあるので、どのGPUが選ばれるかわかりません。私が最初に使った時はA10Gが選ばれてました。
余裕のある方は、ここを"H100"や"A100"と指定しても良いかもしれませんが、文字通りお金が溶けていきます。
とりあえず試したい場合は、一番安価な”T4"にしておくと良いでしょう。

image

image = (
    modal.Image.debian_slim(python_version="3.11")
    .apt_install("git")
    # Here we place the latest ComfyUI repository code into /root.
    # Because /root is almost empty, but not entirely empty
    # as it contains this comfy_ui.py script, `git clone` won't work.
    # As a workaround we `init` inside the non-empty directory, then `checkout`.
    .run_commands(
        "cd /root && git init .",
        "cd /root && git remote add --fetch origin https://github.com/comfyanonymous/ComfyUI",
        f"cd /root && git checkout {comfyui_commit_sha}",
        "cd /root && pip install xformers!=0.0.18 -r requirements.txt --extra-index-url https://download.pytorch.org/whl/cu121",
        "cd /root && git clone https://github.com/pydn/ComfyUI-to-Python-Extension.git",
        "cd /root/ComfyUI-to-Python-Extension && pip install -r requirements.txt",
    )
    .pip_install(
        "httpx",
        "requests",
        "tqdm",
    )
    .run_function(download_checkpoints)
    .run_function(download_plugins)
)

書き換えることは多くないですが、ここも重要です。
Modalではコンテナという技術を使っており、雑に説明するとModal上で動かす自分のPC環境をimageという形で構築しています。

  • apt_install:必要なソフトウェアをインストール

  • run_commands:環境構築時に実行してほしいコマンド

  • pip_install:必要なPythonライブラリのインストール

  • run_function:環境構築時に実行してほしい関数(comfy_ui内に定義している関数)

私がComfyUIを使うにあたって、comfyui_controlnet_auxがうまく使えないという問題があったので、ここを書き換えました。

ControlNet Auxiliary Preprocessorsのエラー

comfyui_controlnet_auxのプラグインの導入をしたはずが、CustomNodeに表示されないという問題がありました。
ログを見てみると、次のようにありました。

ImportError: libGL.so.1: cannot open shared object file: No such file or directory

これは、OpenCVを使うときによく出てくるエラーらしいです。
解決策を調べるとlibgl1-mesa-devをインストールしろと出てきます。
そのため、imageを作る際の apt-installのコードを次のように書き換えます。

.apt_install("git", "libgl1-mesa-dev", "libglib2.0-0")

libglib2.0-0という別のものも追加されてますが、これはlibGL.so.1の後に似たエラーが出たので、それを解決するために入れたものです。
これで、comfyui_controlnet_auxが使えるようになるはずです。

実際に使っているコード

私が画像生成のために実際に使っているコードです。使っているとはいえまだ初めて1ヶ月も経っていないので、今後変わる可能性はあります。

プラグインとして、以下二つ。
comfyui_controlnet_aux
ComfyUI-Manager
Contolnetのモデルも4つ入るようにしています。

もし不明な点等あれば、コメントなりいただけると幸いです。


この記事が気に入ったらサポートをしてみませんか?