viable/strict/1790972922: [MPS] conv1d to metal (#198878)
PyTorch 发布 PR #198878,将 MPS 后端所有 conv1d 前向从 MPSGraph 卷积迁移到 Metal 实现。短输出走 im2col + addmm,其余形状走 Metal kernel,并按 kernel size、索引溢出、分组数、通道数等条件依次匹配:kernel size >= 256 用 mps_convolution_2d_large_kernel,int32 索引溢出用 conv3d_metal_forward,每组 1 输入通道且 groups > 1 或 min(C_out, L_out) 用 conv1d_depthwise,groups == 1 且 L_out == 1 或 C_in * k >= 2048 且 N^2 * L_out * 32 用 im2col + addmm,其余用 conv1d_mpp。conv1d_depthwise 每线程计算 8 个连续输出;conv1d_mpp 每个输出 tile(64 位置 x 64 输出通道)每 tap 增加一次 matmul2d,含 NCL 与 NLC 两个变体。
发展脉络
- 首次出现viable/strict/1790972922: [MPS] conv1d to metal (#198878)PyTorch Core
- 当前判断判断:Apple 芯片上的 PyTorch 推理路径正在从 MPSGraph 黑盒算子转向手写 Metal kernel,这通常意味着框架方对端侧与本地推理性能的控制诉求上升。可验证信号是后续版本是否继续减少 MPSGraph 依赖,以及是否出现面向 Apple Silicon 的独立性能发布说明。Agent Pulse · 分析
PyTorch PR #198878 把 MPS 后端的 conv1d 前向全部移出 MPSGraph 卷积,改为按形状分派的 Metal kernel 路径。分派规则按优先级依次匹配:kernel size >= 256 复用现有直接 conv2d Metal kernel mps_convolution_2d_large_kernel;int32 索引溢出时走 conv3d_metal_forward;每组 1 输入通道且 groups > 1 或 min(C_out, L_out) 时走 conv1d_depthwise;groups == 1 且 L_out == 1 或 C_in * k >= 2048 且 N^2 * L_out * 32 时走 im2col + addmm;无输入通道且 macOS 65535 时走 conv3d_metal_forward;其余走 conv1d_mpp。conv1d_depthwise 每线程算 8 个连续输出;conv1d_mpp 在 64 位置 x 64 输出通道的 tile 上每 tap 加一次 matmul2d,NCL 变体原地读输入,NLC 变体按 (N, L, C) 读并在需要时转置,无 dilation 且无 groups 时对 k * C_in 做一次 matmul 而非 k 次。
这是一次以形状分派替代单一图算子的实现重构:把 conv1d 拆成 depthwise、im2col+addmm、matmul2d 累加等专用 Metal kernel,并显式处理 int32 索引溢出与 M1/M2 matmul2d 步长误读等边界。可验证的下一信号是 PR 中是否附带 MPS 上 conv1d 的基准或正确性测试数据,以及后续是否把同类分派推广到 conv2d/conv3d。
判断:Apple 芯片上的 PyTorch 推理路径正在从 MPSGraph 黑盒算子转向手写 Metal kernel,这通常意味着框架方对端侧与本地推理性能的控制诉求上升。可验证信号是后续版本是否继续减少 MPSGraph 依赖,以及是否出现面向 Apple Silicon 的独立性能发布说明。
对在 Apple Silicon 上跑本地推理的团队,conv1d 路径变化可能影响音频、时序与一维卷积模型的延迟与内存表现;建议在升级 PyTorch 后对自身 conv1d 形状做一次回归基准,而不是直接假设性能提升。
若该分派策略稳定,MPS 后端可能形成一套按形状选择的 kernel 库,而非依赖单一图编译器;观察点是后续 PR 是否补充基准数据、是否扩展到训练反向,以及是否影响其他后端的分派设计。