Rust in Everything
基于 burn 0.22.1

全景

这一部分先回答「burn 在张量运算和硬件之间加了哪几层」,再把算子主线和训练主线各从头到尾走一遍,后面各章都从这里出发。两个走读页的实验只开 flex、metal、tracing 三个 feature,Flex 和 Metal 各跑一遍。

  1. burn 解决什么问题:README 的「training and inference in a single codebase」落在哪:后端 trait、Autodiff<B> 和 Fusion<B> 两个装饰器、cubecl 运行期编译;0.22 把装饰器从类型挪到 Device 值上,backward 从编译期保证变成运行期检查;和 candle 0.11、tch-rs、PyTorch 只对照能核实的部分。
  2. 一次 matmul:算子主线逐层走:后端名 dispatch<autodiff<fusion<cubecl<wgpu<msl>>>>> 就是要穿过的层;Flex 在调用里由 gemm 算完,Metal 上 matmul 只登记一条 IR、几微秒返回,内核要等 into_data 时在 cubecl 的设备线程上提交;空缓存的第一次先跑一万八千个测速内核。
  3. 一个训练步:训练主线逐步走:没有后端参数的两层 MLP、合成数据、Adam、手写循环,Flex 和 Metal 各 200 步;GradientsParams 把节点 id 换成参数 id,ModuleOptimizer 用 map 换上新参数而 id 不变。
flowchart TB
  why["burn 解决什么问题"] --> mm["一次 matmul"]
  why --> step["一个训练步"]
  mm --> tensor["02 张量"]
  mm --> backend["03 后端与分派"]
  mm --> fusion["05 IR 与融合"]
  mm --> cubecl["06 CubeCL 与 GPU"]
  step --> ad["04 自动微分"]
  step --> module["07 模块与训练"]

💬 关联讨论

发起讨论
加载中...