Prhub

#29691 [Apple Silicon] [CI] Add model-free unit-test workflow on macos-26

原始 PR 作者 jlee5814 合并时间 2026-07-02 12:00 文件变更 1 提交数 6 评论 9 代码增减 +97 / -0

执行摘要

新增 macOS 上 MLX 模型无关单元测试 CI 工作流

MLX (Apple Silicon) 后端有模型无关的单元测试,但之前只在 ubuntu base-a-test-cpu 作业中运行,而在该作业中这些测试会被跳过,导致 MLX 逻辑未被测试,回归未被发现。此工作流旨在填补这一空白。

建议团队将此工作流纳入 CI 体系,并确保 mlx 标签可以正确被维护者用于需要 MLX 测试的 PR。对于关注 Apple Silicon 后端的开发者,值得精读该工作流的设计(标签门控、uv 隔离、强制环境变量),可作为其他供应商 CI 的参考。当前已满足 MLX 基础测试需求,未来可考虑集成模型测试到自托管运行器。

讨论亮点
  1. macOS 版本选择:reviewer changminbark 建议使用更新的 macos-26(Tahoe)而非 macos-14,因为 MLX 可能针对新系统开发。作者采纳并更新。
  2. 使用 uv 隔离环境:reviewer yeahdongcn 建议使用 uv 创建干净隔离的环境,并提供了参考文档。作者采纳并切换到 astral-sh/setup-uvuv venv
  3. 标签事件逻辑chatgpt-codex-connector 指出在已标记 mlx 的 PR 上添加其他标签会导致作业被错误跳过。作者调整了条件,确保基于当前标签集而非触发事件标签。
  4. MLX 后端环境变量chatgpt-codex-connector 指出需要设置 SGLANG_USE_MLX=1 以确保测试执行 MLX 分支而非 MPS 分支。作者添加了该环境变量。
  5. finish 作业运行器:yeahdongcn 询问 pr-test-mlx-finish 使用 ubuntu-latest 是否正确,作者解释其仅聚合结果,不需要 macOS,故正确。
  6. 测试选择:LijuanTang94 在 Issue 评论中提醒 rebase 后一些之前跳过的测试已可通过,作者相应移除了 -k 过滤。

实现拆解

实现步骤如下:

  1. 创建工作流文件:在 .github/workflows/pr-test-mlx.yml 中定义了一个新的 CI 工作流,触发条件为 PR 的 opened、synchronize、reopened 和 labeled 事件,并配置并发控制。
  2. 标签门控mlx-unit-test 作业通过条件 contains(github.event.pull_request.labels.*.name, 'mlx') 仅在 PR 标记了 mlx 标签时运行,避免不必要的资源消耗;聚合作业 pr-test-mlx-finish 在任何情况下运行并处理 skipped 状态。
  3. 环境配置:使用 GitHub 托管的 macos-26 运行器,设置环境变量 SGLANG_USE_MLX=1 激活 MLX 后端、HF_HUB_OFFLINE=1 禁止模型下载,确保测试不依赖外部模型。
  4. 依赖安装:利用 astral-sh/setup-uvuv venv 创建隔离的 Python 环境,安装 python[srt_mps] extra 以及 pytest。
  5. 执行测试:直接通过 pytest 运行四个模型无关的 MLX 单元测试文件(签名合约、Metal Profiler 模拟、注意力补丁、量化配置覆盖),共 56 个测试。
    此实现参考了已有的 MUSA/XPU 供应商工作流模式,但采用标签门控而非路径过滤,以便更灵活地捕获共享代码变更对 MLX 的破坏。
文件 模块 状态 重要度
.github/workflows/pr-test-mlx.yml CI 工作流 added 5.37

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

macOS 版本选择 (macos-14 → macos-26) other

changminbark: IMO we should push for testing on newer MacOS versions (macos 14 was released 3 years ago and MLX is probably going to be developed with the newer MacOS versions in mind).

结论:作者采纳并更新为 macos-26。 · 已解决

使用 uv 隔离环境 other

yeahdongcn: It would be better to use uv to create a clean, isolated virtual environment for running the tests on macOS.

结论:作者切换到 astral-sh/setup-uv 和 uv venv。 · 已解决

标签门控事件逻辑 正确性

chatgpt-codex-connector: Do not skip MLX tests when other labels are added (P2).

结论:作者调整条件,基于当前标签集而非触发事件标签。 · 已解决

启用 MLX 后端环境变量 正确性

chatgpt-codex-connector: Enable the MLX backend in the MLX test job (add SGLANG_USE_MLX=1).

结论:作者添加了 SGLANG_USE_MLX=1。 · 已解决

finish 作业运行器使用 ubuntu-latest question

yeahdongcn: Is ubuntu-latest correct here?

结论:作者解释 finish 作业仅聚合结果,不需要 macOS,所以正确。 · 已解决

移除被跳过测试的 -k 过滤 测试

LijuanTang94: rebase 后三个之前被跳过的测试已可通过,建议移除 -k deselections。

结论:作者 rebase 并移除 deselections。 · 已解决

风险与影响

由于该 PR 仅添加 CI 工作流,不修改任何源代码,风险很低。可能的风险包括:

  • macOS 运行器可用性:依赖 GitHub 托管的 macOS 运行器,可能因资源限制导致排队延迟或运行失败。
  • 标签门控误触:若其他 PR 被错误标记 mlx,将触发不必要的测试,但只消耗运行器资源,不会造成功能影响。
  • 环境隔离不足uv venv 隔离了依赖,但若安装步骤失败,测试会跳过,可能漏报回归。但工作流已设置 fail-fast 和超时保障。
  • 测试覆盖有限:仅包含模型无关测试,无法捕获需要模型加载的回归(后者仍在自托管运行器上)。

对用户无直接影响。对系统层面,新增一个 CI 作业,消耗 macOS 运行器分钟数,可能略微增加 CI 整体耗时。对团队而言,MLX 后端的回归防护得到增强,测试覆盖从零增加到 56 个模型无关测试,减少了 MLX 相关代码未经测试合入的风险。工作流采用标签门控,不会干扰非 MLX PR 的 CI 流程。

新增 CI 作业依赖 macOS 运行器 标签门控可能被误用 测试覆盖仅限模型无关

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论