nokoのブログ

こちらは暫定のメモ置き場ですので悪しからず

PyTorch環境構築メモ(Docker)

はじめに

  • PyTorchでサクッと検証したいなとなる度に、ディレクトリ構成やらどのベースイメージ使うかやらに悩んでいたので、Dockerでテンプレート化してみました。

github.com

作った環境

  • OS version
$ cat /etc/issue
Ubuntu 16.04.5 LTS \n \l
$ python -V
Python 3.6.8 :: Anaconda, Inc.
  • PyTorch version
>>> 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環境構築手順

  • 起動コマンド
# sh docker.sh docker/nvidia-docker
  • Dockerfile
FROM pytorch/pytorch:1.0.1-cuda10.0-cudnn7-runtime

ARG PYTHON_VERSION=3.6
ENV GIT_SSL_NO_VERIFY=1

# apt install
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
         curl \
         git \
         vim

# pip install
COPY requirements.txt /tmp/
RUN pip install --upgrade pip && \
    pip install -r /tmp/requirements.txt

# make dir
RUN mkdir -p /opt/config \
             /opt/data \
             /opt/features \
             /opt/logs \
             /opt/models \
             /opt/notebook \
             /opt/scripts \
             /opt/utils

# cd
WORKDIR /opt

# expose port TensorBoard
EXPOSE 6006
# expose port TensorBoard
EXPOSE 8888
  • requirements.txt
jupyter
opencv-python
pillow
  • dokcer.sh
#!/bin/sh

# usage
SCRIPT_FILE=`basename $0`
function usage()
{
  echo "usage: ${SCRIPT_FILE} docker/nvidia-docker" 1>&2
}

# arguments
if [ $# -ne 1 ]; then
  usage
  exit 1
fi
DOCKER_CMD=$1

# constant
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

# log
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}
}

# main
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

# log "info end script"

(おまけ)テンプレートファイル

  • crawling.sh
    • シェルスクリプトでWeb上の画像をクローリングしたりすることが多かったので、テンプレート化しました。
#!/bin/sh

# usage
SCRIPT_FILE=`basename $0`
function usage()
{
  echo "usage: ${SCRIPT_FILE} DEF_FILE" 1>&2
}

# arguments
if [ $# -ne 1 ]; then
  usage
  exit 1
fi
DEF_FILE=$1

# constant
SCRIPT_DIR=$(cd $(dirname $0); pwd)
LOG_FILE=${SCRIPT_DIR}/../logs/crawling.log
DOWNLOAD_DIR=${SCRIPT_DIR}/../data/images

# log
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}
}

# main 
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"

おわりに

  • 随時、テンプレートファイルを追加して充実させていきます。