背景
翻阅Github时偶然发现这个阿里开源的编译器项目,一眼看去非常贴合现在编译器的主流方向:heterogeneity-aware-lowering-and-optimization
(后文简称HALO),能感知异构硬件的编译和优化。Github Fork 75, Star 273,2021年release第一个版本,后面基本是每个月更新一版,知道最后一次更新是2022年5月就再也没用更新。看来是推出一年不温不火之后就夭折,抱着好奇,作为一个码农,来看看是否能从代码上看出一些端倪。
顺手搜了下知乎,看看这个项目的“业界影响“,还真有:MLPerf™最新推理榜单阿里云斩获多项第一 震旦vODLA算力池技术崭露头角,里面就提到了这个项目,文章来源是阿里云基础设施官方出品, 发表于2022年9月,截图如下:
halo2.png从上面的架构图和知乎文章,和github star/fork数目已经形成了强烈的反差, 仅仅发表文章半年后就再无版本更新和迭代,已经足够引起好奇。
整体架构流程
直接上官方文档的原图:
halo.png
基本思想
提供一个编译器,可以把AI模型“编译”生成C++的统一模型推理的代码,然后这套代码就可以在不同的加速平台上编译运行了,然后就称之为可以异构感知的编译器。旨在解决加速硬件碎片化这个业界的长期痛点,可以说,有了这个编译器,再让其他厂商支持下这个的ODLA runtime,就能完成模型的部署和推理,节省大量自研编译器的成本。
ODLA是 Open Deep Learning API的缩写,一眼看出想构建统一的硬件推理的生态,相当于给厂商们说,你们以后模型编译和优化就不用管了,只用负责实现我们这套ODLA接口就行了。
基本原理
也在图中说明了:
- 把AI模型通过HALO Compiler能编译出C++代码(图里面称为ODLA Code,即基于ODLA API写来实现的代码),这里写的"generate once, run everywhere"是想说明,针对每个一个模型,只需要编译出一份ODLA Code。
- 结合这个ODLA Code和ODLA Runtime (也就是ODLA Code执行需要依赖的运行库),就可以完成在不同加速硬件上的推理。
几个问题
稍了解AI编译器的人应该多少知道:芯片架构碎片化实际上带来的是编译器在IR表达,指令生成,调度上的优化策略的碎片化,这些优化涉及到编译器的不同阶段和lower的不同层级,这个编译器能做到在编译阶段优化统一的?
”Compile Once, Run Everywhere“ 真的能做到吗
举个基本的例子,厂商A实现了一个硬件支持一个融合算子A的计算。compiler在生成ODLA C++代码的过程前会做模型的前端图解析,图融合优化。那么针对厂商A,如果模型中有特定的结构可以转换成融合算子A来实现明显会在厂商A平台推理效率更高。但如果按前面所说的只需要一次编译出针对厂商A的ODLA C++代码,那厂商B显然是不能用的,因为厂商B的硬件没有实现这个融合算子的优化。除非要求所有厂商都能开发统一的融合算子,支持通用的优化方法,这明显也是不现实的。
ODLA API 到底干了什么
ODLA API 本身只是阿里抽象出来的接口,而接口的实现还是需要根据对应的底层加速库来实现,其中分两类:
基于完整图编译的 (odla_compute,h):
-odla_CompileComputation(odla_computation* computation)
- odla_ExecuteComputation(const odla_computation computation, const odla_context context,
const odla_compute_mode mode, odla_device device)
基于算子的 (odla_ops_xx)比如:
- odla_Conv
- odla_MaxPool
从文档上看,已经支持的都是一些知名的开源推理库,例如NV的TensorRT,Intel的OneAPI,Eigen等,大致看了下这些库,主要分两类:
- 支持直接导入模型,然后再实现优化和推理,例如Tensor RT, OneAPI,针对这种不难看出会用类似CompileComputation的接口来封装,然后里面再去调用下面这些开源的推理库。
- 基于特定算子的加速,例如Eigen,那行,采用方案二,通过通用算子的接口来实现调用Eigen对应算子就好了。
到这里,整体情况基本摸清楚了,实际上是这个编译器把市面上主流的几个推理库研究了下,然后整合了一套接口,这样的话 这套接口就可以顺利的对接这些主流推理库。
怎么就突然打破mlperf记录了
再看看知乎上这篇号称打破mlperf世界纪录的文章, 一查原来有个另外的github 仓库,叫做autoSinian
同样是阿里云出品,可是里面单单一个测试结果,和前面这个HALO框架可以说没有任何关系,里面提到的震旦异构加速平台更是无从联系。
但既然mlperf是一个专业的硬件性能测试平台,是如何成功打上榜单的呢?上面github文档里面的链接已经跳转不到mlperf的测试表单了,只能看到当时的测试硬件是基于Nvidia的硬件 A100/V100/T4,没有在边缘端或者其他加速平台上的结果。那么请问,全篇异构优化又是在哪里?
小结
到这里基本上明朗了,其实这个HALO编译器本质就干了模型解析,然后CodeGen产生ODLA API这两件事情,其他图优化,指令生成,指令调度全部就直接扔给底层的依赖库去实现吧。这充其量算是定义了一套HAL API,用来实现不同底层库的调用。
再说一下这个mlperf的测试,人家是一个用来专业评测不同AI硬件加速平台推理性能的网站,测试基准是同一个模型结构和推理方式。结果你就优化了下模型结构或者改变了下在nv卡上的推理方式,提升了一丢丢的推理性能,请问这个和硬件加速,异构感知有什么关系?怎么就利用了ODLA接口就达到这个效果?所标榜的震旦加速平台甚至都没有部署到硬件上去,脸皮真是厚出了天际。
很难想象,这个是在阿里云基础设施下show出来的产品,是如何通过里面那些高级专家的评审的。发表过了半年,没有激发出任何业界的水花,知乎上也就一个赞同。然后这个产品沉入水底,再无任何声响。请问做出这个产品又是花了多少人力,请了多少高P,浪费了多少年时间呢?
最近看雷锋网,阿里云基础设施又在提聚焦AI生态,希望少点故事,多看到一些实际的有用的产品或者平台,而不是夸大其词的文章和相差甚远的开源代码。
如果是我理解错了,请证明给业界看看。
网友评论