見出し画像

HunyuanVideoモデルとSkyreels_hunyuanモデルのマージしてみた話

すでに挑戦されている方もおられると思いますが、Skyreels_hunyuanモデルと通常のHunyuanVideoモデルのマージについての話です。

当初はこのマージがうまくいっていなかったのですが、現在は問題なくマージ出来るようになっています。
・・・・・がお勧めするかは何とも言えません。

実は2025/2/19時点(前回記事を記載した日)では、Skyreels_hunyuanモデルをロードした際に適切にロードできていなかったという問題があったようです。
以下の部分がそれに該当します。
Fix Hunyuan unet config detection for some models. by maedtb · Pull Request #6877 · comfyanonymous/ComfyUI

以下のような感じでマージすることができます。

これだと上がSkyreels_hunyuan_t2vモデルで、下がLoraのマージで調整したHunyuanVideoモデルです。

この方法で当初、手持ちのモデルとマージしてみようとしたのですが、うまくいかずひどい画像が出力されるだけになりました。

現在は、マージを行わなくても「これまでの生成フロー」でも画像が出力されるようになります。

以下は前回記事の生成に使用したプロンプトです。

A young girl stands poised in the batter’s box, gripping her bat firmly. The golden light of the setting sun casts a warm glow over the field, creating long, dramatic shadows.
The ball gets closer, and her muscles tense in anticipation. She shifts her weight onto her back foot, coiling her body like a spring. Her front shoulder stays tucked in, her elbows perfectly aligned.
she pushes off her back foot, her hips rotating powerfully. Her arms follow through, the bat slicing through the air with a sharp whoosh. The wooden surface meets the ball with a resounding CRACK! A vibration surges through her hands as the impact sends the ball hurtling forward. The bat follows through in a perfect arc as she completes her swing, eyes still locked on the ball’s soaring path. The game has just changed

比較のため、同じシード値で生成してみました。

これは以下のようなオリジナルのモデルの設定です。

Skyreels_hunyuan_t2vモデル 

HunyuanVideoモデル 20ステップ、30ステップ

Skyreels_hunyuan_t2v+HunyuanVideoモデル 20ステップ、30ステップ

ちなみにSkyreels_hunyuan_t2vの出力は前回記事のフローの方が圧倒的に高いため、そちらの使用が良いです。ロードの問題の解決がされ、生成される画像の改善しています。

マージしたモデルを使用すると、最適な設定が混在してしまうため、Skyreels_hunyuan_t2vに既存のLoraをマージして調整する方が良い可能性もありそうです。

<以下、ComfyUIで対応がされる前に検討した内容>

この記事が作成された際は修正されていましたが、せっかくなので記録として残しておきます。

当初はモデル同士のマージがうまくできておらず、その部分について検討しています。
特にHunyuanVideoモデルやSkyreels_hunyuanモデルの層構造についてです。

前回記事で、オリジナルのSkyreels_hunyuan_i2vモデルを自分で統合して作成したモデルはComfyUIで使用できないというコメントをしました。
この部分は変わりない状態です。
この原因としては、統合したモデルにある層ごとの「名前空間」「キー名」というのが、ComfyUI用のものと大きく異なっているからでした。

Kijaiさんのモデルは、「名前空間」「キー名」が少し違うものの、おおむねの構造をオリジナルのhunyuanvideoの構造に統一させたものになっています。

例えば同じ「名前空間」「キー名」の層を見ると以下の感じです。

ComfyUIのオリジナル版
model.model.single_blocks.2.linear1.bias (21504,)
Skyreels_hunyuan_i2vモデル
single_transformer_blocks.2.attn.to_k.bias (3072,)
single_transformer_blocks.2.attn.to_q.bias (3072,)
single_transformer_blocks.2.attn.to_v.bias (3072,)
single_transformer_blocks.2.proj_mlp.bias (12288,)
Kijaiさんのモデル
single_blocks.2.linear1.bias (21504,)

ただ、①ComfyUIのオリジナル版とKijaiさんのモデルは、名前が違うものの数とか同じです。

Skyreels_hunyuan_i2vをComfyUIで使用するためには、この面倒臭い変換を適切にする必要があったようです。
Kijaiさん凄いですね!

さて、ComfyUIのオリジナル版とKijaiさんのモデルをマージすると以下のような警告文がログに出てきました。もし、見たいかたは上の修正が加わる前のバージョンのComfyUIで試してみてください。

WARNING SHAPE MISMATCH diffusion_model.img_in.proj.weight WEIGHT NOT MERGED torch.Size([3072, 16, 1, 2, 2]) != torch.Size([3072, 32, 1, 2, 2])

このエラーだと、diffusion_model.img_in.proj.weightという層について、1つのモデルでは形状が [3072, 32, 1, 2, 2] であるのに対し、もう1つのモデルでは [3072, 16, 1, 2, 2] となっています。このような形状の不一致があると、マージ処理で両モデルの重みを統合できず、片方のモデルの重みだけが使われるか、マージがスキップされる可能性があるという内容の様です。

実際のところでは、diffusion_model.img_in.proj.weightという層に対応する、オリジナル版の層は「model.model.img_in.proj.weight」で、データの型は同じですので、ログの表記と期待している内容が異なっています。
要は、マージの際に適切に認識されていないということが分かります。

fp8をそろえた状態でのマージしたモデルの出力内容も確認しました。
当初と同様にうまくいっていないので、fp8は関係していいないようです。

アーキテクチャが同じ場合は、Pythonスクリプトで「名前空間」「キー名」というのを変えることが出来るようで、オリジナル版と比較してもらい、Skyreels_hunyuanモデルをオリジナルの「名前空間」「キー名」にするというスクリプトを作成してもらいました。

現状は、これでSkyreels_hunyuanモデルの「名前空間」「キー名」を変えても、変化はないので参考まで。

モデルの「名前空間」「キー名」は以下のようなコマンドで確認しました。

import torch
from safetensors.torch import load_file

# Safetensorsファイルのパス
safetensors_path = "/tmp/ComfyUI/models/diffusion_models/hunyuantest2.safetensors"

# safetensorsのロード
state_dict = load_file(safetensors_path, device="cpu")

# キー一覧と対応するshape、dtypeを出力
print("==== Keys in HunyuanVideo U-Net safetensors ====")
for key in sorted(state_dict.keys()):
    tensor = state_dict[key]
    print(f"{key}\t{tuple(tensor.shape)}\t{tensor.dtype}")


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