Soracom

Users

ドキュメント
Home ドキュメント SORACOM Beam Amazon Web Service (AWS) に送信する

IAM 認証を利用して Amazon SageMaker にデータを送信して推論する

お客様の AWS アカウントにある Amazon SageMaker にデプロイしたモデルでの推論を、Beam が動作する SORACOM の AWS アカウントにのみ許可できます。

Beam を使用することで、Amazon SageMaker で推論するための認証情報を、デバイスにインストールする必要がなくなります。デバイスでは、以下のように Beam のエントリポイントを指定してアクセスするだけで、Amazon SageMaker で推論できます。

このページでは、例として 2022 年 12 月の東京の電力需要実績値 (万 kW) (出典: 東京電力パワーグリッド (株)) と東京の気象データ (出典: 気象庁) を利用して、ある時刻の温湿度から電力需要を予測するモデルを XGBoost で作成し、デバイスからデータを送信して、推論を実行する方法を説明します。

米国西部 (オレゴン) (us-west-2) を利用してください

Amazon SageMaker は、動作確認が取れている米国西部 (オレゴン) (us-west-2) を利用してください。このページで紹介するコードの一部は、アジアパシフィック (東京) (ap-northeast-1) では動作しないことがわかっています。

ステップ 1: データ準備用の Amazon SageMaker ノートブックインスタンスを作成する

Beam に送信した温度データおよび湿度データを、転送する先になる Amazon S3 バケットを作成します。

  1. 米国西部 (オレゴン) (us-west-2) の Amazon SageMaker のノートブックインスタンス画面にアクセスします。

  2. [ノートブックインスタンスの作成] をクリックします。

  3. [ノートブックインスタンス設定][ノートブックインスタンス名] に、ノートブックインスタンスの名前 (例: beam-sagemaker) を入力します。

  4. [アクセス許可と暗号化][IAM ロール] で、[新しいロールの作成] をクリックします。

    「IAM ロールを作成する」画面が表示されます。

  5. [指定する S3 バケット - オプション] で「任意の S3 バケット」が選択されていることを確認し、[ロールを作成] をクリックします。

    ノートブックインスタンスから SageMaker と S3 を利用するための IAM ロールが作成されます。

  6. [ノートブックインスタンスの作成] をクリックします。

    ノートブックインスタンスの作成が開始されます。

[ステータス] に「InService」と表示されるまで待ちます。

ステップ 2: Jupyter Notebook でモデルを作成する

ステップ 1: データ準備用の Amazon SageMaker ノートブックインスタンスを作成する で作成したノートブックインスタンスを使って、モデルを作成します。

  1. ノートブックインスタンス画面で、[ステータス] に「InService」と表示されているノートブックインスタンスをクリックします。

    ノートブックインスタンスの設定画面が表示されます。

  2. [Jupyter を開く] をクリックします。

  3. [New][conda_python3] の順にクリックします。

    Jupyter Notebook が作成されます。

  4. セルに以下のコードを貼り付けて、[Run] をクリックします。

    # import libraries
    import boto3, sagemaker
    import uuid, urllib.request, os
    import numpy as np
    import pandas as pd
    

    コードが実行され、このページで説明するコードの実行に必要なライブラリがインポートされます。

  5. 次のセルに以下のコードを貼り付けて、[Run] をクリックします。

    # Define IAM role
    role = sagemaker.get_execution_role()
    prefix = 'sagemaker/beam-xgboost'
    my_region = boto3.session.Session().region_name
    xgboost_container = sagemaker.image_uris.retrieve(framework="xgboost",region=my_region,version='1.5-1')
    print("my_region: " + my_region + ", xgboost_container: " + xgboost_container)
    

    コードが実行され、AWS リージョン (my_region) とモデルの学習に利用するイメージの URL (xgboost_container) が表示されます。

    my_region: us-west-2, xgboost_container: 123456789012.dkr.ecr.us-west-2.amazonaws.com/sagemaker-xgboost:1.5-1
    

    Amazon SageMaker の XGBoost に対応した最新コンテナイメージは Docker Registry Paths and Example Code XGBoost (algorithm) を参照してください。

  6. 次のセルに以下のコードを貼り付けて、[Run] をクリックします。

    コードの 2 行目で、Amazon S3 バケットの名前を指定しています。必要に応じて変更してください。

    bucket_name = 'beam-sagemaker-' + str(uuid.uuid4())
    print("bucket_name: " + bucket_name)
    s3 = boto3.resource('s3')
    try:
        if my_region == 'us-east-1':
            s3.create_bucket(Bucket=bucket_name)
        else:
            s3.create_bucket(Bucket=bucket_name, CreateBucketConfiguration={ 'LocationConstraint': my_region })
        print('S3 bucket created successfully')
    except Exception as e:
        print('S3 error: ',e)
    

    「beam-sagemaker-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX」という名前の Amazon S3 バケットが作成されます。

    bucket_name: beam-sagemaker-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
    S3 bucket created successfully
    
  7. 次のセルに以下のコードを貼り付けて、[Run] をクリックします。

    csv_filename = "weather_power_202212.csv"
    urllib.request.urlretrieve("https://users.soracom.io/ja-jp/docs/beam/aws-sagemaker/files/" + csv_filename, csv_filename)
    s3.Bucket(bucket_name).upload_file(csv_filename, csv_filename)
    

    weather_power_202212.csv (学習するサンプルデータ) がダウンロードされ、S3 バケットにアップロードされます。

    weather_power_202212.csv は、2022 年 12 月の東京の電力需要実績値 (万 kW) (出典: 東京電力パワーグリッド (株)) と東京の気象データ (出典: 気象庁) を利用して作成したデータです。

  8. 次のセルに以下のコードを貼り付け、[Run] をクリックします。

    try:
        data_key = 'weather_power_202212.csv'
        data_location = 's3://{}/{}'.format(bucket_name, data_key)
        df_weather_power = pd.read_csv(data_location)
        print('Success: Data loaded into dataframe.')
    except Exception as e:
        print('Data load error: ',e)
    df_weather_power.head()
    

    S3 バケットにアップロードした weather_power_202212.csv (学習するサンプルデータ) が読み込まれ、表形式で表示されます。

    学習するサンプルデータには、日付情報、気象データ、実績電気消費量がありますが、中でも [time (時刻)] [temperature (温度)] [humidity (湿度 (%))] [actual_power (電力需要実績値 (万kW))] を例として利用していきます。

  9. 次のセルに以下のコードを貼り付け、[Run] をクリックします。

    df_weather_power["time"]=df_weather_power["time"].str.replace(':00','').astype('int')
    train_data, test_data = np.split(df_weather_power.loc[:,["time","temperature","humidity", "actual_power"]].sample(frac=1, random_state=1729), [int(0.7 * len(df_weather_power))])
    print(train_data.shape, test_data.shape)
    

    学習するサンプルデータが、学習データ (train_data) とテストデータ (test_data) に分割されます。

    (520, 4) (223, 4)
    
  10. 次のセルに以下のコードを貼り付け、[Run] をクリックします。

    pd.concat([train_data['actual_power'], train_data.drop(['actual_power'], axis=1)], axis=1).to_csv('train.csv', index=False, header=False)
    s3.Bucket(bucket_name).Object(os.path.join(prefix, 'train/train.csv')).upload_file('train.csv')
    s3_input_train = sagemaker.inputs.TrainingInput(s3_data='s3://{}/{}/train'.format(bucket_name, prefix), content_type='csv')
    

    学習データが S3 バケットにアップロードされます。

  11. 次のセルに以下のコードを貼り付け、[Run] をクリックします。

    sess = sagemaker.Session()
    xgb = sagemaker.estimator.Estimator(xgboost_container,role, instance_count=1, instance_type='ml.m5.xlarge',output_path='s3://{}/{}/output'.format(bucket_name, prefix),sagemaker_session=sess)
    xgb.set_hyperparameters(objective='reg:squarederror',num_round=100)
    

    Amazon SageMaker のトレーニングジョブが作成されます。

    ここでは例として、Amazon XGBoost を利用して、与えられた「time (時間)」、「temperature (温度)」、「humidity (湿度 (%))」から、「actual_power (電力需要実績値 (万 kW))」を予測するように回帰モデルを学習します。

  12. 次のセルに以下のコードを貼り付け、[Run] をクリックします。

    xgb.fit({'train': s3_input_train})
    

    トレーニングジョブが実行されます。終了までに数分かかる場合があります。

    トレーニングジョブが終了すると、以下のように「Billable seconds: 999」と表示されます。

  13. 次のセルに以下のコードを貼り付け、[Run] をクリックします。

    from sagemaker.serverless import ServerlessInferenceConfig
    
    serverless_config = ServerlessInferenceConfig(
        memory_size_in_mb = 2048,
        max_concurrency = 5
    )
    serverless_predictor = xgb.deploy(serverless_inference_config = serverless_config)
    

    学習したモデルがサーバーレスエンドポイントにデプロイされ、エンドポイントの名前 (例: sagemaker-xgboost-2023-03-06-08-53-15-937) が表示されます。エンドポイントの名前は、これ以降、${amazon_sagemaker_model_endpoint_name} と表記します。

    作成されたモデルは、Amazon SageMaker の モデル画面 にアクセスしても確認できます。

  14. 次のセルに以下のコードを貼り付け、[Run] をクリックします。

    from sagemaker.serializers import CSVSerializer
    
    test_data_array = test_data.drop(['actual_power'], axis=1).values
    serverless_predictor.serializer = CSVSerializer()
    prediction_results = serverless_predictor.predict(test_data_array).decode('utf-8')
    predictions = np.fromstring(prediction_results[1:], sep='\n')
    
    actual = test_data['actual_power'].to_numpy()
    RMSE = np.sqrt(np.mean(np.power(actual-predictions,2)))
    print(RMSE)
    

    テストデータで推論を実行し、予測精度を確認します。ここでは、推論した値と実際の値の RMSE (二乗平均平方根誤差) を計算しています。

    364.0653729628472
    

ステップ 3: IAM ロールを作成して SORACOM の AWS アカウントに割り当てる

ステップ 2: Jupyter Notebook でモデルを作成する で作成した モデルでの推論の実行を、Beam が動作する SORACOM の AWS アカウントに許可します。具体的には、推論の実行を許可するための AWS IAM ロールを作成し、SORACOM の AWS アカウントに割り当てます。

  1. IAM ダッシュボード画面にアクセスし、[アクセス管理][ロール] の順にクリックして、[ロールを作成] をクリックします。

  2. [AWS アカウント][別の AWS アカウント] の順にクリックし、[アカウント ID] に SORACOM の AWS アカウント ID を入力します。

    Beam が動作する SORACOM の AWS アカウントの ID は、カバレッジタイプによって異なります。

    • 日本カバレッジ: 762707677580
    • グローバルカバレッジ: 950858143650

  3. [外部 ID を要求する] にチェックを入れ、[外部 ID] に任意の文字列を入力します。

    [外部 ID] に入力した文字列は、これ以降、${external_id} と表記します。例: External-ID-gtDRpa2ZQCE7RSvj

  4. [次へ] をクリックします。

    「許可を追加」画面が表示されます。

  5. [ポリシーを作成] をクリックします。

    別のウィンドウまたは別のタブで、「ポリシーの作成」画面が表示されます。

    ここからは「ポリシーの作成」画面でポリシーを作成します

    「ポリシーの作成」画面の操作が終わったら、[ポリシーの作成] が表示されている「許可を追加」画面に戻ってきて IAM ロールを作成する操作を続けます。画面を閉じないでください。

  6. 以下の項目を設定します。

    項目説明
    [サービス][サービスの選択] をクリックして、[SageMaker] をクリックします。
    [アクション][フィルタアクション] に「InvokeEndpoint」と入力し、[InvokeEndpoint] にチェックを入れます。

  7. [リソース][指定][ARN の追加] の順にクリックします。

    「ARN の追加」画面が表示されます。

  8. 以下の情報を入力して、[追加] をクリックします。

    項目説明
    [Region]Amazon SageMaker のリージョン「us-west-2」を入力します。
    [Account]お客様の AWS アカウント ID を入力します。
    [Endpoint name]デプロイしたモデルの名前 ${amazon_sagemaker_model_endpoint_name} を入力します。(例: sagemaker-xgboost-2023-03-06-08-53-15-937)

    「ポリシーの作成」画面に戻ります。

  9. [次のステップ: タグ][次のステップ: 確認] の順にクリックします。

  10. [名前] に AWS IAM ポリシーの名前を入力し、[ポリシーの作成] をクリックします。

    AWS IAM ポリシーが作成され、ポリシー画面が表示されます。

  11. ポリシー画面が表示されているウィンドウまたはタブを閉じて、「許可を追加」画面に戻ります。

  12. [] をクリックし、手順 10 で入力した AWS IAM ポリシーの名前をテキストボックスに入力して、Enter キーを押します。

    作成した AWS IAM ポリシーが表示されます。

  13. 作成した AWS IAM ポリシーにチェックを入れて、[次へ] をクリックします。

  14. [ロール名] に IAM ロールの名前を入力して、[ロールを作成] をクリックします。

    ロール画面に戻ります。

  15. 作成した IAM ロールの名前をクリックし、[ARN] をメモします。

    この ARN は、これ以降、${iam_role_arn} と表記します。例: arn:aws:iam::XXXXXXXXXXXX:role/beam-sagemaker-device-role

ステップ 4: SORACOM Beam をセットアップする

Beam の Web サイトエントリポイントを設定します。ここで説明するとおりに設定すると、以下の機能が実現できます。

  • IoT SIM を利用するデバイスから Amazon SageMaker のモデルにデータを送信して、推論する。

認証情報ストアに AWS IAM ロール認証情報を登録する

Beam から Amazon SageMaker のエンドポイントを呼び出すために、IAM ロールに関する認証情報を、SORACOM ユーザーコンソールの認証情報ストアに登録します。認証情報は、${iam_role_arn} および ${external_id} です。認証情報ストアの「認証情報を登録」画面の表示方法については、認証情報を登録する を参照してください。

認証情報は、以下のように登録します。

項目説明
[認証情報 ID]認証情報を識別するために任意の名前を入力します。例: AWS-IAM-role-credentials-invokeEndpoint
[種別]「AWS IAM ロール認証情報」を選択します。
[ロール ARN]${iam_role_arn} を入力します。例: arn:aws:iam::XXXXXXXXXXXX:role/beam-sagemaker-device-role
[外部 ID]${external_id} を入力します。例: External-ID-Rs6E3TFfh5QsyFWp

credential registration credential registration

Beam の Web サイトエントリポイントを設定する

Beam の設定はグループに対して行います

ここでは、グループの設定を変更する操作のみを説明します。グループの仕組みやグループを作成する操作について詳しくは、グループ設定 を参照してください。

  1. SIM グループ画面で [SORACOM Beam 設定] をクリックします。

    SIM グループ画面を表示する操作について詳しくは、グループの設定を変更する を参照してください。

  2. [+設定を追加する][Web サイトエントリポイント] の順にクリックします。

    「SORACOM Beam - Web サイト転送設定」画面が表示されます。

  3. 以下のように設定します。

    項目説明
    [設定名]任意の設定名 (例: Amazon SageMaker) を入力します。
    [転送先][プロトコル]「HTTPS」を選択します。
    [転送先][ホスト名]「runtime.sagemaker.us-west-2.amazonaws.com」を入力します。
    [転送先][ポート番号]空欄のままにします。
    [ヘッダ操作][Authorization ヘッダ]

    オンにして、以下のように設定します。

    • [タイプ]: 「AWS Signature V4」を選択します。
    • [サービス]: 「Amazon SageMaker」を選択します。
    • [リージョン]: Amazon SageMaker のリージョン「us-west-2」(米国西部 (オレゴン)) を選択します。
    • [認証情報 ID]: 認証情報ストアに AWS IAM ロール認証情報を登録する で登録した AWS IAM ロール認証情報を選択します。

    Webサイト エントリポイント Webサイト エントリポイント
    Webサイト エントリポイント Webサイト エントリポイント

    Web サイトエントリポイントの設定値の意味は、Web サイトエントリポイント を参照してください。

  4. [保存] をクリックします。

  5. IoT SIM が所属するグループを切り替えます。

    IoT SIM の Beam の設定が完了しました。

ステップ 5: Web サイトエントリポイントを使用して Amazon SageMaker にデプロイしたモデルにデータを送信して推論する

Beam の Web サイトエントリポイントを使用して、Amazon SageMaker にデプロイしたモデルにデータを送信して、推論します。

AWS SDK for Python (Boto3) を使用して推論する

  1. デバイスに、AWS SDK for Python (Boto3) をインストールします。

    $ pip install boto3
    
  2. デバイスに、sagemaker_invoke_endpoint.py をダウンロードします。

    $ wget http://users.soracom.io/ja-jp/docs/beam/aws-sagemaker/files/sagemaker_invoke_endpoint.py
    
    sagemaker_invoke_endpoint.py はサンプルスクリプトです

    sagemaker_invoke_endpoint.py は、AWS SDK for Python (Boto3) を利用して、Amazon SagaMaker にデプロイしたモデルで推論する機能を持つサンプルスクリプトです。

  3. デバイスで、以下のコマンドを実行します。

    $ python -c "import sagemaker_invoke_endpoint;\
    sagemaker_invoke_endpoint.invoke_endpoint(\
      endpoint_name='sagemaker-xgboost-2023-03-06-08-53-15-937',\
      hour=9,\
      temperature=9.0,\
      humidity=81)"
    

    sagemaker_invoke_endpoint.invoke_endpoint() メソッドの引数は以下のとおりです。

    項目説明
    endpoint_nameデプロイしたモデルのエンドポイント名 ${amazon_sagemaker_model_endpoint_name} を指定します。例: sagemaker-xgboost-2023-03-06-08-53-15-937
    hour温度と湿度が計測された時間を指定します。例: 9 (9 時)
    temperature温度を指定します。例: 9.0
    humidity湿度 (%) を指定します。例: 81.0

    成功すると電力需要 (万 kW) の値が推論結果として表示されます。

    {'predictions': [{'score': 3453.01220703125}]}
    

curl コマンドを使用してデータを送信して推論する

IoT SIM を利用するデバイスで、以下のコマンドを実行しても、データを送信して推論できます。

$ curl -X POST --data "${hour},${temperature},${humidity}" -H "Content-Type: text/csv" -H "Accept: application/json" http://beam.soracom.io:18080/endpoints/${amazon_sagemaker_model_endpoint_name}/invocations

例:

$ curl -X POST --data "9,9.0,81.0" -H "Content-Type: text/csv" -H "Accept: application/json" http://beam.soracom.io:18080/endpoints/sagemaker-xgboost-2023-03-06-08-53-15-937/invocations
{'predictions': [{'score': 3453.01220703125}]}
curl で実行する場合は HTTP エントリポイントも利用できます

HTTP エントリポイント[転送先][パス] に、「/endpoints/${amazon_sagemaker_model_endpoint_name}/invocations」(例: /endpoints/sagemaker-xgboost-2023-03-06-08-53-15-937/invocations) を指定すると、HTTP エントリポイントにデータを送信しても推論を実行できます。

(参考) SageMaker の利用を終了する

SageMaker が不要になった場合は、作成したデータを削除します。

  1. ステップ 2: Jupyter Notebook でモデルを作成する で作成した Jupyter Notebook の次のセルに以下のコードを貼り付けて、[Run] をクリックします。

    serverless_predictor.delete_model()
    serverless_predictor.delete_endpoint()
    

    デプロイされたモデルが削除されます。Amazon SageMaker の モデル画面 にアクセスして、削除されたことを確認してください。

  2. 同様に、このページで作成した以下の情報も削除してください。

    • AWS
      • SageMaker のノートブックインスタンス
      • Amazon S3 バケット
      • IAM ロール
        • ノートブックインスタンスから SageMaker と S3 を利用するための IAM ロール
        • SORACOM の AWS アカウントから SageMaker を利用するための IAM ロール
      • IAM ポリシー
    • SORACOM ユーザーコンソール
      • 認証情報
      • グループ
    • デバイス
      • sagemaker_invoke_endpoint.py