1. イントロダクション
Apple Silicon(M1・M2・M3・M4)に最適化された oMLX は、既存の mlx 系フレームワーク(mlx-lm, mlx-vlm, mlx-audio など)を統合し、vllm(vllm-mlx) に似た API で操作できる点が魅力です。機能的にはPaged KV cacheやContinuous Batchingなど前回紹介させてもらったvllm-mlxと重なる面もありますが、Webダッシュボードやアプリベースのインストール&起動など、CLIが主体のvllm-mlxには無い使い勝手の良さがあるのが特徴です。
※韓国のデータエンジニアが中心になって開発されている模様。
この記事では、oMLX の特徴、インストール手順、サーバー起動、Python API での利用例、さらに OpenAI API 互換 でOpencodeやPentAGI等のAIエージェントに組み込むまでを順を追って解説します。
ポイント
- マルチモーダル対応(テキスト・画像・ビデオ・オーディオ)を同一エンジンで実行
- Metal/MPS GPU によるネイティブ高速化
- Paged KV Cache でメモリ効率を向上(RAMとSSDの両方を利用)
- OpenAI API 互換 で既存のツールやフレームワークと即座に連携
2. oMLX の概要
2.1 主な特徴
私自身は最大の特徴は使い勝手の良さだと思っており、最近ではmlx対応したOllamaよりoMLXを使う方が頻度が高くなっています。公式の特徴は以下の通りです。
| Feature | 説明 |
|---|---|
| マルチモーダル | 画像・音声・動画の入力・出力が可能 |
| Apple Silicon GPU | M1〜M4 の Metal (または MPS) をフルに活用 |
| 高速・省メモリ | vllm の Paged KV Cache による 1.14×高速化、80% メモリ節約 |
| 連続バッチング | mlx-lmのBatchGeneratorを通じて同時リクエストを処理、最大同時リクエスト数はCLIまたは管理パネルで設定 |
| OpenAI API 互換 |
http://localhost:8000/v1 で既存ツールがそのまま動作 |
| Python API |
vllm_mlx.models でシンプルにロード・生成 |
| デフォルトで 4bit/8bit 量子化 | HuggingFace からの軽量モデルが即使用可能 |
| oQ : oMLXユニバーサル動的量子化 | Apple Silicon向けのデータ駆動型混合精度量子化システムで,固定ルールやテンソル型に基づいてビットを割り当てるのではなく、oQはキャリブレーションによって各レイヤーの実際の量子化感度を測定し、データに基づいて最も重要と判断される場所にビットを割り当てます。 |
| ネイティブSwiftUIアプリ |
apps/omlx-mac/ に配置されておりXcode 26.5以降およびPython 3.11以降が必要です。venvstacks は開発用依存関係として定義されているため、pip install -e ".[dev]"(または uv sync --dev)を実行することで、固定されたバージョンが導入されます。また、ホスト環境全体で利用可能なツールランナーを使用したい場合は、ビルドスクリプトが uvx venvstacks や pipx run venvstacks をフォールバックとして利用するようになっています。 |
※ HaggingFaceではoQモデルはまだ少なく、試した感じではあまり差異を感じなかったのと、本格的にMacやiPhone向けのアプリ開発の予定は無いため、oQとネイティブSwiftUIアプリには基本手を出せていません。
2.2 利用シナリオ
| 用途 | 具体例 |
|---|---|
| ローカルサーバー | 企業内でのプライベート LLM 配備 |
| リモート利用 | ローカルLLMをAPI経由でリモート利用 |
| Python 内でのラッパー | エージェント(例: OpenAI Client の置き換え) |
| 開発・デバッグ | テスト時に即座に API 呼び出しで結果確認 |
| マルチモーダル | チャット+画像・音声生成を同時に扱うシステム |
3. oMLX のインストール
3.1 MacOS App(一番簡単かつ維持管理も楽でお勧め)
ここから.dmgファイルをダウンロードし、アプリケーションフォルダにドラッグ&ドロップするだけで完了です。アプリには自動アップデート機能が組み込まれているため、今後のアップグレードもワンクリックで行えます。また、軽量なCLIシム(~/.omlx/bin/omlx)もインストールされるため、ターミナルコマンドや「ショートカット」アプリから、このアプリが管理するサーバーを操作することが可能です。
3.2 Homebrew
brew tap jundot/omlx https://github.com/jundot/omlx
brew install omlx
# Upgrade to the latest version
brew update && brew upgrade omlx
# Run as a background service (auto-restarts on crash)
omlx start
3.3 ソースコードからインストール
git clone https://github.com/jundot/omlx.git
cd omlx
pip install -e . # Core only
pip install -e ".[mcp]" # With MCP (Model Context Protocol) support
4. oMLXの使い方
4.1基本的な使い方
公式Gitbhubに日本語での説明もあるので、macOSアプリやCLIでの使い方はそちらを参照して下さい。ここではMacOSアプリの使い方の概要説明に留めます。
⑴ ダッシュボード:アプリ起動→Open Web Dashboardを選択→ブラウザでダッシュポード画面が起動
・ローカルLLMモデルの設定・読込み・切替:temperature等のパラメータの設定やThinkingモードの設定等
・LLMサーバーの設定・再起動:メモリ確保の方法、API_keyの設定等
・サーバーログの確認
⑵ Chat with oMLX:チャットUIがブラウザで起動し、⑴で設定したモデルを使って会話できます。マルチモーダルモデルでは画像の取り込みも可能ですが、Ollamaのような外部とのインターネット接続は現在不可です。
⑶ Setting...:⑴の簡易版的なアプリウィンドウが起動。機能的には⑴とほぼ共通。
Ollama.appとの比較では、速度面ではoMLXの方が速く、安定性ではOllamの方が優位だがメモリ管理をある程度最適化できればoMLXでも安定して動く感じです。またモデルの遠隔切替(サーバー再起動含む)、ログの確認、同時接続処理の面でoMLXが優っていると思います。
4.2 AIエージェンでの使いこなし術
ここからがoMLXの使い勝手の良さが発揮される場面です。今回はコード生成のOpenCodeと、ペネとレーションテスト用のPentAGIでの連携方法をご紹介します。
⑴ OpenCode
OpenCodeのモデル設定は.config/opencode/opencode.jsonで行います。モデルは複数設定可能で、下記は2番目に具体的なモデル例を記載してます。
{
"$schema": "https://opencode.ai/config.json",
"model": "gpt-oss-20b",
"provider": {
"oMLX": {
"models": {
"<mlxモデル名>": {
"_launch": true,
"name": "<mlxモデル名>",
"limit": {
"context": 32768, #モデルに合わせて設定して下さい
"output": 8192 #モデルに合わせて設定して下さい
}
},
"gpt-oss-20b": {
"_launch": true,
"name": "gpt-oss-20b",
"limit": {
"context": 32768,
"output": 8192
}
}
},
"name": "oMLX",
"npm": "@ai-sdk/openai-compatible",
"options": {
"baseURL": "http://localhost:8000/v1", #Port番号はoMLXと一致させる
"apiKey": "XXXXXX" #oMLXで設定したapi_keyを設定
}
}
}
}
これでOpenCodeを起動して、/modelsでモデルを選択すれば使えるはずです。
⑵ PentAGI
PentAGIはペネトレーションテストをAIで自律的に実行するツールです。Mac本体にインストールして使うことも可能ですが、UTM等の仮想環境のSandBox内で利用する方が安全ですので、今回はUTMでUbuntu26.04を立ち上げ、ここにPentAGIをインストした前提で、oMLXとの設定方法を紹介します。
PentAGIのモデル設定は、.envファイルで行います(最初の設定はinstallerを立ち上げて設定しますが、次回の変更は.envの方が楽です)。oMLXの場合OpenAI互換なので、##Custom LLM providerに必要な設定を行います。
...
## Custom LLM provider
LLM_SERVER_URL=http://192.168.64.1:8000/v1 #UTMでは192.168.64.1を使用する
LLM_SERVER_KEY=xxxxxx #oMLXで設定したapi_keyを設定
LLM_SERVER_MODEL=<mlxモデル名>
LLM_SERVER_PROVIDER=omlx
LLM_SERVER_CONFIG_PATH=
LLM_SERVER_LEGACY_REASONING=
LLM_SERVER_PRESERVE_REASONING=
...
Macに直接PentAGIをインストした場合はlocalhostが使えますが、UTM等の場合は192.168.64.1でホスト側のローカルホストに接続します。これでPentAGIを
docker compose up -d
で立ち上げて、providerの設定を.envファイルと同じモデル名で設定すれば動くと思います。
ちなみにMac mini M4 24GBでは、gemma4-26bかgpt-oss-20bがお勧めのモデルになりますが、pentAGIを使う場合はgemma4-26bだと自粛モードになり処理が止まる確率が高いので、gpt-oss-20bが最も精度が良かった印象です。但し画像のOCR等の処理もしたい場合はgemma4-26bかgemma4-12bですね(Qwen等も優秀ですがそろそろ国家統制が厳しくなりそうな感じ...?)。
4.3 ローカルLLMとのリモート接続
これはセキュリティリスクのある使い方になるので、全ての方にお勧めするつもりはないのですが、自分は自宅のMac miniのoMLXで起動した比較的大きなローカルモデルを、リモートで非力なMacBookAir(8GBメモリ😢)で利用したかったのでこの方法を試しました。
結論から言うとMac mini側でngrokを使いローカルポートを公開し、そこにリモート接続する方法で快適なノマドAIワークが可能になりました。必要な設定とセキュリティ対策は下記のようになります。
⑴ oMLX側の設定
事前にoMLXのサーバーのリモート対応用の設定をします。
・Open Web Dashboard → 設定 → グローバル設定:
>認証と情報欄で、APIキーを設定
>サーバー欄で、ホスト → 全体公開(0.0.0.0)を選択、ポート → ポート番号を設定
>リソース管理欄で、 メモリ → モデルに合わせてsafe/Balanced/Aggressiveを選択
>NETWORK欄で、必要があればproxyを設定します
実際のリモート接続はVPNかngrokで接続すると思いますが、ホスト(サーバー)側のURLを控えておきましょう。
⑵ リモート端末側の設定
opencodeの場合は"localhost:8000/v1"の部分を"<ホスト側のURL>:/v1"に置き換えます。また、pentAGIの場合も"192.168.64.1:8000/v1"の部分を"<ホスト側のURL>:/v1"に置き換えて下さい。
⑶ セキュリティ留意点
API_keyの設定、独自ポート番号の使用、リモート接続利用時以外はVPN接続やngrokを解除する等は最低限のセキュリティ対策かと思いますが、くれぐれもインシデントを発生させないよう自己責任でお願いします。セキュリティ対策に自信の無い方や、きめ細かな設定変更作業が面倒な方にはお勧めしません。
5. まとめと今後について
今回は前回のvllm-mlxの発展形として、Mac向けのローカルLLMアプリであるoMLXの使いこなし方について紹介させてもらいました。Ollamaもmlx対応がされ推論速度等の改善されたようですが、やはりApple Siliconではmlxの方が推論速度やメモリ管理のアドバンテージがあるのではないかと思います。oMLXにはリモートでもモデル切替やサーバーログ確認ができるダッシュボード機能もあるので、色々と重宝してます。
今後はモデルの新しい量子化手法も増えて来ているので、今回のoQ含めて比較して最適な手法を整理できたらと考えてます。