0. 写在前面
上上周我尝试了使用mac os 通过x11转发,显示从ubuntu docker中启动的gui程序,并使用ubuntu docker中的输入法的实践
上周我尝试了在windows上在其基础上加入了nvidia-docker2的步骤,也成功了,不过没时间记录,于是今日写此文档记录
不管是mac os还是windows上所做的这些实验,都是为了在docker中运行我的开源的yolo8辅助训练软件label-image
1. 前置条件
1.1 wsl 2
由于windows上的ubuntu docker container运行在wsl2可以支持得更好,也是nvidia-docker2的充分必要条件,所以如果你安装的wsl发行版本不是wsl版本的话,需要先安装一个wsl2的docker-desktop
安装成功后可以命令行查看
1
2
3
|
PS C:\WINDOWS\system32> wsl --list -v
NAME STATE VERSION
* docker-desktop Running 2
|
wsl2的安装方法,随便搜索一下就有很多,略
需要在docker-desktop中启用wsl2, 如果设置成功的放在, setting->resouces中显示如下图
![image-20241013134544149](image-20241013134544149.png)
1.2 nvidia-docker2安装
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
参照些文,如此如此,这般这般,就好了,这里不再展开,没安装成功的再努力百度一下
相比linux下的步骤简单, 安装完后在docker-desktop中重启一下docker就可以生效
如果是在linux下, 需要
sudo systemctl reload-daemon && sudo systemctl restart docker
by the way ,
linux的docker的daemon.json在/etc/docker/daemon.json
widnows的docker的daemon.json在~/.config/docker/daemon.json
设置代理会解决很多镜像拉不下来的问题
1
2
3
4
5
6
7
8
9
10
11
12
|
{
"registry-mirrors": [
"https://dockerhub.icu",
"https://docker.chenby.cn",
"https://docker.1panel.live",
"https://docker.awsl9527.cn",
"https://docker.anyhub.us.kg",
"https://dhub.kubesre.xyz"
],
//...保存原来的..
}
|
验证安装的话,先拉一个ubuntu镜像(直接用hello-world镜像不行)
1
|
docker pull ubuntu20.04
|
查看镜像
1
2
3
|
PS C:\WINDOWS\system32> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 20.04 9522b5ff29b8 3 weeks ago 72.8MB
|
然后以这个hello-world镜像运行一个容器,在里面调用nvidia-smi 查看显示信息
1
|
docker run --rm ubuntu20.04 --runtime=nivdia --gpus all -it nvidia-smi
|
如果你机器上有多个gpu,但只想某一些gpu或某一个gpu, 可以查看文档,有多种方式可以约束
但是如果docker run加了--privileged
参数, 不管你怎么约束,所有gpu都将在docker container内可见.(linux上是如此,windows没有实验过)
1.3 安装windows上的x11 server
用于接收来自docker container中的gui程序交互消息
我安装的是这个 x11 server
安装后需要设置一下 禁用 访问策略或设置相应的规律,让自己的docker中的gui可以转发过来
我是直接禁用了
![image-20241013143925868](image-20241013143925868.png)
![image-20241013143950633](image-20241013143950633.png)
![image-20241013144031054](image-20241013144031054.png)
2.构建ubuntu20.04运行时docker
和在使用x11转发在macos上从docker容器中启动gui程序一样,首先构建一个ubuntu20.04的环境,测试显示gui程序和使用容器中的中文输入法
基本和mac os 那篇记录中的脚本基本一致,只是做了几个改动
- 基础镜像改为nvidia-cuda镜像
- 替换了apt源改为清华大学的apt source
- 修改docker container workdir为/opt/label-image ,这个目录将会是我部署label-image的目录
2.1 构建docker image
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
FROM nvidia/cuda:12.6.1-cudnn-devel-ubuntu20.04
#FROM --platform=linux/amd64 nvidia/cuda:12.6.1-cudnn-devel-ubuntu20.04
ENV DEBIAN_FRONTEND=noninteractive
COPY .gitconfig /root/.gitconfig
COPY .vimrc /root/.vimrc
RUN cat <<EOF > /etc/apt/sources.list
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
deb http://security.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
EOF
RUN \
apt update && \
apt install -y \
build-essential \
software-properties-common &&\
apt update && \
apt install -y locales language-pack-zh-hans language-pack-gnome-zh-hans fonts-wqy-zenhei fonts-wqy-microhei ibus-rime librime-data-wubi && sed -i.bak 's/# zh_CN.UTF-8/zh_CN.UTF-8/g' /etc/locale.gen && locale-gen && update-locale LANG=zh_CN.UTF-8 && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
apt install -y \
autoconf \
automake \
bison \
build-essential \
cmake \
gcc \
g++ \
git \
lsb-release \
make \
ninja-build \
python3 \
rsync \
tar \
unzip \
vim \
wget \
curl \
cowsay && \
apt install -y openssh-server && echo 'root:aaa' | chpasswd && sed -i.bak 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/g' /etc/ssh/sshd_config && service ssh restart && \
apt clean && \
mkdir -p /opt/label-image
RUN apt install -y gnome && apt clean
COPY .config /root/.config
WORKDIR /opt/label-image
ENTRYPOINT ["/bin/bash","-c" ,"service ssh start && tail -f /dev/null"]
|
2.2 启动docker container
我原本想要在windows上使用git bash 直接用 这个脚本启动容器
不过基于这几个原因重写了一个.bat
批处理脚本来启动windows上的容器
- git bash仿真环境不能执行 docker run命令,会出现问题
- windows上的x11服务器是基于 tcp 的,不需要像linux那样挂载
/tmp/.x11-unix
- display环境变量不像linux那样设置:n,而是
host.docker.internal:0
,Host在container中的域名:0
runDocker.bat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
@echo off
set display=host.docker.internal:0
set runcmd=docker run ^
--name hbb ^
--privileged ^
-p 2246:22 ^
--gpus all ^
--runtime=nvidia ^
-e DISPLAY=%display% ^
-e LANG=zh_CN.UTF-8 ^
-e XMODIFIERS="@im=ibus" ^
-e QT_IM_MODULE=ibus ^
-e GTK_IM_MODULE=ibus ^
--entrypoint /bin/bash ^
-e GID=%NUMBER_OF_PROCESSORS% ^
-e UID=%USERNAME% ^
-it ubuntu:20.04 -c "ibus-daemon -xrd && gedit"
%runcmd%
|
执行这个脚本后, 启动输入法,打开 文本编辑器gedit, 测试输入法没有问题后, 可以开始准备编译程序和部署程序了
3. label-image 编译部署
3.1 安装qt 开发环境
由于已经支持x11转发了,所以下载 qt 官方的在线安装器就能安装qt 5.15,不是arm64,所以不需要交叉编译qt 源码
所以… 略
唯一需要注意的一点是, 访问host的使用 host.docker.internal
3.2 编译
略
3.3 测试label-image docker中使用cuda加速训练
![e680df290e84b9711218c6290689838d](e680df290e84b9711218c6290689838d.png)
虽然软件写得很烂,但还是成功在windows 上使用cuda加速训练了yolov8,
不过我的windows电脑的GPU是 1650, 最终还是以out of memory失败告终,但证实这个方案是可行的
>> Home
Comments