MacでLLMを使う際のMLX周りのライブラリ
はじめに
私は、以下のような理由でMac Studioを購入したものです。
- Google Colabで寝落ち従量課金は嫌だ
- APIも使いまくりたい。LLMを使ったアプリケーションのテスト一発で$20は嫌だ
今ではQwen3などを用いていい感じの推論をできています。用途に応じて異なるLLMを使えるのがいいですね。embeddingもいろいろできます。
今回は、主にApple GPUに特化したライブラリ「MLX」を用いてOpenAI APIをサーブするまでに使う基本的なライブラリについて説明します。Pythonベースの基本的なものについて説明します。iOS開発でLLMやりたいなどの方は別の記事にまとめるかもしれません。あと、「使い方」に関しては検索すれば記事がたくさん出てくるのでそちらでお願いします。
MLX
全ての基本となるライブラリです。位置付けとしては、numpyやPyTorchの一部のリプレースです。これらを使える方なら簡単に使えるでしょう。
作者はAppleの方々です。しかし、appleのorganization配下にないあたりから、何か独自の部隊で動いているのでしょう。Apple名義で出した深層学習系の論文のリポジトリはappleでホストされます。
なぜわざわざこのライブラリを使うのか。それは、Apple Silicon(Mシリーズ)がUMA(Unified Memory Architecture)を用いているからです。つまり、NVIDIA GPUなどを使う場合は、普通メインメモリからVRAMにメモリを転送しますが、UMAの場合は両者がメモリを共有しているためメインメモリの遅さや転送のロスに悩まされることがあまりありません。また、使えるメモリが単純に増える、これが大きい。128GB載っていれば100GBほどは楽に割り当てられます。
転送速度としては、Wikipediaを見るに以下のようになります。「そんなに遅くない」と言う感じです。
- M4: 120GB/s
- M4 Pro: 273GB/s
- M2/M3 Ultra: 819.2GB/s
- GeForce RTX 4090: 1008GB/s
- NVIDIA H100 SXM: 3352GB/s
MLX LM
基本的にMLXは"MLX is designed by machine learning researchers for machine learning researchers."というように、MLXを使って新しい機械学習の世界を探究しよう!というライブラリで、サンプルでいろいろなモデルが実装されています。
しかし、LLM(Llama 2など)の推論などのサンプルコードになってから一気に実用的な方向に関心が行き、あれできないこれできないといろいろ改善が進みました。これは単なるサンプルの枠を超えているため、単一リポジトリとして独立しました。 いろいろでき、私は- HFモデルのMLX用のモデルフォーマットへの変換
- Python API
- 推論のためのコマンド
- ファインチューニングのためのコマンド
- OpenAI APIに似たサーバ
などを使っています。
MLX-VLM
NVIDIA GPUなどの場合は基本的にHuggingFace Transformersライブラリ1つに何でもかんでもぶちこんであります。しかし、何しろこっちは人が少ないので巨大ライブラリのマネジメントなんて困難、MLX LMをVision Language Modelにも対応しろと言っても無理な話です。なので、そっちは別の方が開発しています。
私は基本的にLLMばかり使っていますが、Gemma 3がVLMのためこちらも必要になりました。
MLXに対応するようにコンバートされたモデルがたくさん公開されていますが
こちらではMLX LM, MLX-VLMのどちらに対応したものも公開されています。両方入れれば問題はありません。MLX-LM-LORA
LLMのファインチューニングに特化したリポジトリです。特に、DeepSeek r1やOpenAI o1などで脚光を浴びたGRPOやPPOなどの強化学習手法の実装に重きを置いています。もともと、MLX LMにPull Requestが投げられていたのですが、マージされず単一のライブラリとして独立したものになります。メモリ消費が多いので削減手法をPull Requestしたいものです。
MLX Omni Server
mlx_lm.server
というサンプルサーバがあったのですが、サンプルはサンプル、embeddingなどのエンドポイントがありません。このため、ちゃんと作ろうということで作られました。open-webuiのバックエンドなどには有用でしょう。
参考: PyTorchなどはどうなの?
mps
バックエンドなどがあり、割と動きます。device
をcuda
からmps
に変えただけで大体動きます。しかし、動かないものが一部あり、完全な互換には至っていません。また、UMAの特徴も活かせません。あと、今回触れなかったものに関しては
- llama.cpp: 依然として有用な選択肢です。
- ollama: MLXにも対応するそうです
- あれは?これは?: 基本的にないと考えたほうがいいです。
Discussion