6.深入解析AI开发流程
6.1 概述
1.常规AI开发流程
AI开发流程可分为训练迭代和部署上线两个方面:
- 训练迭代,即从选定特定数据集、模型结构、损失函数和评价指标入手,通过模型参数的不断优化,致力于实现尽可能接近或超越领域内最先进技术(SOTA)的结果。
- 部署上线,即把训练好的模型在特定环境中推理运行的过程,更多关注于部署场景、部署方式、吞吐率和延迟。
AI模型通常通过PyTorch、TensorFlow、飞桨等深度学习框架训练完成,但直接使用训练模型推理有两个问题:直接通过这些模型来进行推理需要依赖这些训练框架,用起来比较复杂;不同的硬件的对算子的底层优化方式可能不同,相同模型运行在不同硬件上效率并不高,特别是对延时要求严格的线上场景;由此,经过工业界和学术界数年的探索,AI开发流程有了一条主流的流水线。
这一条流水线解决了模型部署中的两大问题:使用对接深度学习框架和推理引擎的中间表示,开发者不必担心如何在新环境中运行各个复杂的框架;通过中间表示的网络结构优化、推理引擎对运算的底层优化,模型的运算效率大幅提升。
2.基于K230的AI开发流程
基于K230的AI开发流程与主流AI开发流程类似,也是先训练,再部署。训练时开发者可以使用常见深度学习框架,eg:Pytorch、TensorFlow、飞桨等来定义网络结构,并通过训练确定网络中的参数。之后,模型的结构和参数会被转换成一种只描述网络结构的中间表示,eg:onnx、tflite,一些针对网络结构的优化会在中间表示上进行。最终,将中间表示转换成特定的文件格式(kmodel),并利用面向K230的推理引擎(K230Runtime),在K230硬件平台上实现模型的高效运行。
相信大家都对训练过程非常熟悉,因此本文着重介绍部署过程。选择开源repo人脸检测、人脸识别(稍后会详细解释两者含义),这两个开源repo都提供了基于Pytorch训练好的模型;因此,本文以Pytorch模型为例,对AI模型在K230的部署过程展开叙述。
对于Pytorch模型来说,从训练好到部署到K230上,会经过三种文件格式:pth/ckpt->onnx->kmodel,每转成新的文件格式之后,我们都需要验证转换模型的正确性,以保证成功部署。
- 已经训练好的Pytorch模型,我们会用pth推理脚本验证它的正确性;
- 验证pth/ckpt没有问题后,转onnx;
- 转onnx后,验证onnx模型的正确性,需要使用ONNXRuntime来验证,验证流程与Pytorch推理流程类似,包括加载onnx、读取图像/视频流、图像/视频帧预处理、onnx run、后处理、显示结果;
- 验证onnx没有问题,将其转 换为kmodel;
- 此时使用K230Runtime来验证kmodel的正确性,验证流程与ONNXRuntime推理流程类似,包括加载kmodel、读取图像/视频流、图像/视频帧预处理、kmodel run、后处理、显示结果;
- kmodel推理流程正确了,我们AI模型就可以成功部署了。
PyTorch模型从训练到在K230上部署经过三个阶段:pth/ckpt验证(通常已验证)、onnx验证(使用ONNXRuntime),最后是kmodel验证(使用K230Runtime)。每个阶段都需要确保模型的正确性,以保证成功部署。验证流程包括加载模型、处理输入数据、运行推理、处理输出结果,最终确保K230上的AI模型部署成功。
6.2 环境搭建
6.2.1 快速上手
以Windows环境为例,进行快速上手说明。
6.2.1.1 CanMV-K230接口说明
说明:CanMV-K230主板电源和串口(与电脑通讯)共用一个TypeC口,如图中⑤所示:
6.2.1.2 CanMV-K230连接示例
请准备如下硬件,然后按照下图连接:
- CanMV-K230
- TypeC USB线 至少1根
- 网线一根(可选)
- HDMI线一根
- SD卡(若是PC没有SD卡插槽,则需要SD卡读卡器)
- 支持HDMI的显示器
按照上图连接之后,需要在SD卡中烧录镜像,下一小节将会介绍如何烧录镜像。
6.2.1.3 镜像烧录
Linux:
在TF卡插到宿主机之前,输入:
ls -l /dev/sd\*
查看当前的存储设备。
将TF卡插入宿主机后,再次输入:
ls -l /dev/sd\*
查看此时的存储设备,新增加的就是TF卡设备节点。
假设/dev/sdc就是TF卡设备节点,执行如下命令烧录TF卡:
sudo dd if=sysimage-sdcard.img of=/dev/sdc bs=1M oflag=sync
Windows:
Windows下可通过rufus工具对TF卡进行烧录,rufus工具下载地址。
1)将TF卡插入PC,然后启动rufus工具,点击工具界面的”选择”按钮,选择待烧写的固件。
2)点击“开始”按钮开始烧写,烧写过程有进度条展示,烧写结束后会提示“准备就绪”。
说明1:
sysimage-sdcard.img.gz
文件时最好先解压缩,烧录解压缩后的文件。
6.2.1.4 串口驱动安装及上电验证
K230 主板通过USB提供两路调试串口,windows下使用调试串口,需要安装USB转串口驱动程序,驱动下载链接。
安装驱动之后,如何验证驱动是否安装成功?先将CanMV-K230开发板按照6.2.1.2图示连接,然后将连接电源的type c连接线连接到PC USB口,可以发现两个USB串口设备,如下图所示:
同时HDMI连接的显示器会显示人脸检测结果。
6.2.1.5 串口调试
安装完驱动之后,下载串口调试工具,安装之后,创建串口窗口。
连接小核:对于AI Demo来说,小核主要负责网络相关工作。
输入root登录,进入小核
连接大核:大核主要负责和AI相关工作
按q,回车,退出当前人脸检测demo。
如何重新启动人脸检测demo?
6.2.2 编译环境搭建
编译环境搭建涉及sdk、nncase,sdk和nncase有一定的对应关系。我们今天以sdk v1.3.0,nncase v2.7.0为例,进行讲解。k230 sdk和nncase版本的对应关系请参考下述链接:
K230 SDK nncase版本对应关系 — K230 文档 (canaan-creative.com)
6.2.2.1 docker容器构建
#以sdk v1.3为例,搭建软件环境
git clone -b v1.3 https://github.com/kendryte/k230_sdk
cd k230_sdk
make prepare_sourcecode
#手动构建名为v1.3_0219的docker image
docker build -f tools/docker/Dockerfile -t v1.3_0219 tools/docker
#创建名为v1.3_0219_lj的docker容器
docker run -u root --name v1.3_0219_lj -it -v $(pwd):$(pwd) -v $(pwd)/toolchain:/opt/toolchain -w $(pwd) v1.3_0219 /bin/bash
注意:
(1)make prepare_sourcecode
会自动下载Linux和RT-Smart toolchain, buildroot package, AI package等. 请确保该命令执行成功并没有Error产生,下载时间和速度以实际网速为准。
以CanMV-K230开发板为例,手动构建镜像(或直接用官网提供v1.3 CanMV-K230镜像):
make CONF=k230_canmv_defconfig #生成镜像sysimage-sdcard.img.gz
#ls k230_sdk/output/k230_canmv_defconfig/images/
drwxr-xr-x 4 root root 169 Feb 21 14:57 ./
drwxr-xr-x 6 root root 79 Feb 20 11:53 ../
drwxr-xr-x 5 root root 138 Feb 21 14:57 big-core/
lrwxrwxrwx 1 root root 22 Feb 21 14:57 k230_canmv_sdcard_v1.3_nncase_v2.7.0.img.gz -> sysimage-sdcard.img.gz
drwxr-xr-x 7 root root 4096 Feb 21 14:57 little-core/
-rw-rw-rw- 1 root root 486556160 Feb 21 14:57 sysimage-sdcard.img
-rw-rw-rw- 1 root root 56831464 Feb 21 14:57 sysimage-sdcard.img.gz
6.2.2.2 nncase安装
nncase是一个为 AI 加速器设计的神经网络编译器, 目前支持的AI设备( target)有K230/k210/k510等。nncase主要由4部分组成:
- 编译模型APIs(Python):用于在PC上将神经网络模型(onnx、tflite等)编译为kmodel,即生成kmodel。
- 模拟器APIs(Python):用于在PC上模拟推理kmodel,验证nncase模拟推理结果和原模型(onnx、tflite)的推理结果是否一致,即Simulator验证。
- KPU运行时APIs(C++):用于在AI设备加载kmodel,使用KPU Runtime进行推理, 获取输出数据等,即上板推理验证。
- AI2D 运行时APIs(C++):用于在AI设备配置AI2D的参数,生成相关寄存器配置,执行AI2D计算等;常用AI2D计算包括Affine、Crop、Resize、Padding等,可以加速图像的预处理操作,即上板预处理。
#以sdk v1.3为例
#nncase发布版本:https://github.com/kendryte/nncase/releases
#在docker容器中,查看sdk对应的nncase版本
cat src/big/nncase/riscv64/nncase/include/nncase/version.h
#安装对应版本nncase
pip install -i https://pypi.org/simple nncase==2.7.0
pip install nncase-kpu==2.7.0