2026年5月4日月曜日

Launchdによる「自律起動」――Macを開けば、そこにAIがいる

 

【OS起動時の「透明な」自動化】

コマンドを叩いてサーバーを立てるのも一興だが、真の「達成感」は、Macを立ち上げた瞬間にすべての環境が整っている「透明な自動化」にある。

macOS標準のサービス管理システム launchd を使い、ログインした瞬間に M1 Max(リモート)と M4 Max(ローカル)の AI サーバーをバックグラウンドで目覚めさせる設定を組んだ。

1. M4 Max(ローカル:Qwen3.5)の plist 作成

まずはメイン機 M4 Max 自身で、爆速の qwen3.5-9b を立ち上げる設定だ。

ファイルパス: ~/Library/LaunchAgents/com.hidenari.qwen35.plist

----XML---
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.hidenari.qwen35</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/hidenari/models/llama-server</string>
        <string>-m</string>
        <string>/Users/hidenari/models/Qwen3.5-9B-Q8_0.gguf</string>
        <string>-c</string>
        <string>65536</string>
        <string>--ngl</string>
        <string>99</string>
        <string>--port</string>
        <string>8081</string>
        <string>--flash-attn</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>WorkingDirectory</key>
    <string>/Users/hidenari/models</string>
    <key>StandardOutPath</key>
    <string>/tmp/qwen35.log</string>
    <key>StandardErrorPath</key>
    <string>/tmp/qwen35_error.log</string>
</dict>
</plist>


2. M4 Max(Local):9Bを瞬時に立ち上げる

次に、手元のM4 Maxで、最新の Qwen3.5-9B を起動する。 /Users/hidenari/models/ に移動し

あえての wget で落とした GGUF を叩く。

------Bash-----
cd /Users/hidenari/models/ && ./llama-server \
-m Qwen3.5-9B-Q8_0.gguf \ -c 65536 \ --ngl 99 \ --port 8081 \ --flash-attn

M4 MaxとM1 Maxで挑む「自律型Terraform構築環境」の模索

 

【導入】

エンジニアを30年以上やってきた。 フリーランスとして、今も現場でキーボードを叩き続けているのは、何よりも「達成感」を味わいたいからだ。

今回、手元に届いた M4 Max (Mac Studio) をメイン機に据えるにあたり、これまで現役だった M1 Max を「引退」させるのではなく、「自分専用のローカルLLM推論サーバー」として再定義することにした。

GPTに頼り切るのではなく、完全にクローズドな環境で、インフラ構成(Terraform)を自律的に爆速で組み上げる。そんな「理想のエンジニアリング環境」を構築した記録だ。

【ハードウェア:M4 Max × M1 Max の重なり】

新旧のMac Studioが重なる姿は、エンジニアとしてのキャリアの積み重ねのようにも見える。 M1 Maxを llama.cpp サーバーとして稼働させ、M4 Max上の Continue(VS Code拡張)からSSH経由で命令を飛ばす。

この構成の肝は、電源アダプターすら不要なM4 Maxのパワーと、まだまだ現役でAIを回せるM1 Maxのメモリ帯域の共演にある。

【ソフトウェア:お作法を捨てた実戦ルール】

AI(Qwen)に指示を出す中で、一つ気づいたことがある。 AIは「シニアエンジニア」という役割を与えると、教科書通りの「綺麗なモジュール分割」をしようとして自滅するのだ。

サブディレクトリを掘り、変数を渡し、複雑な構造を作ろうとして、結果的にLLMのコンテキストを使い果たしてエラーを吐く。 「しんどそうだな、お前」 画面の中のAIに、思わずそう声をかけそうになった。

そこで私は、19項目の「行動規範(Rules)」を再定義した。

  1. モジュール分割の禁止: すべてをルート直下のファイル名(vpc.tf, ec2.tf等)で分ける「フラット構成」にする。

  2. 一気通貫の実行: フォルダ作成から validate まで、承認を待たずに一気に完遂させる。

  3. 日本語の徹底: 思考のノイズを減らすため、 Reasoning も含めてすべて日本語で行う。


ブログに技術的な裏付けを持たせるために、具体的な「足場」の部分を書き加えました。M1 Maxをサーバーにする際の実践的なノウハウとして、エンジニア読者が最も喜ぶセクションになります。


ブログ追加セクション案:M1 Maxを最強の推論サーバーに変える「足回り」

【採用モデル:Qwen2.5-Coder-32B】

今回、Terraform構築の相棒に選んだのは Qwen2.5-Coder-32B だ。 これまで数多くのモデルを試してきたが、コーディングにおける「正確性」と、HCL(HashiCorp Configuration Language)の構造を理解する「論理力」において、現時点でのローカルモデルとしては群を抜いている。

M1 Maxの広帯域なユニファイドメモリ(64GB搭載機であればなおさら)なら、このクラスのモデルも驚くほど軽快に、かつ深いコンテキストを持って動かすことができる。

【バックエンド:llama.cpp の起動戦略】

この Qwen を裏側で支えているのが llama.cpp だ。 ただ動かすだけではなく、M1 Max の GPU 性能を引き出し、かつ VS Code(Continue)からの要求に耐えうる「サーバー」として、私は以下のパラメータで叩いている。

Bash
./llama-server \
  -m models/qwen2.5-coder-32b-instruct-q4_k_m.gguf \
  -c 32768 \
  --ngl 99 \
  --host 0.0.0.0 \
  --port 8080

設定のポイント:

  • -c 32768: コンテキストサイズを 32k まで拡張。Terraform の複数ファイルを一気に読み込ませるには、デフォルトでは到底足りない。

  • --ngl 99: GPU(Metal)に全レイヤーをオフロード。M1 Max の GPU コアをフルに使い切るための「魔法の数字」だ。

  • --host 0.0.0.0: M4 Max からネットワーク越しに叩くため、バインド先を広げておく。

【「道具」を使いこなすという快感】

SSH で繋いだ M1 Max のターミナルでこのコマンドを叩き、サーバーが立ち上がるログが流れる。 その瞬間、昨日の主力機だった M1 Max は、現代最強の「コーディング専用ブレイン」に生まれ変わる。






Launchdによる「自律起動」――Macを開けば、そこにAIがいる

  【OS起動時の「透明な」自動化】 コマンドを叩いてサーバーを立てるのも一興だが、真の「達成感」は、Macを立ち上げた瞬間にすべての環境が整っている「透明な自動化」にある。 macOS標準のサービス管理システム  launchd  を使い、ログインした瞬間に M1 Max(リモ...