`nn.Upsample(mode="linear")` 在上采样时比基于 matmul 的双线性缩放慢 2-4 倍
作者: bahaehmimdi创建于 2026年8月30日更新于 2026年9月15日
标签performance
说明
mx.nn. Upsample' 与mode='线性'/aign corners=False'具有显著意义
速度要慢于放大( " 尺度 因素 > 1 " )时的具体速度。
我发现这个,同时将一个视频帧插座模型(RIFE)移植到MLX,
其中重复的双线调整大小是前行通道中有意义的一分.
固定- ratio 双线性调整大小可分割为两个 1D 线性调整大小, 分别是
它只是一个矩阵乘以一个小而固定(2-非零s-每行)的重量
矩阵——将"大小调整"变成"matmul"剧作,以达到MLX在这里自己的实力. 这个
与 nn 相对应。 Upsample 的输出( 见 repro) 和 2-4x 更快 上采样形状;用于下采样 “nn. Upsample” 实际上有点“快” 所以这看起来就像一个真实的 具体的空白 以实例说明路径,而不是仅仅避免nn.Upsample'的理由。
- 重现
""雷普罗:mx.nn. Upsample( mode="线性") 慢于 a
固定- ratio 双线性调整大小, 作为两个小马图执行, at
普通图像管线调整形状大小。 没有火炬,只有MLX。
"" "" ""
导入时间
将数字导入为 np
导入 mlx.core 为 mx
导入 mlx.nn 为 nn
def matmul remax weight(以 大小,出 大小) :
缩放 = 为 大小 / 出自 大小
src = (np.arange(出 大小)+ 0.5) * 缩放 - 0.5
src = np.clip(src, 0,以 大小 - 1 为单位)
x0 = np.地板 (src).astype(np.int64).
x1 = np. (x0 + 1,以 大小 - 1 为单位)
w1 = (src - x0). astype (np. float32) 维基语录链接:名人名言 - 文学作品 - 谚语 - 谚语 - 谚语
w0 = 1.0 - w1 (中文(简体) ).
w = np.zelos((出 大小,以 大小),dtype=np.float32).
w [np.arange(出 大小), x0] +% w0
w[np.arange(出 大小), x1] *% w1
返回 mx.array(w)
def matmul rescale(x,缩放 因素):
n, h, w, c = x. 形状
出 h,出 w = 圆 (h * 缩放 因素),圆 (w * 缩放 因素)
wh, ww = matmul rescale weight(h,出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出入出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出
x = (wh@ x. transpose (1, 0, 2, 3)reshape (h, n * * c)). reshape (out h, n, w, c). Transpose (1, 0, 2, 3).
x = (ww@ x. transpose (2, 0, 1, 3)reshape (w, n * * c)). reshape (out w, n, out h, c). Transpose (1, 2, 0, 3).
返回 x
daf 时间d(fn,n=30,取暖=8):
在范围(温暖):
mx.eval( fn ()) (韩语).
t0 = 时间.perf counter ()
在范围(n)中:
mx.eval( fn ()) (韩语).
返回(时间.perf counter () - t0) / n * 1000
在 h, 在 w, 在 [(192, 320, 4.0, (384, 640, 2.0), (768, 1280, 0.25, (768, 1280, 0.5)] 中的比额:
x = mx.random. normal ((1, in h, in w, 4)).
上行 = nn. Upsample (scale factor=scale, mode="线性",对齐 corners=False)
上 c = mx.compile(lambda a: up(a))
调整大小 c = mx.compile(lambda a: matmul resize (a, scale))
上行 ms=定时(lambda: up c(x))
调整大小 ms=定时(lambda: resign c(x))
diff = (mx.abs (up c (x)- resign c (x)). max ().
出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出
打印(f) “{in h}x{in w} -> {out h}x{out w} (scale scale}):”
f"nn. Upsample up ms: 3.f}ms matmul rism rism ms: 3.f}ms" (中文(简体) ).
f"({上 ms/更大小 ms: 1f}x更慢) max diff ={diff: 2.e}").
. . . . . . .
内容来源: ml-explore/mlx