暫定版 Advanced tips of "ComfyUI-MultiGPU" node &α
本記事は、専用VRAM12GBクラスのGPUと、RAM64GB以上のシステム環境を前提に記述しています。
Funyuan Video(SkyReels、WAN2.1も同様)
Funyuan Videoに関しては…Forgeでlllyasviel氏が導入した「Shared Swap」アイデアと同様のアプローチと思われる、「Distorch」と称するらしい"Virtual VRAM"技術により、大幅なVRAM消費削減を実現できる"ComfyUI-MultiGPU"ですが、
(但し、VRAM使用状況のモニターを見る限り、メモリ管理のロジックは完全に同じではない。)

その後、頑張ってFlux1方面に活かそうと試行錯誤していましたが…ぶっちゃけると現状、Funyuan Videoほどの効果は出ません。
(但し、ある程度の高速化は可能で、それは後述する)
MultiGPUノードに関しては、下記shiba*2さんの記事で、詳細に解説されていますので、そちらを参照して導入してください。
…話を戻すと、
その理由ははっきりしていて、Funyuan Videoで大幅な性能向上を実現できる理由は、この「Distorch」テクノロジーをベースモデルに対して適用できる点にあります。
例えば、下図はFunyuan Videoにおけるほぼフルスペック、BF16-GGUF(約25GB)で動画生成をしている場面ですが、

下図のように、Distorchテクノロジーの適用により、何とこの状態で専用VRAMの使用量は12GBを下回り、MultiGPUノードなしでは絶対に不可能な速度で生成が出来ています。


ちなみに生成速度は、120フレームに対して900秒未満…これはMultiGPU適用前に比較して約6倍の速度です。更にこれは25GBのBF16モデルを使用しての結果ですから、仮にMultiGPUなしで同じことをやったら、速度差は6倍処ではない筈です。
...
Fixing Flux1
しかし、現時点においてFlux1.dev.fp16に対してこのDistorchを適用できるノードが開発されていないのです。
この辺りは今後開発される可能性があるのか不明ですが、少なくとも現時点においては存在しません。
現時点、Flux.devに対して適用できる下図のノードは、CUDAとCPUの切り替えは出来ますが、Distorchテクノロジーに対応していません。当然ながらCPUに切り替えると劇遅になります。寧ろ、何もしない方がマシです。

…と、ここまではFlux1における最適化の方法が見つからずに苦戦していたのですが。
2025年3月8日、以下きまま / Easygoingさんの記事を読み、やっとFlux1に対しても、ほぼ最適と思われるMultiGPUのセッティングを得ることが出来ました。
まず、その前に以下記事を参照して、torch.compileの設定は行っておいてください。KJNodesによるtorch.compileノードをmax-autotune(又はmax-autotune-no-cudagraphs) back endで使用する形が現状ベストです。
今日まで、Flux1のモデルファイルに対して何とかDistorch機能を使えないかと意識し過ぎていましたが、下図のようにClipに対してdevice cpuを適用する事により、Flux1は相当高速化する事がわかりました。

私は今日まで、ComfyUIの基幹部分のコード改造で似たようなことをやれないかと模索していたのですが、
(試行錯誤の記録として以下記事も残しておきます)
身も蓋もなく、MultiGPUで同じことが出来る事がわかりました…というか、ああ、このノードはここで役に立つのか、的な。
結果ですが、私がコード改造で得ていた高速化とほぼ同等の速度を得ることが出来ました。2回目以降は圧倒的に高速化します。Multi ControlNet使用で専用VRAM消費は12GBを超えているのですが、その上で尚、速いです。

以下記事で公開している私のMulti ControlNet搭載型Flux1ベースプログラムですが、Multi ControlNetを使用する形での比較テストを行いました。
下図が、2月時点の暫定的なWaveSpeed版(cudagraphs backend)です。

上図と比較して一目瞭然ですが、2回目以降の生成は2月当時より3倍以上の高速化になっています。
…
Customized MultiGPU
2025年2月末に新しく登場した動画生成AI「Wan2.1」は、BF16形式のGGUFファイルのサイズが最大30GBに達する為、GGUFベースモデルに対するDistorchの最大サイズ初期設定24GBでは不足してしまいます。
そこで、その最大サイズを変更する方法について以下解説します。
編集するファイルは、ComfyUI\custom_nodes\ComfyUI-MultiGPUフォルダ内にある_init_.pyです。
563行目からと617行目からの2か所の記述を下のように変更してください。以下は36GBに拡大したケースです。
def override_class_with_distorch(cls):
class NodeOverrideDisTorch(cls):
@classmethod
def INPUT_TYPES(s):
inputs = copy.deepcopy(cls.INPUT_TYPES())
devices = get_device_list()
default_device = devices[1] if len(devices) > 1 else devices[0]
inputs["optional"] = inputs.get("optional", {})
inputs["optional"]["device"] = (devices, {"default": default_device})
inputs["optional"]["virtual_vram_gb"] = ("FLOAT", {"default": 4.0, "min": 0.0, "max": 36.0, "step": 0.1})
inputs["optional"]["use_other_vram"] = ("BOOLEAN", {"default": False})
inputs["optional"]["expert_mode_allocations"] = ("STRING", {
"multiline": False,
"default": "",
"tooltip": "Expert use only: Manual VRAM allocation string. Incorrect values can cause crashes. Do not modify unless you fully understand DisTorch memory management."
})
return inputsdef override_class_with_distorch_clip(cls):
class NodeOverrideDisTorch(cls):
@classmethod
def INPUT_TYPES(s):
inputs = copy.deepcopy(cls.INPUT_TYPES())
devices = get_device_list()
default_device = devices[1] if len(devices) > 1 else devices[0]
inputs["optional"] = inputs.get("optional", {})
inputs["optional"]["device"] = (devices, {"default": default_device})
inputs["optional"]["virtual_vram_gb"] = ("FLOAT", {"default": 4.0, "min": 0.0, "max": 36.0, "step": 0.1})
inputs["optional"]["use_other_vram"] = ("BOOLEAN", {"default": False})
inputs["optional"]["expert_mode_allocations"] = ("STRING", {
"multiline": False,
"default": "",
"tooltip": "Expert use only: Manual VRAM allocation string. Incorrect values can cause crashes. Do not modify unless you fully understand DisTorch memory management."
})
return inputs
すると下図のように、distorchはRAMから36GBをVirtual VRAMとして活用します。この場合、RAM搭載量は64GBが最低基準でしょう…但し、RAMを4枚刺しして128GBを搭載した時に、その容量を使えるのかはテストしていないのでわかりません。

