Windows 下 Docker 部署 RKNN-Toolkit 并与局域网内边缘设备通讯
本文介绍了在Windows系统下通过Docker部署RKNN-Toolkit工具包的高效方案。主要内容包括:1)使用Docker容器简化RKNN-Toolkit环境配置;2)ONNX模型转换RKNN格式的详细步骤;3)容器与主机、RK3588开发板间的文件传输方法;4)网络配置与端口映射技巧;5)容器管理及常见问题解决方案。该方案避免了Windows原生安装的复杂依赖问题,同时提供了便捷的模型转换
大家好,最近在搞 Rockchip RK3588 的 AI 模型部署,RKNN-Toolkit 是必备工具。有同学没有Linux环境同时部署Linux镜像的虚拟机及其繁琐,但在 Windows 上直接安装环境总是一堆坑,尤其是依赖和兼容性问题。幸好 Docker 救场!今天分享一个基于 Docker 的部署方案,不仅能轻松在 Windows 上跑起 RKNN-Toolkit,还能通过容器直接向局域网内的 RK3588 传输转换后的模型文件(比如 .rknn 文件)。
这个方案涵盖了从基本操作到网络传输的常见坑点。文末附上完整 FAQ,如果你卡壳了可以直接对照。走起!
为什么用 Docker 部署 RKNN-Toolkit?
RKNN-Toolkit 是 Rockchip 官方的神经网络工具包,支持模型转换(ONNX/TensorFlow 等转 RKNN 格式)、量化、性能评估等。Windows 原生安装需要 Python 3.6+、NumPy、Protobuf 等一堆依赖,还得配 ONNX Runtime,超级麻烦。
Docker 镜像一拉,环境全搞定!Rockchip 官方有 RKNN Docker 镜像(比如 rockchip/rknn-toolkit2),Windows 支持 Docker Desktop,一键运行。传输文件时,用容器内工具(如 scp)或简单 Flask 服务,就能推到 RK3588 上测试。
前提准备:
- 安装 Docker Desktop(Windows 版),启用 WSL2。
- 拉取 RKNN 镜像:
docker pull rockchip/rknn-toolkit2:latest(根据版本调整)。 - 确保 Windows 和 RK3588 在同一局域网(ping 通主机 IP)。
步骤 1: Docker 基本操作与容器启动
先拉镜像、跑容器,这是基础。
-
拉取镜像:
docker pull rockchip/rknn-toolkit2:latest -
运行容器:
docker run -it --name rknn-container rockchip/rknn-toolkit2:latest-it:交互模式,进入终端。--name:给容器起名,便于管理。
-
进入容器(如果容器已退出):
docker exec -it rknn-container bash
容器启动后,你就进入了一个 Ubuntu 环境,RKNN-Toolkit 已预装。验证一下:
python -c "from rknn.api import RKNN; print('RKNN ready!')"
步骤 2: RKNN 模型转换(ONNX 导出示例)
假设你有 ONNX 模型(比如 Whisper 的 ONNX 版),在容器内转换到 RKNN 格式。RKNN 支持类似参数配置。
示例代码(保存为 convert.py,在容器内运行):
from rknn.api import RKNN
rknn = RKNN()
# 配置
rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], target_platform='rk3588')
rknn.load_onnx(model='whisper.onnx') # 你的 ONNX 文件路径
rknn.build(do_quantization=True, dataset='./dataset.txt') # 量化,需准备数据集
rknn.export_rknn('whisper.rknn') # 输出 RKNN 文件
rknn.release()
print('转换完成!')
运行:python convert.py。生成的 whisper.rknn 就是 RK3588 能跑的模型文件。
参数说明(类似 Whisper ONNX 导出):
target_platform:目标芯片,如 ‘rk3588’。do_quantization:是否量化,影响精度和速度。- 输出路径:默认当前目录,可指定
--output_dir。
语音模型少于 30s? RKNN 支持任意长度输入,会自动 pad/trim。
步骤 3: 文件传输到 RK3588
转换完模型,得推到 RK3588 上跑。Docker 容器和主机/RK3588 互传文件是关键。
3.1 容器与主机互传
- 从容器取文件到主机:
docker cp rknn-container:/workspace/whisper.rknn C:\rknn_models\ - 主机文件夹复制到容器(已运行容器):
docker cp C:\input_models\ rknn-container:/workspace/
更好的是用卷挂载(新建容器时):
docker run -it -v C:/rknn_models:/workspace/models --name rknn-container rockchip/rknn-toolkit2:latest bash
- 这样,主机
C:/rknn_models直接映射到容器/workspace/models,改动实时同步。
3.2 容器向 RK3588 传输
RK3588 在局域网内,推荐挂载主机目录,然后主机用 scp/smb 传;或容器内直接 scp。
-
容器内 scp 传输(需容器有 scp 工具,RKNN 镜像通常有):
进入容器:scp /workspace/whisper.rknn rk3588_user@192.168.1.100:/home/rk3588/models/- 替换 IP 为 RK3588 的地址,输入密码。
-
用 Flask 服务下载(简单局域网分享):
针对我使用的 RK3588 是 Debian 命令行环境,因此用 Flask 提供 HTTP 文件下载接口,然后在 RK3588 上用 curl 或 wget 下载文件写一段代码可以启动服务之后确保监听 0.0.0.0:8000,确保外部可以访问,把要共享的文件放到 /app/share 目录(可用挂载卷映射主机目录),然后我可以以此来将容器中的文件传输到RK3588上。
在容器内跑一个 Flask 文件服务器,确保要下载的文件已经放在容器内 /app/share 目录下, RK3588 拉取。示例代码(
flask_server.py):from flask import Flask, send_from_directory import os app = Flask(__name__) SHARE_DIR = "/workspace" # 你的模型目录 @app.route('/download/<filename>') def download_file(filename): return send_from_directory(SHARE_DIR, filename, as_attachment=True) @app.route('/list') def list_files(): files = os.listdir(SHARE_DIR) return "\n".join(files) if __name__ == '__main__': app.run(host="0.0.0.0", port=8000)运行:
pip install flask(如果镜像无),然后python flask_server.py。在 RK3588 上:
- 列文件:
curl http://Windows主机IP:8080/list(注意端口映射,见下文) - 下载:
wget http://Windows主机IP:8080/download/whisper.rknn或curl -O http://主机IP:8080/download/whisper.rknn
- 列文件:
步骤 4: 网络配置与端口映射
Windows Docker 默认用 bridge 网络,RK3588 可能 ping 不通容器 IP。解决:
4.1 查看容器网络
docker inspect -f "{{ .NetworkSettings.IPAddress }}" rknn-container
默认 IP 如 172.17.0.2。
4.2 自定义网络 & 指定 IP
docker network create --subnet=192.168.10.0/24 mynet
docker run -it --net mynet --ip 192.168.10.199 -p 8080:8000 -v C:/rknn_models:/workspace --name rknn-container rockchip/rknn-toolkit2:latest bash
--net mynet --ip:固定 IP,便于 RK3588 访问。-p 8080:8000:主机 8080 映射容器 8000(Flask 端口)。
RK3588 ping 容器 IP 不通?用 host 模式:--network host(但 Windows Docker Desktop 有限制,建议端口映射)。
4.3 测试端口
- ping 只测 IP,不测端口。用:
或 RK3588 上telnet Windows主机IP 8080curl http://Windows主机IP:8080/list。
如果 404? 检查文件名(用 /list 确认)。Empty reply? 服务没启动或监听错地址(确保 host="0.0.0.0")。
防火墙问题:Windows 防火墙允许 Docker/8080 端口。
步骤 5: 容器管理 & 持久化
-
停止/删除:
docker stop rknn-container docker rm rknn-container docker rmi rockchip/rknn-toolkit2:latest # 删除镜像 -
重启进入:
docker start rknn-container docker exec -it rknn-container bash -
保存修改(加了文件后):
docker commit rknn-container my-rknn-toolkit:v1
容器无服务?手动启动 Flask 或 RKNN 脚本。查看进程:容器内 ps aux 或 netstat -tuln。
常见坑点 FAQ
基于实际调试,整理了这些 Q&A:
-
RKNN 转换参数:target_platform=‘rk3588’,do_quantization=True。输出到指定 dir。
-
短音频模型:RKNN 自动 pad/trim,支持 <30s。
-
容器名冲突:stop/rm 旧的。
-
主机到容器复制:用
docker cp或 -v 挂载。 -
RK3588 互传:scp 直传,或 NFS/SMB。
-
网络不存在:先
docker network create。 -
ping 不通:用端口映射,非自定义 IP。
-
端口测试:curl/telnet,别用 ping。
-
服务检查:
docker ps看映射,容器内 netstat。 -
网页访问失败:查防火墙、日志(Flask 控制台)。
-
Empty reply:服务未监听 0.0.0.0。
-
无进程:手动跑服务。
-
404:路径错,用 /list 查。
-
关于如何检查容器防火墙、服务是否启动、端口是否正确映射 :
1. 检查容器服务是否启动
进入容器,确认服务进程在运行(如 Python、nginx、flask 等):docker exec -it 容器名 bash ps aux或直接运行服务相关命令,确认端口监听。
ps aux 若没有其他服务进程。这说明容器内没有其他服务在运行,或者服务已经退出,这会导致边缘设备使用 curl 访问端口时没有响应(Empty reply from server)。
2. 检查端口监听
在容器内用 netstat 或 ss 命令:netstat -tuln确认服务监听的是 0.0.0.0:端口 或容器 IP:端口。
3. 检查端口映射
在主机上查看容器端口映射:docker ps看 PORTS 列是否有你映射的端口(如 0.0.0.0:8080->8000/tcp)。
4. 检查主机防火墙
Windows 主机可在“控制面板-防火墙”或用命令:netsh advfirewall firewall show rule name=all确认端口未被阻挡。
5. 检查容器防火墙
大多数容器默认无防火墙。可用 iptables 命令查看(需容器内有该工具):iptables -L6. 用 curl 或 telnet 测试端口
在主机或边缘设备上:curl http://主机IP:端口 telnet 主机IP 端口
结语
这个方案让我在 Windows 上愉快转换模型,直传 RK3588 跑推理,效率翻倍!如果你用的是其他模型(YOLO、Whisper 等),调整下 load_onnx 路径就行。欢迎评论区交流,有坑一起踩~ 代码和镜像全开源,Docker Hub 搜 “rockchip/rknn” 起步。
参考:Rockchip 官方文档 + Docker 实战。点赞收藏,下篇聊 RK3588 上线部署!
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)