Amazon SageMakerを使用してモデル構築を効率化するためのフィーチャーストアの作成
以前のブログ「AWSクラウド環境でのデータレイクとカスタマー360を使用したNBFCでのアドバンスアナリティクスの実行とフィーチャーストアの利用」では、Amazon SageMakerのフィーチャーストア機能を利用することが、ビジネスが1000時間以上の人的作業を節約し、MLモデル構築の速度と能力を向上させた方法について学びました。
このブログでは、技術者が自組織のAmazon SageMakerにフィーチャーストアを作成する方法についての実践ガイドになります。もし、AWSクラウドMLテックスタックで働きたいと考えているデータサイエンティストや機械学習エンジニアであれば、このブログはAmazon SageMakerのフィーチャーストアを学び、探求するのに完璧な出発点になります。
以下のステップに従って、フィーチャーストアの作成と使用方法を学ぶことができます。チュートリアルで使用されるデータとコードも、以下のリンクからダウンロードできます。
ステップ 1:
データを保存するためのs3バケットを作成または使用します。
例:「quickstart-feature-store-demo」というバケットを作成しました。作成成功後、トランザクションデータのcsvファイルをs3にアップロードしました。
ステップ 2:
AWS Sagemaker Studioを開き、Feature Storeという名前の新しいノートブックを作成します。
ステップ 3:
モジュールのインポートと基本設定を始めます。
# インポート
from sagemaker.feature_store.feature_group import FeatureGroup
from time import gmtime, strftime, sleep
from random import randint
import pandas as pd
import numpy as np
import subprocess
import sagemaker
import importlib
import logging
import time
import sys
import boto3
from datetime import datetime, timezone, date
if sagemaker.__version__ < '2.48.1':
subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'sagemaker==2.48.1'])
importlib.reload(sagemaker)
logger = logging.getLogger('__name__')
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler())
logger.info(f'Using SageMaker version: {sagemaker.__version__}')
logger.info(f'Using Pandas version: {pd.__version__}')
# デフォルト設定
sagemaker_session = sagemaker.Session()
default_bucket = sagemaker_session.default_bucket()
logger.info(f'Default S3 bucket = {default_bucket}')
prefix = 'sagemaker-feature-store'
region = sagemaker_session.boto_region_name
ステップ 4:
入力S3バケットからデータを読み込みます。
# 入力データを指し示すために以下の変数を更新します
bucket='quickstart-feature-store-demo'
data_key = 'Transaction Dataset Sample Features.csv'
data_location = 's3://{}/{}'.format(bucket, data_key)
orders_df = pd.read_csv(data_location)
注:Forbiddenエラーが発生した場合は、以下のステップに従ってください。
sagemaker.get_execution_role()
コマンドを使って使用されているロールを表示します。- 表示されたロールに入力データを含むs3バケットへの読み取りアクセス権があることを確認します。
# sagemakerが使用するIAMロールを取得します
role = sagemaker.get_execution_role()
ステップ 5:
データ処理します。
# 一意のイベントタイムスタンプを生成する
def generate_event_timestamp(x):
# ローカルタイムを表すnaive datetime
naive_dt = datetime.now()
# タイムゾーンを考慮に入れる
aware_dt = naive_dt.astimezone()
# UTC時間
utc_dt = aware_dt.astimezone(timezone.utc)
# ISO-8601形式に変換
event_time = utc_dt.isoformat(timespec='milliseconds')
event_time = event_time.replace('+00:00', 'Z')
return event_time
orders_df['event_time'] = orders_df['Date'].apply(lambda x : generate_event_timestamp(x))
for cols in orders_df.columns:
orders_df[cols] = orders_df[cols].astype('string')
ステップ 6:
フィーチャーグループとその定義を作成します。
# フィーチャーグループの作成
current_timestamp = strftime('%m-%d-%H-%M', gmtime())
orders_feature_group_name = f'orders-{current_timestamp}'
%store orders_feature_group_name
# フィーチャーグループの定義の作成
logger.info(f'Orders feature group name = {orders_feature_group_name}')
orders_feature_group = FeatureGroup(name=orders_feature_group_name, sagemaker_session=sagemaker_session)
orders_feature_group.load_feature_definitions(data_frame=orders_df)
def wait_for_feature_group_creation_complete(feature_group):
status = feature_group.describe().get('FeatureGroupStatus')
print(f'初期状態: {status}')
while status == 'Creating':
logger.info(f'フィーチャーグループ {feature_group.name} の作成を待っています...')
time.sleep(5)
status = feature_group.describe().get('FeatureGroupStatus')
if status != 'Created':
raise SystemExit(f'フィーチャーグループ {feature_group.name} の作成に失敗しました: {status}')
logger.info(f'フィーチャーグループ {feature_group.name} が正常に作成されました。')
orders_feature_group.create(s3_uri=f's3://{default_bucket}/{prefix}',
record_identifier_name='OrderId',
event_time_feature_name='event_time',
role_arn=role,
enable_online_store=True)
wait_for_feature_group_creation_complete(orders_feature_group)
ステップ 7:
フィーチャーストアにデータを取り込みます。
%%time
logger.info(f'フィーチャーグループ {orders_feature_group.name} にデータを取り込んでいます...')
orders_feature_group.ingest(data_frame=orders_df, max_processes=16, wait=True)
logger.info(f'{len(orders_df)} 件の注文記録がフィーチャーグループ {orders_feature_group.name} に取り込まれました。')
注: データがs3バケットに反映されるまで数分かかる場合があります。
ステップ 8:
botoセッションを使用して、フィーチャーグループのリストを取得し、データをクエリすることもできます。
# すべてのフィーチャーストアのリストを取得します
boto_session = boto3.Session(region_name=region)
sagemaker_client = boto_session.client(service_name='sagemaker', region_name=region)
sagemaker_client.list_feature_groups()
他の多くのフィーチャーを試したり、バルクバッチデータなどを取得するには、次のAWSドキュメントリンクを使用できます。
ステップ 9:
AWS Sagemakerのフィーチャーストアは、メタデータ情報をAWS Glueに保持します。Glueコンソールを使用してテーブルを表示できます。
ステップ 10:
結論:
この記事で、以下のことを学びました。
- フィーチャーストアの重要性
- Amazon Sagemakerでフィーチャーストアを作成し、実装する方法
- Amazon Sagemakerのフィーチャーストアにアクセスする方法
こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/gauravkankaria/creating-feature-store-for-streamlined-model-building-using-amazon-sagemaker-3k1f