独自のトレーニングコンテナの適応 - Amazon SageMaker

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

独自のトレーニングコンテナの適応

独自のトレーニングモデルを実行するには、Amazon ノートブックインスタンスから Amazon SageMaker Training Toolkit を使用して Docker コンテナを構築します。 SageMaker

ステップ 1: SageMaker ノートブックインスタンスを作成する

  1. https://console.aws.amazon.com/sagemaker/ で Amazon SageMaker コンソールを開きます。

  2. 左側のナビゲーションペインで、[Notebook] (ノートブック)、[Notebook instances] (ノートブックインスタンス)、[Create notebook instance] (ノートブックインスタンスの作成) の順に選択します。

  3. [ノートブックインスタンスの作成] ページで、次の情報を入力します。

    1. [ノートブックインスタンス名] に「RunScriptNotebookInstance」と入力します。

    2. [ノートブックインスタンスタイプ] で、[ml.t2.medium] を選択します。

    3. [Permissions and encryption] (アクセス許可と暗号化) セクションで、以下の操作を行います。

      1. [IAM role] (IAM ロール) は、[Create a new role] (新しいロールの作成) を選択します。新しいウィンドウが開きます。

      2. [Create an IAM role] (IAM ロールの作成) ページで、[Specific S3 buckets] (特定の S3 バケット) を選択し、sagemaker-run-script という名前の Amazon S3 バケットを指定して、[Create role] (ロールの作成) を選択します。

        SageMaker は、 という名前の IAM ロールを作成しますAmazonSageMaker-ExecutionRole-YYYYMMDDTHHmmSS。例えば AmazonSageMaker-ExecutionRole-20190429T110788 です。実行ロールの命名規則では、ロールが作成された日時を T で区切って使用することに注意してください。

    4. [Root Access] (ルートアクセス) で、[Enable] (有効) を選択します。

    5. [Create notebook instance] (ノートブックインスタンスの作成) を選択します。

  4. [Notebook instances] (ノートブックインスタンス) ページでは [Status] (ステータス) は [Pending] (保留中) となっています。Amazon が機械学習コンピューティングインスタンスを起動 SageMaker するまでに数分かかることがあります。この場合は、ノートブックインスタンスを起動し、機械学習ストレージボリュームをアタッチします。ノートブックインスタンスには、事前設定された Jupyter ノートブックサーバーと一連の Anaconda ライブラリがあります。詳細については、「」を参照してください。 
CreateNotebookInstance

  5. 作成したノートブックの [名前] をクリックします。新しいページが開きます。

  6. [Permissions and encryption] (アクセス許可と暗号化) セクションで、[the IAM role ARN number] (IAM ロールの ARN 番号) をコピーし、メモ帳ファイルに貼り付けて、一時的に保存します。この IAM ロールの ARN 番号は、後でノートブックインスタンスでローカルトレーニング推定器を構成するために使用します。[the IAM role ARN number (IAM ロールの ARN 番号)] は、次のようになります。'arn:aws:iam::111122223333:role/service-role/AmazonSageMaker-ExecutionRole-20190429T110788'

  7. ノートブックインスタンスのステータスが に変わったらInServiceを開く JupyterLabを選択します。

ステップ 2: Dockerfile および Python トレーニングスクリプトを作成してアップロードする

  1. JupyterLab が開いたら、 のホームディレクトリに新しいフォルダを作成します JupyterLab。左上隅で、[New Folder] (新しいフォルダ) アイコンをクリックし、フォルダ名 docker_test_folder を入力します。

  2. docker_test_folder ディレクトリに Dockerfile という名前のテキストファイルを作成します。

    1. 左上隅の [New Launcher] (新しいランチャー) アイコン (+) を選択します。

    2. 右ペインの[Other] (その他) セクションで、[Text File] (テキストファイル) を選択します。

    3. 次の Dockerfile サンプルコードをテキストファイルに貼り付けます。

      #Download an open source TensorFlow Docker image FROM tensorflow/tensorflow:latest-gpu-jupyter # Install sagemaker-training toolkit that contains the common functionality necessary to create a container compatible with SageMaker and the Python SDK. RUN pip3 install sagemaker-training # Copies the training code inside the container COPY train.py /opt/ml/code/train.py # Defines train.py as script entrypoint ENV SAGEMAKER_PROGRAM train.py

      Dockerfile のスクリプトは以下のタスクを実行します。

      • FROM tensorflow/tensorflow:latest-gpu-jupyter – 最新の TensorFlow Docker ベースイメージをダウンロードします。これは、コンテナの構築に持ち込む任意の Docker ベースイメージと、 AWS ビルド済みのコンテナベースイメージに置き換えることができます。

      • RUN pip install sagemaker-training – と互換性のあるコンテナを作成するために必要な一般的な機能を含む SageMaker Training Toolkit をインストールします SageMaker。

      • COPY train.py /opt/ml/code/train.py - スクリプトを、 が期待するコンテナ内の場所にコピーします SageMaker。スクリプトは、このフォルダにある必要があります。

      • ENV SAGEMAKER_PROGRAM train.py - トレーニングスクリプト train.py をコンテナの /opt/ml/code フォルダにコピーされたエンドポイントスクリプトとして処理します。これは、独自のコンテナを構築する場合に指定する必要がある唯一の環境変数です。

    4. 左側のディレクトリナビゲーションペインでは、テキストファイル名は自動的に untitled.txt に設定されます。ファイルの名前を変更するには、ファイルを右クリックし、[Rename] (名前の変更) で、ファイル名を .txt 拡張子のない Dockerfile に変更し、Ctrl+s または Command+s を押してファイルを保存します。

  3. トレーニングスクリプト train.pydocker_test_folder にアップロードします。次のスクリプトの例を使用して、この演習用に MNIST データセットでトレーニングされた手書きの数字を読み取るモデルを作成できます。

    import tensorflow as tf import os mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=1) model_save_dir = f"{os.environ.get('SM_MODEL_DIR')}/1" model.evaluate(x_test, y_test) tf.saved_model.save(model, model_save_dir)

ステップ 3: コンテナを構築する

  1. JupyterLab ホームディレクトリで Jupyter Notebook を開きます。新しいノートブックを開くには、[新しい起動] アイコンを選択し、次に [ノートブック] セクションで conda_tensorflow2 の最新バージョンを選択します。

  2. 最初のノートブックセルで次のコマンドを実行して、docker_test_folder ディレクトリに変更します。

    cd ~/SageMaker/docker_test_folder

    これにより、次のように現在のディレクトリが返されます。

    ! pwd

    output: /home/ec2-user/SageMaker/docker_test_folder

  3. Docker コンテナを構築するには、次の Docker ビルドコマンド (最後のスペースとピリオドも含めます) を実行します。

    ! docker build -t tf-custom-container-test .

    Docker のビルドコマンドは、作成した Docker ディレクトリ (この場合は docker_test_folder) から実行する必要があります。

    注記

    Docker が Dockerfile を見つけられないという次のエラーメッセージが表示された場合は、Dockerfile の名前が正しいこと、およびそのディレクトリに保存されていることを確認してください。

    unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /home/ec2-user/SageMaker/docker/Dockerfile: no such file or directory

    docker は、現在のディレクトリ内で拡張子を付けずに、Dockerfile と名付けられたファイルを検索します。別の名前を指定した場合は、-f フラグを付けて手動でファイル名を渡すことができます。例えば、Dockerfile に Dockerfile-text.txt という名前を付けた場合、次のコマンドを実行します

    ! docker build -t tf-custom-container-test -f Dockerfile-text.txt .

ステップ 4: コンテナをテストする

  1. ノートブックインスタンスでローカルにコンテナをテストするには、Jupyter ノートブックを開きます。[新しいランチャー] を選択し、[ノートブック] セクションで conda_tensorflow2 の最新バージョンを選択します。

  2. 次のサンプルスクリプトをノートブックのコードセルに貼り付けて、 SageMaker 推定器を設定します。

    import sagemaker from sagemaker.estimator import Estimator estimator = Estimator(image_uri='tf-custom-container-test', role=sagemaker.get_execution_role(), instance_count=1, instance_type='local') estimator.fit()

    前のコード例では、セッション用にセットアップされたロールを自動的に取得するために、 sagemaker.get_execution_role()role引数に指定されています SageMaker 。ノートブックインスタンスを設定したときに使用した [IAM ロール ARN 番号] の文字列値に置き換えることもできます。ARN は次のようになります。'arn:aws:iam::111122223333:role/service-role/AmazonSageMaker-ExecutionRole-20190429T110788'

  3. コードセルを実行します。このテストでは、トレーニングの環境設定、環境変数に使用された値、データのソース、およびトレーニング中に得られた損失と正確性が出力されます。

ステップ 5: Amazon Elastic Container Registry (Amazon ECR) にコンテナをプッシュする

  1. このローカルモードテストが正常に実行されたら、Docker コンテナを Amazon ECR にプッシュし、それを使用してトレーニングジョブを実行できます。Amazon ECR の代わりにプライベート Docker レジストリを使用する場合は、「Push your training container to a private registry」を参照してください。

    ノートブックセルで次のコマンドラインを実行します。

    %%sh # Specify an algorithm name algorithm_name=tf-custom-container-test account=$(aws sts get-caller-identity --query Account --output text) # Get the region defined in the current configuration (default to us-west-2 if none defined) region=$(aws configure get region) region=${region:-us-west-2} fullname="${account}.dkr.ecr.${region}.amazonaws.com/${algorithm_name}:latest" # If the repository doesn't exist in ECR, create it. aws ecr describe-repositories --repository-names "${algorithm_name}" > /dev/null 2>&1 if [ $? -ne 0 ] then aws ecr create-repository --repository-name "${algorithm_name}" > /dev/null fi # Get the login command from ECR and execute it directly aws ecr get-login-password --region ${region}|docker login --username AWS --password-stdin ${fullname} # Build the docker image locally with the image name and then push it to ECR # with the full name. docker build -t ${algorithm_name} . docker tag ${algorithm_name} ${fullname} docker push ${fullname}
    注記

    この bash シェルスクリプトは、次のエラーメッセージに似た許可の問題が発生する可能性があります。

    "denied: User: [ARN] is not authorized to perform: ecr:InitiateLayerUpload on resource: arn:aws:ecr:us-east-1:[id]:repository/tf-custom-container-test"

    このエラーが発生した場合は、AmazonEC2ContainerRegistryFullAccess ポリシーを IAM ロールにアタッチする必要があります。IAM コンソールに移動し、左側のナビゲーションペインで、[ロール] を選択し、ノートブックインスタンスに使用した IAM ロールを検索します。アクセス許可タブで、ポリシーのアタッチ ボタンを選択し、AmazonEC2ContainerRegistryFullAccess ポリシーを検索します。ポリシーのチェックボックスをオンにして、[アクセス許可の追加] を選択して終了します。

  2. Studio ノートブックセルで次のコードを実行して、トレーニングコンテナの Amazon ECR イメージを呼び出します。

    import boto3 account_id = boto3.client('sts').get_caller_identity().get('Account') ecr_repository = 'tf-custom-container-test' tag = ':latest' region = boto3.session.Session().region_name uri_suffix = 'amazonaws.com' if region in ['cn-north-1', 'cn-northwest-1']: uri_suffix = 'amazonaws.com.cn' byoc_image_uri = '{}.dkr.ecr.{}.{}/{}'.format(account_id, region, uri_suffix, ecr_repository + tag) byoc_image_uri # This should return something like # 111122223333.dkr.ecr.us-east-2.amazonaws.com/sagemaker-byoc-test:latest
  3. 前のステップからecr_image取得した を使用して、 SageMaker 推定器オブジェクトを設定します。次のコードサンプルは、 を使用して SageMaker 推定器を設定しbyoc_image_uri、Amazon EC2 インスタンスでトレーニングジョブを開始します。

    SageMaker Python SDK v1
    import sagemaker from sagemaker import get_execution_role from sagemaker.estimator import Estimator estimator = Estimator(image_uri=byoc_image_uri, role=get_execution_role(), base_job_name='tf-custom-container-test-job', instance_count=1, instance_type='ml.g4dn.xlarge') #train your model estimator.fit()
    SageMaker Python SDK v2
    import sagemaker from sagemaker import get_execution_role from sagemaker.estimator import Estimator estimator = Estimator(image_uri=byoc_image_uri, role=get_execution_role(), base_job_name='tf-custom-container-test-job', instance_count=1, instance_type='ml.g4dn.xlarge') #train your model estimator.fit()
  4. 独自のコンテナを使用してモデルをデプロイする場合は、「Adapting Your Own Inference Container」を参照してください。 TensorFlow モデルをデプロイできる AWSフレームワークコンテナを使用することもできます。モデル例をデプロイして手書きの数字を読み取るには、前のサブステップでモデルのトレーニングに使ったのと同じノートブックに、次のスクリプトの例を入力して、デプロイに必要なイメージ URI (ユニバーサルリソース識別子) を取得し、モデルをデプロイします。

    import boto3 import sagemaker #obtain image uris from sagemaker import image_uris container = image_uris.retrieve(framework='tensorflow',region='us-west-2',version='2.11.0', image_scope='inference',instance_type='ml.g4dn.xlarge') #create the model entity, endpoint configuration and endpoint predictor = estimator.deploy(1,instance_type='ml.g4dn.xlarge',image_uri=container)

    次のコード例を使用して、MNIST データセットの手書き数字の例を使用してモデルをテストします。

    #Retrieve an example test dataset to test import numpy as np import matplotlib.pyplot as plt from keras.datasets import mnist # Load the MNIST dataset and split it into training and testing sets (x_train, y_train), (x_test, y_test) = mnist.load_data() # Select a random example from the training set example_index = np.random.randint(0, x_train.shape[0]) example_image = x_train[example_index] example_label = y_train[example_index] # Print the label and show the image print(f"Label: {example_label}") plt.imshow(example_image, cmap='gray') plt.show()

    テストの手書き数字を、テスト予測を取り込んで作成 TensorFlow できる形式に変換します。

    from sagemaker.serializers import JSONSerializer data = {"instances": example_image.tolist()} predictor.serializer=JSONSerializer() #update the predictor to use the JSONSerializer predictor.predict(data) #make the prediction

カスタムコンテナをローカルでテストし、Amazon ECR イメージにプッシュする方法を示す完全な例については、「Building Your Own TensorFlow Container example notebook」を参照してください。

ヒント

トレーニングジョブをプロファイリングおよびデバッグして、システム使用率の問題 (CPU のボトルネックや GPU の低使用率など) をモニタリングし、トレーニングの問題 (オーバーフィット、オーバートレーニング、テンソルの爆発、勾配消失など) を特定するには、Amazon SageMaker Debugger を使用します。詳細については、「カスタムトレーニングコンテナと共にデバッガーを使用する」を参照してください。

ステップ 6: リソースをクリーンアップする

入門サンプルを終了したときにリソースをクリーンアップするには
  1. SageMaker コンソールを開き、ノートブックインスタンス を選択しRunScriptNotebookInstanceアクション を選択し、停止 を選択します。インスタンスが停止するまで、数分かかる場合があります。

  2. インスタンスの [Status] (ステータス) が[Stopped] (停止) に変化したら、[Actions] (アクション)、[Delete] (削除) の順に選択し、ダイアログボックスで [Delete] (削除) を選択します。インスタンスが削除されるまで、数分かかる場合があります。ノートブックインスタンスが削除されると、テーブルには表示されなくなります。

  3. Amazon S3 コンソールを開き、モデルのアーティファクトとトレーニングデータセットを保存するために作成したバケットを削除します。

  4. IAM コンソールを開き、IAM ロールを削除します。アクセス許可ポリシーを作成した場合は、それも削除することができます。

    注記

    Docker コンテナは、実行後に自動的にシャットダウンします。削除する必要はありません。

ブログと導入事例

以下のブログでは、Amazon でのカスタムトレーニングコンテナの使用に関する導入事例について説明します SageMaker。