瓜某人前段时间需要在win10系统上测试mmrotate(旋转目标检测框架)的.mar模型,根据官方文档,win10上必须部署docker创建对应镜像,然后在torchserve上测试。
来来回回翻了好多博客,踩了许多坑,最后终于成功部署!在此记录一下。
本文主要流程:wsl2—> docker —> torchserve测试。
如果有一样要实现以上目的的小伙伴,希望本文有所帮助,请一定按照步骤来!!!
瓜某人当时遇到的部分报错相应解决方式也会说明。
首先!!!看下自己的Windows系统是不是最新版本,相信我,这个很重要!不是最新版的要更新!
查看当前系统版本: Windows 键 + R—> 输入winver —>回车
更新系统:Windows设置—> 更新和安全—> Windows更新
瓜某人系统更新完后版本是21H2。
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
重启电脑
wsl --set-default-version 2
进入微软商店下载并安装ubuntu版本
瓜某人下载的是Ubuntu 18.04.5 LTS。
打开下载好的ubuntu,然后进入管理员身份PowerShell,输入:
wsl -l -v
不要在下载的ubuntu里安装docker!!!
这是之前踩的一个坑,搜了下说是ubuntu内部的docker会与Windows冲突… …
比如瓜某人之前按照网上教程给ubuntu里装了docker,但是win10系统调用不了,之后下载了Docker Desktop on Windows,在设置里里勾选了ubuntu,结果docker完全用不了。
经过一番摸索,重复结论:
不要在下载的ubuntu里安装docker!!!
不要在下载的ubuntu里安装docker!!!
不要在下载的ubuntu里安装docker!!!
直接下载Docker Desktop on Windows软件
安装条件
1)docker for windows只适用于win8以上的系统,win10是现在的主流,所以这里我将介绍的是win10系统中docker的安装和使用。
2)开启电脑的虚拟化,一般电脑都是默认开启的。可以在任务管理器->性能->CPU下查看虚拟化是否开启。
3)查看Hyper-v是否开启,启用Hyper-v可以在电脑中配置虚拟机。开启步骤:控制面板->程序->启用或关闭Windows功能->把Hyper-v勾上->最后重启电脑就可以了。
下载Docker Desktop on Windows
官网下载链接
下载完后打开,在右上角设置中勾选如图:
(跟瓜某人勾选的一样就么问题)
最后别忘了重启docker!
wsl -l -v
也可以在管理员身份PowerShell中输入:
docker images
到现在wsl2+docker已全部OK!!!
主要参考mmrotate官方文档
按照官方文档,需要在mmrotate文件夹下打开终端,输入:
docker build -t mmrotate-serve:latest docker/serve/
但是,直接创建一定会失败!!!
在cmd终端中输入:
nvcc -V
查看自己电脑的nvidia版本,搜索相对应的版本,将Dockerfile文件中的版本修改为适合自己的。
以下是瓜某人自己的版本:
ARG PYTORCH="1.10.0"
ARG CUDA="11.3"
ARG CUDNN="8"
FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel
ARG MMCV="1.5.3"
ARG MMDET="2.25.0"
ARG MMROTATE="0.3.2"
ARG TORCHSERVE="0.6.0"
修改后的完整Dockerfile文件如下:
(注释掉的为原命令,除了修改了部分命令,还给下载命令后添加了镜像源,否则创建镜像时间会非常的漫长。。。)
# ARG PYTORCH="1.8.0"
# ARG CUDA="11.1"
# ARG CUDNN="8"
# FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel
# ARG MMCV="1.4.6"
# ARG MMDET="2.25.0"
# ARG MMROTATE="0.3.2"
# ARG TORCHSERVE="0.6.0"
ARG PYTORCH="1.10.0"
ARG CUDA="11.3"
ARG CUDNN="8"
FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel
ARG MMCV="1.5.3"
ARG MMDET="2.25.0"
ARG MMROTATE="0.3.2"
ARG TORCHSERVE="0.6.0"
ENV PYTHONUNBUFFERED TRUE
# RUN apt-get update && \
# DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \
# ca-certificates \
# g++ \
# openjdk-11-jre-headless \
# # MMDet Requirements
# ffmpeg libsm6 libxext6 git ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 \
# && rm -rf /var/lib/apt/lists/*
RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN apt-get clean
RUN rm /etc/apt/sources.list.d/cuda.list
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \
ca-certificates \
g++ \
openjdk-11-jre-headless \
# MMDet Requirements
ffmpeg libsm6 libxext6 git ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 \
&& rm -rf /var/lib/apt/lists/*
ENV PATH="/opt/conda/bin:$PATH"
RUN export FORCE_CUDA=1
# TORCHSEVER
# torchserve>0.2.0 is compatible with pytorch>=1.8.1
RUN pip install torchserve==${TORCHSERVE} torch-model-archiver nvgpu -i https://pypi.tuna.tsinghua.edu.cn/simple/
# MMLAB
ARG PYTORCH
ARG CUDA
RUN ["/bin/bash", "-c", "pip install mmcv-full==${MMCV} -f https://download.openmmlab.com/mmcv/dist/cu${CUDA//./}/torch${PYTORCH}/index.html -i https://pypi.tuna.tsinghua.edu.cn/simple/"]
RUN pip install mmdet==${MMDET} -i https://pypi.tuna.tsinghua.edu.cn/simple/
RUN pip install mmrotate==${MMROTATE} -i https://pypi.tuna.tsinghua.edu.cn/simple/
# RUN ["/bin/bash", "-c", "pip install mmcv-full==${MMCV} -f https://download.openmmlab.com/mmcv/dist/cu${CUDA//./}/torch${PYTORCH}/index.html"]
# RUN pip install mmdet==${MMDET}
# RUN pip install mmrotate==${MMROTATE}
RUN useradd -m model-server \
&& mkdir -p /home/model-server/tmp
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh \
&& chown -R model-server /home/model-server
COPY config.properties /home/model-server/config.properties
RUN mkdir /home/model-server/model-store && chown -R model-server /home/model-server/model-store
EXPOSE 8080 8081 8082
USER model-server
WORKDIR /home/model-server
ENV TEMP=/home/model-server/tmp
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD ["serve"]
修改完Dockerfile文件后,先不要着急跟着官方文档命令创建镜像,因为还有一个huge坑在等着瓜某人。。。
现在,已经没有什么坑了(如果还有的话那应该是瓜某人没见过的问题捏),可以美滋滋地按照官方文档输入创建镜像的命令了,gogogo
docker build -t mmrotate-serve:latest docker/serve/
随后就是等待、等待、等待,等我们的windows电脑将镜像创建好。
创建完毕后可以在Docker Desktop on Windows软件中看到我们创建好的镜像,如图:
(瓜某人在创建时改了镜像名字,按照官方命令的话镜像名字是:mmrotate-serve)
现在我们第一步创建镜像就完美结束啦!
也就是把.pth转为.mar模型。
如果已经生成了.mar模型,直接跳到第三步运行镜像。
按照mmrotate官方文档,在mmrotate文件夹中打开终端,运行:
python tools/deployment/mmrotate2torchserve.py ${CONFIG_FILE} ${CHECKPOINT_FILE} \
--output-folder ${MODEL_STORE} \
--model-name ${MODEL_NAME}
${CONFIG_FILE} :配置文件路径
${CHECKPOINT_FILE} :.pth模型
(注:最好不要使用mmrotate中的latest.pth模型,直接转化epoch模型,比如:12epoch.pth,不然模转化后的模型可能会有问题)
${MODEL_STORE}:转化后的.mar模型存放路径 ${MODEL_NAME}:.mar模型名字
这样就可以生成.mar模型。
在终端中输入:
docker run --rm --cpus 8 --gpus all -p8080:8080 -p8081:8081 -p8082:8082 --mount type=bind,source=$MODEL_STORE,target=/home/model-server/model-store mmrotate-serve:latest
$MODEL_STORE:与第二步中的一样,.mar模型的存放路径
(路径这里需要注意,Windows中这里不要写D:/,应该为/d/)
-p8080:8080 -p8081:8081 -p8082:8082:镜像运行时的端口映射
然后通过终端可以看到镜像已经成功运行。
curl http://127.0.0.1:8080/predictions/${MODEL_NAME} -T ${image.jpg}
${MODEL_NAME}:第二步中转为.mar模型时设置的模型名字
${image.jpg}:测试图片(瓜某人用的绝对路径)
若得到类似下图格式的输出,说明部署成功:
[
{
"class_name": "small-vehicle",
"bbox": [
584.9473266601562,
327.2749938964844,
38.45665740966797,
16.898427963256836,
-0.7229751944541931
],
"score": 0.9766026139259338
},
{
"class_name": "small-vehicle",
"bbox": [
152.0239715576172,
305.92572021484375,
43.144744873046875,
18.85024642944336,
0.014928221702575684
],
"score": 0.972826361656189
}
]