ml-explore/mlx-lm

GitHub: ml-explore/mlx-lm

Apple 官方推出的 Python 工具包,让开发者能够在 Apple Silicon 上高效运行、量化和微调各类大语言模型。

Stars: 4418 | Forks: 532

## MLX LM MLX LM 是一个 Python 包,用于在 Apple silicon 上利用 MLX 生成文本和微调大语言模型。 一些关键功能包括: * 与 Hugging Face Hub 集成,通过单个命令即可轻松使用数千个 LLM。 * 支持量化模型并将其上传到 Hugging Face Hub。 * [低秩和全模型微调](https://github.com/ml-explore/mlx-lm/blob/main/mlx_lm/LORA.md),并支持量化模型。 * 使用 `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](https://huggingface.co/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) ``` 查看[生成示例](https://github.com/ml-explore/mlx-lm/tree/main/mlx_lm/examples/generate_response.py)以了解如何更详细地使用 API。查看[批量生成示例](https://github.com/ml-explore/mlx-lm/tree/main/mlx_lm/examples/batch_generate_response.py)以了解如何为一批提示高效地生成续写内容。 `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-bit 量化的 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 社区](https://huggingface.co/mlx-community),你可以执行: ``` mlx_lm.convert \ --model mistralai/Mistral-7B-Instruct-v0.3 \ -q \ --upload-repo mlx-community/my-4bit-mistral ``` 模型也可以直接在 [mlx-my-repo](https://huggingface.co/spaces/mlx-community/mlx-my-repo) Hugging Face Space 中进行转换和量化。 ### 长提示和生成 `mlx-lm` 拥有一些工具可以高效扩展到长提示和生成: - 一个旋转的固定大小 key-value cache。 - 提示缓存 要使用旋转 key-value cache,请传递参数 `--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 中使用,以避免重新计算提示。这在多轮对话或使用相同上下文的跨请求中非常有用。有关更多用法详细信息,请参阅[示例](https://github.com/ml-explore/mlx-lm/blob/main/mlx_lm/examples/chat.py)。 ### 支持的模型 `mlx-lm` 支持 Hugging Face Hub 上可用的数千个 LLM。如果你想要运行的模型不受支持,请提交[问题](https://github.com/ml-explore/mlx-lm/issues/new),或者更好的是提交 pull request。[MLX Community](https://huggingface.co/mlx-community) Hugging Face 组织中以各种量化格式提供了许多受支持的模型。 对于某些模型,tokenizer 可能要求你启用 `trust_remote_code` 选项。你可以通过在命令行中传递 `--trust-remote-code` 来实现这一点。 如果你没有显式指定该标志,则在运行模型时,系统会提示你在终端中信任远程代码。 Tokenizer 选项也可以在 Python API 中设置。例如: ``` model, tokenizer = load( "qwen/Qwen-7B", tokenizer_config={"eos_token": "<|endoftext|>", "trust_remote_code": True}, ) ``` ### 大型模型 相对于机器上可用总 RAM 较大的模型可能会运行缓慢。`mlx-lm` 将尝试通过锁定模型和缓存占用的内存来加快速度。这需要 macOS 15 或更高版本才能工作。 如果你看到以下警告消息: 那么该模型在给定机器上可能会很慢。如果模型可以装入 RAM,则通常可以通过增加系统锁定内存限制来加速。 要增加限制,请设置以下 `sysctl`: ``` sudo sysctl iogpu.wired_limit_mb=N ``` 值 `N` 应大于模型大小(以兆字节为单位),但小于机器的内存大小。
标签:4bit, AI开发框架, Apex, Apple Silicon, DNS解析, Hugging Face, LLM, LoRA, MLX, NLP, Python, PyTorch替代, Unmanaged PE, 分布式计算, 大型语言模型, 开源项目, 异常处理, 推理引擎, 无后门, 本地部署, 机器学习, 模型微调, 深度学习, 生成式AI, 索引, 逆向工具, 量化