性能
这一部分回答两个问题:两边的时间怎么量才能比,以及 tenferro 上什么东西会出人意料地贵。JAX 的时间藏在异步派发和第一次调用的编译里,tenferro 的时间藏在 engine 的线程宽度和求导变换里。每页的数字都写明负载、线程数和取的是最小值还是中位数。tenferro 的编译、准备、执行各做什么,见 tenferro 卷的 运行时;provider 的选择和矩阵运算的速度见 CPU provider。
- 计时:不
block_until_ready的 JAX 调用 0.06 ms 就返回;JAX 20 步 TRG 的第一次grad1.2 s,tenferro 分段的全部程序准备 27 ms;最小值和中位数;8 线程 engine 在机器满载时一次慢 20 倍;TRG 的前向几乎全是 SVD,faer 单线程比 LAPACK 慢 1.7 倍。 - 求导变换的代价:JAX 的
grad变换随深度线性;tenferro 的ad.grad在值被重复使用的链上指数增长(y·y每层乘 2,SVD 三个输出每层乘 3),释放导数图同样贵;整图 TRG 4 步 2.1 s,所以要分段。
flowchart TB q["这次调用花了多久"] --> a["JAX 等结果了吗"] q --> b["第一次还是稳态"] q --> c["几个线程 负载多少"] q --> d["变换算进去了吗"] d --> e["tenferro 深图 指数增长"] e --> f["08 分段"]
💬 关联讨论
发起讨论加载中...