Rust in Everything
基于 tenferro-runtime 0.8.0

动手

前面各部分读的是 tenferro 的源码。这一部分反过来:不依赖 tenferro,用标准库把 einsum 线自己写一遍。张量是列主序的 Vec<f64> 加形状,规划是一个贪心,每一步收缩是「置换 + reshape + matmul」。写完之后让 tenferro-einsum 0.8.0 和 omeco 处理同样的输入,对数值、对规划代价、对确定性、对速度。

  1. 写一个迷你 einsum:库 339 行代码。解析显式箭头的下标(不支持省略号和对角线),先把只在一个输入里出现的标签求和掉,再按「这一步的乘加次数最少」贪心地选对,每一步把标签分成左、右、收缩、批四类,和 tenferro 的 GemmPlan 是同一套布局(CPU 上真正执行的是 cpueinsum 和 tcontract)。13 个下标和嵌套循环一致,7 个和 tenferro 一致。规划代价在 MPS 内积上是最优的 15 倍多,在矩阵链上反而比 tenferro 默认的贪心略好;tenferro 的退火四个网络都找到了最优。tenferro 0.8.0 的默认规划是自己的确定性贪心,同一输入在 5 个进程里路径和结果逐位相同;退火路径仍不固定。最后一张表列出 tenferro 多出来的东西(规划器、计划复用、AD 规则、三种入口、下标方言、视图、收缩内核、GPU)和讲它们的页。
flowchart TB
  str["下标字符串"] --> parse["解析"]
  parse --> plan["贪心规划"]
  plan --> step["置换 加 matmul"]
  step --> cmp["和 tenferro 核对"]
  plan --> cost["和 tenferro 比代价"]

💬 关联讨论

发起讨论
加载中...