見出し画像

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

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