因参加比赛,需要搭建一个docker镜像。我一看 docker,这个我还真不会呀,直接懵逼,让我制作一个带有深度学习的镜像,而且还要能跑 预训练模型(我用的是 预训练模型+微调的方式);当时我就懵逼了,以为跟阿里的那种docker提交方式一样呢,但是万万没想到,有差距,而且很大!!!
这个参考的是:datawhale 中的 docker 提交项目
#!/bin/sh
CURDIR="`dirname $0`" #获取此脚本所在目录
echo $CURDIR ## 显示变量的值
cd $CURDIR #切换到该脚本所在目录
python /code/mlp_predict.py ## 要执行的 .py 文件
# Base Images
## 从天池基础镜像构建
FROM registry.cn-shanghai.aliyuncs.com/tcc-public/tensorflow:latest-cuda10.0-py3
## 把当前文件夹里的文件构建到镜像的根目录下(.后面有空格,不能直接跟/)
## 表示将当前电脑下的,当前路径,添加到虚拟镜像中的 / 这个路径下 (根路径下) !!!
ADD . /
## 指定默认工作目录为根目录(需要把run.sh和生成的结果文件都放在该文件夹下,提交后才能运行)
## 指定的是 虚拟镜像中的路径 !!!!!
WORKDIR /
## Install Requirements(requirements.txt包含python包的版本)
## 这里使用清华镜像加速安装
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
#RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
## 镜像启动后统一执行 sh run.sh
CMD ["sh", "run.sh"]
#### 1.登录
sudo docker login --username="自己的用户名" registry.cn-shenzhen.aliyuncs.com
#### 2.build
docker build registry.cn-shenzhen.aliyuncs.com/ai_earth_baseline/test_ai_earth_submit:1.0 .
#### 3.push
docker push registry.cn-shenzhen.aliyuncs.com/ai_earth_baseline/test_ai_earth_submit:1.0
### 这里的my_version指的是 我们拉去的镜像的名称;v01指的是版本号
FROM my_version:v01 ## 需要根据自己的需要更换
### 将本地电脑中的 ./app文件 复制到 虚拟镜像中的 /app 文件中
COPY ./app /app
### 设置 虚拟镜像中的工作地址 /app
WORKDIR /app
### 执行安装库的命令 ;安装我们需要的库函数
RUN pip config set global.index-url https://mirrors.aliyun.com/pypi/simple
RUN pip config set install.trusted-host mirrors.aliyun.com
RUN pip install -U pip -i https://mirrors.aliyun.com/pypi/simple
RUN pip install numpy -i https://mirrors.aliyun.com/pypi/simple
RUN pip install argparse==1.1 -i https://mirrors.aliyun.com/pypi/simple
### 当然也可以写在 requirements.txt文件中 ,然后执行 下面的安装命令
### RUN pip install --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple
### 完成所有数据的赋值
COPY . .
### 使用这个命令执行,可以省去在 dockerfile 中传入参数的操作
ENTRYPOINT ["python","./app/main.py"]
## 使用命令拉去镜像
docker pull nvidia/cuda-arm64:11.1.1-base-ubuntu18.04
## 等同于 ## 等价于 ##
## 在dockerfile 中的 FROM 语句!!!!
FROM nvidia/cuda-arm64:11.1.1-base-ubuntu18.04
寻找 docker 镜像的网站:
docker hub :https://hub.docker.com/
### -t 是在终端运行 docker build 指令
### ximenzi_image:v01 其中 ximenzi_image 是我们的自定义的镜像名 ;v01是自定义的版本号
### . 是指当前的文件夹
docker build -t ximenzi_image:v01 .
### 因为 main.py 文件中有两个参数 input_dir 和 output_dir 所以需要在这里指定一下参数
### -input 指定参数 input_dir
### -output 指定参数 output_file
docker run --rm -it ximenzi_image:v01 -input "aaa" -output "bbb"
#### 等价于 #####
python ./app/main.py -input "aaa" -output "bbb"
运行结果如下:
1. 需要先执行 docker run --rm -itd my_version:v001
2. 然后通过 docker ps 找到 正在执行的容器号
3. 通过 docker exec -t 容器号xxx /bin/bash 进入镜像内部的系统
4. 进行相应的程序文件修改
5. exit 退出 镜像系统
6. 完了之后,在本机的环境中使用 docker commit 容器号xxx-id my_version_new:v001 保存成了另一个镜像
7. 通过 docker images 完成查看
## 保存镜像操作
docker save my_version_new:v001
## 保存镜像,并将其压缩成指定的文件操作 (这里保存成 tar.gz 文件)
docker save my_version_new:v001 | gzip > my_version_new.tar.gz
docker load -i self_define_image.tar.gz
from argparse import ArgumentParser
import os
import numpy as np
def main(input_dir, output_file):
# 调用模型, 输入的测试集文件路径为input_dir, 输出文件到output_file
print(input_dir, "\n")
print(output_file, "\n")
if __name__ == "__main__":
parser = ArgumentParser()
parser.add_argument("-input", type=str, required=True)
parser.add_argument("-output", type=str, required=True)
args = parser.parse_args()
print(np.ones(3))
main(input_dir=args.input, output_file=args.output)