Ubuntu利用docker将ONNX模型转换为RK3588模型

发布于:2025-04-12 ⋅ 阅读:(177) ⋅ 点赞:(0)

1.安装docker

下载教程

1.拉取镜像

方法一:通过命令拉取

   # 下载官方Docker镜像
   sudo docker pull registry.cn-hangzhou.aliyuncs.com/rockchip/rknn-toolkit2:v2.3.0

方法二:通过rknn-toolkit2自带的直接安装

2.开始工作

创建工作目录并复制ONNX模型

   # 创建工作目录
   mkdir -p ~/rknn_workspace
   
   # 复制ONNX模型到工作目录
   cp /mnt/e/Projects/3.项目/RKNN/fnet_onnx/fnet.onnx ~/rknn_workspace/

运行Docker容器并挂载目录

   # 运行Docker容器,挂载工作目录
   docker run -it --rm \
     -v ~/rknn_workspace:/workspace \
     rknn-toolkit2:local \
     /bin/bash
  1. 在Docker容器内创建转换脚本
   # 在Docker容器内执行以下命令
   cd /workspace
   
   # 创建转换脚本
   cat > docker_convert.py << 'EOF'
   #!/usr/bin/env python3
   from rknn.api import RKNN
   import numpy as np
   
   ONNX_MODEL = 'fnet.onnx'
   RKNN_MODEL = 'fnet_rk3588.rknn'
   
   # 创建RKNN对象
   rknn = RKNN(verbose=True)
   
   # 配置转换参数
   print('--> Config model')
   rknn.config(
       target_platform='rk3588',
       optimization_level=3,
       batch_size=1,
       single_core_mode=True,
       force_builtin_perm=True,
       quantized_dtype='dynamic_fixed_point-8',
       custom_op_limit=[
           {'type': 'OP_TENSOR_LIMIT', 'limit_size': 10000}
       ]
   )
   print('完成配置')
   
   # 加载ONNX模型
   print('--> 加载ONNX模型')
   ret = rknn.load_onnx(model=ONNX_MODEL)
   if ret != 0:
       print('加载ONNX模型失败!')
       exit(ret)
   print('ONNX模型加载成功')
   
   # 构建模型
   print('--> 构建模型')
   ret = rknn.build(
       do_quantization=True,
       rknn_batch_size=1,
       pre_compile=True
   )
   if ret != 0:
       print('构建模型失败!')
       exit(ret)
   print('模型构建成功!')
   
   # 导出RKNN模型
   print('--> 导出RKNN模型')
   ret = rknn.export_rknn(RKNN_MODEL)
   if ret != 0:
       print('导出RKNN模型失败!')
       exit(ret)
   print('模型导出成功!')
   
   rknn.release()
   
   print('模型转换完成!')
   EOF
   
   # 添加执行权限
   chmod +x docker_convert.py
  1. 运行转换脚本

   # 在Docker容器内执行
   python3 docker_convert.py

查看转换结果:

   # 在Docker容器内查看生成的RKNN模型
   ls -lh /workspace/fnet_rk3588.rknn

退出docker容器:

   # 退出容器
   exit

验证WSL本地目录中的模型:

   # 在WSL中查看生成的模型
   ls -lh ~/rknn_workspace/fnet_rk3588.rknn

将生成的模型复制到原始项目目录:

   # 复制模型到项目目录
   cp ~/rknn_workspace/fnet_rk3588.rknn /mnt/e/Projects/3.项目/RKNN/fnet_onnx/

注意:WSL 和直接的LINUX操作系统部分命令可能有区别

附:1.docker基础

一、Docker是什么?

想象你要搬家,把家具打包进标准集装箱里,无论用轮船、火车还是卡车运输,里面的物品都保持原样。Docker就是软件世界的"集装箱"技术,它将应用及其依赖(代码、环境、配置等)打包成标准化容器,实现​​"一次打包,处处运行"​​。
​核心价值​​:解决"在我电脑能跑,别人电脑报错"的环境差异问题,提升开发部署效率。


二、Docker vs 虚拟机

​特性​ ​Docker容器​ ​传统虚拟机​
​启动速度​ 秒级启动(如启动APP) 分钟级(需启动完整操作系统)
​资源占用​ 仅MB级(共享内核) GB级(独占虚拟硬件资源)
​隔离性​ 进程级隔离(轻量但满足多数场景) 硬件级强隔离(安全性更高)
​适用场景​ 微服务、快速迭代、CI/CD 安全敏感型应用、完整OS环境需求

​举个栗子​​:虚拟机好比每个租客住整栋别墅,Docker则是共享地基的公寓,每个房间独立但共用地基(操作系统内核)。


三、Docker核心概念(必须掌握!)

  1. ​镜像(Image)​

    • 只读模板,相当于软件安装包(包含代码+环境)
    • 分层存储:类似Photoshop图层,基础镜像(如Ubuntu)作为底层,新增内容叠加形成新镜像
    • 常用命令
      docker pull nginx         # 拉取镜像
      docker images            # 查看本地镜像
      docker rmi 镜像ID         # 删除镜像
  2. ​容器(Container)​

    • 镜像的运行实例,相当于运行中的软件
    • 每个容器有独立文件系统、网络、进程空间
    • 常用命令:
      docker run -d -p 80:80 nginx   # 启动容器(后台运行+端口映射)
      docker ps                      # 查看运行中容器
      docker exec -it 容器ID bash     # 进入容器内部
      docker stop 容器ID             # 停止容器
  3. ​仓库(Registry)​

    • 镜像的存储中心,类似应用商店
    • 公共仓库:Docker Hub(默认,含百万镜像)
    • 私有仓库:企业自建(如Harbor)
  4. ​Dockerfile​

    • 文本文件,定义镜像构建步骤(环境安装、文件复制等)
    • 示例:构建Python应用镜像
      FROM python:3.10          # 基础镜像
      WORKDIR /app              # 工作目录
      COPY . .                  # 复制文件
      RUN pip install -r requirements.txt  # 安装依赖
      CMD ["python", "app.py"]  # 启动命令
      构建命令:docker build -t myapp:v1 .

四、Docker底层原理

  1. ​命名空间(Namespaces)​
    • 隔离进程、网络、文件系统等资源,实现"每个容器都以为自己在独立机器上运行"
  2. ​控制组(Cgroups)​
    • 限制CPU/内存等资源使用,防止单个容器耗尽主机资源
  3. ​联合文件系统(UnionFS)​
    • 镜像分层存储,多个容器共享基础层,节省磁盘空间

五、安装与配置(手把手教学)

  1. ​安装Docker(以Ubuntu为例)​
    sudo apt update
    sudo apt install docker-ce
    sudo systemctl start docker
    sudo usermod -aG docker $USER  # 当前用户免sudo操作
  2. ​配置镜像加速​
    {
      "registry-mirrors": ["https://docker.1panel.live"]
    }
    重启服务:sudo systemctl restart docker

六、实战操作场景

  1. ​部署Nginx网站​

    docker run -d --name my-nginx -p 8080:80 nginx
    # 访问 http://localhost:8080 即可看到欢迎页
  2. ​数据持久化​

    docker run -v /宿主机路径:/容器路径 mysql  # 目录映射
  3. ​多容器互联(Docker Compose)​

    version: '3'
    services:
      web:
        image: nginx
        ports: ["80:80"]
      db:
        image: mysql
        environment:
          MYSQL_ROOT_PASSWORD: 123456

    启动:docker-compose up -d


七、安全须知

  1. ​风险点​​:容器逃逸、镜像漏洞、配置不当
  2. ​防护建议​​:
    • 使用非root用户运行容器
    • 定期更新基础镜像
    • 限制容器资源(CPU/内存)
    • 扫描镜像漏洞(如Trivy工具)

八、应用场景

  1. ​微服务架构​​:每个服务独立容器化
  2. ​CI/CD流水线​​:构建→测试→部署全流程标准化
  3. ​快速搭建开发环境​​:一键启动MySQL/Redis等中间件
  4. ​混合云部署​​:跨云平台保持环境一致性

学习建议

  1. ​实操练习​​:从运行第一个容器开始,逐步尝试构建自定义镜像
  2. ​掌握核心命令​​:run/ps/exec/build/logs
  3. ​理解容器编排​​:学习Docker Compose和Kubernetes
  4. ​关注镜像安全​​:选择官方镜像,定期更新

附:2.docker为什么这么神奇?

Docker的神奇之处源于其独特的轻量级虚拟化设计和对底层操作系统的深度优化,其实现机理融合了Linux内核的三大核心能力。以下从核心优势、实现原理、技术架构三方面深入解析:


一、Docker的“神奇”价值:轻量高效与环境一致性


二、Docker实现机理:Linux内核的三大核心技术

  1. ​命名空间(Namespaces)——资源隔离​
    通过6种命名空间实现资源隔离,使每个容器拥有独立的运行环境:

    • ​PID命名空间​​:隔离进程树,容器内进程无法看到宿主机或其他容器的进程

    • ​NET命名空间​​:每个容器独立IP、网卡和防火墙规则,如容器A的80端口与容器B的80端口互不冲突

    • ​MNT命名空间​​:独立的文件系统挂载点,容器看到的根目录与实际宿主机路径隔离

  2. ​控制组(Cgroups)——资源限制​
    通过层级化进程组管理,实现:

    • ​CPU配额​​:限制容器最多使用50%的CPU时间片
    • ​内存硬限制​​:容器内存超限时触发OOM Killer自动终止进程
    • ​磁盘IO优先级​​:为数据库容器分配更高的IO带宽


三、Docker技术架构:三位一体的运行体系


四、Docker与虚拟机的本质差异

​维度​ Docker容器 传统虚拟机
​虚拟化层级​ 操作系统级(共享内核) 硬件级(Hypervisor虚拟化)
​启动速度​ 0.1秒级(相当于启动进程) 1分钟级(需启动完整OS)
​镜像大小​ 通常50MB-500MB(如Alpine仅5MB) 最小1GB以上
​资源开销​ 仅需进程运行资源 需分配固定CPU/内存/磁盘

五、典型应用场景

  1. ​微服务架构​​:每个服务独立容器化,通过Kubernetes实现弹性扩缩容
  2. ​CI/CD流水线​​:构建→测试→部署全流程容器化,耗时从小时级降至分钟级
  3. ​混合云部署​​:同一镜像可运行在AWS/阿里云/本地机房,实现跨云无缝迁移


总结

Docker通过Linux命名空间实现隔离、Cgroups实现资源控制、UnionFS实现高效存储,三者协同构建了轻量级、高性能的容器化解决方案。其核心价值在于用“集装箱”思维标准化软件交付流程,使开发、测试、运维的协作效率发生质变。想要深入实践,可从docker run -d nginx启动第一个容器开始体验


    网站公告

    今日签到

    点亮在社区的每一天
    去签到