Musubi-Tunerを使ってRunpod上でHunyuan Videoを追加学習してみる
はじめに
この記事は、RunpodでGPUをレンタルして@kohya_techさんのMusubi-Tunerを使ってHunyuan VideoのLoRAアダプタを学習する備忘録的な記事です。
なお、筆者は動画生成どころか画像生成もほとんど触ったことのない素人なので、細かい文言のミス等あればご容赦ください。
環境準備
Runpod上での環境作成
まずはRunpod上で環境を作成します。今回はGPUにRTX 5000 Ada(VRAM 32GB)を選択し、Pod Templateにはrunpod/pytorch:2.4.0-py3.11-cuda12.4.1-devel-ubuntu22.04
を選択します。
また、途中で各種モデルファイルをダウンロードする必要があるので、Volume Diskをやや多めにしておきます。今回は100GBにしておきました。
Runpod上での設定例
Musubi-Tunerの環境構築
作成した環境のJupyter Labに接続し、READMEを参考にMusubi-Tunerの環境構築作業を進めます。
まず、PyTorchのバージョンを動作確認済みの2.5.1に合わせます。
pip install -U "torch==2.5.1" torchvision
次に、Musubi-Tunerをクローンし必要なライブラリ類をインストールします。
git clone https://github.com/kohya-ss/musubi-tuner.git
cd musubi-tuner
pip install -r requirements.txt
# wandbにログを残したい場合はwandbもインストールしておく
pip install ascii-magic matplotlib tensorboard wandb
各種モデル類の準備
学習に必要となるDiTやVAEなどの各種モデル類をダウンロードします。今回はhuggingface-cliを使ってダウンロードします。
# DiTをダウンロード
huggingface-cli download tencent/HunyuanVideo hunyuan-video-t2v-720p/transformers/mp_rank_00_model_states.pt --local-dir ./models
# VAEをダウンロード
huggingface-cli download tencent/HunyuanVideo hunyuan-video-t2v-720p/vae/pytorch_model.pt --local-dir ./vae
# Text Encoder2種類をダウンロード
huggingface-cli download Comfy-Org/HunyuanVideo_repackaged split_files/text_encoders/clip_l.safetensors --local-dir ./text_encoders
huggingface-cli download Comfy-Org/HunyuanVideo_repackaged split_files/text_encoders/llava_llama3_fp16.safetensors --local-dir ./text_encoders
学習データセットの準備
何らかの動画や静止画を元に学習データセットを準備します。
データセットの設定に関する詳細は公式のドキュメントを参照してください。ここでは、静止画の画像ファイルとそれに対応するキャプションのテキストファイルを準備したとします。出来た画像とキャプションのファイルは以下のようにGPUサーバ上の1つのディレクトリに格納しておきます。
train_data/
├── image_001.jpg
├── image_001.txt
├── image_002.jpg
├── image_002.txt
├── image_003.jpg
├── image_003.txt
これに対応するdataset configを作成します。今回はconfigs/config.toml
として以下のような設定ファイルを作成しました。resolution
やbatch_size
、image_directory
などは適宜変更してください。
# resolution, caption_extension, batch_size, enable_bucket, bucket_no_upscale must be set in either general or datasets
# general configurations
[general]
resolution = [960, 544]
caption_extension = ".txt"
batch_size = 1
enable_bucket = true
bucket_no_upscale = false
[[datasets]]
image_directory = "/workspace/musubi-tuner/train_data"
cache_directory = "/workspace/musubi-tuner/cache"
# other datasets can be added here. each dataset can have different configurations
LoRAアダプタの学習
学習の前に、latentとText Encoder出力の事前キャッシュを作成しておきます。以下のようなコマンドで作成します。
# latentのキャッシュ
python cache_latents.py --dataset_config configs/config.toml --vae vae/hunyuan-video-t2v-720p/vae/pytorch_model.pt --vae_chunk_size 32 --vae_tiling
# Text Encoder出力のキャッシュ
python cache_text_encoder_outputs.py --dataset_config configs/config.toml --text_encoder1 text_encoders/split_files/text_encoders/llava_llama3_fp16.safetensors --text_encoder2 text_encoders/split_files/text_encoders/clip_l.safetensors --batch_size 16
上記処理が完了後、実際の学習を開始します。ここではテストのためepochを1に設定していますが、実際には大きな値に設定してください。また、その他のパラメータ類も適当なので実際には探索が必要となります。
accelerate launch \
--num_cpu_threads_per_process 1 \
--mixed_precision bf16 \
hv_train_network.py \
--dit models/hunyuan-video-t2v-720p/transformers/mp_rank_00_model_states.pt \
--dataset_config configs/config.toml \
--sdpa \
--mixed_precision bf16 \
--optimizer_type adamw8bit \
--learning_rate 1e-3 \
--max_data_loader_n_workers 8 \
--persistent_data_loader_workers \
--network_module networks.lora \
--network_dim 32 \
--timestep_sampling sigmoid \
--discrete_flow_shift 1.0 \
--max_train_epochs 1 \
--save_every_n_epochs 1 \
--seed 42 \
--output_dir ./outputs \
--output_name lora-test \
--log_with wandb \
--wandb_run_name HunyuanVideoLoRA \
--wandb_api_key <wandb_api_key> \
--log_config \
--network_alpha 16 \
--gradient_checkpointing \
--logging_dir ./logs
学習が始まるとコンソール上に進捗が表示され、同時にwandb上からも進捗を確認できるようになります。
wandbの学習ログ
推論のテスト
学習が完了したLoRAアダプタを使って実際に推論のテストをしてみます。
まず、以下のようなコマンドでLoRAアダプタを使用せず素のモデルのままで推論してみます。
python hv_generate_video.py \
--video_size 544 960 \
--video_length 61 \
--infer_steps 30 \
--prompt "test prompt here" \
--save_path ./inference_results \
--output_type both \
--dit models/hunyuan-video-t2v-720p/transformers/mp_rank_00_model_states.pt \
--attn_mode sdpa \
--vae vae/hunyuan-video-t2v-720p/vae/pytorch_model.pt \
--vae_chunk_size 32 \
--text_encoder1 text_encoders/split_files/text_encoders/llava_llama3_fp16.safetensors \
--text_encoder2 text_encoders/split_files/text_encoders/clip_l.safetensors \
--seed 1234 \
--fp8
推論が完了すると、save_path
で指定したディレクトリに動画ファイルが出力されます。
次に、LoRAアダプタを使って同様に推論してみます。
python hv_generate_video.py \
--video_size 544 960 \
--video_length 61 \
--infer_steps 30 \
--prompt "test prompt here" \
--save_path ./inference_results \
--output_type both \
--dit models/hunyuan-video-t2v-720p/transformers/mp_rank_00_model_states.pt \
--attn_mode sdpa \
--vae vae/hunyuan-video-t2v-720p/vae/pytorch_model.pt \
--vae_chunk_size 32 \
--text_encoder1 text_encoders/split_files/text_encoders/llava_llama3_fp16.safetensors \
--text_encoder2 text_encoders/split_files/text_encoders/clip_l.safetensors \
--seed 1234 \
--fp8 \
--lora_multiplier 1.0 \
--lora_weight outputs/lora-test.safetensors
1エポックしか学習していないので恐らく良い結果にはなっていないと思いますが、出力された動画が学習データに近づいていることが確認できると思います。
LoRAの形式の変換
LoRAアダプタをComfyUIで利用可能な形式に変換するスクリプトも提供されているので、これも試してみます。
mkdir converted
python convert_lora.py --input outputs/lora-test.safetensors --output converted/lora-test-converted.safetensors --target other
変換が完了すると、出力先のディレクトリに該当のファイルが保存されていることが確認できると思います。
このアダプタをHugging Face上に保存しておきたい場合は、以下のようにhuggingface-cliからアップロードすることができます。
# write権限のあるtokenで認証
huggingface-cli login
# アップロード
huggingface-cli upload <user name>/<repo name> converted/lora-test-converted.safetensors lora-model.safetensors
最後に
この記事では、Musubi-Tunerを使ってRunpod上でHunyuan Videoを追加学習する流れを解説しました。動画生成・画像生成初心者の私でも比較的簡単に動かせたので、興味のある方はぜひ触ってみてください。
Discussion