Amazon Web Services ブログ

Bottlerocket on Amazon ECS の NVIDIA GPU サポートの発表

この記事は Announcing NVIDIA GPU support for Bottlerocket on Amazon ECS を翻訳したものです。

昨年、Amazon Elastic Container Service (Amazon ECS) に最適化された Bottlerocket AMI の一般提供を発表しました。Bottlerocket は、セキュリティとメンテナンス性に焦点を当てたオープンソースプロジェクトであり、コンテナベースのワークロードをホストするための信頼性と、一貫性のある Linux ディストリビューションを提供します。本日、Bottlerocket を使用して ECS NVIDIA GPU アクセラレートされたワークロードを ECS 上で実行できるようになったことを発表します。

この記事では、Bottlerocket で NVIDIA GPU ワークロードを実行するための Amazon ECS タスクを作成する方法について説明します。

なぜ Bottlerocket を使うのですか?

お客様は、ワークロードを実行するためにコンテナを採用し続けています。AWSは、お客様のコンテナ化されたアプリケーションを実行するために設計・最適化された Linux ディストリビューションの必要性を感じていました。Bottlerocket OS は、コンテナを実行するホストにセキュアな基盤を提供し、ホストをスケールするための運用上のオーバーヘッドを最小限に抑えるために構築されました。Bottlerocket は、自動化によって信頼性の高いアップデートを適用できるように設計されています。

Bottlerocket と Amazon ECS の使用開始方法の詳細については、紹介ブログ「Amazon ECS での Bottlerocket の始め方 〜 コンテナ向けのセキュアな Linux ディストリビューション」を御覧ください。

Bottlerocket と NVIDIA GPU で ECS クラスターをセットアップする

セットアップが実際にどのように行われるかを見てみましょう。 us-west-2 (オレゴン) リージョンで作業します。

前提作業

  • 適切な認証情報を持つ AWS CLI
  • 選択したリージョンのデフォルト VPC (既存の VPC も使用可能です)

まず始めに、ecs-bottlerocket という名前の ECS クラスターを作成します。

aws ecs --region us-west-2 create-cluster --cluster-name ecs-bottlerocket

起動するインスタンスには、ECS API と Systems Manager セッションマネージャー API の両方と通信するために、AWS Identity and Access Management (IAM) ロールが必要です。ここでは ecsInstanceRole という名前の IAM ロールを作成しました。このロールには、管理ポリシーである AmazonSSMManagedInstanceCoreAmazonEC2ContainerServiceforEC2Role の両方がアタッチされています。

NVIDIA GPU の利用をサポートしている Bottlerocket Amazon Machine Image (AMI) のリストは、AWS Systems Manager パラメータストアに公開されています。では、最新リリースの Bottlerocket の AMI ID を取得しましょう (AMI は x86_64aarch64 の両方のアーキテクチャで利用できます)。この記事では、x86_64 の AMI を使用します。

latest_bottlerocket_ami=$(aws ssm get-parameter --region us-west-2 \
    --name "/aws/service/bottlerocket/aws-ecs-1-nvidia/x86_64/latest/image_id" \
    --query Parameter.Value --output text)

次に、パブリック IP アドレスを割り当てるように構成されているサブネット (パブリックサブネット) のリストを取得します。

aws ec2 describe-subnets \
   --region us-west-2 \
   --filter=Name=vpc-id,Values=$vpc_id \
   --query 'Subnets[?MapPublicIpOnLaunch == `true`].SubnetId'
   
[
    "subnet-bc8993e6",
    "subnet-b55f6bfe",
    "subnet-e1e27fca",
    "subnet-21cbc058"
]

EC2 インスタンスを ECS クラスターに関連付けるには、インスタンスの作成時にいくつかの情報をインスタンス自体に設定する必要があります。ECS クラスターの詳細を含む小さな設定ファイル (userdata.toml) を、カレントディレクトリ作成しておきます。

現在サポートしている設定はこちらにあります。

cat > ./userdata.toml << 'EOF'
[settings.ecs]
cluster = "ecs-bottlerocket"
EOF

上記のサブネットのいずれかに Bottlerocket インスタンスを 1 つデプロイしてみましょう。この記事ではパブリックサブネットを選択していますが、これはデバッグが必要な時にインスタンスに接続するのを簡単にするためです。ユースケースに応じて、プライベートサブネットまたはパブリックサブネットを選択してください。

ここでは、NVIDIA Tesla V100 Tesla Core GPU が 1 つあるインスタンスタイプの p3.2xlarge を使用します。

aws ec2 run-instances \
   --subnet-id subnet-bc8993e6 \
   --image-id $latest_bottlerocket_ami \
   --instance-type p3.2xlarge \
   --region us-west-2 \
   --tag-specifications 'ResourceType=instance,Tags=[{Key=bottlerocket,Value=quickstart}]' \
   --user-data file://userdata.toml \
   --iam-instance-profile Name=ecsInstanceRole

次に、サンプルアプリケーションのタスク定義を作成しますす。

cat > ./sample-gpu.json << 'EOF'
{
  "containerDefinitions": [
    {
      "memory": 80,
      "essential": true,
      "name": "gpu",
      "image": "nvidia/cuda:11.0-base",
      "resourceRequirements": [
         {
           "type":"GPU",
           "value": "1"
         }
      ],
      "command": [
        "sh",
        "-c",
        "nvidia-smi"
      ],
      "cpu": 100,
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
           "awslogs-group": "/ecs/bottlerocket",
           "awslogs-region": "us-west-2",
           "awslogs-stream-prefix": "demo-gpu"
           }
      }
    }
  ],
  "family": "example-ecs-gpu"
}
EOF

タスク定義で、resourceRequirements パラメータを使用して 1 つの NVIDIA GPU をタスクに割り当てます。また、コンテナからのログ出力を Amazon CloudWatch に送信するための awslogs-group 設定も定義します。

ロググループの設定は次のとおりです。

  • リージョン: us-west-2
  • ロググループ名: /ecs/bottlerocket
  • ログストリームのプレフィックス: demo-gpu

上記のタスク定義で指定した CloudWatch ロググループを作成します。

aws logs create-log-group –log-group-name ‘/ecs/bottlerocket’ –region us-west-2

タスク定義を ECS に登録します。

aws ecs register-task-definition \
   --region us-west-2 \
   --cli-input-json file://sample-gpu.json

タスクを実行します。

aws ecs run-task --cluster ecs-bottlerocket \ 
   --task-definition bottlerocket-gpu:1

タスクが実行されると、コンテナ内でコマンドが実行され、利用可能な GPU 構成に関する情報をログに出力し、終了します。

ECS コンソールに移動すると、停止したタスクが表示されます。左側のメニューで [クラスター] を選択し、ecs-bottlerocket クラスターを選択して、[タスク] タブを選択します。

タスク ID をクリックし、[ログ] タブを選択します。このタブには、実行したばかりのタスクのログ出力が表示されます。

コンテナから出力されたログは、ロググループ名、ログストリーム名の両方と、タイムフレームを渡すことによってコマンドラインからも表示できます。この記事の場合は次のように指定します。

aws logs tail '/ecs/bottlerocket' / 
   --log-stream-names 'demo-gpu/gpu/7af782059c644872977da89a06023483' /
   --since 1h --format short

後片付け

この記事で作成したリソースを削除するには、次のコマンドを実行します。

aws ecs deregister-task-definition \
   --region us-west-2 \
   --task-definition bottlerocket-gpu:1
      
delete_instances=$(aws ec2 describe-instances --region us-west-2 \
   --filters "Name=tag-key,Values=bottlerocket" "Name=tag-value,Values=quickstart" \
   --query 'Reservations[].Instances[].InstanceId')  
   
for instance in $delete_instances
  do aws ec2 terminate-instances --instance-ids $instance --region us-west-2
done 

aws ecs delete-cluster \
   --region us-west-2 \
   --cluster ecs-bottlerocket

aws logs delete-log-group --log-group-name '/ecs/bottlerocket'

まとめ

この記事では、Bottlerocket 上のコンテナで GPU を利用したワークロードを迅速かつ安全に実行するために、適切な構成で ECS タスク定義を作成する方法を説明しました。また、CloudWatch でコンテナログがどのように利用できるか、コマンドラインからアクセスする方法も確認しました。Bottlerocket on ECS で実行する GPU アクセラレートされたワークロードのサンプルを追加で探す場合は、AWS Marketplace の NVIDIA NGC カタログから NVIDIA GPU 最適化コンテナを確認できます。

Bottlerocket はオープンソース (MIT または Apache 2.0 ライセンス) であり、使用、修正、拡張するための自由が文書化されていることを意味します。Bottlerocket は GitHub でオープンに開発されており、ディスカッションフォーラムでのコントリビューション、issue、フィードバックを歓迎しています。

翻訳はソリューションアーキテクトの加治が担当しました。原文はこちらです。