AWS SageMakerとS3を連携した機械学習データ管理の完全ガイド

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マネジメントコンソールからバケットを作成する手順

  1. AWSマネジメントコンソールにログインします
  2. 「全てのサービス」からS3を選択します
  3. 「バケットを作成する」をクリックします
  4. バケット名を入力します(世界で一意である必要があります)
  5. リージョンは通常「アジアパシフィック(東京)」を選択します
  6. オプション設定はデフォルトのままでも構いません
  7. アクセス権限設定では「パブリックアクセスを全てブロック」を確認します
  8. 「バケットを作成」をクリックして完了です8

重要なのはバケット名で、SageMakerと連携する場合は名前に「sagemaker」を含めると、特別なアクセス許可設定を行わなくても済む場合があります17

2. S3へのデータアップロード方法

S3にデータをアップロードするには複数の方法があります。

2.1. マネジメントコンソールから直接アップロード

  1. S3のバケット一覧から作成したバケットを選択します
  2. 「アップロード」ボタンをクリックします
  3. ファイルを選択してアップロードします

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上のtrainingvalidationというキー名で別々のデータセットを指定しています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を連携させることで、機械学習のデータ管理をクラウド上で効率的に行うことができます。このレポートで解説した主要なポイントは以下の通りです:

  1. S3バケットの作成と基本的な操作方法
  2. 複数の方法によるS3へのデータアップロード
  3. SageMakerからS3データを読み込む様々な方法
  4. 学習結果(モデルや評価結果)のS3への保存方法
  5. 効率的なデータ管理のための実践的なポイント

これらの知識を活用することで、クラウド上で効率的かつスケーラブルな機械学習ワークフローを構築できるようになります。AWS SageMakerとS3の連携は、大規模なデータセットを扱う機械学習プロジェクトにおいて特に重要な役割を果たします11116

初心者の方は、まずAWSマネジメントコンソールからS3バケットを作成し、SageMakerのデフォルトバケットとして活用することから始めるとよいでしょう。徐々にPythonコードでのS3操作に慣れていくことで、より高度なデータ管理が可能になります。

Citations:

  1. https://www.semanticscholar.org/paper/cfb574d7bca094932b15b68337b769e8994c6e0a
  2. https://sagemaker.readthedocs.io/en/stable/api/utility/inputs.html
  3. https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-uploading-files.html
  4. https://sagemaker.readthedocs.io/en/stable/session.html
  5. https://qiita.com/kazuneet/items/294357a2214ac733f6f1
  6. https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/model-access-training-data-using-pysdk.html
  7. https://zenn.dev/shigeru_oda/articles/eaa42d9d1cefb0d9bee7
  8. https://qiita.com/miriwo/items/41e488b79fb58fa7c952
  9. https://python-guide.work/s3-upload_file/
  10. https://qiita.com/okazy/items/e5b44a56cb745c75018a
  11. https://www.semanticscholar.org/paper/97e5c542ee4854654226b812ee4a1b0d348cba06
  12. https://pages.awscloud.com/rs/112-TZM-766/images/202205_AWS_Black_Belt_AIML_Dark_01_AmazonSageMakerTraining.pdf
  13. https://dev.classmethod.jp/articles/read-csv-file-on-s3-bucket-into-buffer-and-edit-it-with-pandas/
  14. https://www.ncbi.nlm.nih.gov/pmc/articles/PMC11638732/
  15. https://www.semanticscholar.org/paper/771f5444534440ec17589447995776eb75a2399f
  16. https://www.semanticscholar.org/paper/23e39c6bc159cbbeb003aa456bf1ed519f104e24
  17. https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-ex-bucket.html
  18. https://qiita.com/kennyQiita/items/c1c4b9638b49ded754d7
  19. https://www.youtube.com/watch?v=ab-rU8MdbI0
  20. https://dev.to/mariazentsova/how-to-load-data-from-s3-to-aws-sagemaker-mea
  21. https://www.youtube.com/watch?v=Ld2oTLY47sA
  22. https://docs.aws.amazon.com/ja_jp/code-library/latest/ug/python_3_s3_code_examples.html
  23. https://qiita.com/john-rocky/items/948f720aa21b6d169c95
  24. https://www.dbc-works.org/feedback/entry/2023/7/29/
  25. https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/debugger-built-in-rules-api.Boto3.html
  26. https://www.semanticscholar.org/paper/db289f307371309841786a9c0bc036984609a346
  27. https://www.semanticscholar.org/paper/eb3fc118dc2a0e23a26bf630c0e9248467080199
  28. https://www.semanticscholar.org/paper/1c8be942c9fe2f4c60a3466d18c2b3d561ba5a91
  29. https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/automatic-model-tuning-ex-bucket.html
  30. https://qiita.com/yamazombie/items/b7cf47a01f037a69de5b
  31. https://pages.awscloud.com/rs/112-TZM-766/images/Amazon%20SageMaker%20%E3%81%AE%E5%9F%BA%E7%A4%8E.pdf
  32. https://pages.awscloud.com/rs/112-TZM-766/images/20191128_Amazon%20SageMaker_Basic.pdf
  33. https://www.intellilink.co.jp/column/ai/2018/091300.aspx
  34. https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/canvas-storage-configuration.html
  35. https://www.youtube.com/watch?v=tgo2F2OY5bU
  36. https://www.semanticscholar.org/paper/52cde6254f4ce79e166b676f0c65701141ea3fec
  37. https://www.semanticscholar.org/paper/73d07e615f8fbd5218dcfd5a52a9347886eb9e07
  38. https://www.semanticscholar.org/paper/9f99579b28d418b5ecce5db6e7c6a742d34d8214
  39. https://www.semanticscholar.org/paper/fea778131675bd3c5e72eef627b5ec952be74060
  40. https://arxiv.org/pdf/2102.11793.pdf
  41. https://arxiv.org/pdf/2211.04630.pdf
  42. https://arxiv.org/pdf/2310.14687.pdf
  43. https://arxiv.org/pdf/2202.13189.pdf
  44. https://codeseterpie.com/blog/qi07lgbn07r/
  45. https://www.semanticscholar.org/paper/5569983d8942f81060b664491a659a8bb1f49234
  46. https://www.semanticscholar.org/paper/6cbea3eef960ab245a56e071811cc8a4c557a1ec
  47. https://www.semanticscholar.org/paper/17796cb43e0df4817d93515bd05d4be61c0385c9
  48. https://www.semanticscholar.org/paper/395629206dbed8f7f3767968e4cc572befe63aed
  49. https://www.semanticscholar.org/paper/3a4bee528a62214d1594d242fa0c19113db8d913
  50. http://arxiv.org/pdf/2012.08483v1.pdf
  51. https://arxiv.org/pdf/2111.05972.pdf
  52. https://arxiv.org/pdf/2111.13657.pdf
  53. https://arxiv.org/pdf/2012.08489.pdf
  54. https://arxiv.org/pdf/2002.05837.pdf
  55. https://arxiv.org/abs/2405.20082
  56. https://arxiv.org/html/2404.06744v1
  57. https://arxiv.org/pdf/2205.04001.pdf
  58. https://arxiv.org/pdf/2407.12057.pdf
  59. http://arxiv.org/pdf/2310.13671.pdf
  60. https://docs.aws.amazon.com/sagemaker/latest/dg/studio-sqlexplorer-athena-s3-quickstart.html
  61. https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/studio-sqlexplorer-athena-s3-quickstart.html
  62. https://www.youtube.com/watch?v=4D8mTJue9BE
  63. https://docs.aws.amazon.com/sagemaker-unified-studio/latest/userguide/lakehouse-s3-tables-integration.html
  64. https://www.semanticscholar.org/paper/594aae201f6fb4b570ce7577dd32f6004e4c2e87
  65. https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/client/upload_file.html
  66. https://qiita.com/is_ryo/items/e16527db5800854cd95f
  67. https://qiita.com/honda28/items/bf71c2b39e8ab109fda3
  68. https://dev.classmethod.jp/articles/boto3-s3-object-put-get/
  69. https://github.com/aws/sagemaker-python-sdk/issues/3356
  70. https://www.semanticscholar.org/paper/0849cf56cd45bfad991a4642b58336b228da72de
  71. https://www.semanticscholar.org/paper/66e4429e4b0a913a172f1b31ddec04904fa9fd42
  72. https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/incremental-training.html
  73. https://dev.classmethod.jp/articles/amazon-sagemaker-data-cannel/
  74. https://www.tdi.co.jp/miso/amazon-sagemaker-deploy
  75. https://repost.aws/ja/knowledge-center/sagemaker-s3-accessdenied-training
  76. https://zenn.dev/youichiro/articles/f4a3504358de5a
  77. https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/byoc-run.html
  78. https://zenn.dev/kmotohas/articles/7bfe313eab01ea
  79. https://dev.classmethod.jp/articles/amazon-sagemaker-non-coding-deploy/
  80. https://www.semanticscholar.org/paper/312ceb5d45b9debbdcf06f857d976309d10d79e7
  81. https://www.semanticscholar.org/paper/e1f98d33a391c38c6c28fae0a49ac8331f50c62d
  82. https://www.semanticscholar.org/paper/fc1ab0a0d8c7f24432cdd84a6f39db5c00d6e6d7
  83. https://www.semanticscholar.org/paper/66a60e83317bd55721356dfaaf5f5734af3ae8ba
  84. https://www.semanticscholar.org/paper/a5e57795e1fa2904ded67492065fa559cd432113
  85. https://www.semanticscholar.org/paper/e085164b4bfa294b741a5fe0613ad7634029afc8
  86. https://arxiv.org/pdf/2401.15463.pdf
  87. http://arxiv.org/pdf/2209.13705.pdf
  88. https://arxiv.org/abs/1912.09322
  89. https://arxiv.org/html/2307.01394
  90. https://arxiv.org/pdf/2001.09052.pdf
  91. https://arxiv.org/pdf/1603.05190.pdf
  92. https://qiita.com/paulxll/items/9290c44580ff2a69170f
  93. https://qiita.com/mynkit/items/68a4d472d02281d6f10c
  94. 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/
  95. https://stackoverflow.com/questions/37703634/how-to-import-a-text-file-on-aws-s3-into-pandas-without-writing-to-disk
  96. https://dev.classmethod.jp/articles/s3_beginner_console/
  97. https://zenn.dev/tomoshimizu/articles/7731679428b9d2
  98. https://aws.amazon.com/jp/s3/getting-started/
  99. https://qiita.com/Tasuku-Q/items/55c15133fcdf0b7cb545
  100. 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/
  101. https://business.ntt-east.co.jp/content/cloudsolution/column-try-43.html

※本ページは、AIの活用や研究に関連する原理・機器・デバイスについて学ぶために、個人的に整理・記述しているものです。内容には誤りや見落としが含まれている可能性もありますので、もしお気づきの点やご助言等ございましたら、ご連絡いただけますと幸いです。

※本ページの内容は、個人的な学習および情報整理を目的として提供しているものであり、その正確性、完全性、有用性等についていかなる保証も行いません。本ページの情報を利用したこと、または利用できなかったことによって発生した損害(直接的・間接的・特別・偶発的・結果的損害を含みますが、これらに限りません)について、当方は一切責任を負いません。ご利用は利用者ご自身の責任でお願いいたします。

おすすめの記事