设计取舍
前七部分按代码讲机制,每一章都顺带碰到一些「这样做换来了什么、付出了什么」。这一部分只有一页,把它们收到一起:每一条先说 candle 选了什么,再说收益和代价,数字取自本卷某一页的实验,链接指向那一页,这里不重讲机制。对照的对象是 burn 0.22.1,它那一侧的数字取自 burn 卷,另外这一页在同一台机器上把同一组小负载在两边各跑了一遍:1024² 的 f32 矩阵乘、一个两层 MLP 的训练步、一串逐元素 op、一次 16 个元素的加法。
- 设计取舍:六条取舍、一份正确性记录和一节同机实测。后端是三变体枚举,层少、二进制小,代价是后端集合封闭、自动微分和融合不能像装饰器那样套上去;每个 op 立即执行,错误和计时都在调用处,代价是没手写融合的地方一个 op 一个内核;几乎处处
Result,但本卷仍碰到 8 种 panic 和一种死锁;Arc<RwLock<Storage>>让clone和视图几乎免费,代价是写穿视图、inplace_op2自锁和 Metal 上不复制的copy;手写内核、运行期整文件编译,热启动几毫秒,冷启动按库付几秒;为推理而生,训练只有 SGD 和 AdamW;本卷复现的 7 处静默算错有 5 处只在 Metal 上;同机实测里 CPU 上两边打平,Metal 上大矩阵乘相近、小张量多 op 的负载 burn 快 2 到 6 倍,新进程的启动 candle 快一个数量级以上。
💬 关联讨论
发起讨论加载中...