Reelune

AI動画1本を21分から11分にした8つの実験|効いた設定と効かなかった設定

実測値つき。採用した2つ、見送った2つ、そして反映されていなかった事故

  • Wan 2.2 高速化
  • AI動画 生成時間
  • ComfyUI 高速化
  • 動画生成 チューニング
完全無料
登録不要
実在の人物なし
毎日更新

AI動画を1本作るのに21分かかっていた。同じ画質のまま11分まで縮めた。サンプリング部分だけを見れば4.4倍速くなっている。8つの実験のうち、採用したのは2つ、見送ったのが2つ。効かなかった話と見送った理由も、効いた話と同じだけ書く。

8つの実験の結果

実験結果判定
計算精度を fp8 高速モードへ1.41 倍速**採用**
ステップ 8 → 4 / CFG 2.0 → 1.0サンプリング 4.4 倍速**採用**
ステップ 10 → 8過去に採用済採用
動画側プロンプトの簡素化799 → 576 文字採用
VAE デコードの分割化1〜2 割遅いがメモリ落ちを回避採用(安定優先)
CFG 1.0 単体での検証プロンプト不具合で正しく測れず保留 → 後に再検証
毎回の 150 秒を潰す迂回路自体が遅いと判明**見送り**
開始画像の生成を縮める純コスト 20 秒。既に十分速い**変更不要**

何に時間がかかっていたのか

速くする前に、どこに時間が消えているかを測りました。1本あたり約21分のうち、動画生成の工程はこう分かれていました。

サンプリングが支配的です。ここを削らない限り何をやっても誤差にしかなりません。

逆に言えば、最初に測っていなければ「モデルの読み込みを速くしよう」のような効果が 45 秒しかない場所に時間を使っていたはずです。

実験1: 計算の精度を落とす — 1.41倍

行列計算を fp8 の高速モードに切り替えました。GPU 世代が対応していれば、設定を 1 行変えるだけです。

変更前変更後
サンプラー速度77 s/it54.5 s/it
動画工程約 1,095 秒約 840 秒
1 本あたり約 21 分約 17 分

1.41 倍。解像度もステップ数も動きの指定も変えていないので、画質への影響はほぼありません。

ダメなら戻すだけ、というリスクの小さい変更から先に試すのは順番として正しい。大きい変更で失敗すると、何が原因だったのか分からなくなります。

実験2: ステップ数を 1/4 に — 4.4倍

本命はこちらです。使っていた高速化用の追加モデルは、そもそも 4 ステップで動くように蒸留されたものでした。にもかかわらず 8 ステップで回していた。さらに CFG を 2.0 にしていたため、1 ステップあたり 2 回計算していました。

つまり実際には 8 × 2 = 16 回 計算していたところを、4 × 1 = 4 回 にできるはずでした。

77% 減、4.4 倍速。

事前に一番心配していたのは「ステップを減らすと動きが途中で止まるのでは」でした。そこで最も動きの大きいケースを選び、開始画像・プロンプト・seed を完全に固定して変更前後を比較しました。結果、動きは最後まで完遂し、画質も同等でした。

副作用: 動画側のネガティブプロンプトが効かなくなる

CFG を 1.0 にすると計算が半分になりますが、代償があります。

CFG は「指示に従った絵」と「指示を無視した絵」の差を強調する仕組みです。1.0 にするとその比較自体をやめるので、「これは出すな」という指定が動画工程で無効になります。

  • 開始画像を作る工程のネガティブ指定は効いたまま
  • 動画は開始画像の色や見た目を引き継ぐので、影響は限定的
  • ただし動画工程で新たに出る破綻は、ネガティブでは抑えられない

速度と制御はトレードオフです。うちは「開始画像側で抑える + 公開前に人が確認する」という二段構えがあるので許容できました。この前提が無いなら同じ判断にはなりません。

見送った実験1: 消せない 150 秒

残る無駄で最大のものは、毎回発生する約 150 秒でした。動画を作る前に画像をエンコードする工程で、メモリ不足に失敗して遅い迂回路に落ちているのが原因です。

調べて分かったのは、迂回路そのものが遅いということでした。通常の経路なら数秒で終わります。

「最初から迂回路を使う」は解決になりません。遅い方を選び続けるだけで、常に 150 秒かかることになります。

本当の解は「通常の経路がメモリに収まるようにする」ことですが、この GPU は同じ GPU を使う別のワークロードと共有していて、こちらの都合だけで空きを確保できません。

効果却下の理由
解像度を少し下げる数秒に短縮公開する動画の画質が落ちる
GPU を専有する根本解決環境の問題でコードでは解けない

見送りました。画質を落とすか環境を変えるかしかなく、前者は本末転倒です。

見送った実験2: 測ったら直す必要がなかった

開始画像の生成時間が 20 秒から 756 秒まで大きく振れていました。設定を絞れば安定するのではないかと考え、測りました。

状況時間
純粋な生成のみ11〜12 秒
空いている時約 20 秒
競合している時88〜99 秒(外れ値で 756 秒)

設定は悪くありませんでした。振れているのは同じ GPU を使う別のワークロードとの競合が原因で、実験1で見送ったのと同じ根っこでした。

縮められそうなレバーも検討しましたが、いずれも却下しました。ステップ数を減らしても削れるのは 4 秒で、その 4 秒のために全動画の元になる 1 枚の品質を落とすのは割に合いません。

「遅い」と感じた場所が、実際に遅いとは限りません。測った結果「直す必要がなかった」と分かるのも、立派な成果です。

一番危なかったのは、設定が反映されていなかったこと

4.4 倍速の設定をデプロイした直後、実際には古い設定のまま動いていました。

原因は 3 つ重なっていました。

  1. コードを転送した後、実行中のプロセスが「もう起動している」と判断されて再起動がスキップされた
  2. Python のキャッシュファイルが残っていて、古いコードが読み込まれ続けた
  3. 稼働確認に使ったコマンドが、自分自身にマッチして「動いている」と誤判定した

「デプロイした」と「反映された」は別のことです。

以後は、確実に停止させ、キャッシュを消し、クリーンに起動し、ログに出るステップ数が実際に変わっていることを目で確認する手順にしました。設定値そのものより、反映されたかを確かめる方法の方が重要でした。

結果

画質は落としていません。解像度もフレーム数も変えておらず、採用した設定は同種のサービスが本番で使っている標準的な値と一致していることも後から確認しました。

残っている無駄は約 150 秒で、これは共有 GPU が原因なので専有できる環境に移れば自動的に解決します。コードでやれることは出し切りました。

この手のチューニングで効いた考え方

  1. まず内訳を測る。支配的な工程が分からないうちに手を出すと、効果が数十秒しかない場所に労力を使うことになります。
  2. リスクの小さい変更から順に。大きく変えて失敗すると、原因の切り分けができません。
  3. 一度に 1 つだけ変える。開始画像・プロンプト・seed を固定しないと、速くなったのか設定のせいなのか分かりません。
  4. 最悪のケースで検証する。平均的なケースで通っても意味がなく、一番厳しい条件で壊れないかを見ます。
  5. 見送りも記録する。「試したが効かなかった」を残さないと、半年後に同じ実験を繰り返します。
  6. 反映されたかを確認する。設定を変えたつもりで変わっていない事故は、設定そのものより高くつきます。

よくある質問

ステップ数を減らすと画質は落ちないのか

使っている高速化モデルが元々4ステップ向けに作られているため、落ちませんでした。最も動きの大きいケースで、開始画像・プロンプト・seedを固定して比較し、画質も動きの完遂も同等であることを確認しています。8ステップは単に設計点を外していただけでした。

CFG を下げる副作用は許容できるのか

動画工程のネガティブ指定が効かなくなります。うちは開始画像側のネガティブが効くことと、公開前に人が確認する工程があるため許容しました。その前提が無いサービスでは同じ判断にはなりません。

残り150秒はなぜ消せないのか

メモリ不足で遅い経路に落ちているのが原因で、根本解決には通常の経路がメモリに収まる必要があります。GPUを他のワークロードと共有しているため、こちらだけでは空きを確保できません。解像度を下げれば解決しますが、公開する動画の画質を落とすことになるので却下しました。

どこから手を付けるのが早いか

まず工程ごとの内訳を測ることです。今回もサンプリングが全体の大半を占めており、そこ以外を最適化しても数十秒しか変わりませんでした。測らずに始めると、効果の小さい場所に労力を使うことになります。

設定を変えたのに速くならない時は

反映されているかを疑ってください。今回、転送は成功したのに実行中のプロセスが再起動されず、さらにキャッシュが残っていて、古い設定のまま動いていました。ログに出る実際の値が変わっているかを毎回目で確認するのが確実です。

フィードを見はじめる