作者也是新手小白,甚至各位小白在学习之初搭建环境的痛苦,所以在写如下过程时会尽可能详细,对大牛们来说就显得作者比较啰嗦啦,如有不对请多多指教~
服务器上构建docker容器
- 下载Xshell
首先需要下载Xshell,这是连接远程服务器的工具。进入Xhell官网进行下载
在这里选择免费的许可证去下载
这样就下载好了Xshell的安装程序了,接下来的安装步骤基本是一直下一步就行。不敢确定的可以搜索一下相关的教程安装就可以。 - 连接服务器
在这一步需要使用Xshell连接服务器,需要知道自己目标服务器的ip地址,还有自己的账号以及密码。
如图所示,点击按钮,新建一个会话,会弹出如下界面
不要直接确定,继续填写下图所示的信息
填完以后选择确定就行,之后可以在Xshell左侧看到这个会话名称,双击即可连接,如果连接不上可能是账号密码有问题,账号密码一定是要能连接目标服务器的
看到如下界面即连接服务器成功了 - 创建docker容器并拉取所需的目标镜像,这里使用pytorch作为训练yolov5的框架
docker run --gpus all --ipc=host -p 6017:8888 -p 6018:22 -v 宿主机上你的目标文件夹:/workspace --name yolov5_test --ulimit memlock=-1 --ulimit stack=67108864 -it nvcr.io/nvidia/pytorch:22.04-py3 //这里解释下上面这段代码的意思以及需要根据自己实际情况修改的部分 1.6017:8888指的是————这个新建的docker容器内部的一个开放端口8888, 这个8888是固有的开放端口,将它映射到宿主机(宿主机指的是你的目标服务器)的端口号上, 因为docker容器事实上是单独开辟出来的这么一个空间,无法直接访问, 所以想要通过本地主机去访问服务器上开辟出来的这个docker容器, 你需要将docker容器的端口号和宿主机的端口号进行一个映射, 然后你就可以通过访问宿主机的这个建立了映射的端口号访问到容器, 在本段代码中将容器内部开放的8888端口号与宿主机的6017端口号进行了映射, 那么之后就可以通过访问宿主机的6017端口去访问到这个docker容器。 (以上是我自己的理解,不一定完全正确,读者如果不理解建议可以先去了解下docker的一些基本指令,会更有助于理解的!!!) 2.6018:22指的是————和上述的第一点差不太多,区别在于8888端口号和22端口号的意义 同样的需要修改6018,修改成你宿主机上的空闲端口号。 3.宿主机上你的目标文件夹:这里是服务器上你个人的文件夹,便于你之后找到自己项目位置的 4.yolov5_test:这个是自己docker容器的名称,可以更改为你自己的名称, 这里只是便于我自己记忆 5.nvcr.io/nvidia/pytorch:22.04-py3:这个是拉取的pytorch镜像, 你也可以更换为你自己需要的其他框架的镜像 !!!这里千万注意,在建立端口映射的时候,你指定的用来映射的宿主机端口必须空闲, 如果被占用了就会出现报错,查看端口是否被占用或者哪些端口空闲可以根据自己的操作系统使用相应的命令去查询。
如果看到如图所示即说明容器搭建成功,直接去第5步继续,失败转去第4步
- 有时会出现如图所示的错误
这是这个错误表明当前用户没有足够的权限连接到 Docker 守护进程。通常,解决这个问题的方法是将用户添加到 Docker 用户组中,以便用户具有访问 Docker 守护进程的权限。
a).以 root 用户登录或者使用具有 sudo 权限的用户
b).运行以下命令将用户添加到 docker 组中:
c).重新登录用户帐户或者运行以下命令以应用用户组更改:sudo usermod -aG docker 用户名 #将 用户名 替换为要添加到 Docker 组的实际用户名
d).最后,确保 Docker 守护进程正在运行:newgrp docker
e).重新运行 Docker 命令:sudo service docker start
当docker ps成功输出的时候说明用户加入docker用户组成功docker ps
- 设置以root账户ssh连接
passwd root
输入上述指令,之后根据提示设置自己的密码,设置后出现下图即成功
- 在容器内安装ssh服务
apt update && apt install -y openssh-server
进入容器时使用的时root账号,但是ssh默认禁止禁止root账号使用密码远程登录的,所以需要修改ssh配置文件,使其允许:
vim /etc/ssh/sshd_config //这里是打开vim编辑器来编辑配置文件,vim编辑器的操作指令不熟悉的可以查询一下操作指令,避免出错
修改如下,将Port22前面的#号去掉注释,然后添加语句PermitRootLogin yes PasswordAuthentication yes
vim编辑器打开后配置文件如图所示
千万注意,使用vim命令打开vim编辑器后,一开始是无法编辑的,需要按“i“按键才能进入编辑模式,进入编辑模式后可以直接复制前面给出的代码粘贴就行,修改后的配置如下图所示,修改完成后先按”Esc“按键退出编辑模式,然后输入”:wq!“,这条命令表示强制保存修改。 - 配置文件修改完成后确定ssh-server服务是否启动
ps -e | grep ssh
如果如上命令执行后控制台未返回可执行文件,则执行以下命令:
service ssh start apt-get install -y libxrender1 apt-get install -y libsm6 apt-get install -y libfreetype6-dev
使用”service ssh start“命令启动ssh-server服务后,即可执行之后的三条命令
配置PyCharm连接远程服务器上的docker容器进行开发
- 配置apt-get的国内安装源
nano /etc/apt/sources.list
#注释掉原来的内容,添加国内源 #默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
编辑完后Ctrl + x退出编辑模式,Y确认保存,退出nano编辑器 - 安装完成后更新apt-get,并安装sudo
apt-get update apt-get install sudo
安装sudo时会弹出提示,输入”y“确认继续安装就可以。
- 安装并启动SSH服务
#安装SSH服务 sudo apt-get install openssh-server #启动SSH服务 sudo /etc/init.d/ssh start #查看SSH服务状态 sudo service ssh status #在安装ssh服务时会提示版本选项,只需要选择2即可
- 重启SSH
service ssh restart
- 通过PyCharm连接本地docker容器
打开PyCharm,选择File——>setting——>选择python解释器
在这里建立连接时,主机地址即是你的宿主机ip,也就是服务器IP地址,端口号为和容器22端口号建立映射的服务器端口号,如果不记得了,可以退出容器登录状态后使用”docker ps“命令查看当前容器,找到目标容器的名字,然后看对应的22端口映射的信息,如图,我这里容器名称是yolov5_test,映射的是6020端口,所以填6020端口。用户名填root,以root身份登录,然后下一步
这里的密码是你服务器账号的密码,然后下一步
如果看到内省完成这个提示,说明前面的步骤都没有问题了,连接上了,继续点击下一步。
在这里要停顿一下,我们需要获得服务器上python的位置,回到Xshell上,登录进容器。如果本身已经登录容器则不需要重复这一步登录,如果之前因为查看端口映射退出了容器,这一步就再登录进容器,红框位置是你的容器名称
使用命令”which python“查看python的位置,红框中就是我查询到的服务器上python的位置
回到PyCharm上刚才的位置,选择系统解释器,然后选择解释器,根据上一步查询到的位置去选择pyhton解释器,如下图所示,填好后点击创建。
当你看到出现如下红框中,容器内部使用pip list命令后查看到的已安装,在PyCharm这个新创建的ssh连接下也出现的时候,就说明全部连接成功了!!!! - 数据卷挂载
这里的本地路径指的是你项目在自己电脑上的位置,部署路径指的是你存放在服务上的工作目录的位置
这样就完成了在本地编辑修改同步上传服务器了。
YOLOv5包载入
- 在服务器进入项目目录
进入yolov5的目录,使用如下命令载入requirements.txt文件中的包pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --timeout 100 -r requirements.txt
- 运行detect,py文件,根据报错的信息安装缺少的包
在安装cv2时会发现,直接使用”pip install opencv-python“命令安装,会直接默认安装最新版的opencv,这时候运行detect.py文件还会出现上述报错
可以使用如下命令从清华安装源下载指定版本的opencvpip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python==4.3.0.38
可以看到已经成功安装指定版本的opencv,再次运行detect.py文件,会发现已经不再报错cv2了,出现了如下报错,记得注意,只有进入yolov5项目下才能执行detect.py文件
啊哈,终于找出来解决方法了,以前的解决方法不知道为什么这次不能解决了,我又找到一个终于解决了,在工作目录下使用如下命令:
apt update apt install -y libgl1-mesa-dev libosmesa6-dev
再次运行detect.py文件,可以看到运行成功啦!!!!激动的心颤抖的手啊~~~ -
将服务器上的运行结果拉取下来在本地查看
大功告成!!!!啊啊啊啊啊啊开心~~~
不知道是否有帮助到你呢?