2024部署mmdetection3d在win10+wsl2
实现过程
- 安装WSL2
踩坑点:
- 基于发行版安装,无法更新wsl1,查证了当前的wi10的驱动是满足要求的,但是无法更新。所以一定要先去更新驱动!
- 刚开始没有装到C盘,选择装到别的盘,cuda总是因为各种文件问题还找不到路径之类的错误,无奈卸载了发行版,去Microsoft store下载,然后export到其他盘。
- 基于docker部署mmdetection3d
- 选择基于docker安装也是因为mmdetection本身有很多现有的景象支持,让这个本来就不稳定的环境少一些发生错误的可能。大概重装了两次wsl都是因为cuda和pytorch安装问题,用docker安装可以少很多这样的弯路。
- 也有docker下载一个现成的也不一定能在这里用,但是没有关系,不纠结直接换另一个可行的就可以。
我会尽量把这其中遇到的困难都记录下来。
安装wsl2
总体来说,需要1 安装win10最新的驱动;2 确保各项虚拟化相关的设置都是正确的;3 为了方便和减少出错的可能,需要按照教程把wsl、ubuntu20.04按照应用商店的应用安装。
参考教程:
https://zhuanlan.zhihu.com/p/621142457
-
这个教程里面会有systemctl不能用的报错:
System has not been booted with systemd as init system (PID 1). Can’t operate. Failed to connect to bus: Host is down
参考:
https://www.zhihu.com/question/535145130 -
迁移系统可详细看:https://zhuanlan.zhihu.com/p/643184142
-
报错 Error code: Wsl/Service/WSL_E_DISTRO_NOT_FOUND
我选择重新安装wsl,然后解决问题
安装docker
报错: WSL2+Ubuntu 20.4+Docker: merged/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1: file exists: unknown. 无法使用GPU,重新下一个,我下载的可用的是这个:
安装地址:https://hub.docker.com/r/artzha/mmdetection3d
另外docker下载镜像需要国内镜像源加速,配置方法:https://blog.csdn.net/elong490/article/details/114627211
补充:下载其他镜像的时候发现同样有这个问题,我的问题是镜像只能建立不带GPU的容器,没办法建立带GPU的容器,如果不带GPU的容器也没办法建立的话,看下图的方法,但是我没试过. 针对性的解决办法:
具体的报错信息:
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: Auto-detected mode as 'legacy'
nvidia-container-cli: mount error: file creation failed:
/var/lib/docker/overlay2/992e2cfa26431a881e3831e93c6659708625b05d1d9c5df663eb2951e62a8c90/merged/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1: file exists: unknown.
错误摘要:
Docker守护进程无法为容器创建任务。
OCI运行时报告无法启动容器进程。
nvidia-container-cli 在尝试挂载文件(libnvidia-ml.so.1)时遇到错误,因为容器的文件系统中已经存在该文件。
在尝试为容器创建任务时,Docker容器初始化过程中出现了问题。具体来说,nvidia-container-cli 报告了一个挂载错误,因为它无法在指定路径创建文件。这通常是由于容器镜像中的NVIDIA库存在冲突所致。
解决方案:
- 使用nvidia-docker 启动原始镜像的非GPU容器。或者使用docker而不是nvidia-docker, 这应该不会产生错误。
- 在容器内部,手动删除或重命名冲突的文件,即 /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1 和 /usr/lib/x86_64-linux-gnu/libcuda.so.1。
提交更改以从容器创建新镜像。 - 使用新创建的镜像使用 nvidia-docker 启动新容器。
# 第1步:
sudo docker run -it [镜像名称] /bin/bash
# (使用 Docker(而不是 nvidia-docker)启动容器)
sudo docker run --rm -it [镜像名称] /bin/bash
# 第2步:在容器内部删除或重命名冲突的文件
mv /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1 /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1.bak
mv /usr/lib/x86_64-linux-gnu/libcuda.so.1 /usr/lib/x86_64-linux-gnu/libcuda.so.1.bak
# 退出容器
exit
# 第3步:提交容器以创建新镜像
sudo docker commit [容器ID] 新镜像名称:标签
# 第4步:使用新镜像使用 nvidia-docker 启动新容器
sudo docker run -it --runtime=nvidia --gpus all 新镜像名称:标签 /bin/bash
与VSCode插件连接
VScode插件可下载:
其他问题
- your gpu arch (8 9) isn’t compiled in prebuilt
我用的是RTX4090,一开始下载spconv的2.1.21, 看openmmdetion3D推荐自己安装的spconv-cu113, 但是仔细查看了spconv的版本更新,发现在2.2.4有关于这个prebuild的改进,于是升级为spconv-cu113的2.2.4版本,没有这个警告了.