独自のトレーニングコンテナの改良 - アマゾン SageMaker

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

独自のトレーニングコンテナの改良

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

ステップ 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 が機械学習コンピューティングインスタンス (この場合ノートブックインスタンス) を起動し、ML ストレージボリュームをアタッチするまでに、数分を要する場合があります。ノートブックインスタンスには、事前設定された Jupyter ノートブックサーバと一連の Anaconda ライブラリがあります。詳細については、『』を参照してください。 CreateNotebookInstance

  5. [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'

  6. ノートブックインスタンスのステータスがに変わったらInService、[Open] を選択します 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 サンプルコードをテキストファイルに貼り付けます。

      FROM tensorflow/tensorflow:2.2.0rc2-gpu-py3-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:2.2.0rc2-gpu-py3-jupyter— TensorFlow Docker ベースイメージをダウンロードします。これを、AWS 構築済みコンテナベースイメージだけでなく、コンテナを構築するために取り込む任意の Docker ベースイメージに置き換えることができます。

      • RUN pip install sagemaker-training— 互換性のあるコンテナの作成に必要な一般的な機能を備えている SageMakerTraining 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 に作成またはアップロードします。この演習では次のサンプルスクリプトを使用できます。

    import tensorflow as tf 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.evaluate(x_test, y_test)

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

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

  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 ノートブックを開きます。[New Launcher] (新しいランチャー) を選択し、conda_tensorflow_p36 フレームワークで [Notebook] (ノートブック) を選択します。

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

    SageMaker Python SDK v1
    from sagemaker.estimator import Estimator estimator = Estimator(image_name='tf-custom-container-test', role='arn:aws:iam::111122223333:role/role-name', instance_count=1, instance_type='local') estimator.fit()
    SageMaker Python SDK v2
    from sagemaker.estimator import Estimator estimator = Estimator(image_uri='tf-custom-container-test', role='arn:aws:iam::111122223333:role/role-name', instance_count=1, instance_type='local') estimator.fit()
  3. 'Put_Your_ARN_Here' 値を、ノートブックインスタンスの構成時にメモ帳ファイルにコピーした IAM ロール ARN 番号に置き換えます。ARN は次のようになります。'arn:aws:iam::111122223333:role/service-role/AmazonSageMaker-ExecutionRole-20190429T110788'

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

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

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

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

    %%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 コンソールに移動し、左側のナビゲーションペインで、[Roles] (ロール) を選択し、Notebook インスタンスに使用した iamRole を検索します。「権限」タブで「ポリシーをアタッチ」ボタンを選択し、AmazonEC2ContainerRegistryFullAccess ポリシーを検索します。ポリシーのチェックボックスをオンにして、[Attach policy] (ポリシーを添付) を選択して終了します。

  2. コンテナをプッシュしたら、 SageMaker 環境内のどこからでも Amazon ECR イメージを呼び出すことができます。その次のノートブックセルで、以下のコード例を実行します。

    Studio でこのトレーニングコンテナを使用して可視化機能を使用する場合は、 SageMaker 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 推定器を設定し、Amazon EC2 インスタンスでトレーニングジョブを開始します。byoc_image_uri

    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.p2.xlarge') # start training estimator.fit() # deploy the trained model predictor = estimator.deploy(1, instance_type)
    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.p2.xlarge') # start training estimator.fit() # deploy the trained model predictor = estimator.deploy(1, instance_type)

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

ヒント

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

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

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

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

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

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

    注記

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

ブログと導入事例

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