ひとつの AWS アカウント で複数人が AWS DeepRacer を始めた時に注意したこと

## はじめに

会社の AWS アカウントを使って複数人で DeepRacer を始めてみました。
ひとつの AWS アカウントを使って複数人が DeepRacer を実行する際に注意した点をまとめます。


## 制限緩和を申請する

複数人で DeepRacer をやろうとすると、すぐに [AWS サービスの制限](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws_service_limits.html) に引っかかります。例えば SageMaker のノートブックやトレーニングの数です。

特に、利用実績の少ない新しい AWS アカウントの場合、ドキュメントに記載の初期値よりかなり低い制限が適用されている場合がありますので、サポートセンターから制限緩和を申請します。

今回、SageMaker と RoboMaker を使った DeepRacer シミュレーションを実行するにあたって、以下の制限の緩和を申請しました。

| サービス         | リソース                                 | 初期値 | 申請値 |
| ---------------- | ---------------------------------------- | ------ | ------ |
| Amazon SageMaker | ノートブックインスタンス（ml.t2.medium） | 20     | 40     |
| Amazon SageMaker | トレーニングジョブ（ml.c4.2xlarge）      | 20     | 40     |
| AWS RoboMaker    | Current active simulation jobs           | 5      | 40     |

RoboMaker については、現時点では、「サービス制限の緩和」フォームのサービス一覧に存在しないため、通常のサポートチケットを起票したところ、対応していただけました。

また、制限はリージョンごとに設定されるため、利用者ごとにリージョンを分けるのも手です。


## ノートブックインスタンスは利用者ごとに分ける

Jupyter Notebook は単一ユーザー利用が前提のため、ノートブックインスタンスは利用者ごとに作成します。その際、インスタンス名に社員IDを入れる、という命名ルールを決めておくことで、誰が作ったインスタンスかひと目で分かるようにしました。こうすることで、

	「このノートブックインスタンスずっと動いてるんだけど・・・」
	「あ、xyz さんですね」

というふうに、すぐに作成者を特定して停止してもらうことが可能です。

AWS Config を辿ればわかることですが、ひと目でわかるのは重要です。
（もちろん AWS Config は有効にしましょう）


## サンプルノートブックのバージョンを統一する

2019年3月時点では、DeepRacer コンソールはプレビュー状態で、一般のユーザーが取り組む場合は、SageMakerのサンプルノートブックを使用する形になります。Jupyter Notebookを開くと、「SageMaker Examples」タブから DeepRacer のノートブックをワークスペースにコピーして使用することができます。

せっかく多人数でやるのですから、当然シミュレーター上のタイムを競おうと考えますが、DeepRacerのノートブックは随時更新中のため、コピーしたタイミングによって内容が大幅に異なる場合があり、タイムを比べることが困難です。

そこで、「SageMaker Examples」タブからコピーするのではなく、GitHub の [awslabs/amazon-sagemaker-examples](https://github.com/awslabs/amazon-sagemaker-examples) からノートブックを取得し、同じバージョンを使用するようにしました。具体的な方法としては、以下のような方法があります。

1. GitHub からアーカイブをダウンロードしてノートブックインスタンスにアップロードする
2. SageMaker の Git 統合を利用して GitHub からクローンする
3. GitHub から自分のリポジトリにフォークし、SageMaker の Git 統合を利用してクローンする

モデル構築にあたってソースコードを修正することになるため、3. がおすすめです。


## シミュレーション関連リソースを識別可能にする

ノートブックのセルを順に実行していくと、各種の AWS リソースが生成されていきます。サンプルノートブックは、リソース名にタイムスタンプを含めて名前が重複しないように記述されていますが、複数人で AWS アカウントを共有している場合、やはり誰が作ったリソースなのかわからなくなってしまい、以下のような状況が発生します。

	「おれのトレーニングジョブのログはどれだ・・・」
	「わたしの渾身のモデルはどこに・・・」
	「この使ってなさそうなリソース消したいんだけど誰のだ・・・」

そこで、セルの実行前に、一部の変数定義を書き換えて、リソース名に社員IDが入るようにしました。具体的には以下の箇所になります。

| 対象セル                      | 修正前                                                       | 修正後                                                       |
| ----------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| Define Variables              | `job_name_prefix = 'rl-deepracer'`                             | `job_name_prefix = '社員ID-rl-deepracer'`                    |
| Create Simulation Application | `app_name = "deepracer-sample-application" + strftime("%y%m%d-%H%M%S", gmtime())` | `app_name = "社員ID-deepracer-sample-application" + strftime("%y%m%d-%H%M%S", gmtime())` |

上記の修正により、社員IDが`foobar`の場合、作成されるリソース名が以下のように変わります。

| リソース                                  | 修正前                                    | 修正後                                           |
| ----------------------------------------- | ----------------------------------------- | ------------------------------------------------ |
| SageMakerトレーニングジョブ               | rl-deepracer-sagemaker-190326-061259      | foobar-rl-deepracer-sagemaker-190326-061259      |
| RoboMakerシミュレーションアプリケーション | deepracer-sample-application190326-061440 | foobar-deepracer-sample-application190326-061440 |
| S3 Prefix（SageMaker用）                  | rl-deepracer-sagemaker-190318-040900      | foobar-rl-deepracer-sagemaker-190318-040900      |
| S3 Prefix（RoboMaker用）                  | rl-deepracer-robomaker-190318-040900      | foobar-rl-deepracer-robomaker-190318-040900      |


## まとめ

ひとつの AWS アカウントを使って、数十人規模でDeepRacerをやってみて、気づいた点をまとめました。
お金はそこそこかかっていますが、開発者が強化学習に触れるいい機会だと思いました。