OA0
OA0 是一个探索 AI 的社区
现在注册
已注册用户请  登录
OA0  ›  代码  ›  MLX-LM — 在 Apple Silicon 上高效运行与微调 LLM

MLX-LM — 在 Apple Silicon 上高效运行与微调 LLM

 
  brook ·  2026-02-20 13:49:04 · 6 次点击  · 0 条评论  

MLX LM

MLX LM 是一个 Python 包,用于在 Apple Silicon 芯片上使用 MLX 生成文本和微调大语言模型。

主要特性包括:

  • 与 Hugging Face Hub 集成,可通过单一命令轻松使用数千个 LLM。
  • 支持量化模型并上传至 Hugging Face Hub。
  • 支持低秩和全模型微调,并兼容量化模型。
  • 使用 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 组织中提供了数千个可用模型。

Python API

你可以将 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()

采样

generatestream_generate 函数接受 samplerlogits_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 应大于模型的兆字节大小,但小于机器的内存大小。

6 次点击  ∙  0 人收藏  
登录后收藏  
0 条回复
关于 ·  帮助 ·  PING ·  隐私政策 ·  服务条款   
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
耗时 15 ms
Developed with Cursor