时效性
本篇撰写时间为2021.12.9,由于计算机技术日新月异,博客中所有内容都有时效和版本限制,具体做法不一定总行得通,链接可能改动失效,各种软件的用法可能有修改。但是其中透露的思想往往是值得学习的。
本篇前置:

本篇是手动构建docker镜像所需技术总结之1

指定cuda版本

镜像有一个好处是方便管理不同的cuda版本
注:对于某张卡,某版本nvidia驱动,如果可以兼容多个版本的cuda,那么不妨用多个镜像管理。每个镜像中,都把驱动暴露给相应版本cuda。然而,如果该驱动本来就不兼容某版本cuda,那使用docker也没用。即镜像解决多个版本的管理问题,但不解决有无问题。
例如sudo docker run --runtime=nvidia --rm nvidia/cuda:10.0-base nvidia-smi:验证cuda:10.0镜像确实能用。
sudo docker pull nvidia/cuda:10.0-cudnn7-devel:拉取镜像
sudo docker run -it --gpus all -P --name <名称> -v <目录>:<目录> nvidia/cuda:10.0-cudnn7-devel:实例化容器,同时作目录的映射。
进入容器,在根目录find . -name *cuda-10*可以看到确实是指定版本。

准备miniconda

apt update
apt install -y vim curl git telnet tmux unzip wget
找合适的地方,wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh(当然,最推荐的是从外面拷进去或者映射。参考17期。否则可能真的很慢)
sh Miniconda3-latest-Linux-x86_64.sh,一路enter和yes
退出重进容器,发现左侧已经有(base)了。然后就是参考第3期配置.condarc等等。
image
可参考

channels:
 - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/peterjc123/
 - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
 - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/menpo/
 - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/
 - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
 - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
 - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
 - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
custom_channels:
 pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  • 注:配置pip源和conda大同小异,可以手动改vim ~/.pip/pip.conf,也可以
    pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
    可以看到~/.pip/pip.conf并不是yaml语法,而是另一种配置设置语法。

创建环境,指定包版本

我们创建镜像的一大目的就是指定版本,之后可以到处迁移,避免各种兼容性问题。且以后其它地方出兼容性问题了也可以参考能用的镜像中的版本。
conda create -n <name> python=3.7
conda activate <name>
conda install pytorch==1.1.0 torchvision==0.3.0 cudatoolkit=10.0 -c pytorch
然后可以conda list(或conda list | grep torch查找)确认包版本正确。
image

使用git clone -b指定分支并安装

有时候,直接conda或pip安装的版本(即使指定了版本号)都是不对的,只有github下指定分支才是对的。这时需要手动下载安装。
例如下面这个mmcv的指定分支(和直接pip install mmcv==0.2.8是不一样的)
git clone -b ego-topo https://github.com/lyttonhao/mmcv.git
然后在clone到的这个目录
image
直接用pip通过源码安装
pip install . # (add "-e" if you want to develop or modify the codes)
注:以下是README.rst里的说明。
image
注:如果报错没有Cython则需要pip install cython补包。
conda list | grep mm效果如下
image
在这个输出处,还看不出和直接pip install mmcv==0.2.8有什么区别。
但是你分别尝试两种方式装mmcv包,去/root/miniconda3/envs/<name>/lib/python3.7/site-packages/mmcv/对比会发现源码是有区别的。

总结和问答练习

  1. Q: 自己作分支的时候,为了做一个负责任的开发者,你不应该让conda list | grep mm和原来看不出区别,那应该怎么做呢?
    A: 在发布包时(setup.py或之类的地方)修改版本号等。