歩いたら休め

なんでこんな模様をしているのですか?

【SageMaker】SageMakerのサンプルをローカル実行してget_execution_role関数がエラーを起こす場合の対処

休みの時間を利用して、こちらのSageMakerのサンプルを試していました。

aws.amazon.com

問題

ただ、ローカルのPC(Mac Book)から利用する場合、下のStackOverflowにある通り、エラーが出て get_execution_role 関数が使えません。

stackoverflow.com

def trained_estimator_from_hyperparams(s3_train_data, hyperparams, output_path, s3_test_data=None):
    # 中略
    knn = sagemaker.estimator.Estimator(containers[boto3.Session().region_name],
        get_execution_role(),
        train_instance_count=1,
        train_instance_type='ml.m5.2xlarge',
        output_path=output_path,
        sagemaker_session=sagemaker.Session())
    knn.set_hyperparameters(**hyperparams)
    # 後略

そもそも、ドキュメントには次のように書かれています。

次の Python コードをコピーして、ノートブックの最初のセルに貼り付けます。「Amazon SageMaker をセットアップします」で作成した S3 バケットの名前を追加し、コードを実行します。get_execution_role 関数は、ノートブックインスタンスの作成時に作成した IAM ロールを取得します。

SageMakerの利用し始めには多少混乱すると思いますが、「ノートブックインスタンス」と「トレーニンインスタンス」が別に存在して、 get_execution_role は「ノートブックインスタンスから自分のroleを取得する」ための関数です。

対処

aws.amazon.com

「オンプレミス環境から Amazon SageMaker を利用する」の記事にもある通り、単純に自前で文字列で指定すればいいだけです。

ひとまず私は、SageMakerとS3(モデルやデータの読み込みに必要)を読み込むロールを付けて直接文字列で指定しました。

def trained_estimator_from_hyperparams(s3_train_data, hyperparams, output_path, s3_test_data=None):
    # 中略
    knn = sagemaker.estimator.Estimator(containers[boto3.Session().region_name],
        "arn:aws:iam::***********:role/sagemaker-execution",
        train_instance_count=1,
        train_instance_type='ml.m5.2xlarge',
        output_path=output_path,
        sagemaker_session=sagemaker.Session())
    knn.set_hyperparameters(**hyperparams)
    # 後略