10 月 30 日,智猩猩联合黑芝麻智能策划推出的「智猩猩在线研讨会黑芝麻智能山海工具链专场」顺利完结。
在此次在线研讨会上,两位主讲人黑芝麻智能嵌入式工程师李俊何、Nullmax 售前产品高级经理周政,分别以《黑芝麻智能山海工具链:深度学习模型量化与部署实战》、《全栈量产智驾应用算法在 C1200 家族芯片上的部署》为主题,进行了直播讲解。
本次研讨会,主讲人李俊何主讲环节的重要信息如下:
模型训练好之后,需要经过黑芝麻智能山海工具链(BST-DAL)量后才能部署到硬件计算平台,也就是计算芯片上面。
黑芝麻智能提供 50 多种 AI 参考模型库的转换用例,大大降低了算法开发的门槛,同时也保证了算法精度,支持一些客户自定义算子开发。
虽然 BST-DAL 量化编译流程有不同的阶段,但是开发者只需要关注模型的输入、输出以及中间的配置文件就可以了。
很多时候训练好的模型都是从TensorFlow或PyTorch直接导出的,可能会存在一些冗余的节点,或比较耗时的操作。而山海工具链会在图优化阶段自动移除冗余节点,并判断节点融合。
山海工具链提供两种量化方式,分别是 accuracy_level:0 和 accuracy_level:1。
量化结束后将会得到一个量化后的模型,但如果想将其部署到 A1000、C1200 这样的计算平台上,还需要图分割的阶段。
分割阶段之后就到了编译阶段。编译阶段就是将一些图分割之后的模型编译成板端能执行的一些文件。
好的工具链对模型的量化速度是一方面,精度也很重要。我们需要在量化之后评估这个模型量化之后是否符合工程上的要求,以及准确性。
山海工具链是高度封装的,但也支持开发者自定义类。比如开发者想很快的加一个数据读取的阶段,或想加一个自定义的图优化阶段,都是完全支持的。
以下是本次研讨会主讲人李俊何的主讲实录整理。如对直播回放以及 Q&A 有需求,可以点击底部【阅读原文】前去观看。
李俊何:大家好,我是来自黑芝麻智能的李俊何,很荣幸能在这里和大家分享关于黑芝麻智能山海工具链的相关知识。
首先介绍一下黑芝麻智能科技有限公司。黑芝麻智能成立于 2016 年,在今年上市,公司的定位是智能汽车计算芯片引领者。
我们目前有两个产品线,一个是黑芝麻智能华山系列,也就是大家熟知的 A1000 家族芯片,包括华山 A1000、华山 A1000L 和华山 A1000 Pro。其中 ,A1000 有 58TOPS 的算力,能够完美适配 L2+ 或 L3 级别的自动驾驶;A1000L 算力有 16TOPS,能够支持 L2 或 L2+ 级别的自动驾驶。
我们还针对跨域计算推出了武当系列,也就是 C1200 家族芯片。其中,武当 C1296 芯片是行业内首颗支持多域融合的芯片平台;武当 C1236 是本土首颗单芯片支持 NOA 的芯片平台。
01 好的芯片配好的工具链
好的芯片配好的工具链。介绍完硬件再和大家分享一下黑芝麻智能基于芯片开发的山海工具链。黑芝麻智能山海开发工具链是一个配合华山系列和武当系列两款芯片的开发工具链,能够为开发者提供快速开发的平台,具有很强的可扩展性、完整性和灵活性。
首先,我们整体看一下量化和部署一体化的流程。
大家熟知的深度学习模型,像障碍物检测模型、车道线检测模型、语义分割模型、行为监控模型,随着电动汽车越来越火,其实很多功能都依赖于这些模型去实现。模型训练好之后,需要经过黑芝麻智能山海工具链(BST-DAL)量后才能部署到硬件计算平台,也就是计算芯片上面。
黑芝麻智能提供 50 多种 AI 参考模型库的转换用例,大大降低了算法开发的门槛,同时也保证了算法精度,支持一些客户自定义算子开发。
接下来,让我们聚焦于黑芝麻智能山海工具链 BST-DAL,DAL 全称是 Deep-learning Acceleration Library。
山海工具链支持不同种类的深度学习框架和模型格式,比如说像常见的 PyTorch、Caffe、TensorFlow 等,输入格式有 ONNX,也支持 PB。
图中间的部分是我们工具链做的一些事情,能够提供黑芝麻智能研发的量化、分区、模型优化算法,自动生成底层的模型代码。
在开始具体的工具链介绍之前,还想和大家介绍一下黑芝麻智能自主研发的 NPU。NPU 硬件就是加速计算资源。
以 A1000 为例,A1000 芯片上是有一个 SIMD 向量化元素计算加速单元,就是 EDP(non-linear)这一块。
GEMM 是一个通用矩阵乘加速阵列,用于加速矩阵与矩阵乘法。
接下来是 2 个大算力的 Engine,是 2 个 MAC 阵列用于加速卷积计算的硬件。
同时我们还内置了一个通用的 P6 DSP,能够支持开发者自定义算子以及各种灵活 NN 算子的部署。
02 BST-DAL 量化编译与部署流程
接下来,我将绍一下 BST-DAL 量化编译的整个流程。虽然流程有这么多,但是我们开发者只需要关注模型的输入、输出以及中间的配置文件就可以了。剩下的每一个阶段,我将简单为大家介绍一下它做了什么,以及为什么这么做。
首先是预处理的 :Preprocessing。在深度学习模型推理的时候会涉及到归一化,我们会将原 ONNX 模型插一个 Pre-head,将预处理阶段整合到模型里,不需要开发者在后续在工程中手动做归一化。
前处理之后就是图优化的阶段。之所以设置图优化这个阶段,是因为很多时候训练好的模型都是从 TensorFlow 或 PyTorch 直接导出的,可能会存在一些冗余的节点,或比较耗时的操作。而我们的工具链会自动移除冗余节点,并判断节点融合。
上面是我举了一个比较简单的例子,一个 Conv 和一个 Relu。山海工具链会将它自动融合成一个 Fused_Conv 计算节点,这样能对硬件更加友好、推理速度更快,以及节点可以等效替代。还有其他很多的图优化策略,开发者都可以在拿到工具链开发包后,通过 Python 导入库来看到所有详细的 pass。
图优化之后,就是量化阶段。
量化就是把一些浮点的数据,比如将深度模型里面的权重,量化成定点数据。举一个简单的例子,上面的浮点数经过量化会产生一个 SCALE,然后就可以将其量化为一个定点数据,这就是量化的基本思想。
在当前人工智能的快速发展下,量化也是越来越重要的一部分,是必不可少的。就像最近苹果要发布Apple Intelligence,其实很多模型都是很大的,像 GPT。如果苹果的 Apple Intelligence 想部署到iPhone或者是 iPad 上面,也是需要量化的。
山海工具链提供两种量化方式,分别是 accuracy_level:0 和 accuracy_level:1。
accuracy_level:0 在评估阶段可以快速地量化模型,看它能否适配我们的硬件平台。accuracy_level:0 的量化速度比较快,采用的 calibration 算法是 min_max 算法。min_max 算法属于饱和量化,饱和量化将原始的数据区间映射到 127 到 -127 的定点区间,它会将所有的数据点映射到这个整数区间。
但这样做的问题是:当输入的原始数据排列比较分散时,比如像右边这种,可能一些边缘数据对整个模型的性能和精度影响没那么大的时候,可以采取 accuracy_level:1 优化的算法进行量化。它使用了 KL 散度 + easyquant 的量化方式进行高精度的量化和优化。
量化结束后将会得到一个量化后的模型,但如果想将其部署到 A1000、C1200 这样的计算平台上,还需要图分割的阶段。图分割的意思是,这种很大的模型很多时候不能作为一个 Section 直接放到芯片上进行计算,我们需要将一个大的模型分割为一些子图的形式。
这边有一个例子,前面的 0 说明它是第一个子图,第二个 0 是第一个子图的第一个计算节点。我们可以看到这 5 个节点构成了一个子图。在硬件平台计算的时候,只有 Section 和 Section 之间会有一些 IO 交互,这样能最大程度在 DST 硬件平台上运行推理的过程。
当然这是一个 Auto partition 的算法,工具链会自动将整个模型切割成对硬件最友好、最高效的运行模式,同时也支持开发者手动设置子图的边界节点。如果想让某些节点单独做一个 Section 也是完全支持的。
图分割阶段之后就到了编译阶段。编译阶段就是将图分割之后的模型编译成板端能执行的文件。bin 文件就是量化后的权重,meta 文件可以看到模型输入输出的维度信息。
其中还有一个小细节,每一个步骤都是会产生一个 IR 中间件的结果,后缀是 bstnnx。我们也做了一个基于 Netron 的小工具,可以使每一个阶段模型可视化。开发者可以把每个阶段的模型放到我们修改的 Netron 上面,支持 BST 算子的显示,所有阶段的结果都是可视化的,这对开发者是很友好的。
另外一方面就是精度评估。我们需要在量化之后评估这个模型量化之后是否符合工程上的要求,以及准确性。我们只要在之前提到的 yaml 文件上配置 quantization_evaluation_stage 就可以直观地在量化后得到一个 PDF。这个 PDF 我截取了一段,可以看到像 mae、mse、psnr 这些常规的精度评估数据,能够帮助开发者去调优。
我截取了部分我们公开的模型库在量化前后模型精度的对比,可以看到我们的工具链能够做到精度损失非常小。
山海工具链是高度封装的,但也支持开发者自定义类。比如开发者想很快的加一个数据读取的阶段,或想加一个自定义的图优化阶段,都是完全支持的。
我总结一下以上介绍的量化部署的流程。
开发者只需要关注准备模型和配置文件,给到山海工具链,它就可以开始自动转换。转换完之后,先要检查一下有没有数据对齐,会不会有什么一些 bug。如果数据对齐了,我们会去做精度验证,如果不满足要求,我们也有精度调优手册,或者寻求黑芝麻智能的支持来进行精度的优化,最终优化到符合工程要求的程度,就可以上板端在端侧部署了。
03 板端开箱即用
总体来说,黑芝麻智能山海工具链是非常容易上手的。工具链发布形式采用Docker的形式,这样就不需要依赖于一些本地的库,只需要把 Docker 下载安装一下。
板端就更简单了,黑芝麻智能提供完整的 SDK,包括 Linux 和 QNX 两个系统。
板端提倡开箱即用,对开发者非常友好。山海工具链有完备的测试例程,config 文件快速配置以及完整的 API 接口,支持零拷贝的功能。
大家可以看到,lib 和 bin 文件是之前工具链量化生成的文件,就是模型量化后的文件,只要放到算法层,根据 demo 示例去修改一下配置,就可以直接上板进行验证。
接下来是一些黑芝麻智能已经验证的模型,比如说像一些经典的 NN 模型,以及常见的 PointPillars 雷达效果点云的模型。同时还支持Transformer。Transformer 也是一个当前热门的模型结构,像 Swim Transformer、BEVFormer、FastBEV、PETRv2 这些都有很好的支持,下方 ppt 右边就是一个 BEV 的效果图。
黑芝麻智能成立以来,已经和很多客户达成了深度的合作。其中,Nullmax 是行业领先的自动驾驶科技公司,致力于打造全场景的无人驾驶应用,加速推动移动出行产业的智能化变革。黑芝麻智能与 Nullmax 深化合作,基于华山 A1000 和武当 C1200 家族芯片,共同为主机厂提供高性价比和高价值的 BEV 无图单芯片 NOA 智驾方案。接下来的时间交给周经理,让他来介绍一下关于黑芝麻智能和 Nullmax 的合作的一些细节。
登录后才可以发布评论哦
打开小程序可以发布评论哦