1. 登录服务器
使用MobaXterm软件,根据ip地址,端口,账号用户名,密码登录。
2. 创建拉取镜像
- 注意:以下操作如果出现如下报错,则说明需要root权限,sudo -i即可。
网址:https://registry.hub.docker.com/,直接搜索拉取即可。
- 拉取镜像:
docker pull pytorch/pytorch:1.8.1-cuda11.1-cudnn8-devel
镜像拉取后也许可以选择删除镜像,清理内存,不过楼主没有进行这个操作,不知是否会影响后续建立容器
- 查找镜像,找到IMAGE ID
docker images
- 删除镜像
docker rmi IMAGE ID
3. 创建容器
- 新建容器
docker run -itd --gpus all --shm-size 24g --name mmdet222 -p 20201:22 -p 20202:6006 -p 20203:8888 -p 20204:80 -v /home/docker/user/zhangwenhui/:/workspace pytorch/pytorch:1.8.1-cuda11.1-cudnn8-devel
-itd:以交互模式运行容器,为容器重新分配一个伪输入终端,后台运行容器,并返回容器ID
--gpus all:表示使用--gpus选项指定GPU设备,例如--gpus all,--gpus '"device=1,2"'
--shm-size(重要):docker共享内存大小,默认为64M,如果不设置会出现RuntimeError(楼主成功踩坑,文 末说明补救方法),设置的大小可以使用df -h命令查看服务器shm的大小进行调整
--name:docker名字
-p:将容器的端口映射到本地的端口,例如20201:22是将容器的22端口映射到本地的20201端口(因为本地的22端口肯定是已经被占用了,需要进行映射)
-v:容器的位置映射,“/home/docker/user/zhangwenhui/”为本地目录,“workspace”为容器目录,表示将“/home/docker/user/zhangwenhui/”挂载到容器的“workspace”目录pytorch/pytorch:1.8.1-cuda11.1-cudnn8-devel:“pytorch/pytorch”为镜像的名字,“1.8.1-cuda11.1- cudnn8-devel”为镜像的TAG。表示根据该镜像生成容器;
- 打开容器,红框为容器编号CONTAINER ID
docker ps
- 进入容器
docker exec -it 486af478a5d7 bash
- 安装必须软件
apt-get update apt-get install sudo apt-get install -y openssh-server wget vim screen
apt-get是一条linux命令,适用于deb包管理式的操作系统,主要用于自动从互联网的软件仓库中搜索、安装、升级、卸载软件或操作系统。(在此之前楼主几乎没怎么接触过,不过不妨碍它很强大,在此之前楼主遇到没有的东西习关于pip install,但这是基于python的)
因此在linux系统如果使用某个指令报错:command not found,建议使用apt-get install,apt install也行
- 推荐安装locate,可以查找文件位置
apt-get install mlocate sudo updatedb ## 更新数据库,不然仍会报错
- 允许通过ssh登录容器
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
- 重启ssh服务
service ssh restart
- 设置登录密码
passwd root
- 退出容器
exit
- 通过ssh进入容器,端口号不是22,而是容器的22端口号映射到本地的端口号。
4. 安装mmcv-full,mmdet
在安装之前,会出现一个小问题,root前没有(base),说明此时并没有进入conda环境 尝试conda activate base,结果是conda :command not found,说明conda无法使用 原因是没有将conda路径加入./bashrc文件中,因此需要进入./bashrc文件中,添加conda路径
因为conda为指令,所以用whereis定位,bashrc为文件,用locate定位。
- 定位conda,找到conda位置
whereis conda
- 定位bashrc,找到./bashrc文件位置,为/root/.bashrc
locate "bashrc"
- 进入./bashrc文件,将conda路径"/opt/conda/bin/"加入./bashrc文件末尾
vim /root/.bashrc
- 在修改./bashrc文件之后,需要激活
source ~/.bashrc
至此,conda命令可以使用,用conda activate base进入base环境,如果报错,可以conda init,然后重启ssh即可。
官方文档提供了好几种方法安装mmdetection,其中有两种比较简洁好用
- 使用openmim,该方法最为简洁,但是在用mim时如果网速不佳,或者因为其他问题导致下载速度很慢,就不提倡使用(楼主深受其害,VPN也不行,会报错节点不对,咱也不懂,mim也不能用镜像源)
pip install openmim mim install mmdet
- 使用pip,这也是楼主最后选择使用的,该方法也很简洁,并且因为是pip,所以可以使用清华源(啥也不说了,清华源yyds)。注意:在安装之前,一定要去MMCV官方文档查看pytorch与cuda的版本是否匹配,然后去MMdet官方文档(附带安装教程)查看MMdet与MMCV的版本匹配。建议加清华源,不然速度会很慢。
# 加清华源之前pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.8.0/index.htmlpip install mmdet==2.19.0
# 加清华源之后pip install -i https://pypi.tuna.tsinghua.edu.cn/simple mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.8.0/index.htmlpip install -i https://pypi.tuna.tsinghua.edu.cn/simple mmdet==2.19.0
安装完成,查看conda环境里的包,也可以通过这个命令查看pytorch与cuda的版本
conda list
5. 安装jupyter,远程登录
jupyter notebook是楼主认为比较好用的编程软件,重在轻量化,界面简单(楼主喜欢简洁) 安装问题不大,主要在于设置登录密码,修改配置文件
- 安装jupyter和conda扩展
conda install jupyter nb_conda
- 设置密码
# 终端进入pythonfrom notebook.auth import passwd
passwd()
# 会让你设置密码,输入两次,之后得到密令,引号里面的就是
- 生成jupyter配置文件,进入配置文件
jupyter notebook --generate-config --allow-root vim /root/.jupyter/jupyter_notebook_config.py
- 找到以下代码,进行修改
c.NotebookApp.allow_root =True c.NotebookApp.ip = '*' c.NotebookApp.password = '密令' c.NotebookApp.port = 8888 c.NotebookApp.allow_remote_access = True
- 打开jupyter
# 正常启动jupyter notebook --no-browser --port=8888 --ip=0.0.0.0 --allow-root
# 后台启动(即使关闭ssh,jupyter也能一直运行)nohup jupyter notebook --no-browser --port=8888 --ip=0.0.0.0 --allow-root &
### 此处的8888端口号为容器的8888端口,在使用浏览器登录时需要使用本地映射端口,比如楼主的是20203。 ### 假如ssh的ip为10.10.10.1:22,登录IP为10.10.10.1:20203
最后,因为在建立容器时没有设置shm-size参数,所以在跑代码时报错:
RuntimeError: DataLoader worker (pid XXX) is killed by signal: Bus error
解决方法(手动更改shm大小):
- 使用服务器账号,进入服务器,sudo-i获取root权限,使用docker ps查找容器ID
- 使用locate查找包含容器ID的所有路径,找到一个类似/home/docker/containers/容器ID的目录
- 在该目录下进入hostconfig.json文件,修改shmsize,该处的shmsize单位为bit,1G=2^30
- 在修改文件前,需要停止容器:docker stop 容器ID
- 修改文件之后,开启容器,并重启ssh:docker start 容器ID,service ssh restart
- 如果在修改结束,重启容器后,发现配置文件又回到修改前,则需要在修改文件前关闭容器服务:service docker stop,在修改完后开启容器服务,service docker start。完成此操作的同时,仍需进行4,5操作