全景
这一部分先回答「burn 在张量运算和硬件之间加了哪几层」,再把算子主线和训练主线各从头到尾走一遍,后面各章都从这里出发。两个走读页的实验只开 flex、metal、tracing 三个 feature,Flex 和 Metal 各跑一遍。
- 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 只对照能核实的部分。 - 一次 matmul:算子主线逐层走:后端名
dispatch<autodiff<fusion<cubecl<wgpu<msl>>>>>就是要穿过的层;Flex 在调用里由 gemm 算完,Metal 上 matmul 只登记一条 IR、几微秒返回,内核要等into_data时在 cubecl 的设备线程上提交;空缓存的第一次先跑一万八千个测速内核。 - 一个训练步:训练主线逐步走:没有后端参数的两层 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 模块与训练"]
💬 关联讨论
发起讨论加载中...