基于docker的深度学习配环境秘笈——docker篇
0、使用docker的必要性: 非root用户可以使用root权限去安装包,可通过ssh直接登录到没有公网ip的服务器, 方便环境迁移,确保代码可复用性
1、去docker hub官网找到自己需要的docker版本,推荐在链接 这里 中找,复制docker pull指令
例如 docker pull nvidia/cuda:11.7.1-devel-ubuntu20.04
docker pull nvidia/cuda:11.3.1-devel-ubuntu20.04
注: 每次建docker和配环境应保证:torch用的cuda版本 ≤ docker的cuda版本 ≤ 服务器的cuda版本 不然训练过程容易出问题,比如loss无法正常收敛。
2、也可以看服务器的仓库中,是否有其他同学拉好了一些镜像 用指令 docker images查看
3、创建docker,需要改的参数有:
(1).确定docker名例如"qxz_another"
(2).确定共享内存大小"16g”
(3).1024:22 确定映射的端口号,我这里映射到1024,你需要映射到其他端口号
(4).映射路径,只有把服务器的路径映射到docker中,docker在运行的时候才能访问到服务器上这些路径对应的文件,代码,数据集等,"/home/qixz22:/home/qixz22 -v /mnt:/mnt" 这里我选择映射服务器路径/home/qixz22, /mnt到我的docker, 个人习惯,你可以改成别的
(5).nvidia/cuda:11.7.1-devel-ubuntu20.04镜像名,改成你pull下来的那个
完整指令:
docker run --name="qxz_another" --shm-size='16g' --gpus all -it -p 1024:22 -v /home/qixz22:/home/qixz22 -v /mnt:/mnt nvidia/cuda:11.7.1-devel-ubuntu20.04 /bin/bash
4、套接字,在docker里能够使用docker相关的指令,例如在docker内部查看服务器上的docker images
方法: 在运行指令中加上: -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker
例如:
(1) docker run --name="fine_tune_new" --shm-size='24g' --gpus all -it -p 9992:22 -v /home/qixz22:/home/qixz22 -v /mnt:/mnt -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker nvidia/cuda:12.2.0-devel-ubuntu22.04 /bin/bash
(2) docker run --name="transfer" --shm-size='24g' --gpus all -it -p 1000:22 -v /home/qixz22:/home/qixz22 -v /mnt:/mnt -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker aa720ad693a9 /bin/bash
5、docker中scp的使用,分为正传和反传两种方式
例如我想把root@region-42.seetacloud.com服务器上classify文件夹传到服务器192.168.5.5上有两种方法:
(1).scp正着传: 在root@region-42.seetacloud.com上操作:
scp -rP 22 /root/autodl-tmp/classify qixz22@192.168.5.5:/home/qixz22/military/train/
(2).反向scp 在192.168.5.5上操作:
scp -rP 39546 root@region-42.seetacloud.com:/root/autodl-tmp/classify /home/qixz22/military/train
注: 代码数据环境都可以直接scp传,环境也可以直接迁移的原因是:环境的本质无非是装载很多深度学习包的文件夹,因此可以把miniconda3/envs/下待传环境直接scp传到目标服务器miniconda3/envs/中,但是注意scp传完环境后一定要在目标服务器的该环境下 conda install --force-reinstall pip
6、docker 常见指令
查看已有镜像
docker images
查看历史容器
docker ps -a
查看当前运行的容器
docker ps
启动容器
docker start 容器名
停止容器
docker stop 容器名
进入容器
docker exec -it 容器名 /bin/bash 如 docker exec -it qxz_another /bin/bash
7、给docker安装常用包
(1).首先update
apt-get update
(2).安装常用包
apt install wget vim tmux curl git tar
apt-get install -y curl git build-essential python3 python3-pip nano htop unzip zip screen openssh-client net-tools sudo
apt-get install -y openssh-server
apt-get install iputils-ping
apt-get install -y git-lfs
(3).docker中一些特殊包的安装,需要自己积累
例如ffmpeg的安装:
下载并解压 wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-amd64-static.tar.xz 然后 tar xvf ffmpeg-git-amd64-static.tar.xz
执行cd ffmpeg-git-20201104-amd64-static 然后 ./ffmpeg
检查: whereis ffmpeg, whereis ffprobe
如果无法找到: sudo cp ffmpeg-git-20201104-amd64-static/ffmpeg ffmpeg-git-20201104-amd64-static/ffprobe /usr/local/bin/
8、如何通过xshell等工具直接连docker
(1).docker里的版本号nvcc --version
docker exec -it qxz_another /bin/bash
(2).进入容器后,更改容器的root密码 passwd
(3).安装ssh服务 apt-get install openssh-server
(4).打开并修改ssh的配置文件,允许通过ssh远程访问docker vim /etc/ssh/sshd_config
将如下代码贴入sshd_config文件中 PermitRootLogin yes
(5).启动ssh服务,至此,服务器端配置完毕 service ssh restart
(6).退出容器,连接测试 ssh root@192.168.6.8 -p 1024
注:如果之后docker出现无法用ssh直接连通的情况,就进入docker后重新service ssh restart
9、要让 Docker 容器支持 UTF-8,避免乱码显示,可以使用以下步骤:
(1).cd ~
(2).使用以下命令在容器中创建一个 .bashrc 文件:
touch .bashrc
打开 .bashrc 文件并添加以下行:
export LC_ALL=C.UTF-8
export LANG=C.UTF-8
保存并关闭 .bashrc 文件。
(3).使用以下命令重新加载 .bashrc 文件:
source .bashrc
现在,Docker 容器将支持 UTF-8
10、关于tmux的操作:
查看tmux里的所有窗口:tmux ls
创建一个新的窗口: tmux new -s 名字
进入一个创建好的窗口:tmux a -t 名字
移除创建好的窗口:tmux kill-window -t 名字
11、给docker添加代理
(1).git clone https://github.com/Elegycloud/clash-for-linux-backup
(2).cd clash-for-linux-backup/
(3).vim .env 复制clash订阅号
(4).bash start.sh
(5).source /etc/profile.d/clash.sh
(6).proxy_on
注一: 给docker添加代理是为了更方便下载、使用huggingface的模型与功能
apt-get install -y git-lfs, git lfs install, git clone (模型主页去掉/tree/main).git
注二: docker添加代理后,结合套接字的使用,能够解决近期国内环境镜像下载失败的问题
12、在docker中安装miniconda
(1).通过wget指令下载清华镜像源的miniconda的安装脚本
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py38_4.8.3-Linux-x86_64.sh --no-check-certificate
(2).运行脚本文件以安装 一路enter后一路yes
sh Miniconda3-py38_4.8.3-Linux-x86_64.sh
(3).重启终端后检验安装
conda -V
13、如何docker打包成镜像,以及docker如何迁移
(1).docker start 容器ID , 例如 docker start 74cc132f0fcc 确保容器正在运行
(2).使用docker commit命令将容器打包成镜像
docker commit 容器ID 新镜像名称:版本号 例如docker commit 74cc132f0fcc new_image:tag
这里的tag自己定,version1,v1,latest都可以,记得住,标记区别就行。
docker images 查看镜像列表之后,下次可以不用在网站上pull, 直接用这个镜像
(3).不同服务器之间docker迁移
方法一 :
将容器打包成.tar.gz
docker save -o myimage.tar myimage:latest
gzip myimage.tar
将该.tar.gz文件传到目标服务器
在目标服务器上直接加载.tar.gz文件,获得docker镜像
docker load -i 文件名.tar.gz
docker images 看镜像加载情况
方法二:
将容器导出为 tar 文件 docker export -o container.tar 74cc132f0fcc
将该tar文件传到目标服务器
加载镜像
docker import container.tar new_image:tag 镜像名和版本号写回之前的
docker images 看镜像加载情况
基于docker的深度学习配环境秘笈——环境篇
一、下载torch(gpu版)
1、官网 :https://download.pytorch.org/whl/cu版本号
举例: pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
特点: 稳定, 全面, 方便, 慢
2、torch_stable网站 https://download.pytorch.org/whl/cu版本号/torch_stable.html
举例:pip3 install torch==1.8.1+cu111 torchvision==0.9.1+cu111 torchaudio==0.8.1 -f https://download.pytorch.org/whl/cu111/torch_stable.html
特点: 快, 需要到相应网站找torch匹配cuda版本号
应用:根据服务器cuda版本确定自己环境里的cuda版本 (需要<=docker中的cuda版本<=服务器cuda版本)
比如我想用cuda 11.1 我就找:
https://download.pytorch.org/whl/cu111/torch_stable.html 看看网站上有哪些torch版本和cuda版本组合,一般而言只需要匹配torch的版本,torchvision 和 torchaudio 可以自动匹配,例如
pip3 install torch==1.8.1+cu111 torchvision torchaudio -f https://download.pytorch.org/whl/cu111/torch_stable.html
检查gpu 版的torch是否安装成功:
1、pip list 后看torch 版本号后面是否+cu版本号, 没有的话很可能下的是cpu版的torch
2、conda activate 环境名——python——import torch——print(torch.cuda.is_available())看是否为True——exit()
二、下载包
1、pip install 包名 和 pip install --upgrade 包名 特点: 简单,慢
2、换源,比如换清华源或者豆瓣源
豆瓣源 pip --default-timeout=1000 install 包名 -i http://pypi.douban.com/simple/ –trusted-host pypi.douban.com 特点:就是快
清华源 pip install 包名 -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn 特点:就是快
还有更秀的操作,使用指令把requirments.txt 里所有的包都换源:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt 特点: 超级快
pip --default-timeout=1000 install -r requirments.txt -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 特点:超级快
3、不好安装的包,离线安装
去 https://pypi.org/ 按包名查找包的.whl文件 点击download files 下载.whl文件,传到文件夹,然后直接 pip install .whl文件
例如 pip install numpy-1.26.2-pp39-pypy39_pp73-win_amd64.whl
4、更不好安装的包,就只能去官网,比如k2包就很难安装,需要去官网找步骤
https://k2-fsa.github.io/k2/installation/from_wheels.html
5、一些特别的包只能随经验积累, 如nltk
pip install certifi
import os
import certifi
os.environ['SSL_CERT_FILE'] = certifi.where()
import nltk
nltk.download('punkt')
6、一些包最好是下载到本地,添加__init__.py后从本地导入使用,比如huggingface 评估包
https://github.com/huggingface/evaluate/tree/main/metrics
三、打包环境,转移环境
打包某个python环境,在打包之前,需要退回到base环境,如果base环境中没有conda-pack包的话,需要安装pip install conda-pack
1、进行python环境打包:如环境名叫py36
conda pack -n py36 -o py366.tar.gz
如果这一过程有包冲突的话,就在该环境中 conda install --force-reinstall wheel
2、传输这个压缩文件py3666.tar.gz到你所需要的服务器的miniconda3/envs/上:
3、解压缩py366.tar.gz:
在miniconda3/envs/创建文件夹:py366,因为我们是要将压缩文件解压到py3666中,这个创建的名字到时候就是你的虚拟python环境的名字。
mkdir py366 解压缩:tar -zxvf py366.tar.gz -C py366
四、离线安装包 比如某内网服务器需要安装librosa
首先pip download librosa==0.10.1 -d \home\niufang\docker
在连网环境:pip download 包名版本号 -d 文件夹 把该文件夹导入内网服务器
在离线环境,进入原环境:pip install --no-index --find-links=\home\packs librosa,
即pip install --no-index --find-links=文件夹位置 包名
五、配环境步骤: 创建环境——激活环境——安装gpu版torch——安装torch以外的所有包
(一) 如wenet(新版), pip方法:
1、conda create -n wen python=3.8
2、conda activate wen
3、安装torch gpu版
pip3 install torch==2.1.0+cu118 torchvision torchaudio -f https://download.pytorch.org/whl/cu118/torch_stable.html
4、git clone https://github.com/wenet-e2e/wenet.git
5、cd wenet 然后 vim requirements.txt 删除掉torch==2.1.0 和 torchaudio== 这两行。(一定要删掉,不然会把gpu版的torch卸载掉,重新下成cpu版的)
6、用清华源下载剩余所有包
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
(二) 如wenet(新版), conda方法:
1、conda create -n wen python=3.8
2、conda activate wen
3、安装torch gpu版
conda install pytorch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 pytorch-cuda=11.8 -c pytorch -c nvidia
4、git clone https://github.com/wenet-e2e/wenet.git
5、cd wenet 然后 vim requirements.txt 删除掉torch==2.1.0 和 torchaudio== 这两行。(一定要删掉,不然会把gpu版的torch卸载掉,重新下成cpu版的)
6、用清华源下载剩余所有包
python -m pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
非常不错 很棒!
作者也太强了,干货满满!