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

pythondockervscodeawsmachinelearning

SageMakerで学習させるモデルを開発するにあたって、Notebooks上ではコードを書きづらいのでVS Codeで書いているのだが、ローカルに依存パッケージをインストールして実行しているため エディタ上では警告が出ていなくても、実際の環境にはパッケージがなかったりすることがある。

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

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

設定

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

PyTorch

  • 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"
	]
}

TensorFlow

conda環境でなかったのでpip installしたりPythonのpathを/usr/local/bin/pythonにしている。

  • Dockerfile
FROM 763104351884.dkr.ecr.us-east-1.amazonaws.com/tensorflow-training:2.2.0-cpu-py37-ubuntu18.04

RUN pip install 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
{
	"name": "AWS DLC TensorFlow",
	"build": {
		"dockerfile": "Dockerfile"
	},
	"settings": {
		"terminal.integrated.shell.linux": "/bin/bash",
		"python.pythonPath": "/usr/local/bin/python",
		"python.linting.enabled": true,
		"python.linting.pylintEnabled": false,
		"python.linting.flake8Enabled": true,
		"python.linting.flake8Path": "/usr/local/bin/flake8",
		"editor.formatOnSave": true,
		"python.formatting.provider": "yapf",
		"python.formatting.yapfPath": "/usr/local/bin/yapf",
		"python.linting.mypyEnabled": true,
		"python.linting.mypyPath": "/usr/local/bin/mypy",
	},
	"extensions": [
		"ms-python.python"
	]
}

接続

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

Dev Container