2025年9月25日木曜日

M2 Pro Mac mini で Stable Video Diffusion を動かす

M2 Pro Mac mini で Stable Video Diffusion を動かす

概要

過去に forge を使った方法を紹介しました
今回はモデルを Python スクリプトで直接動かし画像から動画を生成してみます

環境

  • macOS 15.6.1
  • Python 3.10.12
    • diffusers 0.35.1
    • torch 2.5.1

ライブラリインストール

  • pyenv local 3.10.12
  • python -m venv svd-env
  • source svd-env/bin/activate
  • pip install diffusers transformers accelerate

モデルダウンロード

  • git lfs install
  • git clone https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xt svd-model

Python スクリプト

  • vim app.py
import torch
from diffusers import StableVideoDiffusionPipeline
from diffusers.utils import export_to_video, load_image

device = "mps" if torch.backends.mps.is_available() else "cpu"

pipe = StableVideoDiffusionPipeline.from_pretrained(
    "./svd-model", torch_dtype=torch.float16, variant="fp16"
)
pipe.to(device)
pipe.enable_model_cpu_offload()
pipe.unet.enable_forward_chunking()
pipe.enable_attention_slicing()

# Load the conditioning image
image = load_image("./input.png")
image = image.resize((256, 256))

# generator = torch.manual_seed(42)
# frames = pipe(image, decode_chunk_size=8, generator=generator, num_frames=4).frames[0]
frames = pipe(image, decode_chunk_size=8, num_frames=2).frames[0]

export_to_video(frames, "generated.mp4", fps=7)

動かすためのポイント

基本的にはそのままでは動かせんません
メモリが足りずに「RuntimeError: Invalid buffer size:」のエラーになります
なのでメモリを節約するための設定をいれる必要があります

pipe.enable_model_cpu_offload()
pipe.unet.enable_forward_chunking()
pipe.enable_attention_slicing()

更にもっともメモリを使用するのは num_frames でこれは生成する動画のフレーム数を指定します
SVD num_frames で指定したフレームを一度に生成するのこの値が大きければ大きいほど動画はスムーズになりますが逆に生成速度とメモリ消費量は大きくなります
デフォルトだと25が指定されていますが25では80GBほどVRAMを使うので到底動きません

最低が2以上で1を指定すると以下のエラーとなります

RuntimeError: Sizes of tensors must match except in dimension 2. Expected size 1 but got size 2 for tensor number 1 in the list.

一応サンプルコードの数値は自分が M2 Pro mac mini で試した感じ生成スピード/消費メモリ/画質のトレーズオフで一番良かった数値になります

また画像のサイズは動画の生成速度にはほぼ影響しませんでした

最後に

M2 Pro mac mini で SVD を動かしてみました
num_frames=2 でしか動かなかったので正直かなり厳しいです
1フレームずつ生成して結合する方法もあるらしいのですがその場合はかなり動きが不自然になる可能性があるのでそれも微妙かなと思います

GPU は問題なさそうですがやはりメモリが明らかに足りていない感じです

参考サイト

0 件のコメント:

コメントを投稿