Amazon ECS での推論用 Inf1 インスタンスの使用 - Amazon Elastic Container Service

Amazon ECS での推論用 Inf1 インスタンスの使用

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

考慮事項

Amazon ECS での Neuron のデプロイを開始する前に、以下の点を考慮してください。

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

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

  • サービスの作成時、またはスタンドアロンタスクの実行時にタスク配置制約を設定する場合は、インスタンスタイプ属性を使用します。これにより、指定したコンテナインスタンスでタスクが起動されることを保証します。また、全体的なリソース使用率を最適化し、推論ワークロードのタスクを確実に 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"
  • Inferencia リソース要件はタスク定義で定義できません。ただし、ホストコンテナインスタンス向けに用意された、特定の Inferentia を使用するようにコンテナを設定できます。これを行うには、linuxParameters パラメータによりデバイスの詳細を指定します。詳細については、「タスク定義の要件」を参照してください。

Amazon ECS 最適化 Amazon Linux 2 (Inferentia) AMI の使用。

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

Amazon EC2 Inf1 インスタンスを起動するときは、Amazon ECSに 最適化された Amazon Linux 2(推定)AMI を使用することをお勧めします。次のコマンドを使用すると、Amazon ECS に最適化された (現在の) Amazon Linux 2 (Inferentia) AMI を、AWS CLI により取得することができます。

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

次の表は、リージョンごとに現在の Amazon ECSに 最適化された Amazon Linux 2(推定)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-east-1

AMI ID を表示

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

ap-northeast-1

AMI ID を表示

アジアパシフィック (ソウル)

ap-northeast-2

AMI ID を表示

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

ap-southeast-1

AMI ID を表示

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

ap-southeast-2

AMI ID を表示

アジアパシフィック (ジャカルタ)

ap-southeast-3

AMI ID を表示

カナダ (中部)

ca-central-1

AMI ID を表示

欧州 (フランクフルト)

eu-central-1

AMI ID を表示

ヨーロッパ (ミラノ)

eu-south-1

AMI ID を表示

欧州 (アイルランド)

eu-west-1

AMI ID を表示

欧州 (パリ)

eu-west-3

AMI ID を表示

中東 (バーレーン)

me-south-1

AMI ID を表示

南米 (サンパウロ)

sa-east-1

AMI ID を表示

AWS GovCloud (米国東部)

us-gov-east-1

AMI ID を表示

AWS GovCloud (米国西部)

us-gov-west-1

AMI ID を表示

中国 (北京)

cn-north-1

AMI ID を表示

中国 (寧夏)

cn-northwest-1

AMI ID を表示

タスク定義の要件

Amazon ECS 上に Neuron をデプロイするには、TensorFlow の推論モデルを提供するビルド済みコンテナのコンテナ定義が、タスク定義の中に含まれている必要があります。この定義は、AWS Deep Learning Containers によって提供されます。このコンテナには、AWS Neuron ランタイムと TensorFlow Serving アプリケーションが含まれています。起動時、このコンテナは Amazon S3 からモデルを取得し、保存されているモデルを使用して Neuron TensorFlow Serving を起動した後、予測リクエストのために待機します。次の例でのコンテナイメージでは、 TensorFlow 1.15 と Ubuntu 18.04 を使用しています。Neuron 用に最適化された事前構築済みの Deep Learning Containers の完全なリストは、GitHub に保持されます。詳細については、Neuron Inference Containers を参照してください。

763104351884.dkr.ecr.us-east-1.amazonaws.com/tensorflow-inference-neuron:1.15.4-neuron-py37-ubuntu18.04

または、独自の Neuron サイドカーコンテナイメージを構築することもできます。詳細については、チュートリアル: GitHub での Neuron TensorFlow Serving を参照してください。

以下は、Fargate の Linux コンテナのタスク定義で使用する構文の表示例を示します。

{ "family": "ecs-neuron", "executionRoleArn": "${YOUR_EXECUTION_ROLE}", "containerDefinitions": [ { "entryPoint": [ "/usr/local/bin/entrypoint.sh", "--port=8500", "--rest_api_port=9000", "--model_name=resnet50_neuron", "--model_base_path=s3://your-bucket-of-models/resnet50_neuron/" ], "portMappings": [ { "hostPort": 8500, "protocol": "tcp", "containerPort": 8500 }, { "hostPort": 8501, "protocol": "tcp", "containerPort": 8501 }, { "hostPort": 0, "protocol": "tcp", "containerPort": 80 } ], "linuxParameters": { "devices": [ { "containerPath": "/dev/neuron0", "hostPath": "/dev/neuron0", "permissions": [ "read", "write" ] } ], "capabilities": { "add": [ "IPC_LOCK" ] } }, "cpu": 0, "memoryReservation": 1000, "image": "763104351884.dkr.ecr.us-east-1.amazonaws.com/tensorflow-inference-neuron:1.15.4-neuron-py37-ubuntu18.04", "essential": true, "name": "resnet50" } ] }