はじめに
こんにちは。
ニッチな需要だと認識していますがタイトルの通り書かせていただきます。
Amazon SageMakerのノートブックインスタンスでは最初からDockerが使えたりawscliが使えたり、tensorflowやmx-netなどが入ったカーネルを選択したり特に環境構築を行わずともそれなり使える環境が簡単に用意することができ便利です。一応jupter notebookのcondaタブで環境を編集することはできますが少し面倒です。今回はプロジェクトの環境管理をPipenvを用いていたこともあり、どうにかPipenv環境をそのままノートブックインスタンスで使うことができないか考えてみました。
ノートブックインスタンス関連の機能紹介
SageMakerはいくつかの機能のあつまりで構成されているのですが、全部使う必要はなく個別につかうことができます。
大別してノートブック機能、トレーニング機能、推論機能です。
今回はSageMakerのノートブック機能の簡単な説明を行います。
ノートブックインスタンス
SageMakerの目玉機能?の一つです。
ある程度設定されたjupyter notebook(lab)が簡単に使えるのが最大の魅力です。
これ単体でも機能します。インスタンスなので当然マシンパワーを設定でき後からでも自由に強さを変更できます。
ただ、/home/ec2-user/SageMaker
以外の場所はインスタンス再起動時にリセットされるので注意しなければいけません。
ライフサイクル
ノートブックインスタンスの最初の構築時または起動時に実行するスクリプトを記述でき任意のノートブックに紐付けることができる機能です。今回はこれを使って/home/ec2-user/SageMaker
内のPipenvfileから作られる環境をインスタンスに元から入っているjupyterにカーネルとして追加します。
Git リポジトリ
2018年11月28日に追加された新たな機能です。
Gitリポジトリを指定しておき、これと紐付けたノートブックインスタンスにリポジトリをクローンします。
httpだけでsshを使ったクローンはできないようです。すこし試してみたところ同一VPC内のgitlabに対しても使うことができましたが、「別にインスタンス内で手動でクローンすればよくない?」みたいな感じです。シークレットマネージャと連動してuser名とpassを管理するのでその辺の入力手間が省けるくらい?
今回は関係ない機能です。
設定
ライフサイクルの「ノートブックの開始」に以下を書いて、
#!/bin/bash
set -e
sudo -u ec2-user sh << EOS
pip install --upgrade
export PIPENV_VENV_IN_PROJECT="42"
cd /home/ec2-user/SageMaker
/home/ec2-user/anaconda3/envs/JupyterSystemEnv/bin/pip install pipenv
/home/ec2-user/anaconda3/envs/JupyterSystemEnv/bin/pipenv install -d ipykernel
/home/ec2-user/anaconda3/envs/JupyterSystemEnv/bin/pipenv run ipython kernel install --user --name=pipenv
EOS
ただしく、設定できると以下のようにたくさんの既存カーネルに紛れて、先ほど設定したpipenvカーネルが追加された状態で起動します
説明
- ライフサイクルはrootユーザで実行されるが普通にノートブックを使う場合はec2-userなためuserを指定して実行します
- PIPENV_VENV_IN_PROJECTの環境変数を設定するとpipenv環境(.venv)がプロジェクトディレクトリに生成されるようになり、次回起動時起動が早くなる気がする
terminalで確認すると.venvが使われていることがわかります。
- あとはノートブックに
~/SageMaker
の環境を追加しています
感想
(コピペするだけなはずなのに私用PCがwindowsを使っていたためライフサイクルをコピペすると改行コードの違いでスクリプトが動かず少々困りました。)
決まったものしか使えないのかと思いきやカスタマイズする余地が残されてて、頑張ればなんとでもなるのはよいと思いました。SageMakerのノートブックインスタンスは機械学習用途となっていますが全然他のことに使えそうです。機械学習用途に関しても始めるならこれ以上ないくらいに十分な環境であり、その上サンプルもたくさん用意されているので勉強にもなりそうです。
最後に、いるのかわかりませんが同じことがしたい人の役に立てれば幸いでした。