⏱️

Mac Studio M1 MaxでWan2.1 I2Vを動かした実測値

に公開

結論

Wan2.1 14B Image-to-Video モデルは、Mac Studio M1 Max 64GB で動きます。

結論を一行で書きます。

480×480 / 49 フレームの動画を、約 60 分で生成完了

これが本番運用している設定です。NVIDIA データセンター GPU と比べれば遅いんですが、bf16 版モデル (約 30GB) を Apple Silicon の統合メモリで動かしきれるという意味では、これでも実用範囲です。

ただし、たった 1 つの環境変数を忘れるか、ノード設定を 1 箇所間違えると、ロード時点で詰まるか、推論段階で止まります。本書ではその地雷を 11 件まとめましたが、本記事では「正しく設定したらどれくらいで動くのか」だけにフォーカスして書きます。

動作確認済みの構成

実機で本番運用している構成は次の通り。

項目
モデル Wan2_1-I2V-14B-480P_bf16.safetensors (約 30GB)
解像度 480×480
フレーム数 49 (fps=25 → 約 1.96 秒)
ステップ数 20
BlockSwap 使用しない
必須環境変数 PYTORCH_MPS_HIGH_WATERMARK_RATIO=0.0
所要時間 約 60 分(実測)

ポイントは fp8 ではなく bf16 版モデルを使うことと、BlockSwap を無効にすることです。

fp8 が Apple Silicon で動かない理由は前回の記事に書きました。BlockSwap については、CUDA 環境では VRAM 節約のために有効なテクニックですが、M1 Max の統合メモリ環境ではむしろ CPU↔MPS 転送のオーバーヘッドで遅くなり、しかも device 不一致エラーで完走しないことが多いです(本書 Chapter 5 で実ログ付きで詳述しています)。

軽量検証設定

本番設定で 1 時間待つのは、プロンプトの方向性を試したいフェーズには重すぎます。設定を絞った軽量検証構成が次です。

項目
解像度 320×320
フレーム数 25
ステップ数 20
所要時間 約 18 分(実測)

「とりあえず動くか確かめたい」「プロンプトの方向性だけ知りたい」用途は、こちらで回します。出てきた 320×320 の動画で方向性を確認してから、同じプロンプトで本番設定 (480×480) に進む、というフローです。

検証 3 回 + 本番 1 回でも合計 1 時間 54 分。1 本に 60 分ベタかけるよりは、検証フェーズで方向性を絞ってから本番にかけた方が、最終的な歩留まりが良くなります。

環境変数と offload_device の重要性

30GB の bf16 モデルを 64GB の統合メモリで動かすために、2 箇所の設定が必須です。

1. PYTORCH_MPS_HIGH_WATERMARK_RATIO=0.0

ComfyUI 起動時に渡す環境変数。

PYTORCH_MPS_HIGH_WATERMARK_RATIO=0.0 python3.11 main.py

これがないと MPS (Metal Performance Shaders) は統合メモリの一部しか使えません。デフォルトはメモリ確保が保守的すぎて、Wan2.1 のような大型モデルは推論途中で OOM に近い形で詰まります。0.0 を指定するとロックが外れて、必要に応じて統合メモリのほぼ全領域を MPS が確保できるようになります。

2. load_device="offload_device"

ComfyUI のモデルローダノード (WanVideoModelLoader) に渡す引数。

load_device = "offload_device"

これを指定すると、モデルは普段 CPU 側に置かれ、推論時だけ MPS にロードされる動的配置になります。30GB を常時 MPS に乗せておくと統合メモリが他の用途で食われるため、必要なときだけ持っていく運用にします。

この 2 つのうちどちらかでも忘れると、起動時に OOM で落ちるか、ロード成功してから推論中にメモリエラーで止まります。

実測値まとめ

実機で測った 2 点だけを示します。本書 Chapter 3 にはこれら 2 点から線形外挿した推定値も含めていますが、本記事では実測値のみに絞ります。

用途 解像度 フレーム数 所要時間
軽量検証 320×320 25 約 18 分
本番出力 480×480 49 約 60 分

ピクセル数で見ると 480² ÷ 320² ≈ 2.25 倍、フレーム数で 49 ÷ 25 = 1.96 倍。掛け合わせると約 4.4 倍ですが、実測時間比は 60 ÷ 18 ≈ 3.3 倍。スケールはやや非線形なので、解像度を倍にしても時間が単純に倍になるわけではない、という感覚です。

NVIDIA のデータセンター GPU と比較すると遅いです。ただし Apple Silicon 環境では「他の作業をしながら裏で生成しておく」運用がしやすく、レイテンシは長くても運用ストレスは低めです。1 時間後にレンダリング完了の通知が鳴る、くらいの感覚で待てます。

Wan2.1 I2V のプロンプトのコツ

Wan2.1 の Image-to-Video モデルは、最初の 1 枚の絵を入力として、続く 48 フレームを生成します。だから「最初の絵を文字で指示する」必要がない代わりに、「動きを文字で指示する」のがプロンプトの中心になります。

具体的に書くべきは「動きの方向と速度」です。本書で挙げている実例:

  • slow rotation
  • camera dolly forward
  • particles drifting upward

このように、何が(被写体)・どう動くか(動詞 + 修飾語)を 2〜3 語で書くのが基本です。

逆に効きにくいのは構図変更です。入力画像にない大きな要素(新キャラクターの追加、画角の大幅変更等)は I2V の特性として出にくく、Wan2.1 はあくまで「入力画像を動かす」モデルで、「入力画像を再構成する」モデルではありません。

文体のコツとして、長い 1 文より、短い英文を複数並べた方が効きが安定します。

まとめ

  • Wan2.1 14B I2V は Mac Studio M1 Max 64GB で動く
  • 480×480 / 49 フレームの本番設定で約 60 分、320×320 / 25 フレームの軽量検証で約 18 分
  • PYTORCH_MPS_HIGH_WATERMARK_RATIO=0.0load_device="offload_device" の 2 点設定が必須
  • BlockSwap は使わない(M1 Max では逆効果)
  • プロンプトは「動き」を 2〜3 語で具体的に書く、短い英文を複数並べる

関連書籍

本記事では「正しく設定したらどう動くか」だけを書きましたが、その「正しい設定」に至るまでに踏んだ地雷を 11 件まとめた書籍を Zenn Book で公開しています。

「Mac Studio で ComfyUI を動かす実戦記録」では、本記事で触れなかった以下も実機ログ付きで解説しています。

  • 9 ノード構成の全引数(text_embeds の接続キー、riflex_freq_index=0 の必須指定、precision="bf16" の明示など)
  • WanVideoVAELoader の precision 必須引数(省略すると WanVideoVAELoader.loadmodel() missing 'precision' エラー)
  • T5 エンコーダの接続キー間違い(encoder ではなく t5 が正しい)
  • WanVideoDecode のタイル 4 引数すべて必須(tile_x, tile_y, tile_stride_x, tile_stride_y)
  • BlockSwap が M1 Max で逆効果になる理由(CPU↔MPS 転送オーバーヘッドと device 不一致エラー、実ログ付き)

https://zenn.dev/kemmm/books/comfyui-mac-studio

Discussion