☁️

ローカルで学習したAIモデルをAmazon SageMakerへアップロードし、デプロイする方法

2024/04/15に公開

前書き

アプリなどでAIモデルを活用する場合、Amazon SageMaker上にモデルをデプロイすると便利らしいです。(私は機械学習モデルの構築や精度の向上には興味がありますが、サーバー周りやアプリへの応用については全く知見がありません。)

私にはアプリ開発を行っている友人がいるのですが、AIモデル構築周りを行っていたメンバーが急病になってしまったらしく、画像分類モデルの更新とアップロードを依頼されました。
私自身もたまたまケガをして歩けない状態になってしまったため、土日にどこにも行けず暇になることが分かっていた(常に暇なわけではない、知らんけど)のと、数少ない友人の頼みなので少し見てみることにしました。

担当者が開発していたnotebookファイルが渡されたのですが、(勿論想定通りですが)自分の環境では動かず、他のファイルを見てみても環境ファイルも見当たらなかったので使用しているライブラリを確認しながら環境構築から行う羽目になりました。1社目の時に経験しましたが、画像周りは環境構築が複雑なイメージで正直苦手です。(ハード周り弱くて情けない。)

頑張った結果(さらっと流してますが本当はとても時間がかかった)、TensorFlowモデルの構築までは出来ましたがAmazon SageMakerにデプロイするまでも何個か作業があり、初めて行ったことも多かったのでモデル構築後からデプロイするまでの流れをまとめていこうと思います。(前書きが長くなりましたが、ここからやっと本題です。)

Amazon SageMakerについて

さっそくモデルのアップロードの件を書き進めたいところですが、構成的にも必要な気がしたためAmazon SageMakerについての章も作りました。

完全な素人ですが、少し調べたところAmazonのサーバー(AWS)上で機械学習モデルの作成、更新からデプロイまでできるサービスらしいです。環境構築とか必要なさそうで、凄く便利そうです。
SageMaker上でモデルの学習ができるなら、わざわざローカルで学習したモデルをアップロードしなくても良いのでは?などと思いながらも作業を進めました。(お金や時間の問題なんでしょうか。詳しい方いらっしゃいましたら教えてくださいませ。)

以下参照
https://aws.amazon.com/jp/sagemaker/

モデルデプロイまでの手順

大まかな流れをまとめると

  1. modelの保存
  2. tar.gz形式で保存
  3. Amazon SageMakerへのモデルのデプロイ
    3.1 SageMakerクライアントとセッションの作成
    3.2 モデルのアップロード
    3.3 SageMaker上へのモデル作成
    3.4 モデルのデプロイ

という流れで作業を行う必要があります。

ここからは学習後のモデル(.hdf5ファイル)があることを前提として流れを記載していきます。

1. modelの保存

形式を整える必要があるためモデルを保存し直します。

import os

def create_model():
    """
    モデルのインスタンスを作成する
    """
    model = ...  # 学習時に作成したモデルと同じ書き方でOK
    return model

def save_model(model, weight_path, save_dir, dir_name):
    """
    指定したweightのモデルを保存する
    """
    model.load_weights(weight_path)
    save_dir_path = os.path.join(save_dir, dir_name)
    model.save(save_dir_path)
    return

# modelのインスタンスを作成
model = create_model()
# 指定したweightのモデルを保存
save_model(model, weight_path, save_dir, dir_name)

2. tar.gz形式で保存

Amazon SageMakerではtar.gz形式でアップロードする必要があるので変換していきます。

import os
import tarfile

def generate_tarball(save_dir, dir_name):
    """
    tar.gz形式で保存する
    """
    tar_gz_name = dir_name + ".tar.gz"
    tar_gz_path = os.path.join(save_dir, tar_gz_name)
    
    with tarfile.open(tar_gz_path, mode="w:gz") as archive:
        archive.add(arcname=dir_name)
    return tar_gz_path

# tar.gz形式で保存
tar_gz_path = generate_tarball(save_dir, dir_name)

3. Amazon SageMakerへのモデルのデプロイ

3.1 SageMakerクライアントとセッションの作成

最後にモデルをアップロードしていきます。
PythonからAWSの操作を行うためにはboto3というライブラリを使用し、SageMakerクライアントとセッションを作成する必要があります。AWSのアクセスキー・シークレットキー、リージョンなどの設定が必要となります。以下のように一度まとめておくとコードも短くなり、便利です。

config = {
    "aws_access_key_id": "<my_access_key>",  # アクセスキー
    "aws_secret_access_key": "<my_secret_key>",  # シークレットキー
    "region_name": "<region>",  # 使用するリージョン。東京リージョンの場合はap-northeast-1
}

次にSageMakerクライアントとセッションを作成します。

import boto3
import sagemaker

boto_session = boto3.session.Session(
    **config
)

sagemaker_client = boto_session.client(
    service_name='sagemaker', 
    **config
)

sagemaker_session = sagemaker.session.Session(
    boto_session=boto_session,
    sagemaker_client=sagemaker_client
)

3.2 モデルのアップロード

Amazon SageMakerにtar.gz形式で保存したモデルをアップロードしていきます。
事前にS3にbucketを作成しておく必要があります。Amazon SageMakerを使用する場合、バケット名はsagemakerを含む必要があります。以下のコードの<sagemaker-test-bucket>になっている部分にbucket名を指定します。

key_prefixにはアップロード先として分かりやすい名前を指定します。デフォルトではdataになっているので変更するのがおすすめです。以下のコードではtestと指定しています。

model_url = sagemaker_session.upload_data(
    path = tar_gz_path,
    bucket = "<sagemaker-test-bucket>",  # bucket名
    key_prefix="test",
)

model_urlを確認し、

s3://<sagemaker-test-bucket>/test/dir_name.tar.gz

といった表示が確認できれば成功です。
AWSマネジメントコンソール上でパスを確認することもできます。

3.3 SageMaker上へのモデル作成

最後にSageMaker上にモデルをデプロイします。

model_nameにモデルの名前、imageにdockerのイメージ、execution_role_arnにIAM ロール ARNを指定します。

docker imageの指定

dockerのイメージはAWSで提供されているものを活用すると便利です。
TensorFlowの推論モデルを使用したい場合は
<region_id>.dkr.ecr.<region_code>.amazonaws.com/tensorflow-inference:<tag>のような形式で指定します。
<region_id>, <redion_code>の部分に自身が使用するリージョンの情報を指定します。

<tag>の部分にtensorflow-2.11.0-cpu-py39-ubuntu20.04-sagemaker-v1.1といった使用したいimageの名前(公式ではリソース識別子)を指定する必要があります。(経験の浅い私には調べるのが少し大変で複雑に感じました。理解が正しいのかも怪しいです。詳しい方いらっしゃれば教えてください。)

・レジストリパスの確認:
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg-ecr-paths/ecr-ap-northeast-1.html#tensorflow-ap-northeast-1.title

・サポートされているタグの確認:
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/notebooks-available-images.html#notebooks-available-images-deprecation

まとめると、
<region_id>.dkr.ecr.<region_code>.amazonaws.com/tensorflow-inference:tensorflow-2.11.0-cpu-py39-ubuntu20.04-sagemaker-v1.1といった感じです。
(使用するライブラリ・バージョンによって変わりますが参考までに)


IAM ロール ARNの指定

SageMakerからS3などの他のサービスへのアクセス権限を付与するために、IAM ロール ARNの指定が必要になります。IAM ロール ARNは事前に作成しておく必要があります。
IAM ロール ARNはarn:aws:iam::<account_id>:role/<role_name>というような構成になっていて、account_idにアカウントID、role_nameにロール名を入力します。


以上をまとめた上で以下コードを実行することでモデルを作成することが出来ます。

sagemaker_client.create_model(
    ModelName = model_name, 
    ExecutionRoleArn = execution_role_arn, 
    Containers = [
        { 
            "Image":        image,
            "ModelDataUrl": model_url,
            "Mode":         "SingleModel"
        }
    ] 
)

3.4 モデルのデプロイ

作成したモデルと紐づけたエンドポイントを作成することで、モデルをデプロイすることができます。
エンドポイントの設定を作成した上で、エンドポイントを作成します。

endpoint_config_namemodel_nameendpoint_nameを指定して、以下を実行します。

# エンドポイントの設定
sagemaker_client.create_endpoint_config(
    EndpointConfigName = endpoint_config_name,
    ProductionVariants=[
            {
            "InstanceType":        "ml.t2.medium",
            "InitialInstanceCount": 1,
            "InitialVariantWeight": 1,
            "ModelName":            model_name,
            "VariantName":          "AllTraffic"
            }
    ]
)

# エンドポイントの作成
sagemaker_client.create_endpoint(
    EndpointName=endpoint_name,
    EndpointConfigName=endpoint_config_name,
)

まとめ

ローカルで学習したAIモデルをAmazon SageMakerへアップロードし、デプロイするまでの手順をまとめました。クラウドの活用を普段行わない私にとっては良い経験になりました。正直、理解が怪しい部分もありますが少しずつできる事を増やしていきたいと思います。

Goals Tech Blog

Discussion