npu工具链体验
前言
近年来,国产神经处理单元(NPU)迅速崛起,成为推动人工智能发展的重要力量。这些NPU以高效的计算能力和能耗优势广泛应用于智能手机、自动驾驶、物联网等领域。目前,许多国内企业,如华为、寒武纪和百度等,已推出自主研发的NPU产品,并在市场上形成了一定的布局。周易也在该领域加码,推出了一系列面向不同算力需求的自研npu架构。
然而,国产NPU在发展过程中也面临着一些挑战。首先,AI软件栈的开放性问题仍然存在,许多NPU的开发环境和工具链相对封闭,导致开发者在使用时遇到障碍。这限制了NPU的生态系统扩展和应用的灵活性。
其次,软件适配问题也是一个亟待解决的难题。由于各家NPU在架构、指令集和性能特征上存在差异,开发者需要为不同的硬件平台进行优化和适配,增加了开发的复杂性和时间成本。为了提高国产NPU的竞争力,推动软件生态的成熟,将是未来发展的关键。
个人使用
首先还是先根据官方提供的教程文档,搭建好相关的部署工具SDK
周易 SDK 是一个全栈平台,可为用户提供快速上市的开发和部署能力
教程:https://docs.radxa.com/sirider/s1/app-development/zhouyi\_npu
1、安装conda虚拟环境隔离
$ conda --version
conda 23.10.0
如出现 conda: command not found, 则表示未安装 anaconda, 请参考 Anaconda 官网进行安装
创建 conda 环境
conda create -n aipu python=3.8
进入 aipu conda 环境
conda activate aipu
退出环境
conda deactivate
个人使用的是服务器,为x86架构的ubuntu20.04系统
在瑞莎下载站下载周易 Z2 SDK 安装包后解压安装
tar -xvf Zhouyi_Z2.tar.gz
cd Zhouyi_Z2 && bash +x SETUP.SH
进入安装的页面,会有一堆license条款,只要一直按y同意即可,中间提示输入安装路径就命名一个,并且同意新创建。等待安装完成
最后会提示一行文字表示安装成功
SiEngine AloT Zhouyi 22 Compass Software Package Install
Successful to /root/tool
安装后得到的完整 SDK 文件如下
AI610-SDK-r1p3-AIoT : ARM ZhouYi Z2 工具包
siengine : siengine 提供的 ARM ZhouYi Z2 模型编译(nn-compiler-user-case-example)及板子部署(nn-runtime-user-case-example)的 demos
提供了resnet50的部署示例代码
配置 nn-compiler 环境,等待pip包下载完成即可
cd AI610-SDK-r1p3-AIoT/AI610-SDK-r1p3-00eac0/Out-Of-Box/out-of-box-nn-compiler
pip3 install -r lib_dependency.txt
模型转换
模型转换工具,如nn-compiler,是连接高层深度学习框架与特定硬件加速平台的重要桥梁。它能够将TensorFlow、ONNX等框架中的模型转换为适合在周易AIPU等硬件上进行推理的格式。这一过程不仅提升了模型在特定硬件上的运行效率,还确保了深度学习模型能够充分利用硬件的并行计算能力,从而加速推理过程。
转换的必要性在于,不同的深度学习框架和硬件平台之间存在架构和实现上的差异,直接使用原始模型可能无法达到最佳性能。通过模型转换,可以优化模型结构、量化权重以及调整计算图,从而有效提升推理速度和降低能耗,使得在边缘设备和移动端的AI应用更加高效和实用。
进入 siengine nn-compiler-user-case-example 目录
如没配置好 nn-compiler 环境, 请按照 x86 PC 端安装 AIPU SDK进行配置
cd siengine/nn-compiler-user-case-example/onnx
生成量化校准集
python3 generate_calibration_data.py
生成用于模型推理的照片文件
python3 generate_input_binary.py
文件在 ./resnet50/input_3_224_224.bin
(可选) 配置 build.cfg (开箱即用案例已提供)
vim ./resnet50/build.cfg
生成 aipu 模型
cd ./restnet50
aipubuild build.cfg
在 ./restnet50 中得到 aipu_mlperf_resnet50.bin
该二进制文件可以直接在板载进行推理。
在 x86 PC 端交叉编译二进制可执行文件
安装 gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu 交叉编译工具链
link:https://releases.linaro.org/c...
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar
cp -r gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu /opt
编译 aiputest
修改 UMDSRC 变量
cd siengine/nn-runtime-user-case-example
vim CMakeLists.txt
#set(UMDSRC "${CMAKE_SOURCE_DIR}/../AI610-SDK-${AIPU_VERSION}-00eac0/AI610-SDK-1012-${AIPU_VERSION}-eac0/Linux-driver/driver/umd")
set(UMDSRC "${CMAKE_SOURCE_DIR}/../../AI610-SDK-${AIPU_VERSION}-AIoT/AI610-SDK-r1p3-00eac0/AI610-SDK-1012-${AIPU_VERSION}-eac0/Linux-driver/driver/umd")
交叉编译
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make
编译生成的文件在 siengine/nn-runtime-user-case-example/out/linux/aipu_test
板端推理
在 Sirider S1 进行板端推理
使用ssh(板子ssh只有client,需要安装sshd server,直接安装会有版本冲突问题,安装对应版本后即可正常食用)将生成的 aipu_mlperf_resnet50.bin 模型文件,input_3_224_224.bin 照片文件,aipu_test 可执行文件,out/linux/libs 动态库文件夹复制到 Sirider S1 中
运行可执行文件、模型、以及输入即可得到推理的输出
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<your libs path>
./aipu_test aipu_mlperf_resnet50.bin input_3_224_224.bin
使用体验
整个工具链使用下来感觉较为易用,基本的功能都有还有相关demo示例,未来将多研究SDK的文档doc,进行更深入的开发。
运行yolov8工业检测
既然是工业场景的开发板,又具有一定的ai推理能力。
为了契合场景,就找了一个工业缺陷检测的项目,部署在S1开发板上。
先尝试在cpu上跑通,使用python
后面看能不能改成cpp实现,参考SDK上的yolodemo示例在npu上运行。
官方给的好像都是resnet的实现
clone代码 工业基建缺陷检测
https://github.com/Wh0rigin/y...
创建虚拟环境,使用arrch64 arm版本的miniconda,下载使用清华镜像。
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py39_23.11.0-1-Linux-aarch64.sh
创建虚拟环境 py3.8版本
将requirements里的包替换成,arm板卡上支持的版本
如pytorch
运行脚本
python crack_predict.py
推理成功
原图片
检测后的缺陷图
使用top查看cpu负载情况
后续再查看SDK的源码,看看怎么调用npu