きっかけ:フタを閉じるとローカルLLMが止まる
Mac(Apple Silicon)でローカルLLMを回すのが当たり前になってきました。Ollama や LM Studio、MLX で長時間の推論・学習・バッチ処理を流す。ところが困るのが、**「実行中にMacBookのフタを閉じると強制スリープしてジョブが止まる」**問題です。
外部ディスプレイをつなげばクラムシェルで動きますが、モニタもケーブルも無い外出先・就寝時はそうもいかない。「AIを回したまま、フタを閉じて持ち運びたい/放置したい」——この地味だけど切実な要求を満たすために、macOSアプリを個人開発しました。
なぜフタを閉じると寝てしまうのか
macOSは、外部ディスプレイを接続していない状態でフタを閉じると、システムレベルで強制スリープします(クラムシェルスリープ)。アプリ側の IOPMAssertion(caffeinate 相当)でアイドルスリープは防げますが、フタ閉じによる強制スリープはこれでは止まりません。
低レベルで効くのが以下です。
sudo pmset -a disablesleep 1 # スリープ全体を無効化(フタ閉じでも起きたまま)
sudo pmset -a disablesleep 0 # 元に戻す
SleepDisabled 1 にすると、外部ディスプレイなし・電源なし(バッテリー駆動)でもフタを閉じたまま動作します。これがコアの仕組みです。
pmset 直叩きの問題点
ただ、これを手動運用するのはつらい。
-
オールオアナッシング:スリープ全体が無効。切り戻し(
0)を忘れると電池が溶ける - sudo必須:毎回パスワード
-
フェイルセーフが無い:シェルが落ちても
1のまま残る - タイマーが無い:「2時間だけ」ができない
そこで、この運用を安全にラップするアプリを作りました。
作ったもの:StayAwake Clamshell
-
特権ヘルパー方式:初回だけ管理者パスワードで小さなヘルパーを設置。以降はメニューバーアプリからXPCで安全に
disablesleepを切り替え(アプリ本体は非特権) - 自動復帰タイマー:10分〜8時間/無期限。指定時間で通常スリープへ自動復帰
- バッテリー保護:残量が閾値(10〜30%)を下回ったら自動停止
- フェイルセーフ:アプリがクラッシュ/終了してもヘルパーが接続断を検知して必ず通常スリープへ復元。「起きっぱなしで固まる」ことが無い
- 完全オフライン:ライセンス検証はEd25519でローカル完結。ネットワーク通信は一切なし。Apple公証済み(macOS 13+ / Apple Silicon・Intel)
こんな使い方
- Ollama / LM Studio で夜通し推論を回したままフタを閉じる
- MLX の学習・ファインチューニングを継続したまま移動
- 大量のバッチ推論や動画書き出し、長時間ダウンロードの完走
注意(放熱と電源)
フタを閉じると排熱が悪化します。高負荷を続けるときは電源に接続し、通気のよい固い面に置いてください(布団やクッションの上はNG)。バッテリーのみでも動きますが、当然消費は早いです。
配布
買い切り ¥1,500(台数無制限・オフライン認証)、7日間の無料トライアルつき。App Store はサンドボックスで pmset を叩けないため、直販のみです。
手動派の方は、上の pmset -a disablesleep 1 がすべての本質です。パッケージ版は「タイマー・バッテリー保護・フェイルセーフ・GUI」の手間を肩代わりするもの、という位置づけです。
※この記事はZennにも投稿しています: https://zenn.dev/mioshoten/articles/b4d401a31711a1