見出し画像

Archive of fixing Florence2-models to transformers 4.50

2025年7月7日現在、ノード最新版を使用する事により以下の問題は発生しなくなっていますが、Archiveとして保存しておきます。

さて、Florence2はollamaよりも軽量で、かつ高速に動作する小型LLMとして、今や画像生成でも動画生成でも必須インフラと言っても良い位ですが、最近以下のような警告が出ます。

Florence2LanguageForConditionalGeneration has generative capabilities, as `prepare_inputs_for_generation` is explicitly overwritten. However, it doesn't directly inherit from `GenerationMixin`. From 👉v4.50👈 onwards, `PreTrainedModel` will NOT inherit from `GenerationMixin`, and this model will lose the ability to call `generate` and other related functions.
  - If you're using `trust_remote_code=True`, you can get rid of this warning by loading the model with an auto class. See https://huggingface.co/docs/transformers/en/model_doc/auto#auto-classes
  - If you are the owner of the model architecture code, please modify your model class such that it inherits from `GenerationMixin` (after `PreTrainedModel`, otherwise you'll get an exception).
  - If you are not the owner of the model architecture class, please contact the model code owner to update it.

もう見たまんま、現行のフォーマットのままではtransformersの4.5以降でFlorence2の使用が出来なくなる…類の警告です。

以前、Pytorch2.6.0以降でモデルダウンロードに関するセキュリティ周りが変更されますよ…的な警告は2.5.1の時代で既に出ていた…事があって、実際に2.6.0が公開されたら本当にAdetailerやReactorでは支障が出て、私が以下記事で結構力ずくな対策を公開していますが、

この警告に関して、Corsor先生は以下のように回答してくるので、Adetailerの時のように実際支障が出てから対策するのもアレなので、今回は警告の時点で内容も分かっている訳ですから、対策しておくことにしました。

問 もし、この対応をしないまま4.50になったらどうなっていた

transformers 4.50以降で対応しないままだと、以下のような問題が発生していたはずです:
警告が発生するだけでなく、実際にgenerateメソッドが使えなくなります:
これはPreTrainedModelからGenerationMixinの継承が削除されるため、以下の機能が失われます。

つまりFlorence2機能がエラーを起こして使えなくなっていたか

はい、その通りです。
4.50以降で対応しないと:
generate()メソッドが使えなくなり、エラーが発生
画像からのキャプション生成など、Florence2の主要な機能が動作しなくなる
ComfyUIのノードが正常に動作しなくなる
つまり、今回の修正(GenerationMixinの継承を追加)は、モデルの機能を維持するために必須の対応だったと言えます。単なる警告対策ではなく、実際の機能停止を防ぐための重要な修正でした。

修正すべきファイルは、ダウンロードしたモデルフォルダ(models\LLM)内にあるmodeling_florence2.pyです。

Cursor先生曰

modeling_florence2.pyの中で、Florence2LanguageForConditionalGenerationクラスの定義を修正する必要があります。
現在のコード(約2062行目):

class Florence2LanguageForConditionalGeneration(Florence2LanguagePreTrainedModel):
    base_model_prefix = "model"
    _tied_weights_keys = ["encoder.embed_tokens.weight", "decoder.embed_tokens.weight", "lm_head.weight"]
    _keys_to_ignore_on_load_missing = ["final_logits_bias"]

以下のように修正します:

from transformers.generation.utils import GenerationMixin

class Florence2LanguageForConditionalGeneration(Florence2LanguagePreTrainedModel, GenerationMixin):
    base_model_prefix = "model"
    _tied_weights_keys = ["encoder.embed_tokens.weight", "decoder.embed_tokens.weight", "lm_head.weight"]
    _keys_to_ignore_on_load_missing = ["final_logits_bias"]

問 transformersの4.5に対応できるか

はい、このコードはTransformers 4.50以降に対応できます。その理由は:
Florence2LanguageForConditionalGenerationクラスがGenerationMixinを直接継承しているため
警告メッセージで推奨されている修正方法(GenerationMixinを直接継承)に従っているため
prepare_inputs_for_generationメソッドも正しく実装されているため

具体的には、以下の部分が4.50以降の仕様に合致しています:

class Florence2LanguageForConditionalGeneration(Florence2LanguagePreTrainedModel, GenerationMixin):
    base_model_prefix = "model"
    _tied_weights_keys = ["encoder.embed_tokens.weight", "decoder.embed_tokens.weight", "lm_head.weight"]

このコードは、Transformers 4.50でPreTrainedModelからGenerationMixinの継承が削除された後も、生成機能(generateメソッドなど)を正しく使用できます。

かなり長いコードですが、下図の場合は2062行目あたりでした。

実際にtransformersの4.5が公開された時、無事に動作するかは、またその時次第ですが、とりあえず警告は消えました。

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