默认模型是 mlx-community/Llama-3.2-3B-Instruct-4bit,首次运行需联网从 Hugging Face 下载;部分模型的 tokenizer 需加 --trust-remote-code 或交互确认;大模型在内存不足的机器上会明显变慢,需 macOS 15+ 并调高 iogpu.wired_limit_mb。
pip install mlx-lm
mlx_lm.generate --prompt "How tall is Mt Everest?"面向 Apple silicon(M 系列芯片)运行,README 未给出具体显存或内存数值;大模型需要 macOS 15.0 及以上才能启用内存 wired 加速。
在 Apple 芯片上用 MLX 跑大模型,一条命令就能下载、生成、微调
在 Apple Silicon 上通过 MLX 框架运行大语言模型,支持加载、推理和微调,让 Mac 本地跑 LLM 更省心。
核心能力
- 一条命令从 Hugging Face Hub 拉取数千个 LLM 并生成文本
- 支持量化模型并上传回 Hugging Face Hub
- 支持 LoRA 与全参数微调,含量化模型微调
- 用 mx.distributed 做分布式推理与微调
- 提供旋转 KV 缓存、prompt 缓存与可调 prefill 步长
容易踩的坑
- v0.32.2最新正式版2026-10-16 · 2026-10-16 02:49 UTC
What's Changed
- Fix attention value scaling in MiMo-V2-Flash by @ricky-chaoju in https://github.com/ml-explore/mlx-lm/pull/1971
- Fix mask in SMM by @michalk8 in https://github.com/ml-explore/mlx-lm/pull/1979
- Muse spark hf names by @nastya236 in https://github.com/ml-explore/mlx-lm/pull/1981
New Contributors
- @ricky-chaoju made their first contribution in https://github.com/ml-explore/mlx-lm/pull/1971
Full Changelog: https://github.com/ml-explore/mlx-lm/compare/v0.32.1...v0.32.2
- v0.32.12026-10-15 · 2026-10-15 21:22 UTC
查看更新说明
What's Changed
- fix muse template by @nastya236 in https://github.com/ml-explore/mlx-lm/pull/1977
- v0.32.02026-10-15 · 2026-10-15 18:30 UTC
查看更新说明
What's Changed
- Honour the left-padding mask in MiniCPM3 and Phixtral batches by @bhaskargurram-ai in https://github.com/ml-explore/mlx-lm/pull/1925
- Fix incorrect assumption when parsing tool_calls[].function.arguments by @LxYuan0420 in https://github.com/ml-explore/mlx-lm/pull/1904
- Tolerate a null rope_scaling config when constructing PhiMoE models by @gyanu2507 in https://github.com/ml-explore/mlx-lm/pull/1889
- Update acknowledgments to include DeepSeek's DeepSeek v4.1 support by @Goekdeniz-Guelmez in https://github.com/ml-explore/mlx-lm/pull/1936
- Fix incorrect masking axis in phi3small by @michalk8 in https://github.com/ml-explore/mlx-lm/pull/1938
- Fix phimoe's sparsemixer by @michalk8 in https://github.com/ml-explore/mlx-lm/pull/1939
- Fix: max_tokens: 0 -> Server accepts max_tokens: 0, generator then rejects it by @abhijithneilabraham in https://github.com/ml-explore/mlx-lm/pull/1935
- Fix Qwen3 Coder argument parsing when the top-level type is missing by @zmylol in https://github.com/ml-explore/mlx-lm/pull/1910
- Add global scale for nvfp4 quantized MoEs by @nastya236 in https://github.com/ml-explore/mlx-lm/pull/1844
- Add tool call parser for MiniCPM5 by @dasashreeya in https://github.com/ml-explore/mlx-lm/pull/1899
- Add prism_hadamard_qwen35 (Hadamard-rotated 2-bit Qwen3.5) by @bri-prism in https://github.com/ml-explore/mlx-lm/pull/1941
- Fix GraniteMoeHybrid padded batch logprobs (#1908) by @aakashkardam in https://github.com/ml-explore/mlx-lm/pull/1921
- Parallel head for qwen 3.5 by @nastya236 in https://github.com/ml-explore/mlx-lm/pull/1960
- Fix long generation crash with MiniMax M3 by @pcuenca in https://github.com/ml-explore/mlx-lm/pull/1958
- Support unconverted models by @nastya236 in https://github.com/ml-explore/mlx-lm/pull/1962
- Add
meta-models/Muse-Spark-Open-816B-A42B-NVFP4by @nastya236 @michalk8 in https://github.com/ml-explore/mlx-lm/pull/1976
New Contributors
- @bhaskargurram-ai made their first contribution in https://github.com/ml-explore/mlx-lm/pull/1925
- @abhijithneilabraham made their first contribution in https://github.com/ml-explore/mlx-lm/pull/1935
- @zmylol made their first contribution in https://github.com/ml-explore/mlx-lm/pull/1910
- @bri-prism made their first contribution in https://github.com/ml-explore/mlx-lm/pull/1941
- @aakashkardam made their first contribution in https://github.com/ml-explore/mlx-lm/pull/1921
Full Changelog: https://github.com/ml-explore/mlx-lm/compare/v0.32.0...v0.31.4
- v0.31.32026-04-22 · 2026-04-22 07:43 UTC
查看更新说明
Highlights
- Lots of bugfixes
- Thread local generation stream to accompany MLX v0.31.2
What's Changed
- Bump the patch version by @angeloskath in https://github.com/ml-explore/mlx-lm/pull/1124
- Fix batch dimension mismatch in BatchKVCache and BatchRotatingKVCache extend() by @razorback16 in https://github.com/ml-explore/mlx-lm/pull/1141
- Fix parallel tool call handling in server by @kernelpool in https://github.com/ml-explore/mlx-lm/pull/1170
- Fix MiniMax M2 parallel tool calling by @kernelpool in https://github.com/ml-explore/mlx-lm/pull/1171
- Fix missing tree_reduce import in models/cache.py by @siiea-ai in https://github.com/ml-explore/mlx-lm/pull/1165
- Apertus tie_word_embeddings fix by @BlackSamorez in https://github.com/ml-explore/mlx-lm/pull/1143
- Fix batch dimension mismatch in ArraysCache extend() by @techtoboggan in https://github.com/ml-explore/mlx-lm/pull/1169
- Fix dwq: check for actual safetensors in target_dir by @micuentadecasa in https://github.com/ml-explore/mlx-lm/pull/1173
- fix: handle NoneType check for think tokens in TokenizerWrapper by @yuetyeelo2855 in https://github.com/ml-explore/mlx-lm/pull/1167
- Fix Gemma4 tool parser: support hyphenated function names and braces in string args by @AkashKhamkar in https://github.com/ml-explore/mlx-lm/pull/1150
- Fix empty tool_call_end breaking Mistral tool calls by @eyupcanakman in https://github.com/ml-explore/mlx-lm/pull/1151
- Fix ArraysCache extend by @angeloskath in https://github.com/ml-explore/mlx-lm/pull/1177
- Fix Gemma 4 KV-shared layers creating unused projections by @glyphVault in https://github.com/ml-explore/mlx-lm/pull/1158
- Thread local generation stream by @angeloskath in https://github.com/ml-explore/mlx-lm/pull/1090
New Contributors
- @razorback16 made their first contribution in https://github.com/ml-explore/mlx-lm/pull/1141
- @siiea-ai made their first contribution in https://github.com/ml-explore/mlx-lm/pull/1165
- @BlackSamorez made their first contribution in https://github.com/ml-explore/mlx-lm/pull/1143
- @techtoboggan made their first contribution in https://github.com/ml-explore/mlx-lm/pull/1169
- @micuentadecasa made their first contribution in https://github.com/ml-explore/mlx-lm/pull/1173
- @yuetyeelo2855 made their first contribution in https://github.com/ml-explore/mlx-lm/pull/1167
- @AkashKhamkar made their first contribution in https://github.com/ml-explore/mlx-lm/pull/1150
- @glyphVault made their first contribution in https://github.com/ml-explore/mlx-lm/pull/1158
Full Changelog: https://github.com/ml-explore/mlx-lm/compare/v0.31.2...v0.31.3
- v0.31.22026-04-07 · 2026-04-07 22:15 UTC
查看更新说明
Highlights
- Caching system prompt and user messages for non-trimmable caches
- Batch generator refactoring
What's Changed
- Bump the patch version by @angeloskath in https://github.com/ml-explore/mlx-lm/pull/959
- Presence and frequency penalties by @angeloskath in https://github.com/ml-explore/mlx-lm/pull/971
- Eval self.left_padding whenever it is updated in BatchRotatingKVCache by @rltakashige in https://github.com/ml-explore/mlx-lm/pull/960
- Late binding caused incorrect cache checkpoint by @angeloskath in https://github.com/ml-explore/mlx-lm/pull/976
- Move to metal agnostic device_info by @angeloskath in https://github.com/ml-explore/mlx-lm/pull/979
- Fix CompletionsDataset mask_prompt crash by @eyupcanakman in https://github.com/ml-explore/mlx-lm/pull/967
- Bump the patch version by @angeloskath in https://github.com/ml-explore/mlx-lm/pull/981
- Fix test after latest MLX update by @angeloskath in https://github.com/ml-explore/mlx-lm/pull/996
- Clear cache trainer memory by @N8python in https://github.com/ml-explore/mlx-lm/pull/986
- feat(server): add --allowed-origins by @nwtgck in https://github.com/ml-explore/mlx-lm/pull/987
- Delta net precision by @angeloskath in https://github.com/ml-explore/mlx-lm/pull/997
- avoid mutating input in SuScaledRoPE and YarnRoPE by @mm65x in https://github.com/ml-explore/mlx-lm/pull/1003
- handle missing content-length header in server by @mm65x in https://github.com/ml-explore/mlx-lm/pull/1001
- fall back to ast.literal_eval for malformed JSON in qwen3_coder tool parser by @mm65x in https://github.com/ml-explore/mlx-lm/pull/1004
- Nemotron super support by @angeloskath in https://github.com/ml-explore/mlx-lm/pull/992
- Supporting delay in mlx_lm benchmark by @AndreasPlt in https://github.com/ml-explore/mlx-lm/pull/1010
- Fix flaky test by @angeloskath in https://github.com/ml-explore/mlx-lm/pull/1020
- Fix missing cache advance from qwen 3.5 by @angeloskath in https://github.com/ml-explore/mlx-lm/pull/1024
- Refactor LRUPromptCache by @angeloskath in https://github.com/ml-explore/mlx-lm/pull/1019
- Fix SSM dt clamp default for Nemotron-H by @kernelpool in https://github.com/ml-explore/mlx-lm/pull/1026
- Inserting logits processors into BatchGenerator in batch_generate by @arthurhjorth in https://github.com/ml-explore/mlx-lm/pull/1008
- fix: break shared-buffer memory leak in GatedDeltaNet cache by @adurham in https://github.com/ml-explore/mlx-lm/pull/1077
- Fix PromptTrie.pop_prefixes() off-by-one when pruning immediate prefixes by @LxYuan0420 in https://github.com/ml-explore/mlx-lm/pull/1078
- Batch generation refactoring and various fixes by @angeloskath in https://github.com/ml-explore/mlx-lm/pull/1072
- perf: use max instead of argsort in apply_min_p sampling by @matteocelani in https://github.com/ml-explore/mlx-lm/pull/1083
- Add gemma 4 by @Blaizzy in https://github.com/ml-explore/mlx-lm/pull/1093
- Bring back max-kv-size to the batch generator by @angeloskath in https://github.com/ml-explore/mlx-lm/pull/1106
- Add Gemma 4 tool call parser by @nicdavidson in https://github.com/ml-explore/mlx-lm/pull/1105
- Fix Gemma 4 quantized per-layer projection loading by @spicyneuron in https://github.com/ml-explore/mlx-lm/pull/1112
- Fix output corruption in speculative decoding by @kernelpool in https://github.com/ml-explore/mlx-lm/pull/1109
- Gemma4 final fixes and multi-token think/tool start/end by @angeloskath in https://github.com/ml-explore/mlx-lm/pull/1114
- Align batch logits processor token contract by @neilmehta24 in https://github.com/ml-explore/mlx-lm/pull/1115
New Contributors
- @rltakashige made their first contribution in https://github.com/ml-explore/mlx-lm/pull/960
- @eyupcanakman made their first contribution in https://github.com/ml-explore/mlx-lm/pull/967
- @nwtgck made their first contribution in https://github.com/ml-explore/mlx-lm/pull/987
- @mm65x made their first contribution in https://github.com/ml-explore/m
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
MLX LM
MLX LM is a Python package for generating text and fine-tuning large language models on Apple silicon with MLX.
Some key features include:
- Integration with the Hugging Face Hub to easily use thousands of LLMs with a single command.
- Support for quantizing and uploading models to the Hugging Face Hub.
- Low-rank and full model fine-tuning with support for quantized models.
- Distributed inference and fine-tuning with
mx.distributed
The easiest way to get started is to install the mlx-lm package:
With pip:
pip install mlx-lm
With conda:
conda install -c conda-forge mlx-lm
Quick Start
To generate text with an LLM use:
mlx_lm.generate --prompt "How tall is Mt Everest?"
To chat with an LLM use:
mlx_lm.chat
This will give you a chat REPL that you can use to interact with the LLM. The chat context is preserved during the lifetime of the REPL.
Commands in mlx-lm typically take command line options which let you specify
the model, sampling parameters, and more. Use -h to see a list of available
options for a command, e.g.:
mlx_lm.generate -h
The default model for generation and chat is
mlx-community/Llama-3.2-3B-Instruct-4bit. You can specify any MLX-compatible
model with the --model flag. Thousands are available in the
MLX Community Hugging Face
organization.
Python API
You can use mlx-lm as a module:
from mlx_lm import load, generate
model, tokenizer = load("mlx-community/Mistral-7B-Instruct-v0.3-4bit")
prompt = "Write a story about Einstein"
messages = [{"role": "user", "content": prompt}]
prompt = tokenizer.apply_chat_template(
messages, add_generation_prompt=True,
)
text = generate(model, tokenizer, prompt=prompt, verbose=True)
To see a description of all the arguments you can do:
>>> help(generate)
Check out the generation example to see how to use the API in more detail. Check out the batch generation example to see how to efficiently generate continuations for a batch of prompts.
The mlx-lm package also comes with functionality to quantize and optionally
upload models to the Hugging Face Hub.
You can convert models using the Python API:
from mlx_lm import convert
repo = "mistralai/Mistral-7B-Instruct-v0.3"
upload_repo = "mlx-community/My-Mistral-7B-Instruct-v0.3-4bit"
convert(repo, quantize=True, upload_repo=upload_repo)
This will generate a 4-bit quantized Mistral 7B and upload it to the repo
mlx-community/My-Mistral-7B-Instruct-v0.3-4bit. It will also save the
converted model in the path mlx_model by default.
To see a description of all the arguments you can do:
>>> help(convert)
Streaming
For streaming generation, use the stream_generate function. This yields
a generation response object.
For example,
from mlx_lm import load, stream_generate
repo = "mlx-community/Mistral-7B-Instruct-v0.3-4bit"
model, tokenizer = load(repo)
prompt = "Write a story about Einstein"
messages = [{"role": "user", "content": prompt}]
prompt = tokenizer.apply_chat_template(
messages, add_generation_prompt=True,
)
for response in stream_generate(model, tokenizer, prompt, max_tokens=512):
print(response.text, end="", flush=True)
print()
Sampling
The generate and stream_generate functions accept sampler and
logits_processors keyword arguments. A sampler is any callable which accepts
a possibly batched logits array and returns an array of sampled tokens. The
logits_processors must be a list of callables which take the token history
and current logits as input and return the processed logits. The logits
processors are applied in order.
Some standard sampling functions and logits processors are provided in
mlx_lm.sample_utils.
Command Line
You can also use mlx-lm from the command line with:
mlx_lm.generate --model mistralai/Mistral-7B-Instruct-v0.3 --prompt "hello"
This will download a Mistral 7B model from the Hugging Face Hub and generate text using the given prompt.
For a full list of options run:
mlx_lm.generate --help
To quantize a model from the command line run:
mlx_lm.convert --model mistralai/Mistral-7B-Instruct-v0.3 -q
For more options run:
mlx_lm.convert --help
You can upload new models to Hugging Face by specifying --upload-repo to
convert. For example, to upload a quantized Mistral-7B model to the
MLX Hugging Face community you can do:
mlx_lm.convert \
--model mistralai/Mistral-7B-Instruct-v0.3 \
-q \
--upload-repo mlx-community/my-4bit-mistral
Models can also be converted and quantized directly in the mlx-my-repo Hugging Face Space.
Long Prompts and Generations
mlx-lm has some tools to scale efficiently to long prompts and generations:
- A rotating fixed-size key-value cache.
- Prompt caching
- A configurable prefill step size
To use the rotating key-value cache pass the argument --max-kv-size n where
n can be any integer. Smaller values like 512 will use very little RAM but
result in worse quality. Larger values like 4096 or higher will use more RAM
but have better quality.
Long prompts are read in steps, and the step size sets how many prompt tokens
are processed at once. Smaller steps use less peak memory while the prompt is
read, at some cost to prompt processing speed. To change it pass
--prefill-step-size n. The default is 2048, and mlx_lm.generate,
mlx_lm.chat, mlx_lm.server and mlx_lm.benchmark all accept it.
Caching prompts can substantially speedup reusing the same long context with
different queries. To cache a prompt use mlx_lm.cache_prompt. For example:
cat prompt.txt | mlx_lm.cache_prompt \
--model mistralai/Mistral-7B-Instruct-v0.3 \
--prompt - \
--prompt-cache-file mistral_prompt.safetensors
Then use the cached prompt with mlx_lm.generate:
mlx_lm.generate \
--prompt-cache-file mistral_prompt.safetensors \
--prompt "\nSummarize the above text."
The cached prompt is treated as a prefix to the supplied prompt. Also notice when using a cached prompt, the model to use is read from the cache and need not be supplied explicitly.
Prompt caching can also be used in the Python API in order to avoid recomputing the prompt. This is useful in multi-turn dialogues or across requests that use the same context. See the example for more usage details.
Supported Models
mlx-lm supports thousands of LLMs available on the Hugging Face Hub. If the
model you want to run is not supported, file an
issue or better yet, submit
a pull request. Many supported models are available in various quantization
formats in the MLX Community Hugging
Face organization.
For some models the tokenizer may require you to enable the trust_remote_code
option. You can do this by passing --trust-remote-code in the command line.
If you don't specify the flag explicitly, you will be prompted to trust remote
code in the terminal when running the model.
Tokenizer options can also be set in the Python API. For example:
model, tokenizer = load(
"qwen/Qwen-7B",
tokenizer_config={"eos_token": "<|endoftext|>", "trust_remote_code": True},
)
Large Models
[!NOTE] This requires macOS 15.0 or higher to work.
Models which are large relative to the total RAM available on the machine can
be slow. mlx-lm will attempt to make them faster by wiring the memory
occupied by the model and cache. This requires macOS 15 or higher to
work.
If you see the following warning message:
[WARNING] Generating with a model that requires ...
then the model will likely be slow on the given machine. If the model fits in
RAM then it can often be sped up by increasing the system wired memory limit.
To increase the limit, set the following sysctl:
sudo sysctl iogpu.wired_limit_mb=N
The value N should be larger than the size of the model in megabytes but
smaller than the memory size of the machine.