Amazon Web Services ブログ

Amazon SageMaker Python SDK で Git 統合を利用可能

Amazon SageMaker Python SDK で Git 統合が利用可能になりました。これからはトレーニングジョブやホスティングモデルのために Git リポジトリからスクリプトをダウンロードする必要がありません。この新機能を使用すると、Python SDK でモデルをトレーニングするときに Git リポジトリに保存されているトレーニングスクリプトを直接使用できます。モデルをホスティングするときに Git リポジトリに保存されているホスティングスクリプトを使用することもできます。スクリプトは GitHub、別の Git ベースのリポジトリ、または AWS CodeCommit リポジトリでホストされています。

この記事では、Amazon SageMaker Python SDK での Git 統合の使用方法について詳しく説明します。

概要

Amazon SageMaker Python SDK を使用してモデルをトレーニングするときは、次を行うトレーニングスクリプトが必要です。

  • 入力チャネルからデータをロード
  • ハイパーパラメータを使用してトレーニングを設定
  • モデルをトレーニング
  • モデルを保存

Estimator オブジェクトを作成するときに、entry_point 引数の値としてスクリプトを指定します。

以前は、ユーザが Python SDK で Estimator または Model オブジェクトを作成したときに、entry_point 値として指定した場合は、トレーニングスクリプトがローカルファイルシステム内のパスでなければなりませんでした。Git リポジトリでスクリプトをトレーニングしていると、ローカルでダウンロードしなければならなかったため、この場所は不便でした。

複数の開発者が Git リポジトリに貢献している場合は、リポジトリに対する更新を把握し続ける必要があります。また、ローカルバージョンが古くなっている場合は、すべてのトレーニングジョブを行う前に最新バージョンを入手しなければなりません。 これにより、定期的なトレーニングジョブのスケジューリングがさらに困難になります。

Git 統合の開始により、これらの問題が解決され、その結果、利便性と生産性が著しく向上しました。

チュートリアル

Estimator または Model オブジェクトを作成するときに、git_config という名前の dict パラメータを渡して Git 統合機能を有効にします。git_config パラメータは、スクリプトを含む Git リポジトリの場所とそのリポジトリにアクセスするための認証に関する情報を提供します。

Git リポジトリを見つける

スクリプトを含むリポジトリを見つけるには、git_configrepobranch、および commit フィールドを使用します。repo フィールドは必須で、他の 2 つのフィールドは省略可能です。 repo フィールドのみを指定した場合は、デフォルトで master 分岐の最新コミットが使用されます。

git_config = {'repo': 'your-git-repo-url'}

分岐を指定するには、repo フィールドと branch フィールドの両方を使用してください。そのブランチの最新コミットがデフォルトで使用されます。

git_config = {'repo': 'your-git-repo-url', 'branch': 'your-branch'}

リポジトリ内にある特定ブランチのコミットを指定するには、git_config の 3 つのフィールドすべてを使用します。

git_config = {'repo': 'your-git-repo-url',
              'branch': 'your-branch',
              'commit': 'a-commit-sha-under-this-branch'}

repo フィールドと commit フィールドのみが指定されている場合は、コミットが master ブランチの下にあり、コミットが使用されているときに機能します。ただし、コミットが master ブランチの下にない場合は、リポジトリが見つかりません。

git_config = {'repo': 'your-git-repo-url', 'commit': 'a-commit-sha-under-master'}

Git リポジトリにアクセス

Git リポジトリが非公開の場合 (すべての CodeCommit リポジトリが非公開の場合)、アクセスするには認証情報が必要です。

CodeCommit リポジトリの場合は、最初に認証方法を設定したことを確認してください。詳細については、AWS CodeCommit の設定を参照してください。このトピックでは、次の認証方法を一覧表示しています。

SSH URL の認証情報

SSH URL の場合は、SSH キーペアを設定する必要があります。これは GitHub、CodeCommit、およびその他の Git ベースリポジトリに適用されます。

SSH キーペアに SSH キーパスフレーズを設定しないでください。その場合、リポジトリへのアクセスに失敗します。

SSH キーペアが設定された後、追加の認証情報なしで Git 統合と SSH URL が連携します。

# GitHub リポジトリの場合
git_config = {'repo': 'git@github.com:your-git-account/your-git-repo.git'}

# CodeCommit リポジトリの場合
git_config = {'repo': 'ssh://git-codecommit.us-west-2.amazonaws.com/v1/repos/your-repo/'}

HTTPS URL の認証情報

HTTPS URL の場合、認証を処理する方法は 2 つあります。

  • ローカルに設定します。
  • git_config2FA_enabledusernamepassword、および token という追加のフィールドを指定して設定します。CodeCommit、GitHub、その他の Git ベースリポジトリでは、状況が少し異なる場合があります。

Git 認証情報を使用した認証

Git の認証情報で認証した場合は、次のいずれかを実行できます。

  1. git_config に資格情報を入力します。
    git_config = {'repo': 'https://git-codecommit.us-west-2.amazonaws.com/v1/repos/your-repo/',
                  'username': 'your-username',
                  'password': 'your-password'}
  2. 認証情報をローカルの認証情報ストレージに保存します。通常、認証情報は AWS CLI で指定された後に自動的に保存されます。たとえば、macOS はキーチェーンアクセスに資格情報を保存します。

Git の認証情報をローカルに保存した場合は、認証情報を指定せずに git_config パラメータを指定して、スクリプトに非表示にすることができます。

git_config = {'repo': 'https://git-codecommit.us-west-2.amazonaws.com/v1/repos/your-repo/'}

AWS CLI 認証情報ヘルパーを使用した認証

前述の設定ドキュメントに従って AWS CLI 認証情報ヘルパーを設定する場合は、認証情報を入力する必要がありません。

GitHub およびその他の Git ベースリポジトリの場合、アカウントで 2 要素認証 (2FA) が有効になっているかどうかを確認してください。(認証はデフォルトで無効になっているため、手動で有効にする必要があります。) 詳細については、2 要素認証 (2FA) を使用してアカウントを保護するを参照してください。

お使いのアカウントで 2FA が有効になっている場合は、git_config を指定するときに 2FA_enabled を選択して、True に設定します。それ以外の場合は、False に設定してください。2FA_enabled が指定されていない場合、デフォルトでは False に設定されています。通常、GitHub や他の Git ベースリポジトリの認証には、ユーザー名 + パスワードまたは個人用アクセストークンのいずれかを使用できます。ただし、2FA が有効になっている場合は、個人用アクセストークンしか使用できません。

認証にユーザー名 + パスワードを使用する方法:

git_config = {'repo': 'https://github.com/your-account/your-private-repo.git',
              'username': 'your-username',
              'password': 'your-password'}

繰り返しますが、スクリプトに表示されないように、認証情報をローカルの認証情報ストレージに保存することができます。

認証に個人用アクセストークンを使用する方法:

git_config = {'repo': 'https://github.com/your-account/your-private-repo.git',
              'token': 'your-token'}

Git 統合を使用して Estimator または Model を作成

git_config を正しく指定したら、Git 統合を有効にするために Estimator または Model オブジェクトを作成するときに、パラメータとして渡します。次に、entry_pointsource_dir、および dependencies がすべて Git リポジトリの相対パスになるようにします。

source_dir が指定されている場合、entry_point はソースディレクトリからの相対パスにする必要があります。Git 統合についてもまた同じです。

 

たとえば、ブランチ「training-scripts」の下にある「amazon-sagemaker-examples」の Git リポジトリの次の構造では、

amazon-sagemaker-examples 
   |
   |-------------char-rnn-tensorflow
   |                          |----------train.py
   |                          |----------utils.py
   |                          |----------other files
   |
   |-------------pytorch-rnn-scripts
   |-------------.gitignore
   |-------------README.md

次のように Estimator オブジェクトを作成できます。

git_config = {'repo': 'https://github.com/awslabs/amazon-sagemaker-examples.git', 'branch': 'training-scripts'}

estimator = TensorFlow(entry_point='train.py',
                       source_dir='char-rnn-tensorflow',
                       git_config=git_config,
                       train_instance_type=train_instance_type,
                       train_instance_count=1,
                       role=sagemaker.get_execution_role(), # このノートブックで使用している AWS ロールをコンテナに渡します
                       framework_version='1.13',
                       py_version='py3',
                       script_mode=True)

この例では、source_dir 'char-rnn-tensorflow' は Git リポジトリ内の相対パスですが、entry_point 'train.py' は ‘char-rnn-tensorflow’ の下の相対パスです。

Git 統合の例

それでは、Git 統合を使用した完全な例を見てみましょう。この例では、PyTorch の例に基づいて、言語モデリングタスクに関する多層 LSTM RNN モデルをトレーニングします。デフォルトでは、トレーニングスクリプトが Wikitext-2 データセットを使用します。SageMaker でモデルをトレーニングし、デプロイしてから、デプロイ済みのモデルを使用して新しいテキストを生成します。

「!」で始まる bash コマンドを除いて、Python スクリプトでコマンドを実行します。

まず、設定を行いましょう。

import sagemaker
 sagemaker_session = sagemaker.Session()
 bucket = sagemaker_session.default_bucket()
 prefix = 'sagemaker/DEMO-pytorch-rnn-lstm'
 role = sagemaker.get_execution_role()

次にデータセットを取得します。このデータはウィキペディアからのもので、CC-BY-SA-3.0 のライセンスを得ています。この例以外の目的でこのデータを使用する前に、https://creativecommons.org/licenses/by-sa/3.0/ に記載されているデータライセンスを理解しておく必要があります。

!wget http://research.metamind.io.s3.amazonaws.com/wikitext/wikitext-2-raw-v1.zip
 !unzip -n wikitext-2-raw-v1.zip
 !cd wikitext-2-raw
 !mv wiki.test.raw test && mv wiki.train.raw train && mv wiki.valid.raw valid

S3 にデータセットをアップロード:

inputs = sagemaker_session.upload_data(path='wikitext-2-raw', bucket=bucket, key_prefix=prefix)

git_config を指定し、それを使って Estimator を作成します。

from sagemaker.pytorch import PyTorch

git_config = {'repo': 'https://github.com/awslabs/amazon-sagemaker-examples.git', 'branch': 'training-scripts'}

estimator = PyTorch(entry_point='train.py',
                     role=role,
                     framework_version='1.1.0',
                     train_instance_count=1,
                     train_instance_type='ml.c4.xlarge',
                     source_dir='pytorch-rnn-scripts',
                     git_config=git_config,
                     hyperparameters={
                         'epochs': 6,
                         'tied': True
                     })

モードをトレーニング:

estimator.fit({'training': inputs})

次にモデルをホストしましょう。 model_fninput_fnoutput_fnpredict_fn のホスティング関数を別々のファイル「generate.py」でカスタムに実装します。これは同じ Git リポジトリにあります。 PyTorch モデルはデフォルトで npy シリアライザーとデシリアライザーを使います。この例では、すべてのホスティング関数がカスタムに実装されているため、代わりに JSON を使用する計画を立てています。JSON をシリアライズおよびデシリアライズできる予測子が必要です。

from sagemaker.predictor import RealTimePredictor, json_serializer, json_deserializer

 class JSONPredictor(RealTimePredictor):
     def __init__(self, endpoint_name, sagemaker_session):
         super(JSONPredictor, self).__init__(endpoint_name, sagemaker_session, json_serializer, json_deserializer)

Model オブジェクトを作成します。

from sagemaker.pytorch import PyTorchModel

training_job_name = estimator.latest_training_job.name
desc = sagemaker_session.sagemaker_client.describe_training_job(TrainingJobName=training_job_name)
trained_model_location = desc['ModelArtifacts']['S3ModelArtifacts']
model = PyTorchModel(model_data=trained_model_location,
                      role=role,
                      framework_version='1.0.0',
                      entry_point='generate.py',
                      source_dir='pytorch-rnn-scripts',
                      git_config=git_config,
                      predictor_cls=JSONPredictor)

ホスティングエンドポイントを作成します。

predictor = model.deploy(initial_instance_count=1, instance_type='ml.m4.xlarge')

今度は、デプロイしたモデルを使用して、ランダムなシード、温度 (より高い多様性)、および取得したい単語数を指定してテキストを生成します。

input = {
     'seed': 111,
     'temperature': 2.0,
     'words': 100
 }
 response = predictor.predict(input)
 print(response)

次の結果が表示されました:

acids west 'igan 1232 keratinous Andrews argue cancel mauling even incorporating Jewish
centimetres Fang Andres cyclic logjams filth nullity Homarinus pilaris Emperors whoops punts
followed Reichsgau envisaged Invisible alcohols are osteoarthritis twilight Alexandre Odes Bucanero Genesis
crimson Hutchison genus Brighton 1532 0226284301 Harikatha p Assault Vaisnava plantie 1829
Totals established outcast hurricane herbs revel Lebens Metoposaurids Pajaka initialize frond discarding
walking Unusually Ľubomír Springboks reviewing leucocythemia blistered kinder Nowels arriving 1350 Weymouth
Saigon cantonments genealogy alleging Upright typists termini doodle conducts parallelisms cypresses consults
others estate cover passioned recognition channelled breathed straighter Visibly dug blanche motels
Barremian quickness constrictor reservist 

使い終わったら、最後にエンドポイントを削除します。

sagemaker_session.delete_endpoint(predictor.endpoint)

結論

この記事では、Amazon SageMaker Python SDK での Git 統合の使用方法について説明しました。Git 統合により、これからはトレーニングジョブやホスティングモデルのために Git リポジトリからスクリプトをダウンロードする必要がなくなりました。Estimator または Model オブジェクトを作成するときに追加のパラメータ git_config を渡すだけで、Git リポジトリで直接スクリプトを使用できるようになりました。

ご質問またはご提案などについては、コメントを残してください。


著者について

Yue Tu は、夏のインターンシップの間に AWS SageMaker ML フレームワークチームに参加しています。彼は、インターンシップ期間中 SageMaker Python SDK の Git 統合に取り組んでいます。仕事以外ではバスケットボールが好きで、彼の好きなバスケットボールチームはゴールデンステートウォリアーズとデュークバスケットボールチームです。彼はしばらく前から、何も気にせずにいるのが好きです。

 

 

Chuyang Deng は、AWS SageMaker ML フレームワークチームのソフトウェア開発エンジニアです。彼女は一人でレゴを楽しむのが好きです。