在新加坡、东京、首尔、香港或美西等节点租用 Mac mini M4做批推理时,不少团队会选 ONNX Runtime 的 CoreML 执行提供程序(EP)。本文整理一份决策矩阵:暖 InferenceSession 数量、intra/inter 线程、批大小 B、内置 NVMe IO,以及将排队等待与单次计算拆开的双超时(记为 Wq / Wc);并给出可粘贴的 Bash 导出与保守并发清单——不承诺固定加速比。与原生栈对照见《Core ML mlmodelc 与批推理矩阵》,Torch 路线见《PyTorch MPS 与 MLX 批推理矩阵》。租期与数据面选址见《区域延迟与批成本:买还是租》。免登录公开页:首页、套餐、购买租用。
痛点与边界
会话膨胀。每个 InferenceSession 会持有图规划、权重与 EP 侧缓存,落在统一内存里;若按请求频繁新建会话,短期吞吐看似正常,中长期会与 ANE 编译产物、NVMe 读放大叠加,尾延迟先恶化。
线程双重预订。ORT 的算子内线程池、OpenMP 与 Accelerate 系内核可能同时争用 P 核;上限不对齐时,CPU 占用仍高但 p95 变差。
单一总超时。把排队与 CoreML 计算混在一个定时器里,容易用重试掩盖 backlog 或误杀仍在首次 shape 编译的任务。
下文是运维向定性表:请用你们镜像中的 ORT 小版本与模型算子覆盖复测,勿外推为普适“最优参数”。
场景决策矩阵(定性)
以行为护栏,再对 B 与会话数做阶梯压测;成本提示为方向性描述,请结合 套餐页 与上文区域买租文核对。
| 场景画像 | 暖会话数 | intra / inter 线程 | 批大小 B | 内置 NVMe IO | 超时 Wq / Wc | 日租 / 月租提示 |
|---|---|---|---|---|---|---|
| 稳定 API、权重常驻 | 16 GB:主会话 1;24 GB:1~2 且设硬上限 | intra 自 2~4、inter 1 起步;若 OMP 过订阅则下调 | 增大 B 至 p95 拐点后回退一步 | 权重预取一次;避免并行整模型多副本 | Wq 偏短;Wc 覆盖批 p95 并留余量 | 流量平稳时月租更省事 |
| CI 或夜间批跑分 | 按模型哈希复用会话;哈希变更再重建 | 除非图天然可 embarrassingly parallel,否则 inter 保持 1 | 中等 B,优先稳定尾延迟 | 循环前把 ONNX 与外置数据落到本地 NVMe | Wq 紧;剖析窗口可放宽 Wc | 尖峰窗口可用日租摊薄试错 |
| 多租户共享主机 | 按模型族做全局信号量 | 每租户线程偏少;公平性优于打满 | 每租户小 B + 准入控制 | 隔离 scratch 前缀;关注共享写尖峰 | 两种超时都进指标;硬杀前先做降级 | 隔离成本高时倾向更大档位月租 |
不做性能夸大。CoreML EP 的实际路径依赖算子集、精度与 ANE/GPU 路由;换 ORT 小版本或换区后都应重新剖析。
可执行环境变量与并发清单
适用于 systemd、CI shell 或容器入口;默认值偏保守,上线后按剖析再调。
# macOS worker — 剖析后再调数值
export OMP_NUM_THREADS="${OMP_NUM_THREADS:-2}"
export OMP_WAIT_POLICY="${OMP_WAIT_POLICY:-PASSIVE}"
export VECLIB_MAXIMUM_THREADS="${VECLIB_MAXIMUM_THREADS:-2}"
export ORT_LOG_SEVERITY_LEVEL="${ORT_LOG_SEVERITY_LEVEL:-3}" # 0 最详 .. 4 仅致命
Python 侧建议显式设置 SessionOptions(与 Bash 导出一起核对):
import onnxruntime as ort
so = ort.SessionOptions()
so.intra_op_num_threads = 2
so.inter_op_num_threads = 1
# providers=[('CoreMLExecutionProvider', {...}), 'CPUExecutionProvider']
切换 CoreML EP 的精度、仅 ANE 类开关或额外 provider 参数时,请在每次发布日志中记录解析后的 providers 字符串;不同 ORT 次版本可能改变默认行为。
- 先限制暖会话,再提高批大小 B。
- 每个进程内保持单一主导的 OpenMP 线程预算;多进程时有意拆分核而非默认打满。
- 记录会话 id、模型哈希、providers、批 wall 时间。
- 过载时顺序:缩小 B → 调整 Wc → 加节点;避免盲重试。
- 失败走签名 DLQ 或摘要 Webhook,避免静默丢弃;编排侧应对照自有队列手册做退避与幂等。
上线前五步
- 钉死 ORT 与 EP 构建:保存
pip freeze与镜像 digest。 - 暖机一次:区分冷启动与稳态,必要时将冷启动排除在对外 SLO 之外并写清文档。
- 对 B 做二分:在延迟方差或内存压力拐点处停止加码。
- 拆分 Wq 与 Wc:分别对 backlog 与慢 EP 告警。
- 换区后复测:RTT 改善不等于算力增加。
建议采集的信号
- 每会话常驻字节数与编译尖峰对比。
- 单条均摊墙钟时间(批总时间除以 B)。
- 十分钟窗口内贴近 Wc 的批占比。
按区域选节点与套餐(公开页)
常见问题
是否保留 CPUExecutionProvider? 多数场景建议保留作回退路径,并对两条路径分别采样。
intra 线程能否一直加? 不一定;以阶梯剖析为准,勿假设近线性加速。
镜像里工具链清单? 见 帮助中心 中与运行时相关的说明。
小结
在租用的 M4 上跑 ORT CoreML EP,关键是会话复用、与 OpenMP/Accelerate 对齐的线程上限、经实测的批大小,以及在统一内存约束下拆分排队与计算超时。换区或升级 ORT 后务必重跑剖析。
Slug: 2026-remote-mac-m4-onnxruntime-coreml-batch-inference-matrix.html