🕶️

AWS Sagemaker Studioで独自Containerを使う-中編-

2022/08/29に公開

はじめに

この記事はAWS Sagemaker Studioで独自Containerを使う-前編-の続きです。
この記事を見ていない方はそちらからどうぞ。

IAMロールの設定

新しくsagemaker用のIAMロールを作成します。ここではSagemakerExcutionRoleという名前で作成します。(名前は適宜変更してください)
まず初めに、「許可を追加」からポリシーをアタッチを選択して、[AmazonSageMakerFullAccess]を追加します。

その後、codebuildのアクセス許可を含める必要があります。
ここでは[build-and-push-container-image-in-sagemaker-studio]という名前でポリシーを作成してアタッチしています。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "codebuild:DeleteProject",
                "codebuild:CreateProject",
                "codebuild:BatchGetBuilds",
                "codebuild:StartBuild"
            ],
            "Resource": "arn:aws:codebuild:*:*:project/sagemaker-studio*"
        },
        {
            "Effect": "Allow",
            "Action": "logs:CreateLogStream",
            "Resource": "arn:aws:logs:*:*:log-group:/aws/codebuild/sagemaker-studio*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:GetLogEvents",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:log-group:/aws/codebuild/sagemaker-studio*:log-stream:*"
        },
        {
            "Effect": "Allow",
            "Action": "logs:CreateLogGroup",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ecr:CreateRepository",
                "ecr:BatchGetImage",
                "ecr:CompleteLayerUpload",
                "ecr:DescribeImages",
                "ecr:DescribeRepositories",
                "ecr:UploadLayerPart",
                "ecr:ListImages",
                "ecr:InitiateLayerUpload",
                "ecr:BatchCheckLayerAvailability",
                "ecr:PutImage"
            ],
            "Resource": "arn:aws:ecr:*:*:repository/sagemaker-studio*"
        },
        {
            "Sid": "ReadAccessToPrebuiltAwsImages",
            "Effect": "Allow",
            "Action": [
                "ecr:BatchGetImage",
                "ecr:GetDownloadUrlForLayer"
            ],
            "Resource": [
                "arn:aws:ecr:*:763104351884:repository/*",
                "arn:aws:ecr:*:217643126080:repository/*",
                "arn:aws:ecr:*:727897471807:repository/*",
                "arn:aws:ecr:*:626614931356:repository/*",
                "arn:aws:ecr:*:683313688378:repository/*",
                "arn:aws:ecr:*:520713654638:repository/*",
                "arn:aws:ecr:*:462105765813:repository/*"
            ]
        },
        {
            "Sid": "EcrAuthorizationTokenRetrieval",
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:DeleteObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::sagemaker-*/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:CreateBucket"
            ],
            "Resource": "arn:aws:s3:::sagemaker*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:GetRole",
                "iam:ListRoles"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::*:role/*",
            "Condition": {
                "StringLikeIfExists": {
                    "iam:PassedToService": "codebuild.amazonaws.com"
                }
            }
        }
    ]
}

更にcode buildには信頼ポリシーも必要なためこれを追加します。

上記のように「信頼関係」タグから以下を記述します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "codebuild.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

さらに、S3のデータを参照し学習、学習結果をアップロードするためS3へのアクセス許可も追加します。ここではsagemaker-execution-policyとして作成してアタッチしています。
sagemakerで始まる名前以外のバケットを参照したい場合、your-bucket-nameにあるように自分が使いたいバケット名を記述します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::SageMaker"
            ]
        },
        {
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::SageMaker/*"
            ]
        },
        {
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::your-bucket-name"
            ]
        },
        {
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::your-bucket-name/*"
            ]
        }
    ]
}

IAMロールの設定は以上です。お疲れ様でした。

Sagemaker Studio側の設定

さて、今度はSagamaekr Studio側の設定を行います。
Amazon Sagemakerへ移動し、左側のコントロール画面からStudioを選択します。
「ユーザーの追加」で新しくユーザーを追加します。
名前を入力し(ここではnn-trainingとしています)、先ほど作成したIAMロールを選択します。

setp2,3の設定はデフォルトで構いません。
ユーザーが作成できたら「アプリケーション起動」から[studio]を選択しsagemaker studioを起動しましょう。起動にはしばらく時間がかかります。

Dockerのビルド

studioが起動したら、次にdockerのビルドを行います。
AWS Sagemaker Studioで独自Containerを使う-前編-
で作成したコードとDockerfileをstudioにコピーします。 左側のフォルダアイコンを選択し、「upload Files」でstudioに取り込むことができます。
また、Studioではgitと連携もできるので、githuib上にアップしたものを取り込むこともできます。
維持管理を行う場合、こちらのほうが良い選択となるでしょう。
新規にNotebookを作成し、下記のようにしてdocker containerをビルドします。
はじめにsagemaker-studio-image-buildをインストールします。

train
!pip install sagemaker-studio-image-build

次にdockerのビルドを行います。

train
!sm-docker build . --repository nnclass:latest

オプション等の詳しい使い方はこちらを参照してください。

ここで、sagameker studioでdockerをビルドする際のチャートを掲載します。
図のとおりですが、初めにS3に必要なデータがアップロードされ、CodeBuildでビルドが実行され、ビルドが成功するとECRにプシュされるという仕組みです。

長くなったので今回はここまでとします。次回いよいよ、 独自containerを使ったトレーニングを行います。

AWS Sagemaker Studioで独自Containerを使う-後編-に続く。

Discussion