Docker 安裝 www.baidu.com 一大坨安裝教程,看到你吐血!!!
按照規定的標準輸入與輸出格式開發演算法,將演算法封裝到Docker鏡像內,并將鏡像推送到官方倉庫中,提交鏡像檔案具體要求如下:
CUDA版本要求11.0;
構建鏡像時指定CMD作為默認執行的命令;
容器內禁止使用網路操作,否則會造成容器卡死,影響演算法執行;
資料輸入目錄為/input_path(容器內目錄),目錄權限只讀,此目錄對應資料組織結構中的test目錄;
資料輸出目錄為/output_path(容器內目錄),目錄權限可寫;
演算法入口程式為main.py,所在檔案夾為/work(容器內目錄),main.py需要讀取/input_path中的資料,并將結果輸出到/output_path;
下面是使用Dockerfile配置環境的示例和main.py示例:
Dockerfile示例:
# 基礎鏡像, cuda為11.0,ubuntu18.04
FROM cuda:11.0-cudnn8-runtime-ubuntu18.04 ##自行修改
# 配置程式依賴環境
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
cmake \
curl \
ca-certificates \
libjpeg-dev \
libpng-dev \
python3 \
python3-dev \
python3-pip && \
rm -rf /var/lib/apt/lists/*
# 安裝torch
RUN pip3 install torch==1.7.1+cu110 torchvision==0.8.2+cu110 torchaudio==0.7.2 -f https://download.pytorch.org/whl/torch_stable.html
RUN pip3 install matplotlib>=3.2.2
RUN pip3 install numpy>=1.18.5
RUN pip3 install scikit-build
RUN pip3 install setuptools>=33.1.1
RUN pip3 install Pillow
RUN pip3 install PyYAML>=5.3.1
RUN pip3 install scipy>=1.4.1
RUN pip3 install torch>=1.7.0
RUN pip3 install tqdm>=4.41.0
RUN pip3 install grpcio
RUN pip3 install tensorboard
RUN pip3 install seaborn>=0.11.0
RUN pip3 install pandas
RUN pip3 install opencv-python>=4.1.2
RUN python3 -m pip install detectron2 -f https://dl.fbaipublicfiles.com/detectron2/wheels/cu110/torch1.7/index.html
# 將程式復制到容器內的/work路徑下
COPY . /work
#COPY ./weights/best.pt /work/weights/
# 容器啟動命令
CMD ["python3", "-u", "/work/main.py"]
1.main.py示例:
def fun(input_dir, output_dir):
pass
if __name__ == '__main__':
parser = argparse.ArgumentParser()
# 資料集路徑
parser.add_argument("--input_dir", default='/input_path', help="input path", type=str)
# 輸出路徑
parser.add_argument("--output_dir", default='/output_path', help="output path", type=str)
args = parser.parse_args()
start_time = time.time()
torch.backends.cudnn.benchmark = True
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
fun(args.input_dir, args.output_dir)
print('total time:', time.time() - start_time)
2.構建鏡像
撰寫好Dockerfile后,與需要打包的程式放到同一個檔案夾下,然后進行以下步驟:
docker build -t docker.image/<image_name>:1.0.0 .
注意最后的.前面有空格.
3.測驗:
運行完成后可在/data/output_path/中查看輸出結果
docker run -it --rm -v /data/input_path/:/input_path -v /data/output_path/:/output_path docker.image/<image_name>:1.0.0
如果需要進行深度學習演算法更換,只需要替換main.py中的fun函式就可以.
4.Docker 中會用到的指令:
- 鏡像構建失敗,需要洗掉tag為的鏡像:
洗掉none的鏡像,要先洗掉鏡像中的容器,要洗掉鏡像中的容器,必須先停止容器,
$ docker images
$ docker rmi $(docker images | grep "none" | awk '{print $3}')
直接洗掉帶none的鏡像,直接報錯了,提示先停止容器,
$ docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }') //停止容器
$ docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }') //洗掉容器
$ docker rmi $(docker images | grep "none" | awk '{print $3}') //洗掉鏡像
- 洗掉所有鏡像:
docker rmi -f $(docker images -qa)
- 容器操作:
查看運行容器
docker ps
查看所有容器
docker ps -a
進入容器
其中字串為容器ID:
1. docker exec -it d27bd3008ad9 /bin/bash
2. docker attach d27bd3008ad9
1.停用全部運行中的容器:
docker stop $(docker ps -q)
2.洗掉全部容器:
docker rm $(docker ps -aq)
3.一條命令實作停用并洗掉容器:
docker stop $(docker ps -q) & docker rm $(docker ps -aq)
- docker系統修剪
docker system prune了以下內容:
所有停止的容器
至少一個容器未使用的所有網路
所有懸空的影像
所有懸空的構建快取
此清除命令將節省大量硬碟空間,
$ sudo docker system prune
WARNING! This will remove:
1. all stopped containers
2. all networks not used by at least one container
3. all dangling images
4. all dangling build cache
Are you sure you want to continue? [y/N] y
Deleted Containers:
10b3f08a93df89818976a29c26f5ccefbda1e2dc2e0205a02e9a3306590a1455
89d9cb3e102dbadc9d314bea0db5feb3110931727e2da0b88d6d88d7d78f4400
49e429f26db40615557a85fdf758cd66afa208dba03f74aea860bb04bb4772b2
3e36a2c0c241f8b815ddc73f398cae97962a6799c244fd5169cd845023c5b657
...
Deleted Images:
deleted: sha256:fe111236265a30b8ec54390defb5da60cc7b76a0d3ff0e883691b8b3c663f2e9
deleted: sha256:2e591f44cd334c7896ed01660d45099f4f58169d0584163b6009dea56c3abcbe
deleted: sha256:8b1c255bf0e627c789fc35b3b3b0a1e5033f6be612e01dca08eb1aa4fd161364
...
Total reclaimed space: 251.3MB
- docker 從鏡像中復制代碼到本地
docker cp <containerId>:/file/path/within/container /host/path/target
注意是containerId 不是 image Id .
如果剛拉取的鏡像, 先操作:
1. sudo docker run -it your_docker_image:version /bin/bash
2. docker ps -a
如果Version 是**<none>**,則用tag指令配置tag:
docker tag ec083d1555e4 docker.image/image_name:1.0.15
sudo docker cp -a 427870a03728:/work /home/yourPC/Desktop/1.0.8f/
查看對應鏡像的容器ID.繼續執行copy操作即可.
- 本地復制到docker image:
建議使用Dockerfile的操作:
有兩個類似Dockerfile指令,COPY或著ADD,這兩者都用于為包括在檔案中的影像
COPY指令和ADD指令的唯一區別在于是否支持從遠程URL獲取資源,COPY指令只能從執行docker build所在的主機上讀取資源并復制到鏡像中,而ADD指令還支持通過URL從遠程服務器讀取資源并復制到鏡像中,
滿足同等功能的情況下,推薦使用COPY指令,ADD指令更擅長讀取本地tar檔案并解壓縮,
- COPY指令
COPY指令能夠將構建命令所在的主機本地的檔案或目錄,復制到鏡像檔案系統,
exec格式用法(推薦):
COPY ["<src>",... "<dest>"],推薦,特別適合路徑中帶有空格的情況
shell格式用法:
COPY <src>... <dest>
- ADD指令
ADD指令不僅能夠將構建命令所在的主機本地的檔案或目錄,而且能夠將遠程URL所對應的檔案或目錄,作為資源復制到鏡像檔案系統,
所以,可以認為ADD是增強版的COPY,支持將遠程URL的資源加入到鏡像的檔案系統,ADD命令能對本地歸檔檔案進行解包而COPY不行,
exec格式用法(推薦):
ADD ["<src>",... "<dest>"],特別適合路徑中帶有空格的情況
shell格式用法:
ADD <src>... <dest>
將當前路徑下所有程式復制到容器內的/work路徑下
COPY . /work
-
COPY指令和ADD指令的用法非常相似,具體注意事項如下:
源路徑可以有多個
源路徑是相對于執行build的相對路徑
源路徑如果是本地路徑,必須是build背景關系中的路徑
源路徑如果是一個目錄,則該目錄下的所有內容都將被加入到容器,但是該目錄本身不會
目標路徑必須是絕對路徑,或相對于WORKDIR的相對路徑
目標路徑如果不存在,則會創建相應的完整路徑
目標路徑如果不是一個檔案,則必須使用/結束
路徑中可以使用通配符 -
讀取URL遠程資源
RUN mkdir -p /usr/src/things \
&& curl -SL http://example.com/big.tar.xz \
| tar -xJC /usr/src/things \
&& make -C /usr/src/things all
- 切換GPU docker中 nvidia-smi可查看GPU屬性
sudo docker run --gpus all nvidia/cuda:9.0-base nvidia-smi
至此,基本操作基本完成,有用都幫忙點個贊唄,寫檔案確實很耗時間,謝謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/345609.html
標籤:其他
上一篇:自學linux驅動從入門到放棄(三)配置PC雙網卡實作內外網區分
下一篇:2.服務器部署web服務器
