Neptune MLをちょっと試してみたいなと思ってドキュメントを見ているとQuickStartのページにCloudFormationが置かれています。
https://docs.aws.amazon.com/ja_jp/neptune/latest/userguide/machine-learning-quick-start.html
ここを一通り触ってみたら概要掴めるかなと試してみたのですが、色々なところで躓いたのでその時の作業メモです。
ML系を試すにはQuickStartでもそれなりにリソースを要求されるのですが、自分の勉強用に新しく立ち上げたAWSアカウントだとサービスクォータがかなり小さく設定されている場合があり、上限緩和申請を出さないと先に進めない場面が何度かありました。
CFnスタックを作成してインスタンスを起動する
→ 少し試す
→ 上限エラー
→ 上限緩和申請を出して適用されるまで一旦スタックを削除
→ 再トライ
というフローを何度か繰り返したので結構心が折れそうでしたね。。
NeptuneのDBインスタンスもSageMakerのNotebookも上限緩和申請が通るまでずっと立ち上げておくと細かく課金されるので毎回立ち上げ直すのも面倒ですし、一通り必要なスペックについては試す前にまとめて申請を出してしまうのがおすすめです。
ちなみに試したサンプルコートは上記CFnスタックで作成されるノートブックに含まれている
/Neptune/04-Machine-Learning/Sample-Applications/01-People-Analytics
です。
必要クォータ一覧
サービス | 項目 | 必要数 |
---|---|---|
AWS Lambda | Concurrent executions | 100以上 |
Amazon EC2 | Running On-Demand Standard (A, C, D, H, I, M, R, T, Z) instances | 72 |
Amazon SageMaker | ml.r5.large for processing job usage | 1 |
ml.r5.xlarge for endpoint usage | 2 |
Lambda
Concurrent executions
Concurrent Executionsはデフォルト値1000
となっていますが、あまりアクティブではないアカウントだと50
と制限されている場合があります。
途中で立ち上がるNeptune-Exportが ReservedConcurrentExecutions : 50
と設定されたLambdaを2つ3つ起動しようとして、スタック起動エラーになりました。
※ 最新のCFnテンプレートだと全部で6件くらいの予約になっていたため改善したのかもしれません。
とはいえここはデフォルト1000まで上げておいてもよいと思います。
ハンズオン資料のCFnテンプレートが手癖のようにReservedConcurrentExecutions : 50
と書かれていて失敗するケースは過去にも経験がありました。
Amazon EC2
Running On-Demand Standard (A, C, D, H, I, M, R, T, Z) instances
Neptune-ExportのExportジョブ(AWS Batch)がコンピューティング環境としてc5.18xlarge
のオンデマンドインスタンスを要求します。
ここでクォータが足りていないと、ノートブック上から実行したneptune_ml export start
で起動したAWS BatchのジョブがRUNNING
のまま先へ進まない(特にエラーにもならない)ということでハマりやすいポイントです。
Amazon SageMaker
ml.r5.large for processing job usage
neptune_mlマジックのドキュメントを読む限り、neptune_ml dataprocessing start
コマンドではトレーニングジョブのインスタンスサイズを指定することはできなそうです。
NeptuneのAPI仕様によればインスタンスタイプ(processingInstanceType)のデフォルト値はml.r5
の中で処理しようとしているデータサイズの最小値、とのことなので、必要になるインスタンスはテストデータのサイズに依存しそうです。
今回試そうとしたサンプルでは
ml.r5.large for processing job usage' is 0 Instances, with current utilization of 0 Instances and a request delta of 1 Instances
とのこと。
しかしdataprocessingのデフォルトタイプがml.r5
なのにそれらが全てクォータ0っていうのはどういう想定なんでしょうね。。
ml.r5.xlarge for endpoint usage
サンプルではnodeの推論エンドポイントとlinkの推論エンドポイントの2つを作成するため2
件あるのが望ましいです。
節約するならlinkの推論を行う前にnodeのエンドポイントをクリーンアップしてしまえば1つでやりくりも可能。
パラメータ名修正
クォータとは関係ないですが、サンプルのnotebookではneptune_ml endpoint create
コマンドの引数が
endpoint_params=f"""
--job-id {training_job_name}
--model-job-id {training_job_name}"""
となっていましたが、どうやらAPIのI/Fが変更になったようで不正な引数エラーになってしまっていました。
下記のように書き換えることで無事動きました。
endpoint_params=f"""
--id {training_job_name}
--model-training-job-id {training_job_name}"""