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 rotationcamera dolly forwardparticles 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.0とload_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 不一致エラー、実ログ付き)
Discussion