概要
このチャプターでは、SageMaker Training Job上で動作するDockerイメージを準備します。
以下を参考にしています。
ディレクトリ構成
このチャプターで必要なファイル構成は以下です。
前チャプターまでと比較して「Dockerfile」を追加しています。
├── scripts
│ ├── road_segmentation.py
│ └── train
├── model
│ └── road_segmentation.onnx
├── Dockerfile
├── requirements.txt
└── sample.mp4
このチャプターで使用するソースコード一式は以下リポジトリでも公開しています。
Dockerインストール
以下の手順に従ってインストールします。
Dockerインストール済みの方は省略して、次の項目へ進んでください。
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を作成しました。
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 ./