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

Fixed Florence-2 for newest ComfyUI

    A1111系WebUIとは比較にならん程、どんどこどんどこ色んなもん腹ん中にぶち込んでる分、ComfyUIのトラブル発生率もまた、A1111系WebUIとは比較にならんです。

    何かもうトラブル対処が日常化してます。

    いやそりゃあ勉強にはなりますがよ、別にコードの勉強が本来の目的じゃねえんで、画像生成や動画生成が本来の目的なんですよ。

    だけどよう、起きるモンは対処するしかしゃあねえよなあ?

    …つー訳で、またまたFlorence-2です。

    ComfyUI/custom_nodes/comfyui-florence2/modeling_florence2.py

    ## Florence2モデルのキャッシュ処理エラー修正まとめ

    ### 問題の概要

    Florence2モデルで`KeyError: 'Cache only has 0 layers, attempted to access layer with index 0'`エラーが発生し、モデルが正常に動作しない問題が発生しました。

    ### 原因

    ComfyUI本体の更新(特にComfyAPI Core v0.0.2とメモリ最適化の更新)により、キャッシュ処理の方法が変更され、空の`past_key_values`に対する処理が厳密になったことが原因でした。

    ### 修正箇所

    #### 1. **Florence2LanguageForConditionalGeneration.prepare_inputs_for_generation** (2198行目付近)

    # 修正前
    if past_key_values is not None:
    
    # 修正後
    if (past_key_values is not None and len(past_key_values) > 0 and len(past_key_values[0]) > 0):

    # 修正後

    if (past_key_values is not None and len(past_key_values) > 0 and len(past_key_values[0]) > 0):

    #### 2. **Florence2ForConditionalGeneration.prepare_inputs_for_generation** (2824行目付近)

    # 修正前

    # 修正前
    past_key_values_length = past_key_values[0][0].shape[2] if past_key_values is not None else 0
    
    # 修正後
    past_key_values_length = past_key_values[0][0].shape[2] if (past_key_values is not None and len(past_key_values) > 0 and len(past_key_values[0]) > 0) else 0

    # 修正後

    if (past_key_values is not None and len(past_key_values) > 0 and len(past_key_values[0]) > 0):

    #### 3. **Florence2LanguageModel.forward** (1794行目付近)

    # 修正前

    past_key_values_length = past_key_values[0][0].shape[2] if past_key_values is not None else 0

    # 修正後

    past_key_values_length = past_key_values[0][0].shape[2] if (past_key_values is not None and len(past_key_values) > 0 and len(past_key_values[0]) > 0) else 0

    #### 4. **Florence2LanguageModel.forward** (1876行目付近)

    # 修正前

    past_key_value = past_key_values[idx] if past_key_values is not None else None

    # 修正後

    past_key_value = past_key_values[idx] if (past_key_values is not None and len(past_key_values) > idx) else None

    ### 修正内容の説明

    #### 問題の詳細

    - `past_key_values`が空のリスト`[]`の場合でも、`past_key_values is not None`は`True`を返す

    - そのため、実際にキャッシュにアクセスしようとしてエラーが発生していた

    #### 修正の効果

    - **空のキャッシュの安全な処理**: `past_key_values`が空の場合、キャッシュアクセスをスキップ

    - **エラーの防止**: `KeyError: 'Cache only has 0 layers, attempted to access layer with index 0'`エラーの解消

    - **正常な動作**: Florence2モデルが正常に動作するようになる

    ### 技術的な詳細

    #### 修正前の問題のあるコード

    # 不十分なチェック - 空のリストでもTrueになってしまう
    if past_key_values is not None:
        past_key_values_length = past_key_values[0][0].shape[2]

    #### 修正後の安全なコード

    # 厳密なチェック - 空のリストの場合はFalseになる
    if (past_key_values is not None and len(past_key_values) > 0 and len(past_key_values[0]) > 0):
        past_key_values_length = past_key_values[0][0].shape[2]

    ### 影響範囲

    - **Florence2モデルの生成処理**: 正常に動作するようになる

    - **Flash Attention 2.0**: 引き続き使用可能

    - **既存のワークフロー**: 変更なしで動作する

    この修正により、Florence2モデルは今後も安定して動作し、Flash Attention 2.0も正常に使用できるようになりました。

     
     

    GJL

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

    あなたへのおすすめ