実行プログラムと拡張機能

LocalsでMacのコーディングエージェントを同時に複数動かす

エージェントを複数立ち上げると、Macが担う量が変わります

LocalsはGenerated Computersが作ったMac向けのローカル推論サーバーです。1回のチャットではなく、エージェントが送るツール呼び出し1、ターンごとに伸びるプロンプト2、同時に走る複数のリクエストを前提に作られています。OpenAI互換とOllama互換のアドレスを同時に開くため、OpenCode、Cline、Aider、Claude Codeなどのツールをそのまま接続できます。M2 Pro 16GBでQwen3.5-4Bを8リクエスト同時に送ったとき、毎秒87トークン3が271トークンに増えたと公表しています。ただしリクエストが1つのときはmlx-lm4とほぼ同じで、2026年10月12日に公開された初期のプロジェクトです。

実行条件と要点
  • 複数エージェントのリクエストをひとまとめに計算するMac向けローカルサーバーです。
  • OpenAI互換とOllama互換のアドレスを同時に開くため、既存ツールをそのまま使えます。
  • M2 Pro 16GBで8リクエストを同時に送ると、毎秒271トークンを記録しました。
  • リクエストが1つのときはmlx-lmとほとんど差がありません。

エージェントが複数になるとチャットとは条件が変わります

LocalsはMacの中でAIモデルを動かし、他のプログラムからのリクエストに答えるサーバーです。ターミナルのコマンド1つでMacのメモリに合うモデルを起動し、そのフォルダで開くコーディングエージェントをこのモデルに接続します。モデルと会話する画面ではなく、複数のエージェントが同じモデルにリクエストを送っても処理量が大きく落ちないように作られた点が、このプログラムの目的です。

エージェントはチャット欄に1行送るのとは動きが違います。ファイルを読みコマンドを実行するためにツールを呼び出し、その呼び出しが決まった形式で返らないと次の段階に進めません。会話が長くなるほどプロンプトも長くなり、コーディング assistant は補助エージェントを同時に複数立ち上げます。通常のMac向け推論ツールはこの状況を前提に作られていないため、リクエストが重なると1件ずつ処理するより遅くなります。

ノートPCの画面にチャットウィンドウ、コードエディタ、ファイル一覧が並び、3つから出た線が画面下部の積み重なったモデルブロックに集まっています。
チャットとコード、ファイル作業が1つのローカルモデルに集まる構成が、エージェントを複数動かすときの基本になります。

インストールしてサーバーを用意します

Appleシリコン(M1以降)とmacOS 14以降が必要です。メモリ16GBなら既定のモデルがよく合い、8GBならより小さいモデルを選びます。インストールスクリプトを実行するか、uvでPyPIから取得します。

インストール
curl -LsSf https://raw.githubusercontent.com/Generated-Computers/Locals/main/install.sh | sh
uvでインストール
uv tool install --python 3.12 locals

プロジェクトフォルダで初回実行します

新しいターミナルウィンドウでプロジェクトフォルダを指定して実行します。

プロジェクトを開く
locals code ~/my-project

初回はMacのメモリに合うモデルを約3GBダウンロードしてバックグラウンドで起動し、そのフォルダでOpenCodeを開きます。ダウンロードが終わったらエディタでファイルを1つ開き、小さな修正を頼んで最初の回答が出るか確認してください。モデルファイルと会話履歴はMacの外に出ません。

すでに使っているエージェントに接続します

OpenCodeはlocals setupで一度接続すれば、モデル一覧からLocalsを選べます。VS Code拡張やZed、JetBrainsのようにOpenAI互換プロバイダーを扱えるツールは、サーバーアドレスを直接入力します。

Ollama形式だけを扱うアプリはlocals launch ollamaで接続します。Open WebUIやRaycastのようにOllamaをサポートするアプリは、アドレスを別途入力する必要がありません。

エディタでOpenAI互換プロバイダーを選ぶときに入れる値
設定項目入力する値
サーバーアドレスhttp://127.0.0.1:8321/v1
APIキー任意の文字列(例: local)
モデル名locals/qwen3.5-4b
コンテキスト長locals launch editorが表示する値

サーバーアドレスとモデル名はlocals launch editorを実行すると、いま動いているモデル基準で再表示されます。

サーバーはターミナルウィンドウを閉じても動き続けます。locals statusで状態を確認し、locals stopで停止します。同じエージェントを別のサーバーと使い分けるときはlocals disconnect opencodeで設定を戻します。

モニターの隣に扉の開いた灰色の収納庫があり、中に色のブロックが積み重なっています。収納庫から出た色の管は右の紙の束へ伸び、床には同じブロックがいくつか散らばっています。
モデルを一度載せておけばターミナルウィンドウを閉じてもサーバーは残り、次のリクエストは起動し直さずにすぐ答えが返ります。

同時に何件送ると速くなるのか

M2 Pro(19コアGPU5)と16GBのMacBook Proで、Qwen3.5-4Bを4ビットで動かした測定です。リクエストが1件のときはmlx-lmと近い値ですが、同時に送る数が増えるほど差が開きます。

左右にスクロールして各項目を比較できます。

同時リクエスト数ごとの毎秒トークン(M2 Pro 16GB、Qwen3.5-4B 4ビット)
同時リクエスト数mlx-lmLocals倍率
161641.0x
2821161.4x
4871601.8x
8872713.1x
161573412.2x

条件はMacBook ProのM2 Pro 19コアGPUと16GB、Qwen3.5-4Bの4ビット、MLX6 0.32で、2つのツールを同じプロセス内で比較しました。同じモデルをサーバーAPI7経由で呼び出してクライアント側で数えると、8件同時で毎秒244トークンとなり倍率は3.2倍でほぼ変わりません。

倍率が大きくなるのは、リクエストを別々に計算しないためです。複数エージェントのリクエストをひとまとめにしてGPUに載せ、1回の計算で処理し、そのバッチサイズ8に合わせたカーネルを別に用意します。ツール呼び出しを書く段階でもGPU上で形式の規則を強制するため、形式がずれてやり直す回数が減ります。

他のサーバーと同条件で比べた値もあります。1,000トークンのプロンプトを8件同時に送ったとき、最初のトークンまでの時間はLocals 1.6秒、llama.cpp 2.1秒、Ollama 41.8秒で、毎秒トークンは110、71、34でした。

速くならない場合もはっきりしています

リクエストを1件だけ送り再利用するものがない場合、差はほとんどありません。同じM2 Proで毎秒64トークンと、mlx-lmの61トークンに近い値です。回答がプロンプトを書き直す作業やプロンプトキャッシュが当たるときは、1件でも速くなります。

プロンプトを読む作業はGPUの演算量に縛られます。8,000トークンのプロンプトを8件同時に送ると毎秒57トークンまでしか出ません。時間の大半がプロンプトの読み込みに使われるためです。

4ビットaffine量子化9(グループ64)に合わせたカーネルのみ調整されています。mxfp4などの他の形式はmlx-lmと同じ速度で動きます。M5のニューラルアクセラレータはMLX自身のカーネルがすでに使っているため、倍率は1.5倍まで下がります。

メモリに合わせてモデルを選びます

モデルは同時に1つだけ動きます。locals start --model lfmのように名前を付けて切り替え、いま動いているモデルはlocals statusで確認します。

左右にスクロールして各項目を比較できます。

モデル別のファイルサイズと毎秒トークン(M2 Pro 16GB、8件同時)
モデル起動オプションファイルサイズmlx-lmLocals
Qwen3.5-4B(既定)--model qwen2.8GB87271
LFM2.5-2.6B--model lfm1.5GB144404
MiniCPM5-2B--model minicpm1.3GB160478
Gemma 4 E4B--model gemma4.8GB80224

8件同時に送った値で、既定値はMacのメモリによって変わります。12GB未満ではQwen3.5-2Bが既定になります。

メモリが24GB以上ならFlint(総40B、トークンあたり2.5Bが有効)を選べます。ファイルは17.8GBで、M4 Pro 24GBでは1件で毎秒115トークン、8件同時で264トークンでした。24GBのMacはGPUに16GBしか渡さない場合があり、locals startが増やす方法を案内します。

長い作業ではLOCALS_KV_BITS=8を付けてキーと値を8ビットで保持します。Flintではリクエスト長が約35,800トークンから67,584トークンに伸び、書き出し速度は4〜13%遅くなります。

Mac miniにケーブルがつながれ、ふたの開いた箱の中に色のブロックがぎっしり詰まっています。箱から出た色の管は、ネットワーク図、写真、波形、文書が載った4つのトレイへ伸びています。
メモリに載るモデルの大きさが、同時に受けられるリクエスト数とコンテキスト長を決めます。

初期のプロジェクトなので確認する点があります

リポジトリは2026年10月12日に公開され、10月25日時点のPyPI最新版は0.2.1です。コマンド名や既定モデルがまだ速く変わる段階なので、インストールしたバージョンでlocals --helpが表示するオプションを基準にしてください。

サーバーはこのMacの中からのリクエストだけを受け取り、外部には開きません。locals runで複数エージェントを動かすときはエージェントごとにプロジェクトの複製を渡し、テストが通ってから元のフォルダが変わります。

同じツールを呼び続けたり同じ文を繰り返したりする場合を検知して止める仕組みがあり、メモリ不足で中断する状況を防ぐ保護も入っています。

Apache 2.0で公開され、計算方法はarXiv 2610.09139の論文にまとまっています。

用語の注釈

  1. ツール呼び出し — ファイル読み取り、検索、コマンド実行などの外部機能を、名前と引数でモデルが要求する形式です。実行の有無はエージェントランタイムと権限設定が決めます。

    本文に戻る
  2. プロンプト — モデルに送る入力文です。生成モデルでは作りたい結果を説明する文になり、出力の構成や内容を大きく左右します。

    本文に戻る
  3. トークン — モデルが入力や出力を分けて処理する単位です。

    本文に戻る
  4. MLX-LM — MLXを使い、言語モデルの読み込み・推論・微調整を行うパッケージです。

    本文に戻る
  5. GPU — 多くの計算を並列に処理するプロセッサーです。AIモデルの実行ではモデル計算を担います。

    本文に戻る
  6. MLX — Appleが開発する機械学習フレームワークで、Apple SiliconのCPUとGPUが共有するメモリを使ってモデルを実行します。

    本文に戻る
  7. API — 別のコードからプログラムの機能を呼び出すための決められたインターフェースです。

    本文に戻る
  8. バッチサイズ — 1回の処理単位にまとめる入力またはリクエストの数です。

    本文に戻る
  9. 量子化 — モデルの重みや計算値を少ないビット数で表し、保存容量やメモリ使用量を減らす方法です。表現が粗くなるため、精度にも影響することがあります。

    本文に戻る

よくある質問

この記事で最初に確認すべきことは何ですか?
LocalsはGenerated Computersが作ったMac向けのローカル推論サーバーです。1回のチャットではなく、エージェントが送るツール呼び出し、ターンごとに伸びるプロンプト、同時に走る複数のリクエストを前提に作られています。OpenAI互換とOllama互換のアドレスを同時に開くため、OpenCode、Cline、Aider、Claude Codeなどのツールをそのまま接続できます。M2 Pro 16GBでQwen3.5-4Bを8リクエスト同時に送ったとき、毎秒87トークンが271トークンに増えたと公表しています。ただしリクエストが1つのときはmlx-lmとほぼ同じで、2026年10月12日に公開された初期のプロジェクトです。
必要なメモリはどのくらいですか?
Appleシリコン(M1以降)とmacOS 14以降が必要です。メモリ16GBなら既定のモデルがよく合い、8GBならより小さいモデルを選びます。インストールスクリプトを実行するか、uvでPyPIから取得します。