Amazon ECS での動画トランスコーディングの使用 - Amazon Elastic Container Service

Amazon ECS での動画トランスコーディングの使用

Amazon ECS で動画トランスコーディングワークロードを使用するには、Amazon EC2 VT1 インスタンスを登録します。これらのインスタンスを登録した後は、事前レンダリングされたライブ動画のトランスコーディングワークロードを、Amazon ECS タスクとして実行できます。Amazon EC2 VT1 インスタンスは、Xilinx U30 メディアトランスコーディングカードを使用して、事前レンダリングされたライブ動画のトランスコーディングワークロードを高速化します。

注記

Amazon ECS 以外のコンテナで動画トランスコーディングワークロードを実行する方法については、Xilinx のドキュメントを参照してください。

考慮事項

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

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

  • アクセラレータ付きの AVC (H.264) および HEVC (H.265) コーデックを備えた、Xilinx U30 メディアトランスコーディングカードを使用する Linux アプリケーションが必要です。

    重要

    他のコーデックを使用するアプリケーションでは、VT1 インスタンスのパフォーマンスが強化されていない場合があります。

  • U30 カードでは、トランスコーディングタスクを 1 つのみ実行できます。各カードには、2 つのデバイスが関連付けられています。VT1 インスタンスごとに、使用しているカードの数だけのトランスコーディングタスクを実行できます。

  • サービスの作成時、またはスタンドアロンタスクの実行時に、インスタンスタイプ属性を使用してタスク配置制約を設定することができます。これにより、指定したコンテナインスタンスでタスクが起動されることを保証します。また、リソースを効果的に使用し、動画トランスコーディングワークロードのタスクが VT1 インスタンスに配置されるようにすることができます。詳細については、「Amazon ECS タスクの配置」を参照してください。

    次の例では、タスクがdefault クラスターの vt1.3xlarge インスタンス上で実行されます。

    aws ecs run-task \ --cluster default \ --task-definition vt1-3xlarge-xffmpeg-processor \ --placement-constraints type=memberOf,expression="attribute:ecs.instance-type == vt1.3xlarge"
  • ホストコンテナインスタンス向けに用意された、特定の U30 カードを使用するようにコンテナを設定します。これを行うには、linuxParameters パラメータによりデバイスの詳細を指定します。詳細については、「タスク定義の要件」を参照してください。

VT1 AMI の使用

Amazon ECS コンテナインスタンス用 Amazon EC2 上で AMI を実行するには、2 つのオプションがあります。1 番目のオプションは、AWS Marketplace にある Xilinx 公式 AMI を使用することです。2 番目のオプションは、サンプルのリポジトリを利用して、独自の AMI を構築することです。

  • Xilinx は、AWS Marketplace に AMI を提供しています

  • Amazon ECS は、動画トランスコーディングワークロード用の AMI を構築するために使用できる、サンプルのリポジトリを提供しています。この AMI には Xilinx U30 ドライバー備わります。GitHub では、Packer スクリプトを含むリポジトリを入手することができます Packer の詳細については、「Packer documentation」(Packer ドキュメント) を参照してください。

タスク定義の要件

Amazon ECS で動画トランスコーディングコンテナを実行するには、アクセラレータ付きの H.264/AVC および H.265/HEVC コーデックを使用する動画トランスコーディングアプリケーションが、タスク定義に含まれている必要があります。Xilinx GitHub の手順に従うことで、コンテナイメージを構築できます。

VT1 インスタンスタイプファミリの場合に限り、タスク定義は、そのインスタンスタイプ特有にする必要があります。これらのインスタンスタイプは、3xlarge、6xlarge、および 24xlarge です。コンテナでは、ホストコンテナインスタンス向けに用意された、特定の Xilinx U30 デバイスの使用を設定する必要があります。これは、linuxParameters パラメータを使用して設定します。次の表に、各インスタンスタイプに固有のカードとデバイス SoC の詳細を示します。

インスタンスタイプ vCPUs RAM (GiB) U30 アクセラレータカード アドレス可能な XCU30 SoC デバイス デバイスへのパス
vt1.3xlarge 12 24 1 2 /dev/dri/renderD128,/dev/dri/renderD129
vt1.6xlarge 24 48 2 4 /dev/dri/renderD128,/dev/dri/renderD129,/dev/dri/renderD130,/dev/dri/renderD131
vt1.24xlarge 96 182 8 16 /dev/dri/renderD128,/dev/dri/renderD129,/dev/dri/renderD130,/dev/dri/renderD131,/dev/dri/renderD132,/dev/dri/renderD133,/dev/dri/renderD134,/dev/dri/renderD135,/dev/dri/renderD136,/dev/dri/renderD137,/dev/dri/renderD138,/dev/dri/renderD139,/dev/dri/renderD140,/dev/dri/renderD141,/dev/dri/renderD142,/dev/dri/renderD143
重要

タスク定義に EC2 インスタンスにないデバイスがリストされている場合、タスクの実行は失敗します。タスクが失敗した場合は、stoppedReason にエラーメッセージ CannotStartContainerError: Error response from daemon: error gathering device information while adding custom device "/dev/dri/renderD130": no such file or directory が表示されます。

次の例に、Amazon EC2 の Linux コンテナのタスク定義に使用される構文を示します。このタスク定義は、「Xilinx documentation」(Xilinx のドキュメント) で説明されている手順により構築されるコンテナイメージ用です。この例を使用する場合は、image を独自のイメージで置き換え、/home/ec2-user ディレクトリにあるインスタンスにビデオファイルをコピーします。

vt1.3xlarge
  1. vt1-3xlarge-ffmpeg-linux.json と言う名前で、以下の内容が記述されたテキストファイルを作成します。

    { "family": "vt1-3xlarge-xffmpeg-processor", "requiresCompatibilities": ["EC2"], "placementConstraints": [ { "type": "memberOf", "expression": "attribute:ecs.os-type == linux" }, { "type": "memberOf", "expression": "attribute:ecs.instance-type == vt1.3xlarge" } ], "containerDefinitions": [ { "entryPoint": [ "/bin/bash", "-c" ], "command": [ "/video/ecs_ffmpeg_wrapper.sh" ], "linuxParameters": { "devices": [ { "containerPath": "/dev/dri/renderD128", "hostPath": "/dev/dri/renderD128", "permissions": [ "read", "write" ] }, { "containerPath": "/dev/dri/renderD129", "hostPath": "/dev/dri/renderD129", "permissions": [ "read", "write" ] } ] }, "mountPoints": [ { "containerPath": "/video", "sourceVolume": "video_file" } ], "cpu": 0, "memory": 12000, "image": "0123456789012.dkr.ecr.us-west-2.amazonaws.com/aws/xilinx-xffmpeg", "essential": true, "name": "xilinix-xffmpeg" } ], "volumes": [ { "name": "video_file", "host": { "sourcePath": "/home/ec2-user" } } ] }
  2. タスク定義を登録します。

    aws ecs register-task-definition --family vt1-3xlarge-xffmpeg-processor --cli-input-json file://vt1-3xlarge-xffmpeg-linux.json --region us-east-1
vt1.6xlarge
  1. vt1-6xlarge-ffmpeg-linux.json と言う名前で、以下の内容が記述されたテキストファイルを作成します。

    { "family": "vt1-6xlarge-xffmpeg-processor", "requiresCompatibilities": ["EC2"], "placementConstraints": [ { "type": "memberOf", "expression": "attribute:ecs.os-type == linux" }, { "type": "memberOf", "expression": "attribute:ecs.instance-type == vt1.6xlarge" } ], "containerDefinitions": [ { "entryPoint": [ "/bin/bash", "-c" ], "command": [ "/video/ecs_ffmpeg_wrapper.sh" ], "linuxParameters": { "devices": [ { "containerPath": "/dev/dri/renderD128", "hostPath": "/dev/dri/renderD128", "permissions": [ "read", "write" ] }, { "containerPath": "/dev/dri/renderD129", "hostPath": "/dev/dri/renderD129", "permissions": [ "read", "write" ] }, { "containerPath": "/dev/dri/renderD130", "hostPath": "/dev/dri/renderD130", "permissions": [ "read", "write" ] }, { "containerPath": "/dev/dri/renderD131", "hostPath": "/dev/dri/renderD131", "permissions": [ "read", "write" ] } ] }, "mountPoints": [ { "containerPath": "/video", "sourceVolume": "video_file" } ], "cpu": 0, "memory": 12000, "image": "0123456789012.dkr.ecr.us-west-2.amazonaws.com/aws/xilinx-xffmpeg", "essential": true, "name": "xilinix-xffmpeg" } ], "volumes": [ { "name": "video_file", "host": { "sourcePath": "/home/ec2-user" } } ] }
  2. タスク定義を登録します。

    aws ecs register-task-definition --family vt1-6xlarge-xffmpeg-processor --cli-input-json file://vt1-6xlarge-xffmpeg-linux.json --region us-east-1
vt1.24xlarge
  1. vt1-24xlarge-ffmpeg-linux.json と言う名前で、以下の内容が記述されたテキストファイルを作成します。

    { "family": "vt1-24xlarge-xffmpeg-processor", "requiresCompatibilities": ["EC2"], "placementConstraints": [ { "type": "memberOf", "expression": "attribute:ecs.os-type == linux" }, { "type": "memberOf", "expression": "attribute:ecs.instance-type == vt1.24xlarge" } ], "containerDefinitions": [ { "entryPoint": [ "/bin/bash", "-c" ], "command": [ "/video/ecs_ffmpeg_wrapper.sh" ], "linuxParameters": { "devices": [ { "containerPath": "/dev/dri/renderD128", "hostPath": "/dev/dri/renderD128", "permissions": [ "read", "write" ] }, { "containerPath": "/dev/dri/renderD129", "hostPath": "/dev/dri/renderD129", "permissions": [ "read", "write" ] }, { "containerPath": "/dev/dri/renderD130", "hostPath": "/dev/dri/renderD130", "permissions": [ "read", "write" ] }, { "containerPath": "/dev/dri/renderD131", "hostPath": "/dev/dri/renderD131", "permissions": [ "read", "write" ] }, { "containerPath": "/dev/dri/renderD132", "hostPath": "/dev/dri/renderD132", "permissions": [ "read", "write" ] }, { "containerPath": "/dev/dri/renderD133", "hostPath": "/dev/dri/renderD133", "permissions": [ "read", "write" ] }, { "containerPath": "/dev/dri/renderD134", "hostPath": "/dev/dri/renderD134", "permissions": [ "read", "write" ] }, { "containerPath": "/dev/dri/renderD135", "hostPath": "/dev/dri/renderD135", "permissions": [ "read", "write" ] }, { "containerPath": "/dev/dri/renderD136", "hostPath": "/dev/dri/renderD136", "permissions": [ "read", "write" ] }, { "containerPath": "/dev/dri/renderD137", "hostPath": "/dev/dri/renderD137", "permissions": [ "read", "write" ] }, { "containerPath": "/dev/dri/renderD138", "hostPath": "/dev/dri/renderD138", "permissions": [ "read", "write" ] }, { "containerPath": "/dev/dri/renderD139", "hostPath": "/dev/dri/renderD139", "permissions": [ "read", "write" ] }, { "containerPath": "/dev/dri/renderD140", "hostPath": "/dev/dri/renderD140", "permissions": [ "read", "write" ] }, { "containerPath": "/dev/dri/renderD141", "hostPath": "/dev/dri/renderD141", "permissions": [ "read", "write" ] }, { "containerPath": "/dev/dri/renderD142", "hostPath": "/dev/dri/renderD142", "permissions": [ "read", "write" ] }, { "containerPath": "/dev/dri/renderD143", "hostPath": "/dev/dri/renderD143", "permissions": [ "read", "write" ] } ] }, "mountPoints": [ { "containerPath": "/video", "sourceVolume": "video_file" } ], "cpu": 0, "memory": 12000, "image": "0123456789012.dkr.ecr.us-west-2.amazonaws.com/aws/xilinx-xffmpeg", "essential": true, "name": "xilinix-xffmpeg" } ], "volumes": [ { "name": "video_file", "host": { "sourcePath": "/home/ec2-user" } } ] }
  2. タスク定義を登録します。

    aws ecs register-task-definition --family vt1-24xlarge-xffmpeg-processor --cli-input-json file://vt1-24xlarge-xffmpeg-linux.json --region us-east-1