Chapter 07

PC:Dockerfile作成、ビルド確認

kazuhito
kazuhito
2022.01.09に更新

概要

このチャプターでは、SageMaker Training Job上で動作するDockerイメージを準備します。
以下を参考にしています。

https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/docker-containers.html
https://github.com/aws/amazon-sagemaker-examples/tree/master/advanced_functionality/scikit_bring_your_own/container

ディレクトリ構成

このチャプターで必要なファイル構成は以下です。
前チャプターまでと比較して「Dockerfile」を追加しています。

├── scripts
│   ├── road_segmentation.py
│   └── train
├── model
│   └── road_segmentation.onnx
├── Dockerfile
├── requirements.txt
└── sample.mp4

このチャプターで使用するソースコード一式は以下リポジトリでも公開しています。

https://github.com/Kazuhito00/Zenn-Book-S3-SageMaker-S3-Sample/tree/main/Chapter-07

Dockerインストール

以下の手順に従ってインストールします。
Dockerインストール済みの方は省略して、次の項目へ進んでください。

https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository

HTTPS経由でリポジトリを使用できるようにします。

sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

Dockerの公式GPGキーを追加します。

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

次のコマンドを使用して、安定リポジトリを設定します。

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

最新バージョンのDocker Engineとcontainerdをインストールします。

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

Dockerがインストールできてるか確認します。

sudo docker run hello-world

Hello from Docker! と表示されれば、Docker はインストールされています。

Dockerインストール直後では一般ユーザーでコマンド実行が出来ずsudoが必要になります。
Dockerインストール時に作成されたdockerグループに自ユーザーを追加することで、一般ユーザーでもDockerコマンドを実行できるようにします。

dockerグループに自ユーザーを追加し、再起動します。

sudo gpasswd -a $(whoami) docker
reboot

Dockerfile

今回は以下のようなDockerfileを作成しました。

Dockerfile
FROM nvidia/cuda:11.4.2-cudnn8-runtime-ubuntu20.04

# ワークディレクトリ変更
ENV PROGRAM_DIR=/opt/program
WORKDIR $PROGRAM_DIR

# aptパッケージ インストール
RUN apt-get -y update \
    && apt-get install -y --no-install-recommends \
         wget \
         python3-pip \
         python3-setuptools \
         ca-certificates \
         cmake \
         libgl1-mesa-dev \
         libglib2.0-0 \
         libsm6 \
         libxrender1 \
         libxext6 \
    && rm -rf /var/lib/apt/lists/*

# python実行パス シンボリックリンク指定
RUN ln -s /usr/bin/python3 /usr/bin/python

# pipパッケージ インストール
COPY requirements.txt $PROGRAM_DIR/requirements.txt
RUN pip3 install --upgrade pip
RUN pip --no-cache-dir install -r requirements.txt

# 標準出力・標準エラーのストリームのバッファリングを行わない
ENV PYTHONUNBUFFERED=TRUE
# .pyc を生成しない
ENV PYTHONDONTWRITEBYTECODE=TRUE
# パス指定
ENV PATH="/opt/program:${PATH}"

# scriptsディレクトリコピー、実行権限付与
COPY scripts /opt/program
RUN chmod +x /opt/program/train

RUN mkdir /opt/program/model
COPY model /opt/program/model

簡単に補足説明していきます。

FROM nvidia/cuda:11.4.2-cudnn8-runtime-ubuntu20.04

将来的にGPUインスタンスでの推論もしたかったので、
ベースイメージは「nvidia/cuda」にしました(※今回はCPUインスタンスしか使用しませんが、、、)
ちなみにCPU推論のみの場合は「ubuntu:18.04」あたりで大丈夫だと思います。

# ワークディレクトリ変更
ENV PROGRAM_DIR=/opt/program
WORKDIR $PROGRAM_DIR

ワークディレクトリを「/opt/program」に指定しています。
「program」以外のディレクトリを指定することも可能です。

# aptパッケージ インストール
RUN apt-get -y update \
    && apt-get install -y --no-install-recommends \
         wget \
         python3-pip \
         python3-setuptools \
         ca-certificates \
         cmake \
         libgl1-mesa-dev \
         libglib2.0-0 \
         libsm6 \
         libxrender1 \
         libxext6 \
    && rm -rf /var/lib/apt/lists/*

aptパッケージをインストールしています。
後述のpipでopencv-pythonをインストールするため、色々必要なものを追加しています。

# python実行パス シンボリックリンク指定
RUN ln -s /usr/bin/python3 /usr/bin/python

特に補足なし。

# pipパッケージ インストール
COPY requirements.txt $PROGRAM_DIR/requirements.txt
RUN pip3 install --upgrade pip
RUN pip --no-cache-dir install -r requirements.txt

pipパッケージをインストールしています。
「PC:推論プログラム作成」チャプターで利用したrequirements.txtです。

  • numpy
  • onnx
  • onnxruntime-gpu==1.9.0
  • opencv-python
# 標準出力・標準エラーのストリームのバッファリングを行わない
ENV PYTHONUNBUFFERED=TRUE
# .pyc を生成しない
ENV PYTHONDONTWRITEBYTECODE=TRUE
# パス指定
ENV PATH="/opt/program:${PATH}"

ここも特に補足なし。

# scriptsディレクトリコピー、実行権限付与
COPY scripts /opt/program
RUN chmod +x /opt/program/train

RUN mkdir /opt/program/model
COPY model /opt/program/model

scripts配下(trainとroad_segmentation.py)をコピーして実行権限を付与しています。
また、modelも同梱しています。

Dockerビルド

例として「zenn_sample」のイメージ名でビルドします。
以下のコマンドをDockerfileと同じディレクトリで実行してください。

docker build -t zenn_sample ./