MLX LM 是一个 Python 包,用于在 Apple Silicon 芯片上使用 MLX 生成文本和微调大语言模型。
主要特性包括:
mx.distributed 进行分布式推理和微调。最简单的入门方式是安装 mlx-lm 包:
使用 pip:
pip install mlx-lm
使用 conda:
conda install -c conda-forge mlx-lm
要使用 LLM 生成文本,请运行:
mlx_lm.generate --prompt "How tall is Mt Everest?"
要与 LLM 进行对话,请运行:
mlx_lm.chat
这将启动一个聊天 REPL,你可以用它来与 LLM 交互。在 REPL 会话期间,聊天上下文会得到保留。
mlx-lm 中的命令通常接受命令行选项,用于指定模型、采样参数等。使用 -h 可以查看命令的可用选项列表,例如:
mlx_lm.generate -h
生成和聊天的默认模型是 mlx-community/Llama-3.2-3B-Instruct-4bit。你可以使用 --model 标志指定任何兼容 MLX 的模型。在 MLX Community Hugging Face 组织中提供了数千个可用模型。
你可以将 mlx-lm 作为模块使用:
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)
要查看所有参数的描述,可以执行:
>>> help(generate)
查看生成示例以了解如何更详细地使用 API。查看批量生成示例以了解如何高效地为一批提示生成续写。
mlx-lm 包还提供了量化模型并可选择上传到 Hugging Face Hub 的功能。
你可以使用 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)
这将生成一个 4 位量化的 Mistral 7B 模型,并将其上传到 mlx-community/My-Mistral-7B-Instruct-v0.3-4bit 仓库。默认情况下,转换后的模型也会保存在 mlx_model 路径下。
要查看所有参数的描述,可以执行:
>>> help(convert)
对于流式生成,请使用 stream_generate 函数。该函数会生成一个生成响应对象。
例如:
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()
generate 和 stream_generate 函数接受 sampler 和 logits_processors 关键字参数。采样器是任何可调用对象,它接受一个可能已批处理的 logits 数组并返回一个采样后的 token 数组。logits_processors 必须是一个可调用对象列表,这些对象以 token 历史记录和当前 logits 作为输入,并返回处理后的 logits。logits 处理器按顺序应用。
mlx_lm.sample_utils 中提供了一些标准的采样函数和 logits 处理器。
你也可以从命令行使用 mlx-lm:
mlx_lm.generate --model mistralai/Mistral-7B-Instruct-v0.3 --prompt "hello"
这将从 Hugging Face Hub 下载一个 Mistral 7B 模型,并使用给定的提示生成文本。
要查看完整的选项列表,请运行:
mlx_lm.generate --help
要从命令行量化模型,请运行:
mlx_lm.convert --model mistralai/Mistral-7B-Instruct-v0.3 -q
要查看更多选项,请运行:
mlx_lm.convert --help
你可以通过为 convert 指定 --upload-repo 来将新模型上传到 Hugging Face。例如,要将一个量化的 Mistral-7B 模型上传到 MLX Hugging Face 社区,可以执行:
mlx_lm.convert \
--model mistralai/Mistral-7B-Instruct-v0.3 \
-q \
--upload-repo mlx-community/my-4bit-mistral
模型也可以在 mlx-my-repo Hugging Face Space 中直接转换和量化。
mlx-lm 提供了一些工具来高效处理长提示词和长文本生成:
要使用旋转键值缓存,请传递参数 --max-kv-size n,其中 n 可以是任何整数。较小的值(如 512)将使用很少的 RAM,但会导致质量下降。较大的值(如 4096 或更高)将使用更多 RAM,但质量更好。
缓存提示词可以显著加速在不同查询中重用相同长上下文的速度。要缓存提示词,请使用 mlx_lm.cache_prompt。例如:
cat prompt.txt | mlx_lm.cache_prompt \
--model mistralai/Mistral-7B-Instruct-v0.3 \
--prompt - \
--prompt-cache-file mistral_prompt.safetensors
然后使用缓存的提示词运行 mlx_lm.generate:
mlx_lm.generate \
--prompt-cache-file mistral_prompt.safetensors \
--prompt "\nSummarize the above text."
缓存的提示词被视为所提供提示词的前缀。请注意,当使用缓存的提示词时,要使用的模型是从缓存中读取的,无需显式提供。
提示词缓存也可以在 Python API 中使用,以避免重复计算提示词。这在多轮对话或使用相同上下文的多个请求中非常有用。有关更多使用细节,请参阅示例。
mlx-lm 支持 Hugging Face Hub 上可用的数千个 LLM。如果你想运行的模型不受支持,请提交一个问题,或者更好的是,提交一个拉取请求。许多支持的模型以各种量化格式在 MLX Community Hugging Face 组织中提供。
对于某些模型,分词器可能需要你启用 trust_remote_code 选项。你可以通过在命令行中传递 --trust-remote-code 来实现。如果你没有明确指定该标志,在运行模型时,终端会提示你是否信任远程代码。
分词器选项也可以在 Python API 中设置。例如:
model, tokenizer = load(
"qwen/Qwen-7B",
tokenizer_config={"eos_token": "<|endoftext|>", "trust_remote_code": True},
)
[!NOTE]
这需要 macOS 15.0 或更高版本才能工作。
相对于机器可用总 RAM 较大的模型可能会运行缓慢。mlx-lm 会尝试通过固定模型和缓存所占用的内存来加速它们。这需要 macOS 15 或更高版本才能工作。
如果你看到以下警告信息:
[WARNING] Generating with a model that requires ...
那么该模型在给定机器上可能会很慢。如果模型能装入 RAM,通常可以通过增加系统固定内存限制来加速。要增加限制,请设置以下 sysctl:
sudo sysctl iogpu.wired_limit_mb=N
值 N 应大于模型的兆字节大小,但小于机器的内存大小。