カラクリスタ

個人ブログ。人です

Arion + Nix な環境で ComfyUI を立ち上げられるようにした

と言う話。細かいところは下記を見てくれ:

使い方

上記リポジトリをgit cloneした上で、

$ nix develop
$ arion up

するだけでComfyUIを立ち上げられます。

なお自分の環境に合わせている都合上、データディレクトリはgit cloneしたディレクトリの親にComfyUI.Dataというディレクトリが掘られるので、そこは各自の環境で調整してください。

また上記サンプルリポジトリではROCm環境が前提となっていて、cudaでは動作しない感じにはなっていますが、cuda用にservices.comfyui.service.devicesを調整すれば動くと思います。

これは何?

ComfyUIArionで扱えるようにしたサンプルリポジトリ。

ArionはNix wayでdockerとかpodmanのcomposeを扱えるようにしたコマンドなんだけど、これを使ってComfyUIを立ち上げられるようにしました。

作った理由としては:

  • PyPIへのセキュリティ対策。悪意あるパッケージが混入しても悪さをしにくくする
  • ComfyUI環境の静的化。今までやっつけで venv を使っていた点からの脱却
  • ComfyUI環境の整理。あまりまともに管理できてなかったので、それのやり直し

といったところ。

みどころ

ComfyUIをNixから扱っている

まず最初の見どころはComfyUIをNixから扱えるようにした、というところでしょう。

今のところComfyUIはnixpkgsの方に入っておらず、またパッケージングもややこしい感じでNix化は難しいかな?と感じていたのですが、やってみたらなんとなりました。

なお実際のコードはこちらからアクセス可能:

ただ、上記リンク先のコードは色々注意点があって、

  • --base-directory 引数が必須。これがないと正常に起動しない
    • ComfyUIは --base-directory を指定されてない時に自身と同じディレクトリを見にいく
      • これは main.py と同じディレクトリを作業ディレクトリとして使う挙動に由来する
    • 上記の挙動は /nix/store がread-onlyなnixpkgsでは動作しない
    • よって --base-directory 引数を指定して状態ファイルを外へ出す必要がある
  • カスタムノードを使う場合、追加の依存は additionalDependencies へ記述する必要がある
    • nixpkgsで扱うソフトウェアは依存関係が静的に定まる構造を持っている
    • 上記の構造からComfyUIで使う依存も静的に定めることが必須
      • この場合、ComfyUIのcustom nodeが使う依存もComfyUIの依存として追加する

と言う辺りへ手当てする必要がある。

なんでパッケージングとしてはあまり綺麗ではないのだけど、とりあえずこれで動いたよ、という証明にはなっていると思う。

ArionでComfyUIを動かしている

これって見どころか?と聞かれると微妙な気もするけど、一応一つの見どころではある。

ここのところ、私はpodman-composeを使う場面ではArionを使っているのだけど、これが非常に便利で、それはcompose.yml というなんだか良く分からないYAMLを書かなくてもいい、と言う点。

compose.yaml を書く場合、複雑になってくるとインデントが深くなってきたり、あるいは同じような記述を繰り返す破目になると感じているのだけど、Nixはここの辺りを関数や浅いマージで解決できるので、そこで書くのが非常に楽。

次に便利なのがNixOSやnixpkgsのホストの /nix/store が扱える点で、これによりシステムの/nix/storeを使いつつ、nixos-container を使うような感覚でpodmanのコンテナを扱えるので、その点もいい感じだと思う。

ただNix書くのは流石にツラくね?と感じる向きがあるのは分かるんだけど(特にNixを書き始めた初期の頃だと分け分からんのは分かる)、私の場合、常日頃からNixを書き続けているので、そこへのコストは存在しない。

むしろArionのおかげでNixを使うと宣言的にパッケージ構成が書けて楽が出来るのに!という場面でNixが扱えるようになったので、そこは非常に楽です。私だけなのかもしれないけど。

nix develop だけで実行環境を整えられる

これはnix flakeを使っている環境全般に言える話だと思う。

普通のOSの場合、アプリケーションが依存するパッケージはシステムかユーザー毎に共有で、開発ディレクトリ毎に分ける、みたいなのが出来ないと思うんだけど、Nixではそういった事が可能なので、システムを汚さずに開発用パッケージを追加したり削ったり、が出来る。

私はこの点からNixOSなしではもう生活が出来ない、という感じなんだけど、他の方だとどうなんだろうね?

以上

とりあえず話としては以上。

まぁArion + NixでComfyUIを扱えるようにしたからと言って、これからそれを良く使うか?と聞かれたら微妙なんですが、例えばOpen WebUIでリモートのLLMに繋いで、ローカルのComfyUIで画像生成させる、とかも出来るので、そこは使い方次第かな、と思ってます。