VSCodeのRemote DeploymentでSageMakerのコンテナ環境でモデルを開発する

(2020-07-19)

SageMakerで学習させるモデルを開発するにあたって、Notebooks上ではコードを書きづらいのでVS Codeで書いているのだが、ローカルに依存パッケージをインストールして実行しているため それが実際の環境でも動くか保証できなくなっている。SageMakerが学習に用いるDockerコンテナにコピーして実行してみれば分かるわけだが、面倒だしデバッグも大変だ。

そんな場合に使えるのがVS CodeのRemote Development。 これはローカルのVS CodeからリモートのVS Code Serverに接続してその環境で開発することができるエクステンションで、 Dockerコンテナのほか、SSHでリモートマシンやVMに接続したり、WindowsならWSLにも接続できる。開発環境を揃えることができて便利だ。

SageMakerでPyTorchのモデルを学習させる - sambaiz-net

設定

.devcontainer/に次のファイルを置く。

Dockerfile

aws/deep-learning-containersの Deep Learning Containers Imagesから選び、ECRからpullするため認証情報を登録しておく。

$ aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin https://763104351884.dkr.ecr.us-east-1.amazonaws.com

これをベースに、開発用ツールを入れてVSCodeのDevelopment Container Scriptsを実行する。

$ cat .devcontainer/Dockerfile
FROM 763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-training:1.5.1-cpu-py36-ubuntu16.04

RUN conda install -y yapf flake8 mypy

# VS Code Development Container Scripts
# https://github.com/microsoft/vscode-dev-containers/tree/v0.128.0/script-library
ARG INSTALL_ZSH="true"
ARG USERNAME="vscode"
ARG USER_UID="1000"
ARG USER_GID="${USER_UID}"
ARG UPGRADE_PACKAGES="true"
ARG COMMON_SCRIPT_SOURCE="https://raw.githubusercontent.com/microsoft/vscode-dev-containers/master/script-library/common-debian.sh"
ARG COMMON_SCRIPT_SHA="dev-mode"

# Configure apt and install packages
RUN apt-get update \
    && export DEBIAN_FRONTEND=noninteractive \
    && apt-get -y install --no-install-recommends curl ca-certificates 2>&1 \
    && curl -sSL  ${COMMON_SCRIPT_SOURCE} -o /tmp/common-setup.sh \
    && ([ "${COMMON_SCRIPT_SHA}" = "dev-mode" ] || (echo "${COMMON_SCRIPT_SHA} */tmp/common-setup.sh" | sha256sum -c -)) \
    && /bin/bash /tmp/common-setup.sh "${INSTALL_ZSH}" "${USERNAME}" "${USER_UID}" "${USER_GID}" "${UPGRADE_PACKAGES}" \
    && rm /tmp/common-setup.sh

devcontainer.json

Python 3の設定を元に、不要なものの削除やパスを変更などした。 flake8でLintが、yapf8で自動フォーマットがかかるようにしている。mypyでType Hintsが効くようにもしている。

PythonのLintとFormatter - sambaiz-net

PythonのType Hintsとmypy - sambaiz-net

$ cat .devcontainer/devcontainer.json
{
	"name": "AWS DLC PyTorch",
	"build": {
		"dockerfile": "Dockerfile"
	},
	"settings": {
		"terminal.integrated.shell.linux": "/bin/bash",
		"python.pythonPath": "/opt/conda/bin/python",
		"python.linting.enabled": true,
		"python.linting.pylintEnabled": false,
		"python.linting.flake8Enabled": true,
		"python.linting.flake8Path": "/opt/conda/bin/flake8",
		"editor.formatOnSave": true,
		"python.formatting.provider": "yapf",
		"python.formatting.yapfPath": "/opt/conda/bin/yapf",
		"python.linting.mypyEnabled": true,
		"python.linting.mypyPath": "/opt/conda/bin/mypy",
	},
	"extensions": [
		"ms-python.python"
	]
}

接続

エクステンションを入れていれば左下に緑のアイコンが出ているのでそこからReopen in Containerするだけでコンテナ環境で同じコードを編集できる。初回はビルドが走る。 ローカルに入れていないPyTorchがimportでき、devcontainer.jsonに書いた設定も効いていることから環境が変わっていることが確認できる。

Dev Container