导读
ZMC700E是ZLG致远电子新一代高性能EtherCAT控制器,内置算力最高6TOPS的NPU,支持AI算法部署,兼具工业级稳定性与高效推理。本文介绍其NPU特性、RKNN工具链及部署流程,助力AI二次开发。
ZMC700E 是广州致远电子股份有限公司开发的最新一代高性能智能总线型控制器,是面向工厂智能化时代的机器控制器。其采用工业领域内先进的嵌入式 ARM 方案,集实时操作系统、智能算法于一身,以 EtherCAT 工业以太网协议为向导,可以快速、有效、便捷的构建数控智能化设备,以适应工厂智能化、信息化产业的变革。
ZMC700E 采用 RK3576 低功耗高性能处理器为核心,它集成了 4 核 Cortex-A72 + 4 核 Cortex-A53 + ARM Cortex-M0,并配有独立的 NEON 协处理器。同时板载 4GB DDR4、8GB eMMC 以及 32KB EEPROM。ZMC700E 主站控制器为了满足不同的自动化应用需求,在硬件接口上面,精心设计了 3 路以太网接口,其中 1 路是千兆 网口,2 路是 EtherCAT 主站百兆网口;5 路 RS485 支持 ModbusRTU 协议;2 路 CAN 支持 CANOpen 协议;2 路 232;16 个用户 I/O,其中 8 路 DI,8 路 DO;1 个 USB3.0 TypeA 接口;1 个 TypeC 接口用于程序升级;1 个 TypeC 接口用于串口调试;1 个 HDMI 接口;支持 TF 卡;系统电源采用高稳定非隔离电源,支持掉电检测;提 供多种程序加密手段,保护用户应用软件知识产权。
ZMC700E 可以广泛应用于电力设备、储能设备、注塑行业、冲压行业、车床行业、搬运码垛、关节机器人、喷涂、玻璃机、压铸机、包装设备、3C 设备、锂电池设备、纺织、流水线工作站、非标自动化装备、特种机床等高端设备应用。
ZMC700E 外观和接口图如下所示:
NPU(神经网络处理单元)作为AI部署的核心硬件,专为加速神经网络算法设计,可高效支撑机器视觉、智能检测等工业AI场景,而RKNN工具链则是ZMC700E实现AI部署的关键支撑,下面就详细介绍NPU相关特性、RKNN工具链及ZMC700E的AI部署全流程。
NPU是什么?
NPU(Neural Processing Unit),即神经网络处理单元,是一种专门为加速人工智能领域神经网络算法而设计的专用处理单元。与通用计算的CPU不同,NPU针对卷积运算、矩阵乘法、激活函数等AI模型的核心计算操作进行了硬件层面的深度优化。它通常采用高度并行的MAC(乘积累加运算)阵列架构,能够大幅提升神经网络前向推理(Inference)的速度,同时显著降低系统功耗,是实现边缘侧、设备端AI实时计算的关键硬件。
随着人工智能在机器视觉、自然语言处理、自动语音识别、高级驾驶辅助系统等领域的广泛应用,NPU已成为从消费电子到工业控制各类智能设备的标准配置。在工业领域,NPU使得在产线现场直接进行视觉缺陷检测、工件分类、行为分析、预测性维护等成为可能,无需将海量数据上传至云端,既保证了实时性,也增强了数据安全与隐私。
NPU算力揭秘:TOPS的计算
衡量NPU性能的核心指标是算力,其常用单位为TOPS,即每秒可执行一万亿次操作。在工业AI部署场景中,TOPS特指8位整型(INT8)精度下的算力,而INT8精度因能很好地兼顾算力输出与系统功耗,已成为工业领域AI部署的主流选择。
NPU的算力(TOPS)与其硬件架构直接相关,其中核心计算单元MAC阵列的规模和工作频率,是决定其峰值算力的关键因素,具体简化计算公式如下:
ZMC700E所搭载的RK3576处理器内置NPU,采用与上述公式对应的硬件设计,可提供INT8精度下最高6 TOPS的算力,同时支持INT16精度的卷积运算,完全能够满足大多数工业视觉检测与识别任务的需求。
NPU与RKNN工具链的优缺点分析
ZMC700E搭载的NPU及配套RKNN工具链,为工业AI部署提供了高效解决方案,但同时也存在一些需要注意的细节的问题,以下是详细分析:
1. 优点
专用算力优化,推理效率高:NPU专为神经网络运算设计,针对卷积、池化等核心操作进行硬件加速,相比CPU推理速度提升数倍,能满足工业场景下的实时检测、快速响应需求,适配视觉检测、智能控制等高频AI任务。
丰富的框架与模型支持:RKNN工具链支持TensorFlow、PyTorch、Caffe、ONNX、TFLite等主流深度学习框架,可直接将训练好的通用模型转换为RKNN格式,无需大量修改代码,大幅降低AI部署门槛。
完善的工具链支撑:RKNN工具链包含RKNN-Toolkit2(PC端)和RKNN Toolkit Lite2(板端),提供模型转换、量化、推理、性能评估等一站式功能,开发者可快速完成从算法验证到板端部署的全流程。
工业级稳定性适配:NPU集成于RK3576处理器,经过工业场景验证,搭配ZMC700E的工业级硬件设计,可适应高低温、强干扰等工业现场环境,满足工业设备长期稳定运行的需求。
轻量化部署支持:RKNN Toolkit Lite2针对嵌入式设备优化,体积小、资源占用低,可完美适配ZMC700E的嵌入式环境,无需额外扩展硬件,降低部署成本。
2. 缺点
版本依赖严格:RKNN-Toolkit2、板端驱动(librknnrt.so)、固件版本需严格匹配,否则会导致转换失败或运行错误。
量化精度折衷:INT8量化可大幅提升速度、降低功耗,但会引入微小精度损失;高精度需求场景,需采用混合量化弥补。
特殊和新算子支持有限:RKNN工具链能良好支持主流深度学习框架中常用算子的参数的常规配置,特殊配置可能会出错;新算子支持依赖瑞芯微(RK)工具链版本更新。
RKNNTool2环境安装
在使用Ubuntu 22.04虚拟机,先安装miniforge、miniconda或anaconda中的任意一种Python包管理工具。打开终端:
conda create -n toolkit2 python=3.8
激活 toolkit2 环境,后续将在此环境中安装 RKNN-Toolkit2:
conda activate toolkit2
从官方RKNN-Toolkit2仓库拉取:
git clone https://github.com/airockchip/rknn-toolkit2
进入 rknn-toolkit2 目录,本地安装依赖包:
pip install -r packages/x86_64/requirements_cp38-x.x.x.txtpip install packages/x86_64/rknn_toolkit2-x.x.x-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
执行以下命令,若没有报错,则代表 RKNN-Toolkit2 环境安装成功:
# 进入 Python 交互模式python# 导入 RKNN 类from rknn.api import RKNN
准备工作
执行以下命令,若没有报错,则代表 RKNN-Toolkit2 环境安装成功。使用TypeC数据线接侧面Download口,可另一边接电脑。电脑会弹出窗口,会弹出adb设备归属选择,选择ubuntu虚拟机。
新建终端,通过adb devices可以查看设备ID,并记录。
模型转换
各大深度学习的平台都有自己模型的格式,同样也只支持自己的格式,需要将其他平台格式转成.rknn。因为ONNX支持各个平台的转换,而RK官方对ONNX的支持也比较深,因此推荐各个深度学习平台可以先导出.onnx,再通过RKNN Tool2转换成.rknn。以RK官方自带的Yolov5作为示例:
cd examples/onnx/yolov5
其中,model_config.yml是模型量化配置工具,内容如下:
models:name: yolov5s_relu #模型输出名称platform: onnx # 原始模型使用的框架model_file_path: ./yolov5s_relu.onnx #原模型路径quantize: true # 是否量化dataset: ./dataset.txt # 量化dataset文件路径(相对yml路径)configs:quantized_dtype: asymmetric_quantized-8 # 量化类型mean_values: [0, 0, 0] # rknn.config的mean_values参数std_values: [255, 255, 255] # rknn.config的std_values参数quant_img_RGB2BGR: false # 不进行RGB2BGR转换quantized_algorithm: normal # 量化算法quantized_method: channel # 量化方法
dataset.txt是模型量化用的图像数据的路径,一行一个样本,推荐至少500个,官方示例只给了一个样本如下:
bus.jpg
模型转换代码写到了test.py,其中涉及的接口config,load_onnx, build和export, 代码如下:
# Create RKNN objectrknn = RKNN(verbose=True)# pre-process configprint('--> Config model')rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], target_platform='rk3576')print('done')# Load ONNX modelprint('--> Loading model')ret = rknn.load_onnx(model=ONNX_MODEL)if ret != 0:print('Load model failed!')exit(ret)print('done')# Build modelprint('--> Building model')ret = rknn.build(do_quantization=QUANTIZE_ON, dataset=DATASET)if ret != 0:print('Build model failed!')exit(ret)print('done')# Export RKNN modelprint('--> Export rknn model')ret = rknn.export_rknn(RKNN_MODEL)if ret != 0:print('Export rknn model failed!')exit(ret)print('done')
rknn的推理,涉及init_runtime,inference接口:
# Init runtime environmentprint('--> Init runtime environment')ret = rknn.init_runtime(target='rk3576',device_id='379b7d35be0f215b')if ret != 0:print('Init runtime environment failed!')exit(ret)print('done')# Set inputsimg = cv2.imread(IMG_PATH)# img, ratio, (dw, dh) = letterbox(img, new_shape=(IMG_SIZE, IMG_SIZE))img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)img = cv2.resize(img, (IMG_SIZE, IMG_SIZE))# Inferenceprint('--> Running model')img2 = np.expand_dims(img, 0)outputs = rknn.inference(inputs=[img2], data_format=['nhwc'])np.save('./onnx_yolov5_0.npy', outputs[0])np.save('./onnx_yolov5_1.npy', outputs[1])np.save('./onnx_yolov5_2.npy', outputs[2])print('done')# post processinput0_data = outputs[0]input1_data = outputs[1]input2_data = outputs[2]input0_data = input0_data.reshape([3, -1]+list(input0_data.shape[-2:]))input1_data = input1_data.reshape([3, -1]+list(input1_data.shape[-2:]))input2_data = input2_data.reshape([3, -1]+list(input2_data.shape[-2:]))input_data = list()input_data.append(np.transpose(input0_data, (2, 3, 0, 1)))input_data.append(np.transpose(input1_data, (2, 3, 0, 1)))input_data.append(np.transpose(input2_data, (2, 3, 0, 1)))boxes, classes, scores = yolov5_post_process(input_data)img_1 = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)if boxes is not None:draw(img_1, boxes, scores, classes)cv2.imwrite('result.jpg', img_1)print('Save results to result.jpg!')
运行python test.py,可以看到生成了yolov5s_relu.rknn。
目标检测如result.jpg,如下:
行人和大巴可以准确识别,说明转换和推理都是成功的。
ZMC700E测试
从https://github.com/airockchip/rknn_model_zoo下载:
git clone https://github.com/airockchip/rknn_model_zoo
仍以yolov5为示例,在上述的yolov5s_relu.rknn放到yolov5/model目录下,在仓库目录下新建build_zmc700e.sh。
脚本内容如下:
export GCC_COMPILER=/opt/zlg/aarch64-buildroot-linux-gnu_sdk-buildroot/bin/aarch64-linuxexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/zlg/aarch64-buildroot-linux-gnu_sdk-buildroot/lib./build-linux.sh -t rk3576 -a aarch64 -d yolov5
执行该脚本,则yolov5的生成的工程可执行文件,模型以及依赖库就存在install中,将install使用adb push到ZMC700E工控器上。
adb push ./install /opt
在ZMC700E工控器进入到示例中,进行测试。
会生成out.png,通过adb pull 传到虚拟机查看:
adb pull /opt/install/rk3576_linux_aarch64/rknn_yolov5_demo/out.png .
55
