見出し画像

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が正常に使用可能になる

いいなと思ったら応援しよう!