在《cifar100模型训练》中,我们已经使用 tpacker
将模型打包成二进制格式。本文将基于 聆思大模型 AI 开发套件介绍如何在 CSK6芯片 上部署该模型。
开发套件的 SDK(duomotai_ap)的 apps/resnet18
目录中包含了一个示例程序,可用于快速理解模型的部署过程。该示例部署了一个 resnet18 图像分类模型,可通过套件摄像头拍摄照片后送入 NPU 推理,并将结果反馈到套件的屏幕中。
请参照《获取开发环境与SDK》进行大模型AI开发套件SDK的下载与初始化,若您之前已经操作过,可忽略本步骤。
建议您在开发前,参照《本地SDK更新》将SDK更新至最新版本。
在 duomotai_ap
目录下,执行以下指令进行代码编译:(以 Windows CMD 终端为例):
# 编译
lisa zep build -b csk6_duomotai_devkit -s apps\resnet18 -p -- -DCONFIG_APLICATION_PACK_IMAGES=y
其中 CONFIG_APLICATION_PACK_IMAGES=y
表示将所有相关运行资源全部打包在一个 bin 文件里烧录,适合第一次烧录时使用。在平时的开发调试中如果希望只烧录程序本身,可以将 y
改为 n
以节省烧录耗时。
编译完成后,编译产物二进制文件位于 build\zephyr\zephyr.bin
使用 Type-C 数据线连接开发套件的 DAP_USB
接口,执行以下命令进行烧录:
lisa zep exec cskburn -s \\.\COMxx -C 6 -b 1500000 0x000000 --verify-all .\build\zephyr\zephyr.bin
或
lisa zep flash -r pyocd --frequency 20000000
其中的 COMx 代表开发套件连接到 PC 上对应的串口号(可通过设备管理器查看)。例如:COM3
。
lisa zep exec cskburn -s PORT -C 6 0x000000 --verify-all ./build/zephyr/zephyr.bin -b 1500000
其中的 PORT 代表开发套件连接到 PC 上对应的串口号。例如:/dev/ttyUSB0
。
打包成二进制之后的模型文件位于 resources/images/model.bin
,你可以将它替换为你自己的模型。其偏移值和长度在 boards/csk6_duomotai_devkit.overlay
中定义:
res_thinker_model_partition: partition@300000 {
label = "thinker_model";
reg = <0x00300000 2932416>;
};
更换模型后,你需要注意将长度(上方代码中的 2932416
)更改为新模型的实际长度。示例程序启动时会自动从该偏移值加载模型。
更换模型后,你就可以使用前述方法烧录整个 bin
文件,也可以指定 CONFIG_APLICATION_PACK_IMAGES=n
编译后,使用 cskburn 单独烧录模型文件:
# 其中 COMx 代表套件在电脑上的串口号
lisa zep exec cskburn -C 6 -b 1500000 -s COMx 0x300000 resources/images/model.bin
服务的标准输入和输出数据类型为 tData
。服务提供了一个 thinker_service_gcs_forward(inputs, input_cnt, *outputs, *output_cnt)
接口,可以传入一个或同时传入多个 input,等待引擎推理,并返回一个或多个 output。
tData input;
input.dtype_ = Int8;
input.scale_ = 6;
input.shape_.ndim_ = 4;
input.shape_.dims_[0] = 1;
input.shape_.dims_[1] = 3;
input.shape_.dims_[2] = 128;
input.shape_.dims_[3] = 64;
input.dptr_ = my_features;
uint32_t input_cnt = 1;
tData *output;
uint32_t output_cnt;
thinker_service_gcs_forward(&input, input_cnt, &output, &output_cnt);
// output_cnt 会被赋值为模型的 output 数,output 即为该次推理的结果
可参考 apps/resnet18/src/resnet18.c
中的实现。