AI算子标准参考实现优秀开发者获奖心得


在鹏城实验室实习的时候,主要的工作是开发AI算子标准参考实现。参考实现是对算子标准的补充,旨在提供代码级别的语义的规范,因此正确性是它的最重要属性。

开发一个新的算子接口是比较繁琐的,虽然标准文档中对算子接口已有比较明确的定义,但是为了给予标准实现者最大的优化空间,它没有规定实现的细节,这也给参考实现的开发增加了一点难度,因为我在开发新算子的时候常常要对这个算子重新调研,找到它的具体实现逻辑,再开发对应的接口。为了满足正确性的要求,在开发完一个新算子后,需要对它进行单元测试。这时候应尽可能给出不同情况的样例,然后将参考实现的结果与tensorflow、pytorch等框架的结果进行对比。

开发了一些算子接口以后,我发现不同算子之间会存在大量重复代码,经常有复杂算子包含了简单算子代码的情况出现,比如maxpool会重复max的代码。为了减少代码开发的工作量、降低代码维护难度,我先开发简单算子,然后让复杂算子中重复了简单算子的代码的部分替换成直接调用简单算子的方式。这种开发方式可能对性能要求高的算子库不适用,但是参考实现追求的是正确性,不考虑性能,因此参考实现的所有算子都可以采取这种方法进行开发。后来,参考实现的维护难度也降低了不少。

除了参考实现,我们还开发了一套自动化测试框架。对于不同的算子库来说,只要遵循了算子标准,那么它们对应的算子接口应该是差不多的:返回值是状态码,输入输出都在参数列表中,参数之间的前后顺序也一致。对算子进行正确性测试的逻辑也是一致的,即生成输入样例、算子运算、对比结果。对于计算机来说,不同的地方在于数据结构(张量等)和函数名。那么,我们只要把测试样例和测试流程代码提前写好,让用户把自行开发的算子的函数名和创建张量等数据结构的接口注册到自动化测试框架中,框架就可以自动地对算子进行正确性测试了。所以,自动化测试框架的关键技术就是接口注册机制。我们调研以后发现,Google Test的“类型参数化”机制可以让用户在触发测试的时候才指定测试代码中某些变量的数据类型。我们就把“类型参数化”作为接口注册机制的原型,通过宏把用户的接口封装到一个类中,用户的接口就“假扮”成了一种数据类型,然后我们在测试代码中从对应的变量里提取出用户的接口,就可以实现接口注册了。

完成以上工作以后,我发现最大的工作量不是写代码,而是写代码之前的调研和设计。我也曾试过草草调研之后就着手写代码,短期内似乎是可行的,但是在后期只要遇到一个bug,我就得花大量时间去调试、调研,得不偿失。运筹帷幄之中,决胜千里之外。

作者:黎子毅

上一篇:参加启智开发社区“人工智能算子开发接口标准参考实现”项目的心得与收获
下一篇:开源分享——优秀开发者心得