今回の環境では、M1 Max MacBook ProとM4 Pro Mac miniの2台をローカルAIワーカーとして使用します。

ただし、2台を常に同時稼働させるわけではありません。

その時間に普段の仕事で使用していない方のMacへ、記事生成や画像生成を担当させます。

運用方針

確定している運用は次のとおりです。

自宅で仕事をしている時間

  • 普段の仕事はMac miniで行う
  • MacBook ProをローカルAIワーカーとして使う

夜間や外出中

  • MacBook Proは停止するか持ち出す
  • Mac miniをローカルAIワーカーとして使う

Mac miniは普段の仕事中に多くのアプリを起動しているため、AIワーカーとして使う時間帯には、必要に応じて重いアプリを終了します。

64GBでもアプリを閉じる必要があるか

Mac miniは64GBのメモリを搭載していますが、普段の仕事中には45GB程度を使用しています。

この状態でも、必ずすべてのアプリを終了する必要はありません。

macOSでは、空いているメモリをキャッシュとして使用するため、単純な使用量だけでは不足しているか判断できません。

確認すべきなのは次の項目です。

  • メモリプレッシャー
  • スワップ使用量
  • モデル読み込み後の状態
  • 生成速度
  • アプリの応答
  • 異常終了の有無

生成中もメモリプレッシャーが緑で、スワップが大きく増えなければ、そのまま利用できる可能性があります。

黄色や赤になる場合は、次のような重いアプリを終了します。

  • 大量のタブを開いたブラウザ
  • Docker Desktop
  • 不要なDockerコンテナ
  • IDE
  • 複数のAIコーディングセッション
  • 仮想マシン
  • 画像編集アプリ
  • 使用していないローカルサーバー

両方のMacに同じ環境を用意する

どちらのMacでも同じジョブを処理できるように、基本的な環境を揃えます。

両方へ用意するものは次のとおりです。

  • Pythonワーカー
  • OllamaまたはMLX
  • ComfyUI
  • 使用するLLM
  • 使用する画像生成モデル
  • ComfyUIのワークフロー
  • 必要なLoRAや追加ファイル
  • 共通の設定ファイル
  • launchdの設定

ワーカーのプログラムはGitで管理します。

一方、容量の大きいモデルファイルはGitへ含めず、それぞれのMacへ個別にダウンロードします。

モデルのバージョンやファイル名は設定ファイルで管理し、2台の差異が分かるようにします。

最初は手動で切り替える

初期段階では、複雑な自動判定を実装しません。

自宅で仕事を始めるときは次の状態にします。

```text
MacBook Pro:ワーカー有効
Mac mini:ワーカー無効
```

外出前や就寝前は次の状態へ切り替えます。

```text
MacBook Pro:ワーカー無効
Mac mini:ワーカー有効
```

手動切り替えの方法としては、次の候補があります。

  • メニューバーアプリ
  • macOSのショートカット
  • シェルスクリプト
  • launchctlを使った開始と停止
  • ローカルの管理画面

初期実装では、シェルスクリプトやショートカットで十分です。

運用が固まってから、専用のメニューバーアプリを作る方法もあります。

同時に起動しても問題が起きない構成

切り替え忘れによって、両方のワーカーが同時に動く可能性があります。

そのため、同時稼働しても同じジョブを二重取得しないよう、VPS側でロックします。

どちらか一方だけを必ず動かすことに依存しない設計にします。

これにより、次のような使い方も可能になります。

  • Mac miniが記事生成
  • MacBook Proが画像生成
  • 2台で別々のジョブを並列処理
  • 一方が停止したらもう一方が引き継ぐ

初期運用は手動切り替えですが、基盤としては複数ワーカーへ対応させます。

スリープ対策

Macがスリープすると、ロングポーリングや生成処理も停止します。

AIワーカーとして使用している間は、システム全体が自動スリープしないようにします。

ただし、ディスプレイを常時点灯させる必要はありません。

次の状態が理想です。

  • ディスプレイは消灯可能
  • システムは稼働を継続
  • ネットワーク接続を維持
  • ワーカーを自動再起動
  • 再起動後も自動ログインに依存しすぎない

macOSのlaunchdを利用し、ワーカーが停止した場合やMacが再起動した場合に自動起動できるようにします。

MacBook Proのバッテリー対策

MacBook ProをローカルAIワーカーとして使う場合、バッテリーと発熱への配慮が必要です。

記事生成や画像生成は、CPU、GPU、メモリを継続的に使用します。

対策として次の運用を行います。

  • 充電上限を低めに設定する
  • 通気性のよいスタンドを使う
  • 高温の場所で長時間処理しない
  • 吸排気を塞がない
  • 不要なモデルを常駐させない
  • 夜間の長時間処理はMac miniへ任せる
  • バッテリー状態を定期的に確認する

MacBook Proは自宅で仕事をしている時間のワーカーとして使用し、常時稼働や夜間処理はバッテリーのないMac miniへ担当させます。

将来の自動切り替え

手動切り替えが安定した後は、自動化を検討できます。

例えば、ワーカーはVPSへ次の情報を送ります。

  • 稼働状態
  • 現在のメモリプレッシャー
  • 空きメモリ
  • CPU使用率
  • GPU負荷
  • 電源接続状態
  • バッテリー残量
  • 現在処理中のジョブ数
  • 対応できるモデル

VPSはこの情報をもとに、適切なワーカーへジョブを渡します。

例えば次のルールが考えられます。

  • MacBook Proがオンラインなら文章生成を優先
  • 夜間はMac miniを優先
  • Mac miniのメモリプレッシャーが高ければジョブを渡さない
  • 画像生成は速い方のMacへ渡す
  • バッテリー駆動中のMacBook Proには重いジョブを渡さない

ただし、自動切り替えは初期段階では追加しません。

まずは実際の使い方と性能を確認し、必要な条件だけを追加します。

まとめ

M1 Max MacBook ProとM4 Pro Mac miniを使い分ければ、普段の仕事を邪魔せずローカル生成AIを運用できます。

自宅で仕事中はMacBook Pro、夜間や外出中はMac miniをワーカーとして使います。

最初は手動で切り替えますが、VPS側では複数ワーカーに対応し、切り替え忘れや同時稼働があっても二重処理しない設計にします。

次回は、ローカルで生成した記事と画像をVPSへ返し、Payload CMSへ下書きとして登録するところまでを構築します。