【動画生成AI】Wan2.1用LoRAの学習方法【Wan2.1】

前回、Wan2.1の導入方法を書きました。

ですが、動画内容によってはWan2.1の動作環境を整えただけでは生成できません。
LoRAを使用することで生成出来るようになりますが、Wan2.1のLoRAは画像生成AI用のように大量に配布されていません。

生成したい動画の内容にあったLoRAが配布されていないということも多々あるでしょう。

そこで今回は、Wan2.1用のLoRAの作り方を紹介していきます。

また、動画生成AIのLoRA学習は画像生成のLoRA学習と違い、高いGPUスペックを要求されます。
学習に使用するフレームを少なくして学習させた場合、RTX4090でも数時間で完了しましたが、使用フレームを多くすると12時間以上かかる場合もありました。

使用フレーム数を少なくすると、動きの速いモーションを学習する場合に支障が出るかもしれません。
もし、長時間GPUを専有されるのが嫌だというのであれば、以下のようなクラウドGPUの使用を検討してみてください。
RunPod
Vast.ai

それでは、学習までの手順を説明していきます。

musubi-tunerのインストール

まずはLoRA学習をするために必要なツール「musubi-tuner」をインストールします。

まず、任意の場所に新しいフォルダを作成します。そのフォルダでコマンドプロンプトなどを開き、git cloneでmusubi-tunerをダウンロードします。

git clone https://github.com/kohya-ss/musubi-tuner

次に、以下のコマンドなどを使い今ダウンロードしたmusubi-tunerフォルダへ移動します。

cd musubi-tuner

次に、仮想環境を作成します。

python -m venv venv

仮想環境を作成したら、その仮想環境をアクティブにします。

.\venv\Scripts\activate

この仮想環境をアクティブにするコマンドは起動時に毎回行ってください。

次に、PyTorchとtorchvisionをインストールします。

pip install torch torchvision --index-url https://download.pytorch.org/whl/cu124

インストールが終わったら、以下のコマンドで依存関係をインストールします。

pip install -r requirements.txt

以下のライブラリも一緒にインストールしておきましょう。

pip install ascii-magic matplotlib tensorboard

これで必要なライブラリのインストールは完了しました。

次は学習に使用するモデルなどをダウンロードしていきます。

スポンサーリンク

学習に必要なモデルのダウンロード

学習に必要な以下の4つのファイルをダウンロードして、任意の場所に保存してください。

wan2.1_i2v_720p_14B_bf16.safetensors
models_t5_umt5-xxl-enc-bf16.pth
models_clip_open-clip-xlm-roberta-large-vit-huge-14.pth
Wan2.1_VAE.pth

これで学習に必要なファイルが揃いました。

今回はI2VモデルのLoRA学習を前提として進めていくのでI2Vモデルをダウンロードしましたが、他のモデルのLoRAを作成したい場合は、以下のリンクより該当するモデルをダウンロードしてください。

Comfy-Org/Wan_2.1_ComfyUI_repackaged

(初回のみ) accelerate configの実行

初回のみ 以下のコマンドを実行してAccelerateの設定を行ってください。

accelerate config

一般的なPCであれば、質問は以下のように答えれば大丈夫です。

In which compute environment are you running?
This machine

Which type of machine are you using?
No distributed training

Do you want to run your training on CPU only (even if a GPU / Apple Silicon / Ascend NPU device is available)?[yes/NO]
NO

Do you wish to optimize your script with torch dynamo?[yes/NO]
NO

Do you want to use DeepSpeed? [yes/NO]
NO

What GPU(s) (by id) should be used for training on this machine as a comma-seperated list? [all]
all

Would you like to enable numa efficiency? (Currently only supported on NVIDIA hardware). [yes/NO]
NO

Do you wish to use mixed precision?
bf16 (使用しているGPUがRTX30/40シリーズ以外であれば fp16を選択 )

これで学習を行う為の設定が全て完了しました。

次に学習を行う為の学習データの準備をしていきます。

学習データの準備

まずは当然ですが学習元となる動画ファイルとキャプションファイルが必要です。

動画の秒数は任意ですが、長い動画だとその分学習時間も多くなります。

キャプションファイルは、動画ファイルと同じ名前の.txtファイルを作成し、その中に入力してください。
「test.mp4」のキャプションファイル名は「test.txt」「test2.mp4」なら「test2.txt」となります

キャプションは全て同じで構いません。

次に.tomlファイルを準備します。最初に.txtファイルを作成し、名前の変更から拡張子を.tomlへ変更するなどして用意してください。

中身は以下をコピーして適宜変更してください。

[general]
resolution = [512, 512]
caption_extension = ".txt"
batch_size = 1
enable_bucket = true
bucket_no_upscale = false

[[datasets]]
video_directory = "C:/LearningData/Path/to/VideoDirectory"
cache_directory = "C:/LearningData/Path/to/VideoDirectory/CachDirectory"
target_frames = [9]
frame_extraction = "head"

video_directoryには、学習に使う動画ファイルが入っているフォルダパスを指定してください。
cache_directoryにはキャッシュを保存する為のフォルダを指定してください。 こちらのフォルダは任意の場所に作成し、それを指定すればOKです。

次にtarget_framesとframe_extractionについての説明です。

target_framesに指定した値が、学習用動画から実際に学習に使われるフレーム数になります。
例えば 9 を指定していた場合、学習用動画から9フレーム分が抽出され、その抽出された部分が学習に使われます。 また、値の指定方法には ” target_frames = [1, 25, 45]” というように複数の値を指定することも出来ます。注意点ですが、ここに指定する値は「N×4+1」である必要があります。

次に、frame_extractionの説明です。

この項目では、前述したtarget_framesで指定したフレームを動画のどのタイミングから抽出するかを決めることが出来ます。タイミングは以下の5つから選択できます。使用するタイミングによっては、.tomlファイルの[[datasets]]の欄に”frame_stride”や”frame_sample”といった項目を使用する必要があります。

head: 動画の最初からtarget_framesで指定した分のフレームを抽出する
chunk: 動画をtarget_framesで指定したフレーム分に分割して最後まで抽出する
slide: frame_strideに指定したフレームごとに区切られ、target_framesで指定したフレームずつ最後まで抽出する
uniform: target_framesで指定したフレームを一定間隔で抽出し、これをframe_sampleで指定した回数分繰り返し、最後まで抽出する
full: 全てのフレームを抽出する

これだけでは少し分かりづらいので、図にして説明します。

前提条件として用意した動画のフレーム数が全部で30、target_framesを[9]と設定した時と[9, 17, 25]のように複数設定した2パターン解説していきます。
また、slideで使用するframe_strideは10uniformで使用するframe_sampleは4とします。

図の見方はxが抽出されたフレーム、oが非抽出のフレームです。

head使用時

target_frames = [9] の場合
xxxxxxxxxooooooooooooooooooooo

このように全部で30フレームある内、最初の9フレームのみ抽出されます。

target_frames = [9, 17, 25] の場合
xxxxxxxxxooooooooooooooooooooo
xxxxxxxxxxxxxxxxxooooooooooooo
xxxxxxxxxxxxxxxxxxxxxxxxxooooo

このように、最初から9フレーム、17フレーム、25フレームが3回に分けられ抽出されます
この場合は9フレームまでは3回、17フレームまでは2回 重複して学習されることになり、合計枚数は51枚となります。

以降、target_frames = [9] のような単体のフレーム指定はheadと変わりないので記載しません。

chunk使用時

target_frames = [9, 17, 25] の場合
xxxxxxxxxooooooooooooooooooooo
oooooooooxxxxxxxxxoooooooooooo
ooooooooooooooooooxxxxxxxxxooo

xxxxxxxxxxxxxxxxxooooooooooooo

xxxxxxxxxxxxxxxxxxxxxxxxxooooo

このようにtarget_framesで指定した数値ずつ抽出されます。ただし、指定したフレーム分抽出できない場合はスキップされ、次に指定した分の抽出が始まります

slide使用時

target_frames = [9, 17, 25]、 frame_stride = 10 の場合
xxxxxxxxxooooooooooooooooooooo
ooooooooooxxxxxxxxxooooooooooo
ooooooooooooooooooooxxxxxxxxxo

xxxxxxxxxxxxxxxxxooooooooooooo
ooooooooooxxxxxxxxxxxxxxxxxooo

xxxxxxxxxxxxxxxxxxxxxxxxxooooo

このようにframe_strideで指定した分だけズレて行き、そこから指定した分のフレームが抽出されます。
frame_strideで指定した分がズラせなくなった場合スキップされ、次に指定した分の抽出が始まります。

uniform使用時

target_frames = [9, 17, 25]、frame_sample = 4 の場合
xxxxxxxxxooooooooooooooooooooo
ooooxxxxxxxxxooooooooooooooooo
ooooooooooooooooxxxxxxxxxxoooo
oooooooooooooooooooooxxxxxxxxx

xxxxxxxxxxxxxxxxxooooooooooooo
oooooxxxxxxxxxxxxxxxxxoooooooo
ooooooooxxxxxxxxxxxxxxxxxooooo
oooooooooooooxxxxxxxxxxxxxxxxx

xxxxxxxxxxxxxxxxxxxxxxxxxooooo
ooxxxxxxxxxxxxxxxxxxxxxxxxxooo
oooxxxxxxxxxxxxxxxxxxxxxxxxxoo
oooooxxxxxxxxxxxxxxxxxxxxxxxxx

このように、frame_sampleで指定した分だけ複製され、target_frameで指定した数値に合わせて一定間隔で抽出されます。

fullは全てのフレームが使用されるので説明はいりませんね。

スポンサーリンク

学習を行う

それでは、学習を開始するまでの手順を説明していきます。

まずはlatentの事前キャッシュとテキストエンコーダ出力の事前キャッシュを作成していきます。
以下のコマンドを自分の環境に合わせて実行してください。

まずはlatentの事前キャッシュからです。

python wan_cache_latents.py --dataset_config "C:\path\to\dataset.toml" --vae "C:\path\to\Wan2.1_VAE.pth" --clip "C:\path\to\models_clip_open-clip-xlm-roberta-large-vit-huge-14.pth"

赤字にしてあるパスの部分を、自分の環境に合わせて変更してください。
上記のコマンドはI2Vモデルの学習時に使用するコマンドです。T2Vモデルを学習する場合は、clipの箇所は削除してください

テキストエンコーダー出力の事前キャッシュ

python wan_cache_text_encoder_outputs.py --dataset_config "C:\path\to\dataset.toml"  --t5 "C:\path\to\models_t5_umt5-xxl-enc-bf16.pth" --batch_size 16

同じように、赤字のパス部分を自分の環境に合わせて変更してください。
VRAMによってはbatch_sizeの値を変更する必要があります。
また、16GB未満のVRAMであれば、引数に --fp8_t5 を追加してください

これで事前キャッシュの作成が完了しました。

最後に、以下のコマンドを実行してLoRAの学習が開始されます。
こちらのコマンドも自分の環境に合わせて該当箇所を変更して実行してください。

accelerate launch --num_cpu_threads_per_process 1 --mixed_precision bf16 wan_train_network.py --task i2v-14B --dit "C:\path\to\wan2.1_i2v_720p_14B_bf16.safetensors" --dataset_config "C:\path\to\dataset.toml" --sdpa --mixed_precision bf16 --fp8_base --optimizer_type adamw8bit --learning_rate 2e-4 --gradient_checkpointing --max_data_loader_n_workers 2 --persistent_data_loader_workers --network_module networks.lora_wan --network_dim 16 --timestep_sampling shift --discrete_flow_shift 3.0 --max_train_epochs 16 --save_every_n_epochs 1 --seed 42 --output_dir "C:\path\to\output_directory" --output_name loraname

基本的に、各自の環境に合わせて変更が必要な箇所は赤字で示した通りですが、もしT2Vモデルなど、他のモデルでLoRAを作成する場合は --task 部分を変更しなければなりません。簡単な説明は以下の通りです。

--task : この引数にはどのモデルのLoRAを作成するかの指定を行います。上記のコマンドでは”i2v-14B”となっているので、I2Vモデルの指定となっています。
他には、”t2v-1.3B”、”t2v-14B”、”t2i-14B” などがあります。適宜変更してください。

あとは、--optimizer_type--learning_rate--max_train_epochs--save_every_n_epochs--output_name あたりをお好みで変更すればOKです。

必要箇所の変更が済んだら、コマンドを実行するだけです。

あとは学習完了を待つだけ。

クラウドGPUの検討

学習に使用するフレームが多ければ多いほど、動きの速いモーションをしっかり学習できますが、冒頭でも書いたようにその分学習時間が長くなってしまいます。

そんな時におすすめしたいのがクラウドGPUです。おすすめは以下の2つ。
RunPod
Vast.ai

クラウドGPUについて簡単に説明すると、高性能なGPUを1時間あたり数百円から借りれるサービスです。もちろん、選べるGPUには機械学習用のも含まれます。

数百万円もするGPUを数百円でレンタル出来るので、LoRA学習などちょっとした事に使うには適していますね。

最後に

自分でLoRAを作成できるようになり、配布されているLoRAが無くて欲しい動画を生成できないという悩みが解決できましたね!

それでは!

コメント