🌟

ComfyUIをぱっと使えるcontainer作ってみた。

2024/11/24に公開

はじめに

対象読者

container内から外部GPUを使いたい人
comfyUIを外部サーバーに置きたい人。
18禁等の規制のない生成AIを自分用にカスタマイズしたい人
とりあえずcomfyUIを使ってみたい人(Stability Matrixのほうが汎用的だが機能多すぎ)

必要知識

  • Git, Docker, WSL, Pythonの基礎知識

環境

  • WIN11、WSL(Ubuntu24.04)
  • python : 3.13.0t
  • docker : version 27.3.1, build ce12230

なぜコンテナ?

  • お試しにAIを色々使うための勉強がてら
  • バージョン管理の煩雑さから解放されるため
  • リモートサーバーにパパッとデプロイしたいから

自作コンテナの概要

https://github.com/nanyanen87/MyComfyUI
nvidia-dirverが入ってるGPUサーバーであればこのまま使用できます。
WSL使わなくても、gamingPCならだいたい大丈夫だと思います。
そのまま使ってみたい方は使ってみようだけ見れば大丈夫です。

project/
├── Dockerfile
├── compose.yml
├── ComfyUI/            # ComfyUI本体
├── ComfyUI-Manager/    # ComfyUI-Manger本体
├── models              
|   └── download.py     # ダウンロードスクリプト
│   └── input.json      # 入れたいmodelリスト
└── README.md           # ドキュメント

GPUコンテナ作成手順

先達者がめちゃくちゃ丁寧にまとめてくれていたので感謝->先達の記事
コピペで起動してから中身覚えていけばいいです。
どうせ環境はいつか壊れるんでそのときに嫌でも調べることになります。

  1. WSL Install
    wsl --install

  2. Ubuntu Install
    wsl --install -d Ubuntu-24.04

  3. NVIDIA Container Toolkit Install
    これから先何百回も打つコマンドnvidia-smiのためのモジュール nvidia-container-toolkitをubuntuにinstall。公式手順に従う

    curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \ && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
    
    sudo apt update \
    sudo apt-get install -y nvidia-container-toolkit
    
  4. Docker Install
    WSL内でDockerをインストール、公式手順に従う。
    windows側でdockerDeskTopを使用している方は競合に注意。
    自分はdesktop入れてないので問題が起きませんでした。

    # Add Docker's official GPG key:
    sudo apt-get update
    sudo apt-get install ca-certificates curl
    sudo install -m 0755 -d /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    sudo chmod a+r /etc/apt/keyrings/docker.asc
    
    # Add the repository to Apt sources:
    echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
      $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
      sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    sudo apt-get update
    
  5. Docker Rootless
    これは確かに必要でした、リモートに置いたときにsshでuser権限で起動できるようになります。 非ルートユーザーでDockerを動かせるように設定、公式手順に従います。

    # システム権限で動作するdockerサービスを無効にする
    sudo systemctl disable --now docker.service docker.socket
    sudo rm /var/run/docker.sock
    # 必要なパッケージinstall
    sudo apt install -y uidmap
    # sudo はつけない
    dockerd-rootless-setuptool.sh install
    

    installを実行すると最後に

    [INFO] Make sure the following environment variable(s) are set (or add them to ~/.bashrc):
    export PATH=/usr/bin:$PATH
    [INFO] Some applications may require the following environment variable too:
    export DOCKER_HOST=unix:///run/user/1000//docker.sock
    

    上記のように出るので.bashrcにつけときます。エラーじゃないので既についてても出ます。

    # docker
    export PATH="/usr/bin:$PATH"
    export DOCKER_HOST="unix:///run/user/1000//docker.sock"
    
  6. NVIDIA-CTK Config
    NVIDIA Container Toolkitの設定を実施。こちらの続きからrootlessでdockerを起動する設定をします。

    nvidia-ctk runtime configure --runtime=docker --config=$HOME/.config/docker/daemon.json
    sudo systemctl restart docker
    sudo nvidia-ctk config --set nvidia-container-cli.no-cgroups --in-place
    
  7. Container内でのGPU認識を確認
    なんでもいいのでdocker contaierを起動し、内部でnvidia-smiを使用し、GPUを認識しているか確認します。

    docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi
    

    containerがGPUを認識していれば下記の画像のような表示が出ます。
    スクリーンショット 2024-11-21 015428.png
    この上部に表示されるDriver Versionはinstallされているnvidiaのdriverのversionなんですが、右上のCUDA Versionはinstsallされているものではなく、互換性のあるVersionが表示されているので注意です。依存関係の詳しいことは丁寧にまとめて下っさている方がいましたので貼っておきます。依存関係の記事


ComfyUIコンテナ作成

完成形

services:
  comfyui:
    image: nvcr.io/nvidia/pytorch:24.10-py3
    volumes:
      - ./ComfyUI:/ComfyUI
      - ./ComfyUI-Manager:/ComfyUI/custom_nodes/ComfyUI-Manager
    runtime: nvidia
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
      - NVIDIA_DRIVER_CAPABILITIES=all
    command:
      - /bin/bash
      - -c
      - |
        cd /ComfyUI/
        pip3 install -r requirements.txt
        pip3 install -r custom_nodes/ComfyUI-Manager/requirements.txt
        python3 main.py --listen
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: ["gpu"]
    #command: ["sleep", "infinity"] # debug用コンテナが終了しないようにする
    ports:
      # host:container
      - "8188:8188"
    networks:
      my-network:
        aliases:
          - comfyui  # コンテナのホスト名
networks:
  my-network:

解説ポイント

  • Image

    • NVIDIA公式コンテナを利用しています。使用したいCPUアーキテクチャがarm64の場合、nvcr.io/nvidia/pytorch:24.10-py3-igpuを使用することでコンテナサイズを半分にすることが可能なはず。
      参照:NVIDIA PyTorchコンテナ
      <n>
  • ComfyUIの拡張機能

    • ComfyUI-Managerをあらかじめインストールし、コンテナ内にマウントしています。
    • 互換性を担保するため、バージョンアップは慎重に行いましょう。
      <n>
  • container debug

    • pythonがエラーで止まるようになったときは command: ["sleep", "infinity"] でcontainerをつけっぱなしにして
    $ docker exec -it <container_name> bash
    

    で入っていろいろ見てみましょう。


使ってみよう

  1. (何らかの手段でdockerをダウンロード、WSL使用しないならdockerDeskTopがいいと思います。)
  2. git clone --recursive https://github.com/nanyanen87/MyComfyUI.git
  3. cd MyComfyUI
  4. docker compose up (自分で作った人はもちろんここだけで)
    暫く待つと

    スクリーンショット 2024-11-22 220640.png

この画面が出たら http://localhost:8188 へアクセス
(1度目は数分待つ必要がありますが2回目からは10数秒で立ち上がります。)

スクリーンショット 2024-11-22 220738.png

ここからはComfyUI自体の使い方なので簡単に

  • 上のworkflowからデフォルトのwalkflow insatll
  • 一番左のnodeにv1-5-pruned-emaonly.safetensorsがsetされていることを確認(undefinedになっていたらmodelのdownloadに失敗しているので自分でダウンロードしてください)
  • queue!
    ComfyUI_00002_.png

できた!

トラブルシューティング

containerなので1度起動したら大丈夫!いつでも安心!
なはずが使っていて1週間ぐらいでうごかなくなったのでそこからの奮闘のためのヒントを残しておきます。

GPUを認識しない

  • とにかくnvidia-smiが通らないとお話にならないです。
    WSL上でも一応確認しておきましょう。そしてcontainerを何かしらのimageで起動して確認。
    docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi
    

Torchが認識されない

  • これはnvidiaの最新のcontainerを使ったことによりもう起こらないと思いますが、当初はcontainerの起動時に
    apt updatea
    apt install -y git python3-pip libgl1-mesa-dev libglib2.0-0
    pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
    
    と必要なmoduleをinstallしていました。
    これをuserでinstallしたのかdockerがroot実行されるので適切なpythonのpathが通っていなかったのかなぁと思います。
    rootでpip3 installすると警告が出るのでそれでおそらくビビりました。
  • nvidiaのimageの中に必要moduleが全てはいっているっぽいです。commandはcomfyUI関連のmodule初期化だけでいけました。

node_extra関連のエラー

WARNING: some comfy_extras/ nodes did not import correctly. This may be because they are missing some dependencies.
comfyui-1  |
comfyui-1  | IMPORT FAILED: nodes_canny.py
comfyui-1  | IMPORT FAILED: nodes_morphology.py

みたいに警告してきますがカスタムノードがimportできなよってだけので無視で大丈夫です。

  • 気になる方はComfyUI-Managerのバージョンを揃えるか、extra_nodes/ディレクトリ内の対象コードを一時的にコメントアウトしましょう。

表示されてるURLに繋がらない。

  • 理屈を知ってる方には鼻◯そみたいな問題ですが、computer scienceを学んでいない者にとっては大きな罠です。
    comfyUIくんはhttp://0.0.0.0:8188をおすすめしてきますがそいつをブラウザに打っても繋がりません。http://localhost:8188につなげましょう。繋がらない理由はGPTに聞きましょう。
    私はWSLのせいだと思い込みこの記事を見て強引にhttp://0.0.0.0:8188につなげてブラウザから見てました。

あってないような追加機能

モデルのダウンロードスクリプト

自分が使用するモデルを一気にダウンロードできるスクリプトを用意しています。
以下の手順で使用可能です:

  1. モデルリストの作成

    • models/input.json にこのようにダウンロード対象モデルを記載。
     [
       {
         "repo_id": "PvDeep/Add-Detail-XL",
         "file_name": "add-detail-xl.safetensors",
         "download_url": "https://huggingface.co/PvDeep/Add-Detail-XL/resolve/main/add-detail-xl.safetensors",
         "model_type": "loras"
       },
       {
         "repo_id": "zdouble/model",
         "file_name": "animagineXLV31_v31.safetensors",
         "download_url": "https://huggingface.co/zdouble/model/resolve/main/animagineXLV31_v31.safetensors",
         "model_type": "checkpoints"
       },
       {
         "repo_id": "lllyasviel/sd_control_collection",
         "file_name": "diffusers_xl_depth_full.safetensors",
         "download_url": "https://huggingface.co/lllyasviel/sd_control_collection/resolve/05cb13f62356f78d7c3a4ef10e460c5cda6bef8b/diffusers_xl_depth_full.safetensors",
         "model_type": "controlnet"
       },
       {
         "repo_id": "stabilityai/sdxl-vae",
         "file_name": "sdxl_vae.safetensors",
         "download_url": "https://huggingface.co/stabilityai/sdxl-vae/resolve/main/sdxl_vae.safetensors",
         "model_type": "vae"
       }
     ]
    
  2. スクリプトの実行
    以下のコマンドでモデルをダウンロード:

    python3 models/download.py
    
  3. 注意
    当初は pythonのhuggingface_hubモジュールを利用して作っていましたが、ファイルが適切にダウンロードできないものがあったりcacheシステムが独特だったので使うのをやめました。
    curlが一番

参考記事

Discussion