Docker+GPU配置+Python打包部署全流程
确保主机docker环境正常,可以调用GPU
-
测试命令:
sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi -
若不正常,则参考以下步骤解决:
# 安装并确认docker正常,尽量不要用docker-desktop # 参考 https://docs.docker.com/engine/install/ubuntu/ # 有问题随时重启docker:systemctl daemon-reload 和 systemctl restart docker sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg echo \ "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker --version sudo docker run hello-word # 为了可以调用GPU,安装NVIDIA Container Toolkit并确认 # 参考 https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html # 参考 https://blog.csdn.net/Tang_Zhe/article/details/122936986 distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update sudo apt-get install -y nvidia-container-toolkit sudo nano /etc/docker/daemon.json 并输入{换行}保存 sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi -
docker出现问题,考虑重装:
sudo apt-get remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
编写dockerfile如下
# v1.2 主要是opengl安装
# 使用基础镜像
FROM ubuntu:20.04
# 避免在安装过程中出现交互式对话框
ARG DEBIAN_FRONTEND=noninteractive
# 设置工作目录
WORKDIR ./ImgEvalSys
# 时区设置,避免奇奇怪怪的问题
ENV TZ=Asia/Shanghai
# 复制项目文件到容器中
ADD . /ImgEvalSys
# Info
LABEL version="1.2"
LABEL manager="Shuai He <hs19951021@bupt.edu.cn>"
LABEL maintainer1="Rui Xie <chenke771@bupt.edu.cn>"
LABEL maintainer2="Yi Xiao <@bupt.edu.cn>"
# apt安装opengl和python3.9
RUN apt-get update && apt-get upgrade -y
RUN apt-get install -y libgl1-mesa-glx libgl1-mesa-dri
RUN apt-get install -y python3.9 python3-pip
RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.9 1 && \
update-alternatives --set python /usr/bin/python3.9
RUN apt-get install libglib2.0-0
# # 安装依赖(为避免问题,在docker创建完成后再安装)
# RUN python3.9 -m pip install -r requirements.txt -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
# RUN python3.9 -m pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn
# RUN python3.9 -m pip install -r requirements.txt
# 替换opencv为headless版本
RUN python3.9 -m pip uninstall opencv-python -y
RUN python3.9 -m pip install opencv-python-headless -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
# 补充安装有问题的依赖包
RUN python3.9 -m pip install opencv-contrib-python-headless
RUN python3.9 -m pip install colour-science
# Debug版启动命令:进入bash命令行
CMD ["/bin/bash"]
# 后续若让container启动时候自动运行测评系统,可用以下替代
# Release版启动命令:直接启动系统
# CMD ["python", "./run.py"]构建image并启动container(必要时加sudo)
# cd 项目文件夹,构建image
docker build -t imevsys-headless .
# 启动container
# 启动到bash(调试模式)
sudo docker run --runtime=nvidia --gpus all -p 9999:9999 -it imevsys-headless
# 或 直接启动系统
sudo docker run --runtime=nvidia --gpus all -p 9999:9999 -it imevsys-headless python web_gui.py
# 或 设定挂载目录
sudo docker run --runtime=nvidia --gpus all -v /home/xr/Templates/ImgEvalSysss:/ImgEvalSys -p 9999:9999 -it imevsys-headless python web_gui.py导出/载入image
sudo docker save -o ImgEvalSys.tar imevsys-headless
sudo docker load -i ImgEvalSys.tar
sudo chmod 777 ImgEvalSys.tar依赖发生微小变化后重新打包
# 查看container运行情况,寻找<container_id>
sudo docker ps -a
# 在容器内:替换环境
pip install colour-science
# 在主机内:提交、打包、更改权限
sudo docker commit <container_id> imevsys-headless:version
sudo docker save -o ImgEvalSys.tar imevsys-headless:version
sudo chmod 777 ./ImgEvalSys.tar
# 其他可选系统维护操作:修改image的tag(实际上是新建一个,再删除旧image)
sudo docker image tag imevsys-headless:latest imevsys-headless:pre
sudo docker image rmi imevsys-headless:latest
# 如果改不了,就先ps查找再rm删除占用image的container
sudo docker ps -a
sudo docker rm <container_id>
# 有时在启动docker container时需要同时运行不止一条命令,这时在command处使用:sh -c ' cmd1 && cmd2 '即可。
sudo docker run --runtime=nvidia --gpus all -v /home/xr/Templates/ImgEvalSys:/ImgEvalSys -p 9999:9999 -it imevsys-headless sh -c 'pip install -r req_0925.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn && python web_gui.py'