Amazon ECS の推論ワークロードの操作 - Amazon Elastic Container Service

Amazon ECS の推論ワークロードの操作

Amazon ECS は、In Amazon EC2 f1 インスタンスをクラスターに登録できるようにすることで、機械学習の推論ワークロードをサポートします。Amazon EC2 Inf1 インスタンスは AWS Inferentia チップを利用しています。Inf1 チップは、クラウド内で高パフォーマンスと低コストの推論を提供するために、AWS によってカスタムビルドされたものです。機械学習モデルは、AWS Neuron を使用してコンテナにデプロイされます。Neuron は、コンパイラー、ランタイム、および Inferentia チップの機械学習推論パフォーマンスを最適化するプロファイリングツールで構成されるソフトウェア開発キット (SDK) です。AWS Neuron は、TensorFlow、PyTorch、MXNet などの一般的な機械学習フレームワークをサポートしています。

考慮事項

Amazon ECS で Inferentia を使用し始める前に、以下の考慮事項に注意してください。

  • クラスターには、Inf1 コンテナインスタンスと Inf1 以外のコンテナインスタンスを混在させることができます。

  • タスクの実行時またはサービスの作成時に、タスク配置制約の設定にインスタンスタイプ属性を使用して、タスクが起動されるコンテナインスタンスを指定できます。これにより、リソースを効果的に使用しながら、推論ワークロードのタスクを Inf1 インスタンスに確実に使用できます。詳細については、「Amazon ECS タスクの配置」を参照してください。

    以下の例では、default クラスター内の Inf1.xlarge コンテナインスタンスでタスクを起動しています。

    aws ecs run-task \ --cluster default \ --task-definition ecs-inference-task-def \ --placement-constraints type=memberOf,expression="attribute:ecs.instance-type == Inf1.xlarge" \ --region us-west-2
  • 現時点では、タスク定義で推論リソース要件を定義することはできません。ただし、AWS_NEURON_VISIBLE_DEVICES 環境変数を使用して、コンテナインスタンスで使用できる特定の Inferentia を使用するようにコンテナを設定できます。

  • Inf1 インスタンスごとに、Inferentia リソース要件を持つタスクを 1 つだけ配置することをお勧めします。

Amazon ECS-optimized Amazon Linux 2 (Inferentia) AMI の使用

Amazon ECS は、AWS Inferentia ドライバーと Docker 用の AWS Neuron ランタイムが事前に設定されている Inferentia ワークロードの Amazon Linux 2 に基づいて Amazon ECS 最適化 AMI を提供します。AMI これにより、Amazon ECS 上で機械学習推論ワークロードの実行が容易になります。

Amazon ECS-optimized Amazon Linux 2 (Inferentia) AMI は、Amazon EC2 Inf1 インスタンスを起動するときに使用することをお勧めします。最新の Amazon ECS-optimized Amazon Linux 2 (Inferentia) AMI は、AWS CLI で以下のコマンドを使用して取得できます。

aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2/inf/recommended

次の表に、リージョン別に現在の Amazon ECS-optimized Amazon Linux 2 (Inferentia) AMI ID を取得するためのリンクを示します。

リージョン名

リージョン

AMI ID

米国東部(バージニア北部)

us-east-1

AMI ID を表示

米国東部 (オハイオ)

us-east-2

AMI ID を表示

米国西部 (オレゴン)

us-west-2

AMI ID を表示

アジアパシフィック (ムンバイ)

ap-south-1

AMI ID を表示

アジアパシフィック (シンガポール)

ap-southeast-1

AMI ID を表示

アジアパシフィック (シドニー)

ap-southeast-2

AMI ID を表示

アジアパシフィック (東京)

ap-northeast-1

AMI ID を表示

欧州 (フランクフルト)

eu-central-1

AMI ID を表示

欧州 (アイルランド)

eu-west-1

AMI ID を表示

欧州 (パリ)

eu-west-3

AMI ID を表示

南米 (サンパウロ)

sa-east-1

AMI ID を表示

タスク定義の要件

Amazon ECS で Inferentia を操作するためのタスク定義を作成するための要件を次に示します。

  • タスク定義には、次のコンテナ定義が含まれている必要があります。

    • neuron-rtd サイドカーのコンテナです。パブリック neuron-rtd コンテナイメージは、neuron-rtd:1.0.8444.0 など、neuron-rtd:latest または特定の neuron-rtd バージョンを指定することで使用できます。リポジトリ URI を含む完全なイメージ名は 790709498068.dkr.ecr.us-west-2.amazonaws.com/neuron-rtd:latest です。

      または、独自の Neuron サイドカーコンテナイメージを構築することもできます。詳細については、GitHub の aws-neuron-sdk を参照してください。

    • 推論モデルを提供するコンテナ。たとえば、GitHub の aws-neuron-sdk を参照してください。

  • neuron-rtd サイドカーコンテナを最初に開始する必要があります。これは、コンテナの依存関係パラメータを使用して定義できます。

  • neuron-rtd サイドカーコンテナには、SYS_ADMIN および IPC_LOCK カーネル機能を追加することで、昇格した権限が必要です。これは、linuxParameters コンテナ定義パラメータを使用して行います。これらの機能は、初期化後に削除されます。

  • 2 つのコンテナには、共有ボリュームが必要です。

  • 現時点では、タスク定義で推論リソース要件を定義することはできません。ただし、AWS_NEURON_VISIBLE_DEVICES 環境変数を使用して、コンテナインスタンスで使用できる特定の Inferentia を使用するようにコンテナを設定できます。AWS Neuron ランタイムは、AWS_NEURON_VISIBLE_DEVICES 環境変数がコンテナ内で動作するように設定されていることを想定しています。コンテナは、AWS_NEURON_VISIBLE_DEVICES="ALL" を指定することで、利用可能なすべてのInferentiaデバイスを使用することをお勧めします。または、最初の 2 つの推論デバイスを使用するために、AWS_NEURON_VISIBLE_DEVICES="0,1" を指定します。指定されたデバイスは常に連続している必要があります。

次に、使用する構文を表示するタスク定義の例を示します。

{ "family": "ecs-neuron", "executionRoleArn": "${YOUR_EXECUTION_ROLE}", "containerDefinitions": [ { "entryPoint": [ "sh", "-c" ], "portMappings": [ { "hostPort": 8500, "protocol": "tcp", "containerPort": 8500 }, { "hostPort": 8501, "protocol": "tcp", "containerPort": 8501 }, { "hostPort": 0, "protocol": "tcp", "containerPort": 80 } ], "command": [ "tensorflow_model_server_neuron --port=8500 --rest_api_port=8501 --model_name=bert --model_base_path=/bert" ], "cpu": 0, "dependsOn": [ { "containerName": "neuron-rtd", "condition": "START" } ], "environment": [ { "name": "NEURON_RTD_ADDRESS", "value": "unix:/sock/neuron-rtd.sock" } ], "mountPoints": [ { "containerPath": "/sock", "sourceVolume": "sock" } ], "memoryReservation": 1000, "image": "${YOUR_IMAGE}", "essential": true, "name": "bert" }, { "entryPoint": [ "sh", "-c" ], "portMappings": [], "command": [ "neuron-rtd -g unix:/sock/neuron-rtd.sock" ], "cpu": 0, "environment": [ { "name": "AWS_NEURON_VISIBLE_DEVICES", "value": "ALL" } ], "mountPoints": [ { "containerPath": "/sock", "sourceVolume": "sock" } ], "memoryReservation": 1000, "image": "790709498068.dkr.ecr.us-east-1.amazonaws.com/neuron-rtd:latest", "essential": true, "linuxParameters": { "capabilities": { "add": [ "SYS_ADMIN", "IPC_LOCK" ] } }, "name": "neuron-rtd" } ], "volumes": [ { "name": "sock", "host": { "sourcePath": "/tmp/sock" } } ] }