はじめに
- PyTorchでサクッと検証したいなとなる度に、ディレクトリ構成やらどのベースイメージ使うかやらに悩んでいたので、Dockerでテンプレート化してみました。
github.com
作った環境
$ cat /etc/issue
Ubuntu 16.04.5 LTS \n \l
$ python -V
Python 3.6.8 :: Anaconda, Inc.
>>> torch.__version__
'1.0.1.post2'
template_pytorch_1_0_1
├── README.md
├── config
├── data
├── docker
│ ├── Dockerfile
│ ├── dokcer.sh
│ └── requirements.txt
├── features
├── logs
├── models
├── notebook
├── scripts
└── utils
Docker環境構築手順
FROM pytorch/pytorch:1.0.1-cuda10.0-cudnn7-runtime
ARG PYTHON_VERSION=3.6
ENV GIT_SSL_NO_VERIFY=1
RUN apt-get update && \
apt-get install -y --no-install-recommends \
curl \
git \
vim
COPY requirements.txt /tmp/
RUN pip install --upgrade pip && \
pip install -r /tmp/requirements.txt
RUN mkdir -p /opt/config \
/opt/data \
/opt/features \
/opt/logs \
/opt/models \
/opt/notebook \
/opt/scripts \
/opt/utils
WORKDIR /opt
EXPOSE 6006
EXPOSE 8888
jupyter
opencv-python
pillow
SCRIPT_FILE=`basename $0`
function usage()
{
echo "usage: ${SCRIPT_FILE} docker/nvidia-docker" 1>&2
}
if [ $# -ne 1 ]; then
usage
exit 1
fi
DOCKER_CMD=$1
SCRIPT_DIR=$(cd $(dirname $0); pwd)
LOG_FILE=${SCRIPT_DIR}/../logs/docker.log
CONTAINER_NAME=template_pytorch_1_0_1
CONTAINER_IMAGE=template_pytorch_1_0_1
HOST_PORT=18888
CONTAINER_PORT=8888
function log() {
local fname=${BASH_SOURCE[1]##*/}
echo "$(date '+%Y-%m-%dT%H:%M:%S') ${PROCNAME} (${fname}:${BASH_LINENO[0]}:${FUNCNAME[1]}) $@" | tee -a ${LOG_FILE}
}
log "info start script"
log "info CONTAINER_NAME: ${CONTAINER_NAME}, CONTAINER_IMAGE: ${CONTAINER_IMAGE}, HOST_PORT: ${HOST_PORT}, CONTAINER_PORT: ${CONTAINER_PORT}"
${DOCKER_CMD} run --name ${CONTAINER_NAME} \
-v $(pwd)/../config:/opt/config \
-v $(pwd)/../data:/opt/data \
-v $(pwd)/../features:/opt/features \
-v $(pwd)/../logs:/opt/logs \
-v $(pwd)/../models:/opt/models \
-v $(pwd)/../notebook:/opt/notebook \
-v $(pwd)/../scripts:/opt/scripts \
-v $(pwd)/../utils:/opt/utils \
-p ${HOST_PORT}:${CONTAINER_PORT} \
-it ${CONTAINER_IMAGE}
if [ $? -gt 0 ]; then
log "error docker run"
fi
(おまけ)テンプレートファイル
- crawling.sh
- シェルスクリプトでWeb上の画像をクローリングしたりすることが多かったので、テンプレート化しました。
SCRIPT_FILE=`basename $0`
function usage()
{
echo "usage: ${SCRIPT_FILE} DEF_FILE" 1>&2
}
if [ $# -ne 1 ]; then
usage
exit 1
fi
DEF_FILE=$1
SCRIPT_DIR=$(cd $(dirname $0); pwd)
LOG_FILE=${SCRIPT_DIR}/../logs/crawling.log
DOWNLOAD_DIR=${SCRIPT_DIR}/../data/images
function log() {
local fname=${BASH_SOURCE[1]##*/}
echo "$(date '+%Y-%m-%dT%H:%M:%S') ${PROCNAME} (${fname}:${BASH_LINENO[0]}:${FUNCNAME[1]}) $@" | tee -a ${LOG_FILE}
}
log "info start script"
mkdir -p ${DOWNLOAD_DIR}
cat ${DEF_FILE} | while read URL
do
cd ${DOWNLOAD_DIR} && { curl -O ${URL} ; cd -; }
if [ $? -gt 0 ]; then
log "error download"
fi
done
log "info end script"
おわりに
- 随時、テンプレートファイルを追加して充実させていきます。