大家好,最近在搞 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 基本操作与容器启动

先拉镜像、跑容器,这是基础。

  1. 拉取镜像

    docker pull rockchip/rknn-toolkit2:latest
    
  2. 运行容器

    docker run -it --name rknn-container rockchip/rknn-toolkit2:latest
    
    • -it:交互模式,进入终端。
    • --name:给容器起名,便于管理。
  3. 进入容器(如果容器已退出):

    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.rknncurl -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,不测端口。用:
    telnet Windows主机IP 8080
    
    或 RK3588 上 curl 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 auxnetstat -tuln

常见坑点 FAQ

基于实际调试,整理了这些 Q&A:

  1. RKNN 转换参数:target_platform=‘rk3588’,do_quantization=True。输出到指定 dir。

  2. 短音频模型:RKNN 自动 pad/trim,支持 <30s。

  3. 容器名冲突:stop/rm 旧的。

  4. 主机到容器复制:用 docker cp 或 -v 挂载。

  5. RK3588 互传:scp 直传,或 NFS/SMB。

  6. 网络不存在:先 docker network create

  7. ping 不通:用端口映射,非自定义 IP。

  8. 端口测试:curl/telnet,别用 ping。

  9. 服务检查docker ps 看映射,容器内 netstat。

  10. 网页访问失败:查防火墙、日志(Flask 控制台)。

  11. Empty reply:服务未监听 0.0.0.0。

  12. 无进程:手动跑服务。

  13. 404:路径错,用 /list 查。

  14. 关于如何检查容器防火墙、服务是否启动、端口是否正确映射

    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 -L
    

    6. 用 curl 或 telnet 测试端口
    在主机或边缘设备上:

    curl http://主机IP:端口
    telnet 主机IP 端口
    

结语

这个方案让我在 Windows 上愉快转换模型,直传 RK3588 跑推理,效率翻倍!如果你用的是其他模型(YOLO、Whisper 等),调整下 load_onnx 路径就行。欢迎评论区交流,有坑一起踩~ 代码和镜像全开源,Docker Hub 搜 “rockchip/rknn” 起步。

参考:Rockchip 官方文档 + Docker 实战。点赞收藏,下篇聊 RK3588 上线部署!

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐