AI動画でBGVを作る(9)|MLXでWan2.2 14B量子化に挑む――32GBの壁は高かった

AI動画でBGVを作る(9)|MLXでWan2.2リベンジ――MacBook Air M5で動画生成 — Wan2.2, MLX, MacBook Air M5 AI動画

こんにちは、パレイド技術部です。

前回はMLX + Wan2.2 TI2V-5Bモデルで、MacBook Air M5での動画生成に成功しました。今回はさらに大きな14Bモデルを4bit量子化して同じMacBook Air上で動かせるか挑戦します。

なお結論としては、VAEでOOMが発生する問題が解消できず中断しています。
参考情報として掲載します。

Wan2.2のモデルラインナップ

Wan2.2には3つの主要モデルがあります。

モデルパラメータ数パイプライン用途
TI2V-5B5BシングルモデルText+Image → Video
T2V-A14B14BデュアルモデルText → Video
I2V-A14B14BデュアルモデルImage → Video

前回は5Bモデル(bfloat16、約21GB)で成功しました。14Bモデルはフルサイズで約56GB。32GBのMacBook Airでは収まりません。

4bit量子化で14Bモデルを圧縮

mlx-videoの変換スクリプトには量子化オプションが用意されています。

# 14Bモデルのダウンロード(約67GB)
python3 -c "
from huggingface_hub import snapshot_download
snapshot_download('Wan-AI/Wan2.2-T2V-A14B', local_dir='./Wan2.2-T2V-A14B')
"

# 4bit量子化でMLX変換
python3 -m mlx_video.models.wan_2.convert \
    --checkpoint-dir ./Wan2.2-T2V-A14B \
    --output-dir ./Wan2.2-T2V-A14B-MLX-Q4 \
    --quantize --bits 4 --group-size 64

量子化の効果

T2V-A14Bはデュアルモデル(high-noise / low-noiseの2つのトランスフォーマー)構成です。

コンポーネントフルサイズ4bit量子化後
High-noise transformer約28GB7.8GB
Low-noise transformer約28GB7.8GB
T5エンコーダ11GB11GB(量子化なし)
VAE484MB484MB(量子化なし)
合計約67GB約27GB

量子化対象は自己注意(Q/K/V/O)、交差注意、FFN(fc1/fc2)の約95%の重み。埋め込み層やLayerNormはbfloat16のまま精度を維持します。

27GBなら32GBのUnified Memoryに収まる計算です。

検証:14B量子化で生成

前回と同じプロンプト・同じ解像度(832×480, 41フレーム)で実行しました。

python3 -m mlx_video.models.wan_2.generate \
    --model-dir ./Wan2.2-T2V-A14B-MLX-Q4 \
    --prompt "Ocean waves crashing on a rocky shore at sunset, cinematic, 4K" \
    --negative-prompt "low quality, blurry, distorted" \
    --width 832 --height 480 --num-frames 41 \
    --steps 40 --guide-scale "3.0,4.0" \
    --seed 42 \
    --output-path test_14b_q4_t2v.mp4

結果:Diffusion完走、VAEでメモリ不足

項目14B Q4(今回)5B bf16(前回)
T5エンコーディング23.2秒81.9秒
Diffusion(40ステップ)12891.9秒(322.3秒/step、約3時間35分)914.9秒(22.9秒/step)
VAEデコードメモリ不足で異常終了185.9秒
総生成時間未完走約20分

Diffusionは3時間半かけて完走しましたが、最後のVAEデコードでメモリ不足(kIOGPUCommandBufferCallbackErrorOutOfMemory)が発生して異常終了しました。3時間半の計算結果が水の泡です。何度かパラメータを変えて試しましたが、VAEデコードでこけます。

Decoding with VAE...
  Tiling (auto): spatial=512px, temporal=none
libc++abi: terminating due to uncaught exception of type std::runtime_error:
[METAL] Command buffer execution failed: Insufficient Memory
(00000008:kIOGPUCommandBufferCallbackErrorOutOfMemory)

原因:tilingの設定不足?

mlx-videoにはVAEデコード時のメモリ消費を抑えるtilingオプションがあります。デフォルトの--tiling autoでは以下のルールが適用されます。

設定spatial tiletemporal tile
auto512px(H or W > 512のとき)64f(F > 65のとき)
aggressive256px32f

今回は41フレーム(< 65)だったため、temporal tilingが無効のままでした。832×480のspatial tileが512pxでも1タイルあたりの面積が大きく、かつtemporal一括で11 latentsを処理するため32GBを超えたと考えられます。--tiling aggressiveを指定すれば、spatialを256px・temporalを32fに分割してメモリ消費を大幅に削減できるはずですが、現在のところこの設定でもOOMが発生します。

実用性の評価

仮に動いたとして、数秒の動画生成に3時間半、しかもメモリ利用が32GBギリギリで他のアプリを開くのは難しい状態です。VAEの問題を解決しても、現時点では実用的とは言えません。

Windows環境ではGGUF Q5_K_S + BlockSwapで14Bモデルが安定動作しているため(第3〜4回参照)、14Bの動画生成はWindows側に任せるのが現実的です。

まとめ

  • 14Bモデルも4bit量子化で27GBまで圧縮でき、Diffusionだけは実行可能
  • ただしVAEデコードでメモリ不足が発生(tiling設定でも未解決)
  • Diffusion速度はわかっている部分でも5Bの約14倍(1ステップ322秒 vs 23秒)
  • 32GB環境では14Bモデルの実用は厳しい — 5Bまでが現実的なライン

前回の5Bモデルの成功と合わせて、MacBook Air M5(32GB)でのMLX動画生成は5Bモデルが実用的な上限という結論です。14BはメモリもDiffusion速度もボトルネックが大きく、MacでやるならWindows環境を併用する方が合理的でしょう。

タイトルとURLをコピーしました