見出し画像

【中編】高いグラボなしでAI動画は無理? Google Colab無料T4-起動時の4GB待ちをGoogle Drive置機で避ける方法

無料のGoogle Colaboratory(以下、Colab)でStable Diffusionを触っていると、誰もが一度は直面する「地味に一番しんどい瞬間」があります。

せっかく環境を作って動かしたのに、セッションが切断され作業ファイルが跡形もなく消える。次回起動したときには、また数GBもある重たいモデルファイルを最初からダウンロードし直さなければならない……。進捗バーを眺めながら、「今日はこの待ち時間だけで夜が終わってしまうのか」とため息をついた経験がある方も多いのではないでしょうか。

前回の記事(Colab無料T4でAnimateDiffを動かし、猫が歩く短尺を検証)でもその洗礼を受けました。動画生成の成功直後に接続が切れ、/content 領域ごとすべて吹き飛んだのです。

「コードのcloneは毎回やり直してもいいけれど、せめて数GBのモデルだけは再ダウンロードしたくない」。

そこで今回は、初回にダウンロードしたCheckpointとモーションモジュールをGoogle Driveへ保存し、WebUIからはシンボリックリンク経由で参照する構成を検証しました。

今回の検証の約束はただ1つ、「起動のたびに4GBのモデルを取り直さないこと」です。


1. なぜ「Driveへ全移行」ではなく「モデルだけリンク」なのか

本題に入る前に、Colabのストレージ仕様と今回の方針について整理しておきます。

/content は消えるが、Drive丸ごとは遅すぎる

Colabの既定の作業領域である /content は、高速なローカルSSDですが、ランタイムが切断されたり再起動したりすると中身が初期化されます。

では、「WebUIの環境ごとすべてGoogle Driveにインストールすればいいのでは?」と考えるかもしれません。しかし、Google Driveをマウントした領域は大量の細かいファイルへのアクセス(I/O)が非常に遅いという弱点があります。何千・何万ものPythonスクリプトやvenvの依存ライブラリをDrive上に置くと、起動やインポートだけで途方もない時間がかかってしまいます。

そこで採用したのが、「WebUI本体は毎回 /content に高速にクローンし、容量の大きいモデルファイルだけGoogle Driveからシンボリックリンクで参照する」というハイブリッド構成です。

今回対象にした大容量ファイルは以下の2つです。

  • Checkpoint: v1-5-pruned-emaonly.safetensors(約4.27GB)

  • モーションモジュール: mm_sd_v15_v2.ckpt(約1.82GB)

本体はGoogle Drive内の MyDrive/sd-models/ に一度だけ保存しておき、Colab起動時に /content 側の所定フォルダへリンクを張ります。


2. 何を動かしたか:実録ステップと検証結果

実際の作業手順と、ログで確認できた成果です。

①. Driveマウントと初回ダウンロード

まずGoogle Driveを /content/drive にマウントし、保存用ディレクトリを作成しました。その上で、初回だけモデルのダウンロードコマンド(wget)を直接Driveのフォルダ宛てに実行しました。

ファイル確認セルを実行したところ、以下の通り正常に保存されていることが確認できました。

  • v1-5-pruned-emaonly.safetensors: OK(4.27 GB)

  • mm_sd_v15_v2.ckpt: OK(1.82 GB)

②. WebUIの準備とシンボリックリンクの作成

続いて、/content 配下にAUTOMATIC1111版WebUIとAnimateDiff拡張を通常通りクローンして用意します。

その上で、Pythonスクリプトを用いてDrive上のモデルからWebUI側の配置場所(models/Stable-diffusion/ および extensions/sd-webui-animatediff/model/)へシンボリックリンクを張りました。

出力ログには、

link: ... -> .../sd-models/... exists=True

という判定が2行表示され、WebUI側からDrive上の実体が正常に見えていることが確認できました。

③. WebUI起動と「Downloading」消失の確認

前回同様、公式リポジトリのミラー指定と MPLBACKEND=Agg をセットして起動スクリプトを実行しました。無事にGradioの公開URL(今回は https://9cd118249ff268401f.gradio.live)が発行されました。

そして、今回もっとも確認したかった起動ログをチェックしました。前回表示されていた、

Downloading: "...v1-5-pruned-emaonly.safetensors"

という4GB超のネットワークダウンロード行が、今回は完全に消えていました

ログには Calculating sha256 のあと、即座に Loading weights ... from .../v1-5-pruned-emaonly.safetensors と続き、Model loaded in 113.8s(うちディスクからの読み出しは1.5s)で完了しました。インターネットから再取得せず、Google Driveのリンクから直接重みを読み込めた証拠です。

3. どこで詰まったか:直面したトラブル(生ログ)

今回も一発ですべて通ったわけではなく、2つのつまずきがありました。

①. リンクセルの NameError

シンボリックリンクを張るPythonセルを実行した際、以下のエラーが発生しました。

NameError: name 'src' is not defined

ループ処理の定義前に src.name を参照してしまっていたコードの記述ミスが原因でした。変数の参照順序を修正したスクリプトに差し替えることで、無事に解決しました。

②. クローン完了前の先走り起動

WebUIのクローンとvenv作成セルが完了する前に焦って起動セルを実行してしまい、./venv/bin/python: No such file or directory で停止しました。

当たり前のことではありますが、作業を急いでいるとやってしまいがちです。実行順序は「環境用意 → リンク作成 → 起動」を徹底する必要があります。

4. 実測数値と、改善したこと/していないこと

今回の検証で計測できた数値は以下の通りです。

  • Google Drive上のモデル容量: Checkpoint 4.27GB / モーション 1.82GB(合計 約6.09GB)

  • 今回のStartup時間: 414.5秒

  • Model loaded時間: 113.8秒(うち disk読み出し 1.5秒)

  • 判定結果: 起動時の4GBモデル Downloading 行が完全に消失

ここで正直に書いておくべきなのは、「何が解決し、何が未解決のままか」です。

今回解決したのは、あくまで「セッションが切れるたびに数GBのモデルを再ダウンロードする無駄な時間と通信量」です。動画の画質や、猫の顔がフレームごとにブレる問題は、前回と同じ課題としてそのまま残っています。

また、今回の起動時間(Startup 414.5秒)が前回の157.4秒より長く見えますが、これは新しいランタイムでPyTorch等の依存パッケージを初回インストールした時間を含んでいるためです。Driveに置いたことが原因で遅くなったわけではありません。

5. 明日やる人向けの急所とColabセル

Colab無料枠でモデルをDriveに退避して動かす場合、押さえるべきステップは以下の5点です。

  1. Google Driveをマウントする

  2. 初回だけ sd-models フォルダに直接モデルをダウンロードする(確認でOKが出るまで待つ)

  3. WebUIを /content に用意する

  4. シンボリックリンクを張る(exists=True が2行出ることを確認)

  5. 起動する(成功の目印は Downloading: ...safetensors が出ないこと)

以下に、今回実際に使用した確認用・リンク用のセルをまとめました。

```python

セルA: Google Driveのマウントと保存先フォルダ作成

from google.colab import drive
import os

drive.mount('/content/drive')

os.makedirs('/content/drive/MyDrive/sd-models/Stable-diffusion', exist_ok=True)
os.makedirs('/content/drive/MyDrive/sd-models/animatediff', exist_ok=True)

セルB: 初回のみモデルをDriveへダウンロード(約6GB。初回だけ実行)

%cd /content/drive/MyDrive/sd-models/Stable-diffusion
!wget -c -O v1-5-pruned-emaonly.safetensors "https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.safetensors"

%cd /content/drive/MyDrive/sd-models/animatediff
!wget -c -O mm_sd_v15_v2.ckpt "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v15_v2.ckpt"

セルC: シンボリックリンクの作成(WebUI用意後に実行)

import os

pairs = [
    (
        "/content/drive/MyDrive/sd-models/Stable-diffusion/v1-5-pruned-emaonly.safetensors",
        "/content/stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.safetensors"
    ),
    (
        "/content/drive/MyDrive/sd-models/animatediff/mm_sd_v15_v2.ckpt",
        "/content/stable-diffusion-webui/extensions/sd-webui-animatediff/model/mm_sd_v15_v2.ckpt"
    )
]

for src, dst in pairs:
    os.makedirs(os.path.dirname(dst), exist_ok=True)
    if not os.path.exists(dst):
        os.symlink(src, dst)
    print(f"link: {dst} -> {src} exists={os.path.exists(dst)}")

セルD: 起動(ミラー指定 + MPLBACKEND対策)

%cd /content/stable-diffusion-webui

import os

os.environ["STABLE_DIFFUSION_REPO"] = "https://github.com/w-e-w/stablediffusion.git"
os.environ["MPLBACKEND"] = "Agg"

!./venv/bin/python launch.py --share --enable-insecure-extension-access --xformers

ログに Running on public URL: が出れば起動完了です。次回以降はセルB(ダウンロード)をスキップし、「マウント → WebUI用意 → リンク作成 → 起動」だけで、モデルのダウンロード待ちなしに作業を再開できます。

6. おわりに

Google Colaboratoryの無料枠と付き合うコツは、「切れてもいいもの(使い捨てのコード領域)」と「切れたら困るもの(重たいモデル資産)」をきれいに切り分けることです。

これだけで、セッション切断におびえたり、長時間のプログレスバーをぼんやり見つめるストレスから解放されます。

次回は、海外の無償GPU枠(Hugging Face ZeroGPUなど)との使い勝手の比較に進む予定です。

続きの検証ログや生のエラーログを追いたい方は、ぜひフォローしていただけると励みになります。

#Google Colab #Google Drive #Stable Diffusion #AnimateDiff #Colaboratory

いいなと思ったら応援しよう!