「重い処理はエディタを閉じてから」と言われても、その自動化はエディタの中で動いてるんですが

自動の動画パイプラインで、画像を手元のMacでローカル生成しています。16GBのM4。生成モデルは12Bパラメータ級(FLUX)で、4bitに量子化しても重みが ~7GBほど常駐します。

過去にこれでマシンを凍らせた教訓から、安全装置は入れてあります。開始前に空きメモリ50% を切っていたら生成を始めない(事前ゲート)。生成中に危険水位を割ったら、生成プロセスだけを落とす(watchdog)。 マシンは凍らせない、が最優先。

その安全装置が、見事に2回 仕事をしました。生成を殺して。

殺される。画像が出ない

ゲートは通る(空き51%)。なのに生成を始めた瞬間、空きが51→7% へ滑り落ち、watchdogが「危険」と判断して生成をkill。画像はゼロ。

マシンは無事です。安全装置は完璧に動いている。でも、欲しいもの(画像)が一個も出てこない。守られながら、何も作れない状態でした。

仮説1:「解像度を下げればいいのでは」→ 外れ

まず思いつくのは解像度です。出力を一回り小さくして再挑戦。

…またしても、単調に空きが落ちてkill。

ここで一つ分かりました。犯人は出力の大きさではなく、常駐する重みそのものだと。解像度を変えても、メモリの落ち幅はほとんど同じ。12Bの重みは、絵の大きさと関係なく最初にドンと載るからです。最初の仮説は、気持ちよく外れました。

実メモリを覗く。マシンはそもそも飢えていた

落ち着いて、実際のメモリ内訳を見ます。

PhysMem: 13G used (うち 3.6G は OS が握って離さない領域, 2.9G は既に圧縮済み)
真の空き: 2.7G
swap: 7.8G 使用中

平常運転で、もう余裕がない。しかも開発環境そのもの(エディタ+常駐プロセス)で ~3GB食っている。そこへ7GBの重みを載せようとすれば、そりゃ溢れます。

そして、ここで例の助言が刺さります。「重いステージはエディタを閉じてから」。ごもっとも。でも、この生成を回している自動化は、そのエディタの中で動いているんです。閉じたら自分が死ぬ。完璧な板挟みでした。

転換点は「7GBって下げられないの?」という素朴な問い

ここで方針が変わります。「7GBはFLUXの仕様なのか、それとも工夫の余地があるのか」。

生成ツールのオプションを端から読み直したら、量子化のレベルが3,4,5,6,8bitから選べると分かりました。自分は今4bit。つまり、もう一段 下げる余地がある。追加ダウンロードも要らない、いちばん安い実験です。

(ちなみに最初の検証は、自分がオプション名を取り違えて一回コケました。メモリの問題ですらなく、ただのタイプミス。原因調査の道中で、いちばん時間を溶かすのは大抵こういうやつです)

直して、3bitでエディタを開いたまま生成。…通りました。最低空き19% で完走。初めて、自分の作業環境を閉じずに画像が出た瞬間でした。

勝利のブログを書く前に、A/Bで犯人を確定する

ここで「3bitが銀の弾丸だった!」と書きたくなります。が、待ってください。直前に重いブラウザも閉じていた。効いたのは3bitなのか、メモリを空けたことなのか、切り分けていない

なので、空きが多い状態で、あえて元の4bitを回してみました。

条件開始空き生成中の最低空き結果ピーク消費(概算)
4bit / 余裕なし51%7% で停止kill~9GB
4bit / 余裕あり71%12%完走~9.4GB
3bit / 中くらい62%19%完走~6.9GB

読めてきました。真犯人は「開始時の空き不足」。ブラウザを閉じて開始を51→71% に上げれば、4bitでも通る。つまりメモリを空けたことが最大の効き目。

そのうえで、3bitはピークを実測で ~2.5GB削る(9.4→6.9GB)。必須ではないけれど、最低空きが12→19% に上がり、より少ない余裕でも・より多くのアプリを開いたままでも安全に回る。おまけに、画質の劣化は目視できませんでした。

ついでに気づいたおまけ:事前ゲートの50% は、この構成には少し甘かった。実ピークが ~9.4GBなら、生き残るには開始 ~57% 以上が要る。watchdogが2回 救ったのは、このゲートと実ピークのズレが原因でした。3bitにするとピークが ~6.9GBに下がり、50% ゲートがまた「正直」になる。だから3bitを既定にするのが筋でした。

学び

  • 安全に「拒否」する仕組みは、freezeを「計測」に変える。落ちてくれたおかげで、毎回 最低空きを観測できた。固まっていたら何も分からなかった。
  • いちばん それっぽい仮説(解像度)を、最初に手早く潰す。外れの確定も前進です。
  • 勝利のブログを書く前にA/Bする。直前に変えた要因が複数あるなら、手柄を取り違える。実際、主因は3bitではなく「メモリ解放」でした。
  • 見るべきは「モデルがデカいか」ではなく、「ピーク消費vs開始時の空き」のギャップ。両方を測って初めて、詰まりの正体が見える。

ローカル生成が「なぜか動かない/落ちる」とき、サイズに怯える前に、ピークと空きの両方の数字を取ってみてください。犯人は、たいていその差分に隠れています。