公司放在客户单位的YOLOv8训练服务器(Ubuntu 24.04)模型转换程序Core Dump了,U总折腾将近一个月,甚至让同事搞坏了公司里的训练服务器(Ubuntu 20.04)模型转换程序,仍旧没解决。我实在看不下去,忍痛腾出两天工作日的打游戏时间,主动免费加班,用公司留在宿舍的闲置ThinkPad笔记本装Fedora44 Sliverblue,把这问题解决了。并非炫耀自己有多厉害,只想表达这种问题连从没接触过深度学习训练的我都能解决,天天在我面前吹屄的U总水平也不过如此嘛,哈哈。
这篇文章属于半教程半踩坑记录,废话不多说,开始吧!
下载并导入容器
首先下载 tpuc_dev:v3.4 容器【下载链接】。Sophgo(算能)官方文档给的链接是v3.2版本,比较旧,这里用知乎这篇文章提供的链接。计算哈希值,以下是我下载的文件的哈希值。
1 | $ sha1sum tpuc_dev_v3.4.tar.gz | tee tpuc_dev_v3.4.tar.gz.sha1 |
解压并用 Podman 导入容器
1 | gzip -d ./tpuc_dev_v3.4.tar.gz && podman load -i ./tpuc_dev_v3.4.tar |
运行容器并配置Python环境
执行以下命令创建 tpu-mlir-v1.28.1 容器。注意 Fedora 的 SELinux。模型转换GPU环境不是必须,CPU就能转换。
1 | mkdir ./workspace |
我试过了,直接启动容器来转换模型,YOLOv5 能转.pt 文件,但是 YOLOv8 转.pt和.onnx 都会报错 Disabling PyTorch because PyTorch >= 2.4 is required but found 2.1.0+cpu,所以我们要多做一些操作,把容器内的旧 PyTorch卸载,安装最新版本。
1 | pip uninstall torch torchvision torchaudio |
执行下面的命令下载 tpu-mlir,不用指定版本号也行。旧版本我试过行不通(在没更新PyTorch的情况下),不如用最新版本。
1 | pip install 'tpu_mlir==1.28.1' -i https://pypi.tuna.tsinghua.edu.cn/simple |
测试效果
从Ultralytics Github下载v8.4.0版本的YOLOv8模型,.pt和.onnx版本都下载下来,并校验哈希值。我下载的是yolov8s.onnx。因为公司项目用的就是这个(f32,bm1684x)。然后将文件通过 podman cp yolov8s.onnx tpu-mlir-v1.28.1:/workspace/ 命令复制进去,不要直接在主机里移动文件到绑定的目录里,SELinux 会阻止容器访问。
你可以下载
yolov8s.pt试试转成.bmodel文件,我试过了,会报错:
1 RuntimeError: PytorchStreamReader failed locating file constants.pkl: file not found. This is an internal miniz error. If you are seeing this error, there is a high likelihood that your checkpoint file is corrupted. This can happen if the checkpoint was not saved properly, was transferred incorrectly, or the file was modified after saving.
用.onnx就没问题。执行以下代码转换模型,忽略生成的其他文件,只看有没有xxx.bmodel文件。
1 | model_transform \ |
如果生成了 yolov8s_1684x_f32.bmodel 文件,就可以用公司YOLOv8训练服务器炼化的.pt文件转成.onnx,再用上述方法转成.bmodel,放进项目机子里跑了。
算能官方文档写的命令加了很多选项,还要提前下载什么资源文件。这些都不重要,用来测试图片识别效果的,可以看文档里参数功能表中哪些是必选。我提供的命令只包含必选项,可以照抄改个路径直接拿来用。