
【Strands Decider】M5 の Mac(16GB)で動かして、MPS・MLX・CPU の速度とメモリを測ってみた
こんにちは、けーまです。
Strands Decider 2B は、選択肢から1つ選ぶ・Yes/No の確率を返す・段階で評価する、の3種類の判定だけを行う小型モデルです。
2B なので手元の Mac でも動きます。
本記事では、M5 の Mac(メモリ16GB)で ask と serve の2つの呼び方、MPS・MLX・CPU の3つの実行方法を試し、速度とメモリを測りました。
0. 前提環境
| 項目 | 内容 |
|---|---|
| マシン | Apple M5、メモリ16GB、macOS 26.6.2 |
| Python | 3.12.13(uv 0.11.3 で venv を作成) |
| strands-decider | PyPI 版 0.1.0(torch 2.14.1、transformers 5.18.0)、MLX はリポジトリの 75c9fd3 |
| モデル | StrandsAgents/strands-decider-2B-hobson-v19 |
1. インストール
mkdir -p ~/work/tools/strands-decider && cd ~/work/tools/strands-decider
uv venv sd-venv --python 3.12
VIRTUAL_ENV=sd-venv uv pip install strands-decider
モデルは初回の呼び出し時に Hugging Face から取得されます。
2. ask で1回だけ聞く
sd-venv/bin/strands-decider ask StrandsAgents/strands-decider-2B-hobson-v19 \
--state "支払いが3日間失敗し続けています。至急対応してください!" \
--choice "どのチームが対応すべきか?=請求,営業,店舗" \
--noul "緊急性を伝えているか"
# 出力例
noul_0 noul = 0.916
choice_0 -> 営業 (confidence 0.417)
営業 0.611
店舗 0.345
請求 0.043
-
noul_0 noul = 0.916: 「緊急性を伝えているか」に Yes と答える確率 -
choice_0 -> 営業: 確率が最も高い選択肢。confidenceは確率の偏り具合で、全選択肢が同じなら0、1つに集中すれば1
緊急性は読み取れていますが、担当は「営業」を選びました。
ask の --choice には選択肢の名前しか渡せず、「請求」が何の担当かを伝えられないためです。
ask は呼び出すたびにモデルを読み込むので、1回9〜11秒かかりました。
何度も判定するなら serve を使います。
3. serve で常駐させる
serve は POST /v1/systemone を受け付ける HTTP サーバーを起動します。
リクエストの形は TypeSafe の Jev と同じです。
ポートのデフォルトは8000ですが、私の環境では別のツールが使っていたので8765にしています。
sd-venv/bin/strands-decider serve StrandsAgents/strands-decider-2B-hobson-v19 --port 8765
curl -s localhost:8765/v1/systemone -H 'content-type: application/json' -d '{
"state": "支払いが3日間失敗し続けています。至急対応してください!",
"questions": {
"team": {"type": "choice", "instructions": "どのチームが対応すべきか",
"criteria": {"請求": "請求・支払いの担当", "営業": "新規契約・商談の担当", "店舗": "店舗運営の担当"}},
"urgent": {"type": "noul", "instructions": "緊急性を伝えているか"}
}
}'
// 出力例(2回目のリクエスト)
{"model":"strands-decider-2B-hobson-v19",
"answers":{"team":{"type":"choice","choice":"請求","probabilities":{"請求":0.9251,"営業":0.0228,"店舗":0.0521},"confidence":0.8877},
"urgent":{"type":"noul","noul":0.9163}},
"usage":{"input_tokens":161,"output_tokens":2},"latency_ms":189.03}
criteria に選択肢の説明を書くと、「請求」(確率0.93)を選びました。
1回目のリクエストは約1.1秒、2回目は約0.19秒(189ms)でした。
4. MLX で動かす
Apple シリコンの Mac では --device mlx で MLX(Apple の機械学習フレームワーク)を使えます。
公式 README では MPS の1.4〜1.6倍速いとされていますが、PyPI の 0.1.0 には含まれておらず、リポジトリから入れる必要があります。
On an Apple-silicon Mac,
--device mlxruns the model through MLX, 1.4 to 1.6x faster than MPS. It needs themlxextra, which ships with the next release; until then, install from a clone withpip install -e ".[mlx]".
引用元: README.md | strands-labs/strands-decider | GitHub
cd ~/work/tools/strands-decider
git clone https://github.com/strands-labs/strands-decider.git src
uv venv mlx-venv --python 3.12
cd src && VIRTUAL_ENV=../mlx-venv uv pip install -e ".[mlx]"
cd .. && mlx-venv/bin/strands-decider serve StrandsAgents/strands-decider-2B-hobson-v19 --port 8765 --device mlx
日本語の短文240問を MPS と MLX で解かせたところ、240問すべてで同じ答えが返り、確信度の差は平均0.004でした。どこで動かすかによって確信度は変わらなさそうです。
5. 速度とメモリ
入力の長さを変えたリクエストを30回ずつ送りました(CPU は10回ずつ)。
本文は架空の日本語で、リクエストごとに内容を変えています。
値はサーバーが返す latency_ms の中央値です。
| 入力(字数 / トークン) | MPS | MLX | CPU |
|---|---|---|---|
| 50字 / 118 | 105ms | 45ms | 1,763ms |
| 200字 / 209 | 145ms | 65ms | - |
| 500字 / 385 | 266ms | 115ms | 2,827ms |
| 1,000字 / 690 | 437ms | 185ms | - |
| 2,000字 / 1,290 | 865ms | 345ms | 5,695ms |
| 4,000字 / 2,488 | 1,765ms | 625ms | - |
| 8,000字 / 4,096**(上限で切り詰め)** | 3,015ms | 1,072ms | - |
| 1リクエストの質問数(500字) | MPS | MLX | CPU |
|---|---|---|---|
| 1問 | 266ms | 115ms | 2,827ms |
| 3問 | 393ms | 169ms | 7,665ms |
| 5問 | 524ms | 217ms | 8,004ms |
| 項目 | MPS | MLX | CPU |
|---|---|---|---|
| 起動から受付開始まで | 9.4秒 | 16.3秒 | 15.7秒 |
| 1回目のリクエスト | 1.1秒 | 3.2秒 | 4.2秒 |
| メモリ(footprint、計測終了時) | 約5.8GB | 約5.0GB | 約7.9GB |
footprint は macOS の footprint コマンドの値で、GPU が使うユニファイドメモリを含みます。
-
速度:MLX は MPS の約2.2〜2.8倍速く、公式の1.4〜1.6倍を上回りました。CPU は MPS の約7〜17倍遅いです
-
入力の長さ:時間はトークン数にほぼ比例します。日本語は1字約0.6トークンで、上限の4,096トークンは質問文込みで約6,500字です。超えた分はエラーにならず末尾が切り捨てられます
-
質問の数:質問1問あたりの増加は MPS で約65ms、MLX で約25ms です。本文の処理は1回で済むので、同じ本文への質問はまとめて送るほうが速くなります
6. まとめ
serve で常駐させれば、短文1問を0.1秒前後で判定できました。
ただし常駐中は約5〜6GB のメモリを使うので、16GB の Mac ではほかのアプリとの兼ね合いがあります。









