尧图精选

如何用 LocalAI 的 MLX distributed 把一个模型拆到多台 Apple Silicon Mac 上推理?

🕒 发布时间:2026/9/13 11:19:00 📁 来源:尧图网络
如何用 LocalAI 的 MLX distributed 把一个模型拆到多台 Apple Silicon Mac 上推理【免费下载链接】LocalAILocalAI is the open-source AI engine. Run any model - LLMs, vision, voice, image, video - on any hardware. No GPU required.项目地址: https://gitcode.com/GitHub_Trending/lo/LocalAI当单台 Mac 的内存装不下一个大型 LLM 时LocalAI 的 MLX distributed文档标注为 experimental可以把同一个模型的层拆分到多台 Apple Silicon Mac 上联合推理。它和 P2P 联邦模式不同联邦模式把整个请求路由到一台节点而 MLX distributed 把单个模型的层切分到各台机器每台机器都参与每一次 forward pass。适用前提至少两台装有 MLX 的机器文档推荐 Apple Silicon、节点间有网络连通Ring 后端走 TCPJACCL 后端走 RDMA/Thunderbolt、同一模型在所有节点可访问例如来自 Hugging Face cache。先理解 rank 与 hostfile后面配置才看得懂MLX distributed 默认使用Ring 后端做 pipeline parallelism每个节点持有模型的一部分层推理时激活值从 rank 0 依次流经每个 rank最后一个 rank 收集最终输出。对于高带宽环境例如 Thunderbolt 连接的 Mac还支持JACCL 后端通过 RDMA 做 tensor parallelism此时每个 rank 持有全部层但权重分片。分工上是固定的rank 0 就是运行 LocalAI 的那台机器由 LocalAI 在模型加载时自动拉起gRPC serverrank 1、2…… 是你手动在其它机器上启动的worker 进程它们参与每次 forward pass但本身不对外提供任何 API只等 rank 0 的指令。准备条件两台或更多装有 MLX 的机器Apple Silicon 推荐所有节点之间的网络连通Ring 用 TCPJACCL 用 RDMA/Thunderbolt同一模型在所有节点可访问例如 Hugging Face cache。首次使用时每个 rank 会通过mlx_lm.load()各自独立下载一次模型这是预期行为hostfile 里列出的端口例如 5555必须在防火墙中放行。主路径用 P2P 自动发现组网这是文档给出的最简单方式省去手写 hostfile 的环节。1. 在跑 LocalAI 的机器上启动 P2P 服务docker run -ti --net host \ --name local-ai \ localai/localai:latest-metal-darwin-arm64 run --p2p启动后会生成一个网络 token复制下来供第 2 步使用。注意 P2P 模式下如果用容器镜像必须带--net host或 compose 里的network_mode: host否则节点间无法正常互通。2. 在每台额外的 Mac 上启动 MLX worker把your-token替换为第 1 步生成的 tokendocker run -ti --net host \ -e TOKENyour-token \ --name local-ai-mlx-worker \ localai/localai:latest-metal-darwin-arm64 worker p2p-mlxworker 会自动注册到 P2P 网络LocalAI server 发现它们并自动生成 MLX distributed 用的 hostfile。P2P 模式下 rank 0 永远是 LocalAI serverworker 的 rank 按节点 ID 排序自动分配不需要你手工指定。判断这一步是否完成的依据server 日志应显示发现了新 workerP2P 文档中描述的确认方式。同时文档提醒要在开始推理之前让 server 发现全部 worker——推理一旦开始就不能再追加 worker。3. 加载模型写一个模型 YAMLmlx-distributedbackend 会自动把模型分片到所有可用 rankname: llama-distributed backend: mlx-distributed parameters: model: mlx-community/Llama-3.2-1B-Instruct-4bit加载成功后即可对llama-distributed发起推理请求。手动路径Ring 后端 hostfile不用 P2P 自动发现、想自己控制节点地址时走手动路径。1. 准备 hostfilehostfile 是一个 JSON 数组第i个元素是ranki监听 ring 通信的ip:port所有 rank 必须使用同一份 hostfile。文档示例两台 Mac[192.168.1.10:5555, 192.168.1.11:5555]上面是文档示例地址192.168.1.10/192.168.1.11换成你两台 Mac 的实际 IP。端口 5555 只是示例任何可用端口都可以但必须开放防火墙。2. 配置模型 YAMLname: llama-distributed backend: mlx-distributed parameters: model: mlx-community/Llama-3.2-1B-Instruct-4bit options: - hostfile:/path/to/hosts.json - distributed_backend:ring/path/to/hosts.json是占位路径替换为 hostfile 文件在运行 LocalAI 那台机器上的实际路径。mlx-distributed后端由 LocalAI 像其它 backend 一样自动拉起分布式行为完全由模型 YAML 的options字段控制。3. 在每台 worker 机器上启动 worker使用同一份 hostfilelocal-ai worker mlx-distributed --hostfile hosts.json --rank 1--rank必须等于该 worker 在 hostfile 中的位置。文档给出的三台机器例子hostfile 为[192.168.1.10:5555, 192.168.1.11:5555, 192.168.1.12:5555]时rank 0 由 LocalAI 在192.168.1.10自动拉起192.168.1.11上运行--rank 1192.168.1.12上运行--rank 2。4. 启动顺序先 worker后加载模型先在所有 worker 机器上启动 worker再在 LocalAI 里加载模型。LocalAI 发送 LoadModel 请求时rank 0 会初始化mx.distributed并尝试连接 hostfile 中列出的所有 rank如果 worker 还没起来连接会超时模型加载失败。可选分支JACCL 后端RDMA/Thunderbolt如果你的 Mac 之间通过 Thunderbolt 高带宽连接可以改用 JACCL。此时 hostfile 不再是地址数组而是一个 2 维 JSON 矩阵描述每对 rank 之间的 RDMA 设备名对角线为nullrank 不和自己通信。文档示例两节点[ [null, rdma_thunderbolt0], [rdma_thunderbolt0, null] ]模型 YAML 改为options: - hostfile:/path/to/devices.json - distributed_backend:jacclJACCL 需要一个coordinator——帮助所有 rank 建立 RDMA 连接的 TCP 服务rank 0LocalAI 所在机器永远是 coordinator。worker 启动命令比 Ring 多两个参数local-ai worker mlx-distributed \ --hostfile devices.json \ --rank 1 \ --backend jaccl \ --coordinator 192.168.1.10:5555--coordinator填运行 LocalAIrank 0那台机器的 IP 加任一可用端口192.168.1.10:5555是文档示例替换为你的实际地址。进阶手动运行 rank 0默认 rank 0 由 LocalAI 自动拉起。如果要在外部直接管理 rank 0作为独立 gRPC backend 运行可以# On Mac A: start rank 0 manually local-ai worker mlx-distributed --hostfile hosts.json --rank 0 --addr 192.168.1.10:50051 # On Mac B: start rank 1 local-ai worker mlx-distributed --hostfile hosts.json --rank 1 # On any machine: start LocalAI pointing at rank 0 local-ai run --external-grpc-backends mlx-distributed:192.168.1.10:50051此时模型 YAML 只需backend: mlx-distributed不需要再写hostfileoption因为 rank 0 已经从 CLI 参数拿到了它。关键选项速查模型 YAMLoptions支持的字段Option说明hostfilehostfile JSON 路径。Ringip:port数组JACCL设备矩阵distributed_backendring默认或jaccltrust_remote_code允许 tokenizer 使用 trust_remote_codemax_tokens覆盖默认最大生成 token 数temperature/temp采样温度top_pTop-p 采样hostfile与distributed_backend也可以通过环境变量MLX_DISTRIBUTED_HOSTFILE、MLX_DISTRIBUTED_BACKEND设置作为模型 options 未指定时的 fallback。worker mlx-distributed的主要 CLI 参数P2P 之外的完整参考见 CLI ReferenceFlagEnv默认值说明--hostfileMLX_DISTRIBUTED_HOSTFILE必填hostfile JSON 路径--rankMLX_RANK必填本进程的 rank0 gRPC server ring 参与者0 纯 worker--backendMLX_DISTRIBUTED_BACKENDringringTCP pipeline parallelism或jacclRDMA tensor parallelism--addrMLX_DISTRIBUTED_ADDRlocalhost:50051gRPC API 监听地址仅 rank 0--coordinatorMLX_JACCL_COORDINATOR无JACCL coordinator 的ip:port所有 rank 必须用同一个值如果既没有hostfileoption 也没有MLX_DISTRIBUTED_HOSTFILE环境变量后端就退化为普通单机 MLX 后端——文档建议用它做本地测试或不需要分布式时使用。结果验证与常见问题怎么判断组网成功P2P 路径下server 日志显示 worker 被发现、并自动生成 hostfile随后加载模型时mlx-distributed会自动把模型分片到所有可用 rank。文档没有给出固定的成功日志样例给出的是失败判据——rank 之间连不上时表现为超时错误排查方向是防火墙规则和 worker 启动顺序。各 rank 独立下载模型首次使用时每个节点各自从 Hugging Face 下载。rank 0由 LocalAI 拉起的模型落到 LocalAI 的模型目录HF_HOME已自动设置worker 上的模型默认进~/.cache/huggingface/hub除非你自己设置HF_HOME。多机部署前可以先确认各节点模型可下载避免加载时卡在下载。P2P 模式 worker 限制必须在推理开始前让 server 发现全部 worker推理开始后再追加 worker 不受支持。性能边界pipeline parallelism 会引入随 rank 数增长的延迟文档的建议是用能装下模型内存的最少 rank 数不要为了能用而把模型拆到过多机器上。功能定位该功能在文档中标注为 experimental与更通用的 P2P / Federated Inference 属于同一 P2P 体系联邦模式路由整请求MLX distributed 拆层。完整的选项表和故障排查条目以 MLX Distributed Inference 文档 为准。【免费下载链接】LocalAILocalAI is the open-source AI engine. Run any model - LLMs, vision, voice, image, video - on any hardware. No GPU required.项目地址: https://gitcode.com/GitHub_Trending/lo/LocalAI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →