🔥

00045.SageMaker 開発環境を整える

2024/04/29に公開

Situation

いちいち AWS Console アクセスしてから SageMaker ページ経由で SageMaker の Notebook ページを出すのがめんどくさくてローカル開発っぽい体験が得づらい。。そして、Notebook ではなくて VS Code でカイハツシタイ。

Goal

  1. Notebook ページをローカルからコマンド一つたたいたら開くようにする
  2. ブラウザ上で VS Code エディタで開発できるようにする

Prerequisites

  • IAM role、ローカルの credentials 設定は適当にググって頑張って設定している状態
  • 必要なコマンドはなんか頑張って設定している状態

Step1: Notebook をコマンド一つで開くようにする

結論:コマンド一つで開くまでは環境依存あるので断念・・。URL表示まで実施

ここまでの成果

Step2: Notebook 上で Code Server を使えるようにする

手動で毎回 Code Server 設定するのがだるいので Step1 のスクリプトに設定を入れ込む。

ここまでの成果

Demo

Case1: 既にインスタンスがある場合

bash -x tmp.sh 
+ NOTEBOOK_INSTANCE_NAME=id00045V03
+ INSTANCE_TYPE=ml.g5.xlarge
+ INSTANCE_VOLUME=500
+ AWS_REGION=us-east-1
+ ROLE_ARN=arn:aws:iam::XXXXX:role/service-role/SageMaker-MLOpsEngineer
+ check_instance_status ''
++ aws sagemaker describe-notebook-instance --notebook-instance-name id00045V03 --output text --query NotebookInstanceStatus --region us-east-1
+ local status=InService
+ '[' -z InService ']'
+ '[' InService '!=' InService ']'
+ return 0
+ '[' 0 -eq 0 ']'
+ create_presigned_url
++ aws sagemaker create-presigned-notebook-instance-url --notebook-instance-name id00045V03 --query AuthorizedUrl --output text --session-expiration-duration-in-seconds 3600
+ PRESIGNED_URL='https://id00045v03.notebook.us-east-1.sagemaker.aws?authToken=eyJhbGciOiJIUzI1NiJ9.eyJ...
+ echo URL:
URL:
+ echo 'https://id00045v03.notebook.us-east-1.sagemaker.aws?authToken=eyJ...
+ tee .presignedURL

Case2: インスタンスがない場合

--create でインスタンスを作成する。

bash -x tmp.sh --create

bash -x tmp.sh --create
+ NOTEBOOK_INSTANCE_NAME=id00045V03
+ INSTANCE_TYPE=ml.g5.xlarge
+ INSTANCE_VOLUME=500
+ AWS_REGION=us-east-1
+ ROLE_ARN=arn:aws:iam::XXXXX:role/service-role/SageMaker-MLOpsEngineer
+ check_instance_status --create
++ aws sagemaker describe-notebook-instance --notebook-instance-name id00045V03 --output text --query NotebookInstanceStatus --region us-east-1
+ local status=
+ '[' -z '' ']'
+ '[' --create == --create ']'
+ create_instance
+ curl -LO https://github.com/aws-samples/amazon-sagemaker-codeserver/releases/download/v0.2.0/amazon-sagemaker-codeserver-0.2.0.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  2958  100  2958    0     0   2452      0  0:00:01  0:00:01 --:--:--     0
+ tar -xvzf amazon-sagemaker-codeserver-0.2.0.tar.gz
amazon-sagemaker-codeserver/install-scripts/notebook-instances/
amazon-sagemaker-codeserver/install-scripts/notebook-instances/install-codeserver.sh
amazon-sagemaker-codeserver/install-scripts/notebook-instances/uninstall-codeserver.sh
amazon-sagemaker-codeserver/install-scripts/notebook-instances/setup-codeserver.sh
amazon-sagemaker-codeserver/install-scripts/studio/
amazon-sagemaker-codeserver/install-scripts/studio/install-codeserver.sh
amazon-sagemaker-codeserver/install-scripts/studio/uninstall-codeserver.sh
+ cd amazon-sagemaker-codeserver/install-scripts/notebook-instances

### lifecycle-config はすでに作っていたのでスキップしている

+ aws sagemaker create-notebook-instance --notebook-instance-name id00045V03 --instance-type ml.g5.xlarge --role-arn arn:aws:iam::XXXXX:role/service-role/SageMaker-MLOpsEngineer --direct-internet-access Enabled --volume-size-in-gb 5 --root-access Enabled --platform-identifier notebook-al2-v2 --region us-east-1 --lifecycle-config-name install-codeserver
{
    "NotebookInstanceArn": "arn:aws:sagemaker:us-east-1:XXXXX:notebook-instance/id00045V03"
}
+ return 0
+ wait_for_instance_ready
+ local max_attempts=60
+ local attempt=0
+ '[' 0 -lt 60 ']'
++ aws sagemaker describe-notebook-instance --notebook-instance-name id00045V03 --output text --query NotebookInstanceStatus --region us-east-1
+ local status=Pending
+ '[' Pending == InService ']'
+ echo 'Notebook Instance '\''id00045V03'\'' はまだ準備中です。(ステータス: Pending) 10秒後に再試行します。'
Notebook Instance 'id00045V03' はまだ準備中です。(ステータス: Pending) 10秒後に再試行します。
+ sleep 10
+ (( attempt++ ))
+ '[' 1 -lt 60 ']'
++ aws sagemaker describe-notebook-instance --notebook-instance-name id00045V03 --output text --query NotebookInstanceStatus --region us-east-1
+ local status=Pending
+ '[' Pending == InService ']'
+ echo 'Notebook Instance '\''id00045V03'\'' はまだ準備中です。(ステータス: Pending) 10秒後に再試行します。'
Notebook Instance 'id00045V03' はまだ準備中です。(ステータス: Pending) 10秒後に再試行します。
+ sleep 10
+ (( attempt++ ))

...

+ '[' 27 -lt 60 ']'
++ aws sagemaker describe-notebook-instance --notebook-instance-name id00045V03 --output text --query NotebookInstanceStatus --region us-east-1
+ local status=InService
+ '[' InService == InService ']'
+ return 0
+ return 0
+ '[' 0 -eq 0 ']'
+ create_presigned_url
++ aws sagemaker create-presigned-notebook-instance-url --notebook-instance-name id00045V03 --query AuthorizedUrl --output text --session-expiration-duration-in-seconds 3600
+ PRESIGNED_URL='https://id00045v03.notebook.us-east-1.sagemaker.aws?authToken=eyJhbG....
+ echo URL:
URL:
+ tee .presignedURL

いい感じで Presigned URL でコンソールを開いて Code Server から開発ができそう。

Conclusion

  • (断念)Notebook ページをローカルからコマンド一つたたいたら開くようにする
    • Notebook Presigned URL を払いだす
  • ブラウザ上で VS Code エディタで開発できるようにする
GitHubで編集を提案

Discussion