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も正常に使用できるようになりました。
