背景
- SageMaker Python SDKを使用
- ローカルのJupyter Notebookを使用
- SageMaker組み込みアルゴリズム randomcutforestを使用
- 学習済みモデルアーティファクトはS3に格納済み
- モデルイメージのリージョンとモデルアーティファクトの格納先リージョンは同じ
上記の条件において、
を参考に、以下のようなコードでモデルをデプロイしようとした。
roleArn = SageMakerFullAccessとS3FullAccessポリシーをアタッチしたもの
image_uri = sagemaker.image_uris.retrieve(framework=組み込みアルゴリズム名, region=リージョン名, version=バージョン)
model = sagemaker.model.Model(
image_uri=image_uri,
model_data="s3://model.tar.gzの置き場所",
role=roleArn
)
model.deploy(
endpoint_name="エンドポイント名",
initial_instance_count=1,
instance_type="ml.c5.large"
)
ところが、
ClientError: An error occurred (ValidationException) when calling the CreateModel operation: RoleArn: Cross-account pass role is not allowed.
と出てしまった。
修正方法
以下のように、sagemaker_sessionという引数を与える必要がある。リージョンは、組み込みアルゴリズムの参照先コンテナイメージのリージョンとする。
boto_session = boto3.Session(
region_name=リージョン名,
aws_access_key_id="**************",
aws_secret_access_key="**************"
)
session = sagemaker.Session(boto_session=boto_session)
model = sagemaker.model.Model(
image_uri=image_uri,
model_data=MODEL_DATA,
role=SM_EXECUTION_ROLE,
sagemaker_session=session # これが必要
)
これで、数時間悩んでしまった。 ネット上に情報がなく、おそらくここでハマる人はあまりいないのだろう。残念。