docker $PWD路径_使用docker炼丹
多人服務器上煉丹,環境管理是個超級麻煩的事。使用python虛擬環境很大程度可以解決這個問題,但是不同cuda版本還是沒法解決,遷移到別的機器又要重來一次。此時Docker就是超級便利的虛擬化環境管理工具,不同容器分開,版本切換極其方便。
Docker 將應用程序與該程序的依賴,打包在一個文件里面。運行這個文件,就會生成一個虛擬容器。程序在這個虛擬容器里運行,就好像在真實的物理機上運行一樣。有了 Docker,就不用擔心環境問題。總體來說,Docker 的接口相當簡單,用戶可以方便地創建和使用容器,把自己的應用放入容器。容器還可以進行版本管理、復制、分享、修改,就像管理普通的代碼一樣。
阮一峰Docker入門
鏡像獲取
第一步便是拉取合適的鏡像。這里區分一下鏡像與容器。
- 鏡像: 是特殊的文件,相當于虛擬機,包含了運行時所需的環境配置,相關庫等文件。鏡像不應該包含用戶自己的個人數據。
- 容器: 可以理解為鏡像的實例化進程。一個服務器中可以有一個(或若干個)用戶們常用的鏡像,每個人根據這個鏡像來啟動屬于自己的容器。容器的生命周期根據用戶使用情況而定,執行完相應程序便會被銷毀。
安裝docker不再贅述,這里已經介紹的非常詳細了。
安裝完成后,啟動docker
sudo service docker start # service 啟動docker sudo systemctl start docker # systemctl 啟動dockerhello-world
國內Docker拉取非常慢,這里我們改為國內鏡像站:
sudo vi /etc/default/docker # 在文件底部加上 DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com" # 重啟docker sudo service docker restart還是最簡單的“hello-world”,我們運行
docker image pull library/hello-world既可以拉取hello-world鏡像了,我們運行:
docker run -it --rm hello-world # 顯示如下內容,即為OK Hello from Docker!拉取nvidia-docker
上面僅是小示例,我們主要為了應用NVIDIA-Docker。首先需要安裝 NVIDIA driver, docker 版本為19.03。這里直接按照 nvidia-docker官方安裝教程來,以centos7為例:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo ? sudo yum install -y nvidia-container-toolkit sudo systemctl restart dockerNvidia-docker即可安裝成功,拉取nvidia/cuda鏡像。
docker pull nvidia/cuda:10.0-base測試一下是否能夠使用你的GPU吧。
#### 測試是否可以看到所有顯卡,如果沒有 nvidia/cuda:10.0-base,則會先下載該鏡像 docker run --gpus all nvidia/cuda:10.0-base nvidia-smi ? # 在一個容器上使用兩塊GPU docker run --gpus 2 nvidia/cuda:10.0-base nvidia-smi ? # 指定使用的GPU docker run --gpus '"device=1,2"' nvidia/cuda:10.0-base nvidia-smi docker run --gpus '"device=UUID-ABCDEF,1"' nvidia/cuda:10.0-base nvidia-smi ? # Specifying a capability (graphics, compute, ...) for my container # 沒用過這種方式 docker run --gpus all,capabilities=utility nvidia/cuda:10.0-base nvidia-smitips
網速不好的時候鏡像拉取會很耗時,這里我們可以在網速較好的機器上先 docker pull XXX_Image,然后 docker save 鏡像名 > my_docker.tar.gz 保存需要的鏡像為一個壓縮包,拷貝進需要的機器中,然后 docker load < my_docker.tar.gz 來導入鏡像。使用容器
我拉取鏡像是: pytorch/pytorch:1.4-cuda10.1-cudnn7-devel。從鏡像中運行容器:
docker run -it -v [主機代碼目錄]:[容器內代碼映射目錄] --gpus all --name [創建的容器名稱] [鏡像名稱]:[鏡像tag] /bin/bash -c "sh trainer/train.sh" # 以我的容器為例,nnunet是我想創建的容器名,以后在這個容器內使用 docker run -it -v "$PWD:/workspace" --gpus all --name nnunet nnunet_pytorch14:v1.0 /bin/bash這就創建好了需要運行的容器。我們介紹若干運行容器時的參數:
-d: 容器啟動后,在后臺運行;--rm: 容器終止運行后,自動刪除容器文件
--name: 指定容器名字
-v "[主機工作目錄]:[容器內工作映射目錄]" : 指定容器內文件的掛載路徑
-c "XXX.sh": 啟動容器后運行的腳本
假設本地目錄為:
workspace │ ├── bin │ ├── app.py - 入口文件那么我們在workspace下編寫 train.sh
cd bin && python app.py --args....然后進入workspace運行以下命令:
docker run -it -e export RESULTS_FOLDER="/workspace/RESULTS_MODEL/Task003_Liver/" -d -v "$PWD:/WORKSPCE" --gpus all --name nnunet nnunet_pytorch14:v1.0 /bin/bash -c "sh train.sh" # $PWD是本機的當前目錄,/WORKSPACE是指定的docker容器內目錄這里需要注意:-e 設置環境變量非常的重要!可以改變容器中的系統環境變量。即可開始訓練。這里列出我的nnUNet訓練腳本
export RESULTS_FOLDER="/workspace/RESULTS_MODEL/Task003_Liver/"export CUDA_VISIBLE_DEVICES=$1 && nohup nnUNet_predict -i /workspace/datasets/ -o /workspace/all_organ_results/ -t Task003_Liver -tr nnUNetTrainerV2 -m 3d_fullres --num_threads_preprocessing 12 --num_threads_nifti_save 4 > nohup_docker.out 2>&1 &定制自己的鏡像
從官方拉取的鏡像往往不能直接使用,還需要根據自己的需求安裝需要的包。這時候就需要定制自己的鏡像了。
Dockerfile
在項目根目錄下(我這里是在nnUNet下,目錄下有requirements.txt, 并且執行 pip install -e . 會安裝相應依賴,請根據自己情況自行對應),新建Dockerfile:
# 基礎鏡像 FROM pytorch/pytorch:1.4-cuda10.1-cudnn7-devel # 將本目錄拷貝進入 workspace COPY . /workspace # 設置工作目錄為 workspace WORKDIR /workspace # RUN chmod +x ./Anaconda3-5.2.0-Linux-x86_64.sh && ./Anaconda3-5.2.0-Linux-x86_64.sh -b -p # /anaconda3 && rm ./Anaconda3-5.2.0-Linux-x86_64.sh # 定義環境變量,我這里用自己新安裝的anaconda3中的python # ENV PATH=/anaconda3/bin:$PATH # 安裝ipython,以及nnunet中的requirements.txt RUN conda install -y ipython RUN pip install -r requirements.txt RUN pip install -e . # sudo yum install libXext libSM libXrender 解決opencv libsm.so.6本地目錄下文件如果很大,有些用不到,可以寫入.dockerignore:
.git datasets node_modules表示不會打包進入鏡像文件。
構建鏡像
docker image build -t MY_DOCKER_IMAGE:1.0構建完成。
實用命令
這里已經把最為常見的使用命令介紹了,其中還有一些可能用到的,稍微介紹:
# 刪除無用的容器 docker rm 容器名稱 # 刪除無用的鏡像 docker rmi -f 鏡像名稱 # 列出所有鏡像 docker image ls # 列出所有容器 docker ps -a # 普通用戶加入docker組 sudo usermod -aG docker $USER sudo systemctl restart docker寫的稍微匆忙,還有很多命令沒有詳解,望大家指出。
總結
以上是生活随笔為你收集整理的docker $PWD路径_使用docker炼丹的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python链表_使用python实现链
- 下一篇: 你要战 那便战!卢伟冰:这是对友商不断挑