超强干货!基于黑芝麻智能山海工具链的模型量化编译与部署

车车东西 2024-11-13 09:25:15

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的合作的一些细节。

0 阅读:2

车车东西

简介:感谢大家的关注