
AWS SageMakerを使って機械学習を行う際、データの保存や管理にAmazon S3(Simple Storage Service)を活用することは非常に重要です。このレポートでは、初心者の方でも理解できるよう、S3にデータを保存し、SageMakerとやり取りする方法について詳細に解説します。
※本ページは、AIの活用や研究に関連する原理・機器・デバイスについて学ぶために、個人的に整理・記述しているものです。内容には誤りや見落としが含まれている可能性もありますので、もしお気づきの点やご助言等ございましたら、ご連絡いただけますと幸いです。
※本ページの内容は、個人的な学習および情報整理を目的として提供しているものであり、その正確性、完全性、有用性等についていかなる保証も行いません。本ページの情報を利用したこと、または利用できなかったことによって発生した損害(直接的・間接的・特別・偶発的・結果的損害を含みますが、これらに限りません)について、当方は一切責任を負いません。ご利用は利用者ご自身の責任でお願いいたします。
S3の基本的な理解とSageMakerとの連携意義
Amazon S3は、AWS上のオブジェクトストレージサービスで、あらゆる種類のデータファイルを保存できます。機械学習においては、大量のデータセット、モデルファイル、学習結果などを安全かつ効率的に管理する必要があり、S3はその役割を担います。SageMakerは機械学習モデルの構築・トレーニング・デプロイを行うマネージドサービスですが、データをS3に保存することでデータパイプラインの効率化が図れます1。
1. S3バケットの作成方法
まずは、データを保存するためのS3バケットを作成します。
1.1 AWSマネジメントコンソールからバケットを作成する手順
- AWSマネジメントコンソールにログインします
- 「全てのサービス」からS3を選択します
- 「バケットを作成する」をクリックします
- バケット名を入力します(世界で一意である必要があります)
- リージョンは通常「アジアパシフィック(東京)」を選択します
- オプション設定はデフォルトのままでも構いません
- アクセス権限設定では「パブリックアクセスを全てブロック」を確認します
- 「バケットを作成」をクリックして完了です8
重要なのはバケット名で、SageMakerと連携する場合は名前に「sagemaker」を含めると、特別なアクセス許可設定を行わなくても済む場合があります17。
2. S3へのデータアップロード方法
S3にデータをアップロードするには複数の方法があります。
2.1. マネジメントコンソールから直接アップロード
- S3のバケット一覧から作成したバケットを選択します
- 「アップロード」ボタンをクリックします
- ファイルを選択してアップロードします
2.2. boto3ライブラリを使用したPythonからのアップロード
boto3は、PythonからAWSサービスを操作するためのライブラリです。以下はboto3を使ってS3にファイルをアップロードする例です:
pythonimport boto3
from botocore.exceptions import ClientError
# プロファイル名(AWSの認証情報を指定する場合)
profile = "default"
# アップロードするファイル
upload_file = "C:/Users/username/Desktop/data.csv"
# バケット名
bucket = "my-sagemaker-bucket"
# キー名(S3上のファイルパス)
key = "training/data/data.csv"
try:
# プロファイルを指定してセッションを作成
session = boto3.Session(profile_name=profile)
s3_client = session.client(service_name="s3")
# S3にファイルをアップロード
s3_client.upload_file(upload_file, bucket, key)
print("S3上にファイルをアップロードしました。")
except ClientError as e:
print("エラーが発生しました。")
print("エラーコード:" + e.response["Error"]["Code"])
print("エラーメッセージ:" + e.response["Error"]["Message"])
except Exception as e:
print("エラーが発生しました。")
print(e)
このコードは指定したローカルファイルをS3バケットの指定したパスにアップロードします9。
2.3. SageMaker SDKを使用したアップロード
SageMaker SDKには、S3とのやり取りを簡単にするためのユーティリティ関数が用意されています:
pythonimport sagemaker
# SageMakerセッションを作成
sagemaker_session = sagemaker.Session()
# データをS3にアップロード
# path:ローカルのデータのパス
# key_prefix:S3上のフォルダパス
inputs = sagemaker_session.upload_data(
path='data',
bucket=sagemaker_session.default_bucket(),
key_prefix='data/training'
)
# アップロード先のS3パスが返される
print('input spec (in this case, just an S3 path): {}'.format(inputs))
この方法では、upload_data
メソッドを使用して、ローカルのファイルやディレクトリを簡単にS3にアップロードできます104。
3. SageMakerからS3のデータを読み込む方法
3.1. SageMaker学習ジョブでS3データを使用する
SageMakerでトレーニングジョブを実行する際、S3上のデータを学習データとして指定できます:
pythonfrom sagemaker.tensorflow import TensorFlow
# Estimatorを作成
estimator = TensorFlow(
entry_point='train.py', # トレーニングスクリプト
py_version='py38',
framework_version='2.7.1',
instance_count=1,
instance_type='ml.m5.xlarge',
role=sagemaker.get_execution_role() # IAMロール
)
# S3上のデータを指定して学習を開始
estimator.fit({
'training': 's3://my-sagemaker-bucket/data/training',
'validation': 's3://my-sagemaker-bucket/data/validation'
})
この例では、S3上のtraining
とvalidation
というキー名で別々のデータセットを指定しています126。
3.2. 入力モードの設定
SageMakerには、S3からデータを読み込む際のモードが複数あります:
pythonfrom sagemaker.inputs import TrainingInput
# Estimatorを作成(上記と同様)
# 入力モードを指定してトレーニングを実行
estimator.fit(
inputs=TrainingInput(
s3_data="s3://my-sagemaker-bucket/data/training",
input_mode='File' # File, Pipe, FastFileから選択可能
)
)
入力モードには以下の3つがあります:
File
:S3のデータをトレーニングインスタンスにダウンロードしてから学習を開始Pipe
:S3からデータをストリーミングして学習(ダウンロード待ちなし)FastFile
:ファイルシステムとしてデータにアクセス(大規模データセット向け)62
3.3. トレーニングスクリプト内でS3データにアクセスする
SageMakerのトレーニングジョブでは、環境変数を通じてS3からダウンロードされたデータのパスにアクセスできます:
python# train.py(トレーニングスクリプト)の例
import os
import json
# 利用可能なすべてのデータチャネルを取得
channels = json.loads(os.environ.get('SM_CHANNELS'))
# 各チャネルのデータディレクトリにアクセス
for channel in channels:
input_dir = os.environ.get('SM_CHANNEL_' + channel.upper())
print(f"Channel {channel} is located at: {input_dir}")
# そのディレクトリ内のファイルを処理
for file_name in os.listdir(input_dir):
file_path = os.path.join(input_dir, file_name)
# ここでファイルを読み込み処理
このスクリプトは、SageMakerが環境変数に設定するデータのパス情報を使用してファイルにアクセスしています125。
3.4. ノートブックインスタンス内で直接S3データを読み込む
SageMakerのノートブックインスタンスから直接S3のデータを読み込むこともできます:
python# CSVファイルの場合
import pandas as pd
import boto3
# 方法1:boto3を使用する場合
s3 = boto3.client('s3')
obj = s3.get_object(Bucket='my-sagemaker-bucket', Key='data/training/data.csv')
df = pd.read_csv(obj['Body'])
# 方法2:pandas から直接S3パスを指定する場合
df = pd.read_csv('s3://my-sagemaker-bucket/data/training/data.csv')
# バイナリデータ(pickleなど)の場合
import pickle
s3 = boto3.resource('s3')
bucket = s3.Bucket('my-sagemaker-bucket')
data = pickle.loads(bucket.Object("model/model.pickle").get()['Body'].read())
ただし、pandas から直接S3パスを読み込む方法は、環境によっては動作しない場合があるので注意が必要です72013。
4. SageMakerでの学習結果をS3に保存する方法
SageMakerのトレーニングジョブでは、モデルや出力データをS3に自動的に保存することができます。
4.1. モデルの保存
トレーニングスクリプト内で、モデルを特定のディレクトリに保存すると、SageMakerが自動でそれをS3にアップロードします:
python# train.py内でのモデル保存例
import os
# 環境変数からモデル保存先ディレクトリを取得
model_dir = os.environ.get('SM_MODEL_DIR')
# モデルを保存(フレームワークによって異なる)
# TensorFlowの例
SM_MODEL_DIR
環境変数で指定されるディレクトリにモデルを保存すると、ジョブ完了時に自動的にmodel.tar.gz
として圧縮されてS3にアップロードされます12。
4.2. その他の出力データの保存
モデル以外の出力データ(評価結果、ログなど)も保存できます:
python# 出力データの保存
output_dir = os.environ.get('SM_OUTPUT_DATA_DIR')
# 出力ファイルの保存
with open(os.path.join(output_dir, 'evaluation.json'), 'w') as f:
json.dump({"accuracy": 0.95}, f)
SM_OUTPUT_DATA_DIR
に保存されたファイルは、output.tar.gz
として圧縮されてS3にアップロードされます12。
5. SageMakerとS3の連携における実践的なポイント
5.1. デフォルトバケットの活用
SageMakerセッションにはデフォルトのS3バケットがあり、特に指定しなくても使用できます:
pythonimport sagemaker
# デフォルトバケットの取得
sess = sagemaker.Session()
default_bucket = sess.default_bucket()
print(f"デフォルトバケット: {default_bucket}")
# デフォルトバケットの使用
prefix = 'my-training-job'
inputs = sess.upload_data(path='data', bucket=default_bucket, key_prefix=prefix)
デフォルトバケット名は通常sagemaker-{リージョン}-{AWSアカウントID}
の形式になります174。
5.2. データ入力モードの選択
データサイズや学習の特性に応じて、適切な入力モードを選択することが重要です:
- 小〜中規模のデータセット:
File
モード(最もシンプル) - ストリーミング処理に適したデータ:
Pipe
モード(ディスク容量を節約) - 大規模データセット:
FastFile
モード(ファイルシステムとしてマウント)
5.3. S3ファイルシステムとしてマウント
特に大量のファイルを扱う場合、S3をファイルシステムとしてマウントする方法も便利です:
python# s3fsを使用したマウント例
!pip install s3fs
import s3fs
fs = s3fs.S3FileSystem(anon=False)
# S3バケット内のファイル一覧取得
files = fs.ls('my-sagemaker-bucket/data')
print(files)
# ファイルを直接開く
with fs.open('my-sagemaker-bucket/data/sample.csv', 'rb') as f:
data = pd.read_csv(f)
この方法では、S3をローカルファイルシステムのように扱うことができます19。
6.よくあるエラーとトラブルシューティング
6.1. アクセス権限のエラー
SageMakerがS3バケットにアクセスできない場合、権限エラーが発生します。以下を確認しましょう:
- SageMakerの実行ロールがS3バケットへのアクセス権限を持っているか
- バケット名に
sagemaker
を含めるか、または明示的にアクセス権限を付与しているか
6.2. パスの問題
S3のパス指定に誤りがあると、ファイルが見つからないエラーが発生します:
- S3 URIの形式が正しいか確認(
s3://bucket-name/path/to/file
) - キー(パス)に先頭または末尾の余分なスラッシュがないか確認
6.3. データ読み込みのエラー
pandas などでS3から直接データを読み込む際にエラーが発生する場合の対処法:
python# 直接読み込みではなく、いったんメモリにダウンロードしてから読み込む
import io
import boto3
s3 = boto3.resource('s3')
obj = s3.Object('my-sagemaker-bucket', 'data/sample.csv')
body = obj.get()['Body'].read().decode('utf-8')
buffer = io.StringIO(body)
df = pd.read_csv(buffer)
この方法では、一旦メモリ上にデータをダウンロードしてからpandasで読み込みます137。
7. まとめ
AWS SageMakerとS3を連携させることで、機械学習のデータ管理をクラウド上で効率的に行うことができます。このレポートで解説した主要なポイントは以下の通りです:
- S3バケットの作成と基本的な操作方法
- 複数の方法によるS3へのデータアップロード
- SageMakerからS3データを読み込む様々な方法
- 学習結果(モデルや評価結果)のS3への保存方法
- 効率的なデータ管理のための実践的なポイント
これらの知識を活用することで、クラウド上で効率的かつスケーラブルな機械学習ワークフローを構築できるようになります。AWS SageMakerとS3の連携は、大規模なデータセットを扱う機械学習プロジェクトにおいて特に重要な役割を果たします11116。
初心者の方は、まずAWSマネジメントコンソールからS3バケットを作成し、SageMakerのデフォルトバケットとして活用することから始めるとよいでしょう。徐々にPythonコードでのS3操作に慣れていくことで、より高度なデータ管理が可能になります。
Citations:
- https://www.semanticscholar.org/paper/cfb574d7bca094932b15b68337b769e8994c6e0a
- https://sagemaker.readthedocs.io/en/stable/api/utility/inputs.html
- https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-uploading-files.html
- https://sagemaker.readthedocs.io/en/stable/session.html
- https://qiita.com/kazuneet/items/294357a2214ac733f6f1
- https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/model-access-training-data-using-pysdk.html
- https://zenn.dev/shigeru_oda/articles/eaa42d9d1cefb0d9bee7
- https://qiita.com/miriwo/items/41e488b79fb58fa7c952
- https://python-guide.work/s3-upload_file/
- https://qiita.com/okazy/items/e5b44a56cb745c75018a
- https://www.semanticscholar.org/paper/97e5c542ee4854654226b812ee4a1b0d348cba06
- https://pages.awscloud.com/rs/112-TZM-766/images/202205_AWS_Black_Belt_AIML_Dark_01_AmazonSageMakerTraining.pdf
- https://dev.classmethod.jp/articles/read-csv-file-on-s3-bucket-into-buffer-and-edit-it-with-pandas/
- https://www.ncbi.nlm.nih.gov/pmc/articles/PMC11638732/
- https://www.semanticscholar.org/paper/771f5444534440ec17589447995776eb75a2399f
- https://www.semanticscholar.org/paper/23e39c6bc159cbbeb003aa456bf1ed519f104e24
- https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-ex-bucket.html
- https://qiita.com/kennyQiita/items/c1c4b9638b49ded754d7
- https://www.youtube.com/watch?v=ab-rU8MdbI0
- https://dev.to/mariazentsova/how-to-load-data-from-s3-to-aws-sagemaker-mea
- https://www.youtube.com/watch?v=Ld2oTLY47sA
- https://docs.aws.amazon.com/ja_jp/code-library/latest/ug/python_3_s3_code_examples.html
- https://qiita.com/john-rocky/items/948f720aa21b6d169c95
- https://www.dbc-works.org/feedback/entry/2023/7/29/
- https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/debugger-built-in-rules-api.Boto3.html
- https://www.semanticscholar.org/paper/db289f307371309841786a9c0bc036984609a346
- https://www.semanticscholar.org/paper/eb3fc118dc2a0e23a26bf630c0e9248467080199
- https://www.semanticscholar.org/paper/1c8be942c9fe2f4c60a3466d18c2b3d561ba5a91
- https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/automatic-model-tuning-ex-bucket.html
- https://qiita.com/yamazombie/items/b7cf47a01f037a69de5b
- https://pages.awscloud.com/rs/112-TZM-766/images/Amazon%20SageMaker%20%E3%81%AE%E5%9F%BA%E7%A4%8E.pdf
- https://pages.awscloud.com/rs/112-TZM-766/images/20191128_Amazon%20SageMaker_Basic.pdf
- https://www.intellilink.co.jp/column/ai/2018/091300.aspx
- https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/canvas-storage-configuration.html
- https://www.youtube.com/watch?v=tgo2F2OY5bU
- https://www.semanticscholar.org/paper/52cde6254f4ce79e166b676f0c65701141ea3fec
- https://www.semanticscholar.org/paper/73d07e615f8fbd5218dcfd5a52a9347886eb9e07
- https://www.semanticscholar.org/paper/9f99579b28d418b5ecce5db6e7c6a742d34d8214
- https://www.semanticscholar.org/paper/fea778131675bd3c5e72eef627b5ec952be74060
- https://arxiv.org/pdf/2102.11793.pdf
- https://arxiv.org/pdf/2211.04630.pdf
- https://arxiv.org/pdf/2310.14687.pdf
- https://arxiv.org/pdf/2202.13189.pdf
- https://codeseterpie.com/blog/qi07lgbn07r/
- https://www.semanticscholar.org/paper/5569983d8942f81060b664491a659a8bb1f49234
- https://www.semanticscholar.org/paper/6cbea3eef960ab245a56e071811cc8a4c557a1ec
- https://www.semanticscholar.org/paper/17796cb43e0df4817d93515bd05d4be61c0385c9
- https://www.semanticscholar.org/paper/395629206dbed8f7f3767968e4cc572befe63aed
- https://www.semanticscholar.org/paper/3a4bee528a62214d1594d242fa0c19113db8d913
- http://arxiv.org/pdf/2012.08483v1.pdf
- https://arxiv.org/pdf/2111.05972.pdf
- https://arxiv.org/pdf/2111.13657.pdf
- https://arxiv.org/pdf/2012.08489.pdf
- https://arxiv.org/pdf/2002.05837.pdf
- https://arxiv.org/abs/2405.20082
- https://arxiv.org/html/2404.06744v1
- https://arxiv.org/pdf/2205.04001.pdf
- https://arxiv.org/pdf/2407.12057.pdf
- http://arxiv.org/pdf/2310.13671.pdf
- https://docs.aws.amazon.com/sagemaker/latest/dg/studio-sqlexplorer-athena-s3-quickstart.html
- https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/studio-sqlexplorer-athena-s3-quickstart.html
- https://www.youtube.com/watch?v=4D8mTJue9BE
- https://docs.aws.amazon.com/sagemaker-unified-studio/latest/userguide/lakehouse-s3-tables-integration.html
- https://www.semanticscholar.org/paper/594aae201f6fb4b570ce7577dd32f6004e4c2e87
- https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/client/upload_file.html
- https://qiita.com/is_ryo/items/e16527db5800854cd95f
- https://qiita.com/honda28/items/bf71c2b39e8ab109fda3
- https://dev.classmethod.jp/articles/boto3-s3-object-put-get/
- https://github.com/aws/sagemaker-python-sdk/issues/3356
- https://www.semanticscholar.org/paper/0849cf56cd45bfad991a4642b58336b228da72de
- https://www.semanticscholar.org/paper/66e4429e4b0a913a172f1b31ddec04904fa9fd42
- https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/incremental-training.html
- https://dev.classmethod.jp/articles/amazon-sagemaker-data-cannel/
- https://www.tdi.co.jp/miso/amazon-sagemaker-deploy
- https://repost.aws/ja/knowledge-center/sagemaker-s3-accessdenied-training
- https://zenn.dev/youichiro/articles/f4a3504358de5a
- https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/byoc-run.html
- https://zenn.dev/kmotohas/articles/7bfe313eab01ea
- https://dev.classmethod.jp/articles/amazon-sagemaker-non-coding-deploy/
- https://www.semanticscholar.org/paper/312ceb5d45b9debbdcf06f857d976309d10d79e7
- https://www.semanticscholar.org/paper/e1f98d33a391c38c6c28fae0a49ac8331f50c62d
- https://www.semanticscholar.org/paper/fc1ab0a0d8c7f24432cdd84a6f39db5c00d6e6d7
- https://www.semanticscholar.org/paper/66a60e83317bd55721356dfaaf5f5734af3ae8ba
- https://www.semanticscholar.org/paper/a5e57795e1fa2904ded67492065fa559cd432113
- https://www.semanticscholar.org/paper/e085164b4bfa294b741a5fe0613ad7634029afc8
- https://arxiv.org/pdf/2401.15463.pdf
- http://arxiv.org/pdf/2209.13705.pdf
- https://arxiv.org/abs/1912.09322
- https://arxiv.org/html/2307.01394
- https://arxiv.org/pdf/2001.09052.pdf
- https://arxiv.org/pdf/1603.05190.pdf
- https://qiita.com/paulxll/items/9290c44580ff2a69170f
- https://qiita.com/mynkit/items/68a4d472d02281d6f10c
- https://pandasquest.com/pandas%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6csv%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92s3%E3%81%AB%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/1258/
- https://stackoverflow.com/questions/37703634/how-to-import-a-text-file-on-aws-s3-into-pandas-without-writing-to-disk
- https://dev.classmethod.jp/articles/s3_beginner_console/
- https://zenn.dev/tomoshimizu/articles/7731679428b9d2
- https://aws.amazon.com/jp/s3/getting-started/
- https://qiita.com/Tasuku-Q/items/55c15133fcdf0b7cb545
- https://engineeringpython.com/aws-s3-%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF/
- https://business.ntt-east.co.jp/content/cloudsolution/column-try-43.html
※本ページは、AIの活用や研究に関連する原理・機器・デバイスについて学ぶために、個人的に整理・記述しているものです。内容には誤りや見落としが含まれている可能性もありますので、もしお気づきの点やご助言等ございましたら、ご連絡いただけますと幸いです。
※本ページの内容は、個人的な学習および情報整理を目的として提供しているものであり、その正確性、完全性、有用性等についていかなる保証も行いません。本ページの情報を利用したこと、または利用できなかったことによって発生した損害(直接的・間接的・特別・偶発的・結果的損害を含みますが、これらに限りません)について、当方は一切責任を負いません。ご利用は利用者ご自身の責任でお願いいたします。