经年治世

西风烈,长空雁叫霜晨月

写了专用算子,又把它拆掉:一次值得认真记录的设计转向

专用仿射算子的引入与撤回,如何比较维护成本与表达力。

系列目录 · 数值与量化 · Read in English “上周还在补专用算子,这周怎么又删了?”在代码评审里,这句话容易带出一丝尴尬。可真正值得追问的不是“谁走了弯路”,而是:“我们发现哪条抽象边界放错了?” 编译器设计经常如此。第一次实现让问题出现,第二次实现才知道应该把问题放在哪层。 一、专用仿射算子最初有什么吸引力 逐通道仿射变换 y=a*x+b有明确的业务语义。保留一个专用节......

只有几个通道参数,为什么局部内存先满了?

避免把通道向量铺满整张量,同时守住广播语义。

系列目录 · 数值与量化 · Read in English “模型里只有一小条 scale,一小条 bias。怎么会内存不够?”屏幕上的分配失败看起来像在跟常识争论。直到有人把编译后常量 shape展开:那两条小向量,已经各自变成了一整张特征图。 广播在数学中像一个省略号;在实现里,它可能是一条地址规则,也可能是成千上万次复制。两者不能只用同一个词概括。 一、广播的语义很便宜,物化不一定......

BatchNorm 变成乘加之后,真正的数值工作才开始

从固定统计量到通道乘加,再到乘数、移位和偏置。

系列目录 · 数值与量化 · Read in English “BatchNorm 已经融合成 y=ax+b了,剩下不就一个乘法一个加法?”大家点头。几分钟后,问题变成:“a 用多少位?b 的 scale 是谁的?乘完先截断吗?a 接近 1 到底能不能省?” 这不是公式越来越复杂,而是公式终于遇到了有限位宽。 一、推理时的归一化可以折叠成仿射变换 固定推理统计量时,逐通道 BatchNor......

乘法没算错,尺度乘错了:整数内核的两张账单

逐项核对输入 scale、输出 scale 与中间乘积的范围。

系列目录 · 数值与量化 · Read in English “两个整数相乘,结果和计算器一致,模型还是不对。”这时候盯着乘号往往没有用。计算器只替你检查了一张账单:整数乘积。模型还在看另一张账单:这些整数分别代表多大的实数。 量化乘法最有迷惑性的地方,是底层每一步都可能“合法”,最后拼起来却不是原来的运算。 一、先把三个量化域写在纸上 定义输入与输出: 123a = s_a * (q_a......

这个归约什么也没做,为什么还不能删?

数学恒等不代表量化编码恒等,空轴和单位轴也有契约。

系列目录 · 数值与量化 · Read in English “沿长度为一的轴求和,就是它自己。删掉,省一条指令。”这句话数学上很稳,工程上却差一个问题:“它自己”是同一个实数,还是同一串整数? 有时删掉一个明明没有计算量的算子,反而让整个模型的数值变了。这样的优化像把温度计从摄氏刻度换成华氏刻度,却坚持显示数字不能动。 一、长度为一,不代表输出表示完全相同 设输入张量 shape 为 [......

最大值、最小值和求和:长得像三兄弟,不能共用一份数学作业

归约框架可以共享,初始化、累加与重定标不能照搬。

系列目录 · 数值与量化 · Read in English “平均值已经有了,求和把除法删掉,最大最小换个符号,下午就收工?” 如果算子支持清单是一张菜单,这个提议十分诱人。可编译器接一个算子,除了厨房会做,还要让点单系统识别它、仓库知道食材放哪、服务员把它送到正确桌子。三个新菜名,可能触发十几处接入点。 一、算子从模型走到指令,至少要经过几道门 历史中的求和、最大值和最小值并非只增加一......

消失的维度:keep_dims=false 为什么能把逆置换弄坏?

被删掉的轴不再属于原来的坐标系,逆置换必须重建。

系列目录 · 数值与量化 · Read in English “保持维度时全绿,去掉维度时全红。”这句话很像一个过于礼貌的报错:它几乎把答案告诉了你,却还是能让人对着屏幕坐很久。 求平均本身可能没有算错。真正出问题的是:归约前的第三根轴,在归约后已经不再有第三个位置,而恢复布局的代码还拿着旧地图。 一、轴不只是一个整数,它指向一份坐标约定 取教学张量 [A,B,C]=[4,6,9],沿 B......

求个平均值,为什么编译器先写起了循环?

把任意归约轴变成可执行的循环,追踪搬运和布局成本。

系列目录 · 数值与量化 · Read in English “这个算子就一行:求平均。”同事把纸推过来。纸上确实只有一行。过了半小时,白板已经出现轴、步长、临时缓冲区和两个循环标签。有人笑:“平均值还没算,先把工作量平均分配一下?” 谜底是:模型描述的是数学集合,向量引擎接收的是地址和固定形状。把“沿某一轴”翻译成“从哪里读、隔多少字节读、在哪停止”,才是编译器的工作。 一、同一个平均值......

编译器工程笔记:48 篇双语文章与阅读路线

数值与量化、算子与布局、资源与调度、工程与交付

Read this guide in English 48 篇关于编译器数值、布局、调度与交付的技术长文。故事常从一个不起眼的问题开始:求个平均值为什么要搬数据,文件明明在为什么找不到,视图没有复制为什么不能释放内存,Debug 正常为什么 Release 失败。 开始阅读 想先读一篇有完整排障过程的故事:Debug 一切正常,Release 却把写入操作“优化没了”。 正在排查量化结果......

从任务提交到路径分发的最小闭环

ROS2

从任务提交到路径分发的最小闭环 ros2-fleet-coordinator本身并不是一开始就瞄准复杂调度,冲突消解,Nav2全栈集成. 相反,它先做了一件更基础,但也更关键的事情: 先把一个多机器人车队系统里面最小可运行闭环搭起来. 这个闭环可以描述为:有机器人周期性上报自身状态/有任务入口可以提交取货点和放货点/有中心管理器选择空闲机器人/有路径规划器给出图上的waypoint路径/有机......