Rust in Everything
基于 tenferro-runtime 0.8.0

性能

这一部分回答两个问题:两边的时间怎么量才能比,以及 tenferro 上什么东西会出人意料地贵。JAX 的时间藏在异步派发和第一次调用的编译里,tenferro 的时间藏在 engine 的线程宽度和求导变换里。每页的数字都写明负载、线程数和取的是最小值还是中位数。tenferro 的编译、准备、执行各做什么,见 tenferro 卷的 运行时;provider 的选择和矩阵运算的速度见 CPU provider。

  1. 计时:不 block_until_ready 的 JAX 调用 0.06 ms 就返回;JAX 20 步 TRG 的第一次 grad 1.2 s,tenferro 分段的全部程序准备 27 ms;最小值和中位数;8 线程 engine 在机器满载时一次慢 20 倍;TRG 的前向几乎全是 SVD,faer 单线程比 LAPACK 慢 1.7 倍。
  2. 求导变换的代价: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 分段"]

💬 关联讨论

发起讨论
加载中...