📼

動画エンコードに最適なEC2インスタンスタイプを探す

2022/12/29に公開

動画を大量にエンコードしたい時、クラウド上のVirtual Machine(VM)で処理を行えば性能を上げたり同時処理数を増やしたりが簡単にできます。ただし、VMには複数のタイプが用意されており、どれを使用するのが最適(高速で安価)なのかは実際に比較してみないとわかりません。

というわけでAmazon Web Services EC2を対象に、エンコードに向いているであろうインスタンスタイプで実際にエンコードを行って最適なインスタンスタイプを調査してみました。

前提

出力する動画の形式はH.264/AVC 1920x1080 29.97fps 6Mbps (2-pass)で、エンコーダはみんな大好きFFmpeg (x264)です。

対象インスタンスタイプ

調査対象のインスタンスタイプには、最も動画エンコード向きと考えられるコンピューティング最適化からC6g, C6i, C6a, C5, C5a, C4を、一般用途向けからM6g, M6i, M6a, M5, M5aを選びました。

サイズは 8xlarge 相当を上限にしています。これは巨大インスタンスタイプのあらゆる数の大きさに畏れをいだいたためでもありますが、C6iで調べると 12xlarge からvCPUの増加に対して処理速度が伸びなくなっていて、他タイプも同様の傾向があると予想されるためです。

c6i.16xlarge は調査時キャパシティ不足でスポットインスタンスが起動できず

エンコード時間(割合)と単価の一覧

エンコードにかかった時間と単価の一覧表です。調査の詳しい情報は下部に書いています。

インスタンスタイプ vCPU オンデマンド単価 スポット参考単価 対入力時間割合 1時間分処理単価(オンデマンド) 1時間分処理単価(スポット)
c6g.medium 1 $0.0428 $0.0175 1087.44% $0.4654 $0.1903
c6g.large 2 $0.0856 $0.0349 568.28% $0.4864 $0.1983
c6g.xlarge 4 $0.1712 $0.0699 292.39% $0.5006 $0.2044
c6g.2xlarge 8 $0.3424 $0.1397 154.44% $0.5288 $0.2158
c6g.4xlarge 16 $0.6848 $0.2794 92.11% $0.6308 $0.2574
c6g.8xlarge 32 $1.3696 $0.5589 58.06% $0.7951 $0.3245
c6i.large 2 $0.1070 $0.0349 421.22% $0.4507 $0.1470
c6i.xlarge 4 $0.2140 $0.0773 210.33% $0.4501 $0.1626
c6i.2xlarge 8 $0.4280 $0.1459 108.61% $0.4649 $0.1585
c6i.4xlarge 16 $0.8560 $0.3093 61.33% $0.5250 $0.1897
c6i.8xlarge 32 $1.7120 $0.5622 38.44% $0.6582 $0.2161
c6a.large 2 $0.0963 $0.0349 399.50% $0.3847 $0.1394
c6a.xlarge 4 $0.1926 $0.0699 196.06% $0.3776 $0.1370
c6a.2xlarge 8 $0.3852 $0.1397 106.17% $0.4090 $0.1483
c6a.4xlarge 16 $0.7704 $0.2794 56.44% $0.4348 $0.1577
c6a.8xlarge 32 $1.5408 $0.5589 - - -
c5.large 2 $0.1070 $0.0333 538.17% $0.5758 $0.1792
c5.xlarge 4 $0.2140 $0.0719 280.11% $0.5994 $0.2014
c5.2xlarge 8 $0.4280 $0.1453 133.83% $0.5728 $0.1945
c5.4xlarge 16 $0.8560 $0.2661 75.28% $0.6444 $0.2003
c5.9xlarge 36 $1.9260 $0.6794 46.00% $0.8860 $0.3125
c5a.large 2 $0.0960 $0.0391 425.72% $0.4087 $0.1665
c5a.xlarge 4 $0.1920 $0.0878 218.11% $0.4188 $0.1915
c5a.2xlarge 8 $0.3840 $0.1496 116.11% $0.4459 $0.1737
c5a.4xlarge 16 $0.7680 $0.3690 69.06% $0.5303 $0.2548
c5a.8xlarge 32 $1.5360 $0.5502 - - -
c4.large 2 $0.1260 $0.0413 587.39% $0.7401 $0.2426
c4.xlarge 4 $0.2520 $0.0712 299.11% $0.7538 $0.2130
c4.2xlarge 8 $0.5040 $0.1433 157.33% $0.7930 $0.2255
c4.4xlarge 16 $1.0080 $0.2535 87.44% $0.8814 $0.2217
c4.8xlarge 36 $2.0160 $0.5069 57.83% $1.1659 $0.2932
m6g.medium 1 $0.0495 $0.0183 1095.06% $0.5421 $0.2004
m6g.large 2 $0.0990 $0.0367 557.78% $0.5522 $0.2047
m6g.xlarge 4 $0.1980 $0.0734 287.22% $0.5687 $0.2108
m6g.2xlarge 8 $0.3960 $0.1467 154.11% $0.6103 $0.2261
m6g.4xlarge 16 $0.7920 $0.2934 91.06% $0.7212 $0.2672
m6g.8xlarge 32 $1.5840 $0.5868 57.89% $0.9170 $0.3397
m6i.large 2 $0.1240 $0.0367 414.61% $0.5141 $0.1522
m6i.xlarge 4 $0.2480 $0.0734 211.11% $0.5236 $0.1550
m6i.2xlarge 8 $0.4960 $0.1497 109.89% $0.5450 $0.1645
m6i.4xlarge 16 $0.9920 $0.2934 60.17% $0.5969 $0.1765
m6i.8xlarge 32 $1.9840 $0.5868 - - -
m6a.large 2 $0.1116 $0.0367 397.56% $0.4437 $0.1459
m6a.xlarge 4 $0.2232 $0.0734 186.22% $0.4156 $0.1367
m6a.2xlarge 8 $0.4464 $0.1467 106.61% $0.4759 $0.1564
m6a.4xlarge 16 $0.8928 $0.2934 54.50% $0.4866 $0.1599
m6a.8xlarge 32 $1.7856 $0.5868 42.22% $0.7539 $0.2478
m5.large 2 $0.1240 $0.0349 604.94% $0.7501 $0.2111
m5.xlarge 4 $0.2480 $0.0699 311.67% $0.7729 $0.2179
m5.2xlarge 8 $0.4960 $0.1409 159.50% $0.7911 $0.2247
m5.4xlarge 16 $0.9920 $0.3264 - - -
m5.8xlarge 32 $1.9840 $0.5816 55.56% $1.1022 $0.3231
m5a.large 2 $0.1120 $0.0349 630.72% $0.7064 $0.2201
m5a.xlarge 4 $0.2240 $0.0711 324.50% $0.7269 $0.2307
m5a.2xlarge 8 $0.4480 $0.1637 173.06% $0.7753 $0.2833
m5a.4xlarge 16 $0.8960 $0.3133 100.28% $0.8985 $0.3142
m5a.8xlarge 32 $1.7920 $0.5589 73.78% $1.3221 $0.4123
  • 対象のリージョンは ap-northeast-1 (東京)です
  • スポット参考単価 は2022年12月12日〜28日ごろの価格です
  • 対入力時間割合 は入力ファイルの長さに対する処理時間の長さの割合です
    • 例えば200%の場合は1時間の入力ファイルに対してエンコードに2時間かかるという意味です
  • 1時間分処理単価 は1時間の入力ファイルをエンコードするのに必要な金額です
    • $0.5の場合は2時間の入力ファイルをエンコードするのに$1かかるという意味です
  • 調査はスポットインスタンスを使用して行っています。打ち消し線が引かれているインスタンスタイプはキャパシティ不足で起動できないか処理中に中断が発生したため計測できていません
  • 測定は手間とコストの都合で基本的に各タイプ1回のみです
  • エンコード時間はパラメータによって大幅に変動しますので、数字は参考程度に捉えてください

オンデマンド価格性能比

表の内容をもとにオンデマンドの単価と処理速度をグラフにしています。

  • X軸(横)が 対入力時間割合 です(目盛は対数です)
  • Y軸(縦)が 1時間分処理単価 です
  • 左にいくほど高速で、下にいくほど低価格になります

スポット価格性能比

こちらはスポットの単価でのグラフです。

  • Y軸の最大値は オンデマンド価格性能比 のグラフと異なりますので注意してください

まとめ

  • 処理速度の傾向は C6a ≒ M6a > C6i ≒ M6i > C5a > C5 > C4 > C6g ≒ M6g > M5 > M5a です
    • (C6aとM6aはCPUが同じAMD EPYC 7R13 Processor)
    • (C6iとM6iはCPUが同じIntel(R) Xeon(R) Platinum 8375C CPU @ 2.90GHz)
  • インスタンスのサイズは xlarge, large, medium が処理が遅い割にそれほど安くありませんので、エンコードが短時間で終わるのでなければ避けた方が良いです
  • 基本的にEBSの料金も必要になるため、1時間分処理単価が同一のインスタンスタイプでも処理時間が長いほどEBS分の料金が増えます
  • オンデマンド
      * C6a, M6a, C6iの2xlarge以上を選ぶのが現時点では最適な選択となりそうです
      * M6iはやや割高ですが処理速度を見るとC6iの代替として使えます
      * C5a (AMD)はC5 (Intel)と比較して安く設定されている割に処理速度はむしろ速いのでお得感があります
  • スポット
    • オンデマンドと同じくC6a, M6a, C6iの2xlarge以上を選ぶのが現時点では最適な選択となりそうです
    • M6iはキャパシティ不足が多く発生したためスポットインスタンスでの使用は避けた方が良いかもしれません(時期によって傾向は変わります)
    • C5aはキャパシティが少ない(東京では起動できるAZも少ない)ように見え、そのためかスポット価格がC5と比較して高い傾向にあるのでお得感は薄れます
  • H.264のエンコードを行う場合はパテントプールへの支払いが必要になる場合があります

補足

調査内容詳細

調査に使用したファイル、コマンドの詳細情報はこちらになります。

入力ファイル

ProRes 422 1920x1080 29.97fps 30分の動き多め実写のQuickTime動画ファイル約30GiBを使用しています。

エンコーダー

FFmpeg公式からダウンロードできるLinux Static Build版FFmpeg 5.1.1を使用しています。(arm64, amd64)

arm64

ffmpeg version 5.1.1-static https://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 8 (Debian 8.3.0-6)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-libgme --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libdav1d --enable-libxvid --enable-libzimg
  libavutil      57. 28.100 / 57. 28.100
  libavcodec     59. 37.100 / 59. 37.100
  libavformat    59. 27.100 / 59. 27.100
  libavdevice    59.  7.100 / 59.  7.100
  libavfilter     8. 44.100 /  8. 44.100
  libswscale      6.  7.100 /  6.  7.100
  libswresample   4.  7.100 /  4.  7.100
  libpostproc    56.  6.100 / 56.  6.100

amd64

ffmpeg version 5.1.1-static https://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 8 (Debian 8.3.0-6)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-libgme --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libvmaf --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libdav1d --enable-libxvid --enable-libzvbi --enable-libzimg
  libavutil      57. 28.100 / 57. 28.100
  libavcodec     59. 37.100 / 59. 37.100
  libavformat    59. 27.100 / 59. 27.100
  libavdevice    59.  7.100 / 59.  7.100
  libavfilter     8. 44.100 /  8. 44.100
  libswscale      6.  7.100 /  6.  7.100
  libswresample   4.  7.100 /  4.  7.100
  libpostproc    56.  6.100 / 56.  6.100

エンコードのパラメータ

ストリーミング配信用を想定して、H.264/AVC 1920x1080 29.97fps 6Mbps キーフレーム間隔3秒(90フレーム)固定で出力されるようにパラメータを設定しています。

ffmpeg -y -i input.mov -c:v h264 -b:v 6000k -maxrate 6000k -bufsize 12000k -tune film -preset medium -force_key_frames "expr:gte(n,n_forced*90)" -x264-params "min-keyint=90" -vf "format=yuv420p" -profile:v high -an -pass 1 -f null /dev/null
ffmpeg -i input.mov -c:v h264 -b:v 6000k -maxrate 6000k -bufsize 12000k -tune film -preset medium -force_key_frames "expr:gte(n,n_forced*90)" -x264-params "min-keyint=90" -vf "format=yuv420p" -profile:v high -c:a aac -b:a 128k -pass 2 output.mp4

OS

Amazon Linux 2を使用しています。

NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"

参考

AWSのマネージドサービスで同等程度の動画エンコードを行った場合の単価です。

サービス名 区分 1時間分処理単価
AWS Elemental MediaConvert プロフェッショナル階層 2パス HD 30fps以下 $2.8560
Amazon Elastic Transcoder 720p以上 $2.0400

Discussion