使用mysql的docker镜像创建一个mysql服务容器,并把my.cnf 和数据库文件映射到宿主机目录

使用Docker创建MySQL容器并映射配置文件和数据目录

以下是在Windows环境下使用Docker Desktop创建MySQL服务容器的步骤。假设你已安装Docker Desktop,并使用PowerShell或命令提示符。

  1. 创建宿主机目录
    • 为数据文件创建目录:mkdir C:\mysql\data
    • 为配置文件创建目录:mkdir C:\mysql\config
  2. 准备my.cnf文件
    • 从MySQL官方镜像复制默认配置文件(可选),或创建自定义的my.cnf文件。
    • 示例:将my.cnf放置在C:\mysql\config\my.cnf。如果没有,可从容器中复制:
      docker run –rm mysql:latest cat /etc/mysql/my.cnf > C:\mysql\config\my.cnf
      • 然后编辑该文件以自定义设置。
    • 运行MySQL容器
      • 使用以下命令创建并启动容器,映射数据目录和配置文件。替换your_root_password为实际密码。
        docker run –name mysql-container -e MYSQL_ROOT_PASSWORD=your_root_password -p 3306:3306 -v C:\mysql\data:/var/lib/mysql -v C:\mysql\config\my.cnf:/etc/mysql/my.cnf -d mysql:latest

          • 参数说明:
            • --name mysql-container:容器名称。
            • -e MYSQL_ROOT_PASSWORD:设置root密码。
            • -p 3306:3306:映射端口。
            • -v C:\mysql\data:/var/lib/mysql:映射数据目录。
            • -v C:\mysql\config\my.cnf:/etc/mysql/my.cnf:映射配置文件。
            • -d:后台运行。
            • mysql:latest:使用最新MySQL镜像。
        1. 验证容器
          • 检查运行状态:docker ps
          • 连接MySQL:使用MySQL客户端连接到localhost:3306,用户名root,密码your_root_password。

        注意:确保Docker Desktop正在运行,且路径使用Windows格式(反斜杠)。如果遇到权限问题,使用管理员权限运行命令提示符。数据和配置会持久化在宿主机目录中。

rk3588上创建一个能调用NPU加速的docker容器

需要先确认一下目录系统是否加载了NPU,使用什么方法加载NPU驱动的,方法是:

dmesg | grep -i rknpu

正确的话应该可以看到

[ 9.617119] [drm] Initialized rknpu 0.8.2 20220829 for fdab0000.npu on minor 1

之类的初始化日志。

再运行:ls -l /dev/dri 2>/dev/null || echo “no /dev/dri”

正常的话应该可以看到:

crw-rw—-+ 1 root video 226, 0 2023年 5月 9日 card0
crw-rw—-+ 1 root video 226, 1 2023年 5月 9日 card1
crw-rw-rw- 1 root render 226, 128 2023年 5月 9日 renderD128
crw-rw-rw- 1 root render 226, 129 2023年 5月 9日 renderD129

再运行 sudo find /usr -name “librk
nn*.so*” 2>/dev/null

正常应该至少看到:

/usr/lib/librknnrt.so/usr/lib/librknnrt.so

这样就可以确定系统是以内核的方式加载了npu驱动,并具备一个最小的runtime 库 librknnrt.so

这样就可以使用以下命令启动一个能调用npu 的容器:

docker run -it –rm \
  –device=/dev/dri/card1 \
  –device=/dev/dri/renderD129 \
  -v /usr/lib/librknnrt.so:/usr/lib/librknnrt.so:ro \
  <镜像> bash

创建一个能使用ffmpeg 调用rk3588硬件视频编解码的容器

使用如下docker 命令:

docker run -it –privileged -d –device=/dev/mpp_service:/dev/mpp_service –device=/dev/rga:/dev/rga –device=/dev/dri:/dev/dri –device=/dev/dma_heap:/dev/dma_heap –name test_vpu -v /tmp:/tmp -v /home/marblech:/data rk3588_ubuntu2004_gst:latest bash

编译ffmpeg:

git clone https://github.com/nyanmisaka/ffmpeg-rockchip.git ffmpeg
cd ffmpeg
./configure \
  –prefix=/usr/local \
  –enable-gpl \
  –enable-version3 \
  –enable-libdrm \
  –enable-rkmpp \
  –enable-rkrga \
  –disable-static \
  –enable-shared
# 编译并安装
make -j8
sudo make install

rk3588上创建可调用硬件加速容器的方法记录

这是记录尝试在rk3588开发板上创建可调用npu 硬件加速和视频硬件编解码容器的笔记。

通过网上资料和AI模型的消息。我在rk3588的板上创建一个可以调用硬件加速的容器需要如下操作:

1、我使用的是香橙派的 orange pi  5 ultra ,8G内存,256G 的SD卡。厂商号称有6T算力。

2、宿主机的操作系统是 orange OS ,其实是 arc linux 的摩改版

3、docker 镜像是ubuntu 20.04 ,在创建镜像时,需要引用宿主机的硬件,使用如下参数:

docker run -it -d –name test_vpu –device /dev/mpp_service –device /dev/dri –device /dev/rga ubuntu:20.04 bash

但在后来使用时发现存在容器MPP 找不到 SoC的问题,

需要加入:

–privileged \
–volume /proc/device-tree:/proc/device-tree:ro \

容器内安装包:

apt-get update && apt-get install -y –no-install-recommends \
    ca-certificates git build-essential pkg-config cmake meson ninja-build \
    libdrm-dev libv4l-dev libudev-dev \
    libglib2.0-dev libgudev-1.0-dev \
    gstreamer1.0-tools gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
    gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav \
    gstreamer1.0-plugins-base-apps \
    python3 python3-pip \
    && rm -rf /var/lib/apt/lists/*
4、下载mpp 代码并编译:
git clone –depth=1 https://github.com/rockchip-linux/mpp.git && \
    cmake -S mpp -B mpp/build -DCMAKE_BUILD_TYPE=Release -DRKPLATFORM=ON && \
    cmake –build mpp/build -j”$(nproc)” && \
    cmake –install mpp/build
5、下载gstreamer 的mpp 插件并编译:
apt install -y git meson ninja-build pkg-config build-essential \
libdrm-dev libglib2.0-dev libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev
下载和编译gstreamer-mpp插件代码并编译,这个原本rk3588厂家在github 上的仓库已不存在,所以使用了其他分支的镜像。
git clone https://github.com/Meonardo/gst-rockchip
cd gst-rockchip
meson setup build –prefix=/usr –buildtype=release
ninja -C build
ninja -C build install
验证插件是否正确安装

gst-inspect-1.0 | grep rockchip
应该能看到类似:

rkmpph264enc

rkmpph265enc

rkmppjpegenc

rkmppvideodec

rkmppfilter

海思SS928V100的视频处理异常退出导致资源被占用不能销毁的问题解决

前些时间开发海思SS928V100的视频解码功能时遇到一个问题。就是当视频解码的程序由于某些原因,包括但不限于程序异常 ,手动杀进程等等 ,异常退出了。程序重新启动无法获取到视频解码器资源,只能断电并重新通电启动主板才能重新运行程序。

经过分析,应该是程序异常退出导致占用的资料无法释放了。后来,从供应商哪里获取到新的SDK库和一个配置方法后解决。但这样毕竟感觉绕了一手,感觉有点不太踏实。

这几天有些时间,深入研究芯片的开发文档,发现其中有个应对这种情况的解决方案原文 :


2.3.3 强制销毁 VB 功能
VB在占用状态时无法被销毁,插入ssxx_base.ko时加上模块参数g_vb_force_exit=1,
即使VB正在被使用也可强制销毁,因此请谨慎使用此功能,需保证业务正常运行时不
可主动销毁VB,必须待所有业务完全退出之后才能主动销毁VB。
须知
强制销毁VB功能是为了应用程序异常崩溃之后方便业务重启而设计的:用户态应用程
序异常崩溃之后,应用程序已经无法按正常的业务退出流程操作,此时重启业务前须
先进行ss_mpi_sys_exit和ss_mpi_vb_exit把上次应用程序异常崩溃之后无法销毁的VB
资源先销毁,然后再进行正常的业务重启流程。

其中在供应商提供的解决方法的配置在 /ko/load_ss928v100 的insmod ot_base.ko配置里增加 g_vb_force_exit=1 即是出自这里。

海思3403-SS928 yolov5 c++开发日记(7)

在上一个日记中记录的问题,最近进行了验证和解决。其中的问题1、aclInit(“acl.json”)  一个进程只能调用一次。这个进一步验证了。所以,只能从代码本身入手进行解决。需要在主线程一开始就调用这个初始化。并且,验证了,这个初始化是可以与子线程无关的。即,这个初始化就是这么调一下哪个函数,不用向下传递什么参数、数据或者指针什么的。另外,在结束时调用 aclFinalize() ,虽然,调用了这个并不能再重新调用  aclInit()  这个重新初始化。但本着有头有尾,以防出现什么内存泄漏问题,还是要按套路来。在程序结束时调一下这个。

第2个问题是,“调用aclInit(…) 函数的线程必须与后面调用 aclrtMalloc( …) 和 aclrtMemcpy(…) 的是同一个线程,否则会报提示不能取得硬件资源的错” 这里需要注意的是子线程中在开始时,必须调用  aclrtSetDevice()、aclrtCreateContext()、aclrtCreateStream() 这三个函数,当然也可以在每次处理时循环调用这个和 Destory() 但这样性能不好。这三个的作用是调置调用的NPU设备号,创建上下文 ,创建一个处理流。相当于告诉设备哪个线程对应的是哪块数据。如果三个函数在主线程上执行,哪子线程在处理时就会抛没有上下文 ,或者没有stream的异常错误。并且需要在每次调用NPU处理时都调用一下aclrtSetCurrentContext() 函数,让NPU处理指定上下文的数据,否则会抛异常。

最后,还是有个比较奇怪,不知是硬件设计就是这样,还是代码还是有哪里不对的问题。虽然,最后使用一些感觉好像是折衷的方法,还是就是这样的方法实现了同一个NNN核,同时多线程运行多个模型 (目前测试了同时运行4个),但就是感觉怪怪的。

1、代码中不能使用SDK提供的异步处理函数  aclrtMemcpyAsync()、aclmdlExecuteAsync() 。 调用 aclrtMemcpyAsync() 时会抛内存不足的异常提示,但我板上内存明明是足够的,数据也不是很大。只能调用 aclrtMemcpy()。使aclrtMemcpy(),然后调aclmdlExecuteAsync(),会卡死。只能调aclmdlExecute()。
2、这样分别调aclrtMemcpy(),aclmdlExecute()是不会卡死了,但在多线程时,还是会因为冲突跑着跑着就卡住不动。所以,最后,我只能人为加入线程锁,实现多线程单核处理多个模型。但这样感觉NPU不是并行处理多个模型,而是互斥的一个个交替处理。

海思3403-SS928 yolov5 c++开发日记(6)

本来以为关于SS928 的NNN 的这个NPU的应用开发差不多可以告一段落了,但最近在做外围的功能的时候,还是发现一些问题。这些问题还是值得记录一下,以免日后忘记。

1、官方库的aclInit(“acl.json”) 这个初始化函数在整个程序进程只能调用一次,即使后面调用了 aclFinalize() 这个函数,也不能再次调用aclInit() 进行初始化。这将使程序报错。

2、调用aclInit(…) 函数的线程必须与后面调用 aclrtMalloc( …) 和 aclrtMemcpy(…) 的是同一个线程,否则会报提示不能取得硬件资源的错。

当需要在块SS928开发板上同时运行多个模型处理一路视频,或者多路视频用一个模型处理,甚至是多路视频使用多个模型处理,并且还得在一个程序进程里进行多线程处理的时候,这些就是需要注意和解决的问题。

海思3403-SS928 yolov5 c++开发日记(5)

关于海思3403-SS928 的4.8T 的NPU 的开发,我基本已经搞明白了,包括ATC的模型转换的使用和代码ACL库的调用部份,可以实现由YOLOV5、YOLOV11 的模型转换和模型推理的整个流程。相关的部份代码,我已开源并放在:

https://github.com/marblech/hisi_3403_SS928_yolo

之后还有一些性能提升的处理有待进一步研究和试验。例如,在前处理上使用官方文档上的AAPP 技术,模型使用量化的方式,把原生的FP32 量化成 INT8 ,还有通过什么方法把 后处理NMS 整合到OM模型(这个不确定是不是可以,从某些网上的文档上看好像是可以的)。因为项目的原因,这些可能短期内不做研究了。

海思3403-SS928 yolov5 c++开发日记(4)

因为实际项目需要,昨天又做了一遍yolov5的模型转换和后处理的代码开发的工作,过程中居然还是发现了一个坑的点。这里说的并不是新的 5.6 T算力的哪个 svp_npu的模型转换,而是还是哪个4.8 T 的哪个,官方文档上说的 “NNN” 的哪个 npu 的模型转换。需然这条路我在前天终于走通了,但今天还是在模型转换时遇到了个坑,然后发现了个官方文 档的问题。这个问题是这样的,以下是官方文 档的原文 :
9.1.3 ONNX 算子规格
该算子规格仅适用于ONNX原生IR定义的网络模型。算子详情请参见《Caffe&ONNX算
子规格清单》>支持ONNX算子清单.。
如果要查看基于Ascend IR定义的单算子信息,请参见《CANN 算子规格说明》手册。
当前支持的ONNX版本为1.8.0、Opset版本为v9~v13、ONNX Runtime版本为1.6.0。

这里说Opset 版本为v9-v13 但实际中,我使用了opset v10  版本把 yolov5s.pt 转为onnx 后,再把这个 yolov5s.onnx 转为 .om 时就会报  Resize 138 节点 input size error 的错误。这个问题折腾了很久,最后发现,就是 .pt 转onnx 时,选用了 v10版本的Opset , 而使用 v12 版本的 Opset 就不会产生这个 Resize138 input size error 的错误。

海思3403-SS928 yolov5 c++开发日记(3)

前两天都是记录了4.8T哪个核的yolov5 的转换和推理,今天补充记录一下关于海思3403-SS928这个芯片的开发环境和其中的一些坑。其中个人觉得关于环境、编译最坑的是关于视频硬解码器的开发和编译。

海思3403-SS928这个芯片我们从供应商哪里拿到的(据称)官方的SDK包里,里面是有个 aarch64-mix210-linux 的编译器。按照官方的文档说,这是个交叉编译器,可以安装在x86 的linux上,然后使用export 等 环境 配置后,就可调用。但这里有两个坑。一个是在这个包的 readme.txt 这个文档上说使用 source 调用这个 aarch64-mix210-linux.install 文件。以下是这个readme.txt 的原文 :

There is two files in the folder: aarch64-mix210-linux.tar.bz2 and aarch64-mix210-linux.install.

The aarch64-mix210-linux.install is a shell script to install the aarch64-mix210-linux toolchain.

You can use
source ./aarch64-mix210-linux.install
command line to install toolchain in /opt/linux/x86-arm.

Or you can use
source ./aarch64-mix210-linux.install dirname
command line to install toolchain in the “dirname” which you Specified.

For now, you can use toolchain like aarch64-mix210-linux-xxx in everywhere.

但在另一个文档,《ATC 工具使用指南》上说,这是得 chmod 777 后直接运行,然后再用export 把C/C++编译器指向安装后目录的。这是两种完全不同的方法,后我使用了《ATC 工具使用指南》上的方法,证实这个方法是可行的。可以安装这个编译器,并使用这个编译器进行编译。但,这还是有个问题,就是这个编译器的命令行调用与一般的 gcc 和 g++ 有一些不同,这样导致如果使用这个编译器编译 ffmpeg 和 opencv 的话有一些麻烦。因为视频和图像处理需要用到 ffmpeg 和 opencv 而 ffmpeg 的现成编译版本不能直接在这板上使用,并且opencv 也需要做一些在版本上加入 freetype 等库,需要自行编译,所以我们使用了另一个方法。

方法并不复杂,就是使用一个arm 版本的 ubuntu 18.04的镜像的docker 容器。在容器里安装 gcc 7.5.0 的编译器,然后在这个容器里进行开发就可以了。虽然 aarch64-mix210-linux 包的编译器应该是 7.3.0 的,但区别应该不大。经测试,在这个容器里使用gcc 7.5.0 编译出的程序能在 这个海思 3403-ss928 上完美运行的。

说到这里就要说到这个3403-SS928编译关联的第二个坑。就是这个芯片的视频硬解码库并不能编译进 ffmpeg 里,只能手写调用ffmpeg 取流程序,在程序里取得流数据后,再把数据传进提供的硬 解码库,调用相关接口进行解码,然后取得解码后的数据,再转成需要的格式,例如:cv:Mat 类型。这相比起同类芯片,例如 瑞芯微rk3588 实在太。。。(#¥!)麻烦了。这需要对h264 / h265 编解码的和rtsp 流有比较深入的了解才能把这整个过程实现。rk3588 是有对应 可以编译进 ffmpeg 的库的。在调用ffmpeg 时直接就能调用对应的硬解码,而无需额外编写硬解码的调用处理代码。然后,还有一个更坑的是,3403-SS928的硬解码库的程序编译是不能使用上面说的 ubuntu18.04+ gcc7.5.0 组合的docker 容器。在容器里编译时会报 glibc 版本没找到的问题。 必须使用官方的哪个 aarch64-mix210-linux 编译器才能编译成功。

最后,为了解决上面的哪个问题,想到了先写一个调用他硬解码的库,在 aarch64-mix210-linux 编译后。再在容器中写一个通过动态加载的方式加载这个硬解码库并调用解码接口的方式,解决编译上不兼容的这个问题。