メインコンテンツへスキップ
見出し画像

Fixed Impact Pack for new API of ComfyUI

    何やら、恒例行事と化しつつあるトラブルです。

    ComfyUI GITSScheduler エラー修正の解説

    エラー概要

    エラーメッセージ:

    AttributeError: 'GITSScheduler' object has no attribute 'get_sigmas'

    発生場所:

    • ノード: `FaceDetailer` (comfyui-impact-pack)

    • 使用スケジューラー: `GITSScheduler`

    修正ファイル:

    D:\USERFILES\ComfyUI\ComfyUI\custom_nodes\comfyui-impact-pack\modules\impact\special_samplers.py

    修正行: 667-671行目


    エラーの理由

    根本的な原因: APIの変更

    ComfyUIは新しいバージョンでノードAPIの実装方法を大幅に変更しました。

    旧API(従来の方式):

    class SomeScheduler:
        def get_sigmas(self, coeff, steps, denoise):
            # 直接sigmasを返す
            return [sigmas_tensor]

    新API(現在の方式):

    class GITSScheduler(io.ComfyNode):
        @classmethod
        def execute(cls, coeff, steps, denoise):
            # NodeOutputオブジェクトでラップして返す
            return io.NodeOutput(torch.FloatTensor(sigmas))

    Impact Packの問題

    Impact Pack(FaceDetailerノード)のコードは古いAPIを前提として書かれていたため、以下のコードが動作しませんでした。

    エラー箇所(修正前):

    # special_samplers.py 667行目
    scheduler = nodes.NODE_CLASS_MAPPINGS['GITSScheduler']()
    return scheduler.get_sigmas(coeff, steps, denoise)[0]
    # ❌ GITSSchedulerにget_sigmasメソッドは存在しない

    修正したコードの詳細解説

    修正ファイル:

    D:\USERFILES\ComfyUI\ComfyUI\custom_nodes\comfyui-impact-pack\modules\impact\special_samplers.py

    修正箇所: 660-673行目

    修正後のコード:

    @staticmethod
    def doit(coeff, denoise):
        def f(model, sampler, steps):
            if 'GITSScheduler' not in nodes.NODE_CLASS_MAPPINGS:
                raise Exception("[Impact Pack] ComfyUI is an outdated version. Cannot use GITSScheduler.")
    
            scheduler = nodes.NODE_CLASS_MAPPINGS['GITSScheduler']()
            result = scheduler.execute(coeff, steps, denoise)
            # Handle NodeOutput object from new API
            if hasattr(result, 'args'):
                return result.args[0]
            return result[0]
    
        return (f, )

    コードの各部分の説明

    1. メソッド呼び出しの変更(667-668行目)

    # 修正前
    return scheduler.get_sigmas(coeff, steps, denoise)[0]
    
    # 修正後
    result = scheduler.execute(coeff, steps, denoise)
    • `get_sigmas` → `execute` に変更

    • GITSSchedulerの実際のメソッドを呼び出す

    2. NodeOutput対応(669-671行目)

    if hasattr(result, 'args'):
        return result.args[0]
    return result[0]

    この処理が必要な理由:

    新APIの`execute`メソッドは`NodeOutput`オブジェクトを返します。

    GITSSchedulerのexecuteメソッド内部:

    return io.NodeOutput(torch.FloatTensor(sigmas))

    NodeOutputの構造:

    class NodeOutput:
        def __init__(self, *args):
            self.args = args  # ← ここにsigmasが格納される

    処理の流れ:

    1. `hasattr(result, 'args')`: NodeOutputオブジェクトか確認

      • 新API → `True` → `result.args[0]`でsigmasを取得

      • 旧API(互換性) → `False` → `result[0]`でアクセス

    2. `result.args[0]`: NodeOutputから実際のテンソルを抽出

    NodeOutput(torch.FloatTensor(sigmas))
      └─ args = (torch.FloatTensor(sigmas),)
         └─ args[0] = torch.FloatTensor(sigmas) ← これが欲しい値

    エラー発生から修正までの流れ

    エラー発生時

    FaceDetailer実行
      ↓
    Impact Pack内部でGITSSchedulerを使用
      ↓
    scheduler.get_sigmas() を呼び出し
      ↓
    ❌ AttributeError: 'GITSScheduler' object has no attribute 'get_sigmas'

    修正後

    FaceDetailer実行
      ↓
    Impact Pack内部でGITSSchedulerを使用
      ↓
    scheduler.execute() を呼び出し
      ↓
    NodeOutput(sigmas) を取得
      ↓
    result.args[0] でsigmasを抽出
      ↓
    ✅ 正常に動作

    なぜこのようなエラーが起きたか

    互換性の問題

    1. ComfyUI本体: 新API(`io.ComfyNode`、`execute`メソッド)に移行

    2. Impact Pack: 古いAPI(`get_sigmas`メソッド)を想定したまま

    3. 結果: メソッドが見つからずエラー

    他のスケジューラーでは問題なかった理由

    従来のスケジューラー(karras、exponentialなど)は古いAPI形式のままなので、Impact Packと互換性がありました。

    GITSSchedulerは新APIで実装されたため、この問題が顕在化しました。


    今後の注意点

    1. ComfyUIを再起動してください(Pythonモジュールの変更を反映させるため)

    2. 他のカスタムノードでも同様の問題が発生する可能性があります

    3. Impact Packの公式アップデートで正式に対応される可能性がありますが、それまではこの修正で動作します

    修正の互換性

    この修正は後方互換性を保っているため、他のスケジューラーにも影響しません。

    # 新API(GITSScheduler)
    if hasattr(result, 'args'):  # ← True
        return result.args[0]
    
    # 旧API(その他のスケジューラー)
    return result[0]  # ← こちらが実行される

    まとめ

    修正ファイル:

    D:\USERFILES\ComfyUI\ComfyUI\custom_nodes\comfyui-impact-pack\modules\impact\special_samplers.py

    問題: Impact PackがGITSSchedulerの古いメソッド(`get_sigmas`)を呼び出していた

    解決: 新しいメソッド(`execute`)を呼び出し、NodeOutputから値を抽出するように修正

    結果: FaceDetailerでGITSSchedulerが正常に使用可能になる

     
     

    GJL

     
     
    Road bike&Cycling Road Race, Respecting Mr.Greg LeMond, & Anti Doping, Football, Rock&Pops, History.

    あなたへのおすすめ