10
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

さくらのアドベントカレンダー2022 20日目の記事です。

どうも、さくらインターネット やまけんです。

2日目で さくらのクラウドでUniFi Network Applicationを動かす

こちらの紹介をしましたが、今度はGPUでのハードウェアエンコードのお話です。
GPUでのハードウェアエンコードの話は、2018年にnvidiaのNVENCを使うお話を。

2021年にはハードウェアエンコードでの品質比較の話をさせていただきました。

今回は、今年発売されたIntelのGPU Intel Arcを使ったハードウェアエンコード環境作成のお話をさせていただきます。

はじめに

intelは今年に入り20数年ぶりに単体GPUカード市場に再参入しました。
とはいえ、再参入と言っても、過去に出したGPUカードはIntel740という製品で、このカードは当時スペック詐欺と言われ全く売れず、その後のi810チップセットの内蔵グラフィックや、CPU内蔵グラフィックという形で単体GPUではなく、お世辞にも性能が高いわけでもなく、表示ができる程度のものがずっと続いていました。
ちなみに黒歴史化してるらしく、アスキーの記事にされています。

一応当時を知る身から一言だけ言わせてもらうと、intelはDirect Memory Executionという、当時としては画期的かつ今のグラボにも応用されている先進機能を搭載したあたりは評価されるべきだし、本当はRDRAMが廉価で提供できれば、この機能を最大限活用できただろうが、そうはならなかったと言うところ。

そんなintelは細々とCPUにiGPUというのを長く続けており、ハードウェアデコーダやエンコーダを搭載し、ゲームをするには心細いが、最低限の機能は兼ね備えています。

昨年の記事でも変換速度はNVEncには敵わないものの、品質についてはNVEncよりも高いものとなっており、バランスのとれたものでありました。

ここに来て、新たに発売されたIntel Arcシリーズは新たにAV1のハードウェアエンコーダをGPUとして初搭載したり(現在はNVIDIA Ada Lovelace世代でも搭載しました)と少し先進的な取り組みをしています。

そんな新しいGPUのハードウェアエンコーダ性能を検証しようと言う内容です。

必須環境

Intel Arcが載っている Ubuntu 24.04 x86_64 マシン

SPARKLE Intel Arc A310 ECOがおすすめです。
1Uサイズ、low profile PCIe、50W補助電源不要でサーバマシンにも組み込めます。
実売15k円ぐらい

準備

ドライバのインストール

Ubuntu 23.10 以降はドライバがあらかじめ組み込まれましたので、ドライバインストールは不要です。

GPUの認識確認

# GPU認識の確認
sudo lspci -v |grep -A8 VGA

下記の結果のようになります。

ubuntu@intel-arc:~$ lspci -v |grep -A8 VGA
03:00.0 VGA compatible controller: Intel Corporation DG2 [Arc A310] (rev 05) (prog-if 00 [VGA controller])
	Subsystem: Device 172f:4019
	Flags: bus master, fast devsel, latency 0, IRQ 129, IOMMU group 1
	Memory at de000000 (64-bit, non-prefetchable) [size=16M]
	Memory at c0000000 (64-bit, prefetchable) [size=256M]
	Expansion ROM at df000000 [disabled] [size=2M]
	Capabilities: <access denied>
	Kernel driver in use: i915
	Kernel modules: i915, xe
ubuntu@intel-arc:~$ 

きちんと認識しているのが確認できました。

しかし、このままでは、エンコードに使う /dev/dri/renderD128 のパーミッションの問題で、一般ユーザーでffmpegを使う場合、HWエンコードができなくなります。

ubuntu@intel-arc:~$ ls -l /dev/dri/render*
crw-rw---- 1 root render 226, 128 Dec 19 18:07 /dev/dri/renderD128
ubuntu@intel-arc:~$

そこで、一般ユーザーでもアクセス可能にするための設定ファイルを作成します。

sudo vi /etc/udev/rules.d/99-render.rules
99-render.rules
KERNEL=="render*" GROUP="render", MODE="0666"

設定反映のためにOS再起動後、デバイスのパーミッションを確認します。

ubuntu@intel-arc:~$ ls -l /dev/dri/render*
crw-rw-rw- 1 root render 226, 128 Dec 19 18:16 /dev/dri/renderD128
ubuntu@intel-arc:~$ 

ドライバインストールの確認

hwinfoをインストールし、ドライバインストールができているか確認します。

sudo apt-get -y install hwinfo
sudo hwinfo --display

下記のように Driver Status: i915 is active なっていればOKです

ubuntu@intel-arc:~$ sudo hwinfo --display
07: PCI 300.0: 0300 VGA compatible controller (VGA)             
  [Created at pci.386]
  Unique ID: svHJ.LFWyWCHJn5D
  Parent ID: GA8e.mr2N3fBJq5F
  SysFS ID: /devices/pci0000:00/0000:00:01.0/0000:01:00.0/0000:02:01.0/0000:03:00.0
  SysFS BusID: 0000:03:00.0
  Hardware Class: graphics card
  Model: "Intel VGA compatible controller"
  Vendor: pci 0x8086 "Intel Corporation"
  Device: pci 0x56a6 
  SubVendor: pci 0x172f 
  SubDevice: pci 0x4019 
  Revision: 0x05
  Driver: "i915"
  Driver Modules: "i915"
  Memory Range: 0xde000000-0xdeffffff (rw,non-prefetchable)
  Memory Range: 0xc0000000-0xcfffffff (ro,non-prefetchable)
  Memory Range: 0xdf000000-0xdf1fffff (ro,non-prefetchable,disabled)
  IRQ: 129 (722 events)
  Module Alias: "pci:v00008086d000056A6sv0000172Fsd00004019bc03sc00i00"
  Driver Info #0:
    Driver Status: i915 is active
    Driver Activation Cmd: "modprobe i915"
  Driver Info #1:
    Driver Status: xe is active
    Driver Activation Cmd: "modprobe xe"
  Config Status: cfg=new, avail=yes, need=no, active=unknown
  Attached to: #18 (PCI bridge)

Primary display adapter: #7
ubuntu@intel-arc:~$ 

メディアドライバの確認

sudo apt-get -y install vainfo
vainfo

下記のように vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 24.1.0 () 表示されればOKです。

ubuntu@intel-arc:~$ sudo vainfo
error: can't connect to X server!
libva info: VA-API version 1.20.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_20
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.20 (libva 2.12.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 24.1.0 ()
vainfo: Supported profile and entrypoints
      VAProfileNone                   :	VAEntrypointVideoProc
      VAProfileNone                   :	VAEntrypointStats
      VAProfileMPEG2Simple            :	VAEntrypointVLD
      VAProfileMPEG2Main              :	VAEntrypointVLD
      VAProfileH264Main               :	VAEntrypointVLD
      VAProfileH264Main               :	VAEntrypointEncSliceLP
      VAProfileH264High               :	VAEntrypointVLD
      VAProfileH264High               :	VAEntrypointEncSliceLP
      VAProfileJPEGBaseline           :	VAEntrypointVLD
      VAProfileJPEGBaseline           :	VAEntrypointEncPicture
      VAProfileH264ConstrainedBaseline:	VAEntrypointVLD
      VAProfileH264ConstrainedBaseline:	VAEntrypointEncSliceLP
      VAProfileHEVCMain               :	VAEntrypointVLD
      VAProfileHEVCMain               :	VAEntrypointEncSliceLP
      VAProfileHEVCMain10             :	VAEntrypointVLD
      VAProfileHEVCMain10             :	VAEntrypointEncSliceLP
      VAProfileVP9Profile0            :	VAEntrypointVLD
      VAProfileVP9Profile0            :	VAEntrypointEncSliceLP
      VAProfileVP9Profile1            :	VAEntrypointVLD
      VAProfileVP9Profile1            :	VAEntrypointEncSliceLP
      VAProfileVP9Profile2            :	VAEntrypointVLD
      VAProfileVP9Profile2            :	VAEntrypointEncSliceLP
      VAProfileVP9Profile3            :	VAEntrypointVLD
      VAProfileVP9Profile3            :	VAEntrypointEncSliceLP
      VAProfileHEVCMain12             :	VAEntrypointVLD
      VAProfileHEVCMain422_10         :	VAEntrypointVLD
      VAProfileHEVCMain422_10         :	VAEntrypointEncSliceLP
      VAProfileHEVCMain422_12         :	VAEntrypointVLD
      VAProfileHEVCMain444            :	VAEntrypointVLD
      VAProfileHEVCMain444            :	VAEntrypointEncSliceLP
      VAProfileHEVCMain444_10         :	VAEntrypointVLD
      VAProfileHEVCMain444_10         :	VAEntrypointEncSliceLP
      VAProfileHEVCMain444_12         :	VAEntrypointVLD
      VAProfileHEVCSccMain            :	VAEntrypointVLD
      VAProfileHEVCSccMain            :	VAEntrypointEncSliceLP
      VAProfileHEVCSccMain10          :	VAEntrypointVLD
      VAProfileHEVCSccMain10          :	VAEntrypointEncSliceLP
      VAProfileHEVCSccMain444         :	VAEntrypointVLD
      VAProfileHEVCSccMain444         :	VAEntrypointEncSliceLP
      VAProfileAV1Profile0            :	VAEntrypointVLD
      VAProfileAV1Profile0            :	VAEntrypointEncSliceLP
      VAProfileHEVCSccMain444_10      :	VAEntrypointVLD
      VAProfileHEVCSccMain444_10      :	VAEntrypointEncSliceLP
ubuntu@intel-arc:~$ 

oneAPI Toolkitsのインストール

IntelGPUではIntel Media SDKを使っていましたが、新しいGPUからoneAPIを使うようになりました。
oneAPIの中のintelVPLというのが該当のものですが、MediaSDKを置き換える存在になっています。

今回は下記のAPTにてインストールします。

wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB \
| gpg --dearmor | sudo tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null

echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list

sudo apt-get update && sudo apt-get -y install intel-basekit libvpl-dev

intelVPL GPUのインストール

oneVPL自体はパッケージでのインストールが完了していますが、GPU Runtimeは別途インストールが必要です。

インストール

sudo apt-get -y install git build-essential pkg-config cmake automake autoconf libva-dev libdrm-dev

git clone https://github.com/intel/vpl-gpu-rt vpl-gpu-rt
cd vpl-gpu-rt

mkdir build && cd build
cmake ..
make
sudo make install

上記にてoneVPL GPUランタイムがインストールされます。

FFmpegのインストール

Compile FFmpeg for Ubuntu, Debian, or Mint

こちらをベースにパッケージベースで入れていきます。

intel GPUでのHWエンコードについては

に記載があるとおり

Build FFmpeg with oneVPL
 ./configure --enable-libvpl && make -j8 && make install

とのことなので、--enable-libvpl をつければ良いということです。

個人的にhapエンコードを使いたいので libsnappy-dev をインストールの上
--enable-libsnappy を追記しています。

またTLS対応のために libssl-dev をインストールの上
--enable-openssl を追記しています。

#FFmpegコンパイルに必要なものを導入
sudo apt-get update -qq && sudo apt-get -y install \
  autoconf \
  automake \
  build-essential \
  cmake \
  git-core \
  libass-dev \
  libfreetype6-dev \
  libgnutls28-dev \
  libmp3lame-dev \
  libssl-dev \
  libtool \
  libva-dev \
  libvorbis-dev \
  libsnappy-dev \
  meson \
  ninja-build \
  pkg-config \
  texinfo \
  wget \
  yasm \
  zlib1g-dev

#作業ディレクトリ作成
mkdir -p ~/ffmpeg_sources ~/bin

#NASM インストール
sudo apt-get -y install nasm

# libx264 インストール
sudo apt-get -y install libx264-dev

# libx265 インストール
sudo apt-get -y install libx265-dev libnuma-dev

# libvpx インストール
sudo apt-get -y install libvpx-dev

# libfdk-aac インストール
sudo apt-get -y install libfdk-aac-dev

# libopus インストール
sudo apt-get -y install libopus-dev

# libaom インストール
sudo apt-get -y install libaom-dev

# libvmaf インストール
cd ~/ffmpeg_sources && \
wget https://github.com/Netflix/vmaf/archive/v3.0.0.tar.gz && \
tar xvf v3.0.0.tar.gz && \
mkdir -p vmaf-3.0.0/libvmaf/build &&\
cd vmaf-3.0.0/libvmaf/build && \
meson setup -Denable_tests=false -Denable_docs=false --buildtype=release --default-library=static .. --prefix "$HOME/ffmpeg_build" --bindir="$HOME/bin" --libdir="$HOME/ffmpeg_build/lib" && \
ninja && \
ninja install

# FFmpeg インストール
cd ~/ffmpeg_sources && \
wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 && \
tar xjvf ffmpeg-snapshot.tar.bz2 && \
cd ffmpeg && \
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
  --prefix="$HOME/ffmpeg_build" \
  --pkg-config-flags="--static" \
  --extra-cflags="-I$HOME/ffmpeg_build/include" \
  --extra-ldflags="-L$HOME/ffmpeg_build/lib" \
  --extra-libs="-lpthread -lm" \
  --ld="g++" \
  --bindir="$HOME/bin" \
  --enable-libvpl \
  --enable-openssl \
  --enable-gpl \
  --enable-libaom \
  --enable-libass \
  --enable-libfdk-aac \
  --enable-libfreetype \
  --enable-libmp3lame \
  --enable-libopus \
  --enable-libvorbis \
  --enable-libsnappy \
  --enable-libvpx \
  --enable-libx264 \
  --enable-libx265 \
  --enable-libvmaf \
  --enable-static \
  --enable-nonfree && \
PATH="$HOME/bin:$PATH" make && \
make install && \
hash -r

パスを通したり
source ~/.profile
echo "MANPATH_MAP $HOME/bin $HOME/ffmpeg_build/share/man" >> ~/.manpath

動作確認

実際にインストールが成功したか、下記のコマンドでQSVエンコード関連オプションが使えるか確認します。

for i in buildconf hwaccels decoders filters encoders; do echo $i:; ffmpeg -hide_banner -${i} | egrep -i "qsv|vaapi|libvpl"; done

結果はこのようになると思います。

ubuntu@intel-arc:~$ for i in buildconf hwaccels decoders filters encoders; do echo $i:; ffmpeg -hide_banner -${i} | egrep -i "qsv|vaapi|libvpl"; done
buildconf:
    --enable-libvpl
hwaccels:
vaapi
qsv
decoders:
 V....D av1_qsv              AV1 video (Intel Quick Sync Video acceleration) (codec av1)
 V....D h264_qsv             H264 video (Intel Quick Sync Video acceleration) (codec h264)
 V....D hevc_qsv             HEVC video (Intel Quick Sync Video acceleration) (codec hevc)
 V....D mjpeg_qsv            MJPEG video (Intel Quick Sync Video acceleration) (codec mjpeg)
 V....D mpeg2_qsv            MPEG2VIDEO video (Intel Quick Sync Video acceleration) (codec mpeg2video)
 V....D vc1_qsv              VC1 video (Intel Quick Sync Video acceleration) (codec vc1)
 V....D vp8_qsv              VP8 video (Intel Quick Sync Video acceleration) (codec vp8)
 V....D vp9_qsv              VP9 video (Intel Quick Sync Video acceleration) (codec vp9)
filters:
 ... deinterlace_qsv   V->V       Quick Sync Video "deinterlacing"
 ... deinterlace_vaapi V->V       Deinterlacing of VAAPI surfaces
 ... denoise_vaapi     V->V       VAAPI VPP for de-noise
 ... overlay_qsv       VV->V      Quick Sync Video overlay.
 ... overlay_vaapi     VV->V      Overlay one video on top of another
 ... procamp_vaapi     V->V       ProcAmp (color balance) adjustments for hue, saturation, brightness, contrast
 ... scale_qsv         V->V       Quick Sync Video "scaling and format conversion"
 ... scale_vaapi       V->V       Scale to/from VAAPI surfaces.
 ... sharpness_vaapi   V->V       VAAPI VPP for sharpness
 ... tonemap_vaapi     V->V       VAAPI VPP for tone-mapping
 ... transpose_vaapi   V->V       VAAPI VPP for transpose
 ... vpp_qsv           V->V       Quick Sync Video "VPP"
 ... hstack_vaapi      N->V       "VA-API" hstack
 ... vstack_vaapi      N->V       "VA-API" vstack
 ... xstack_vaapi      N->V       "VA-API" xstack
 ... hstack_qsv        N->V       "Quick Sync Video" hstack
 ... vstack_qsv        N->V       "Quick Sync Video" vstack
 ... xstack_qsv        N->V       "Quick Sync Video" xstack
 ... pad_vaapi         V->V       Pad the input video.
 ... drawbox_vaapi     V->V       Draw a colored box on the input video.
encoders:
 V..... av1_qsv              AV1 (Intel Quick Sync Video acceleration) (codec av1)
 V....D av1_vaapi            AV1 (VAAPI) (codec av1)
 V..... h264_qsv             H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (Intel Quick Sync Video acceleration) (codec h264)
 V....D h264_vaapi           H.264/AVC (VAAPI) (codec h264)
 V..... hevc_qsv             HEVC (Intel Quick Sync Video acceleration) (codec hevc)
 V....D hevc_vaapi           H.265/HEVC (VAAPI) (codec hevc)
 V..... mjpeg_qsv            MJPEG (Intel Quick Sync Video acceleration) (codec mjpeg)
 V....D mjpeg_vaapi          MJPEG (VAAPI) (codec mjpeg)
 V..... mpeg2_qsv            MPEG-2 video (Intel Quick Sync Video acceleration) (codec mpeg2video)
 V....D mpeg2_vaapi          MPEG-2 (VAAPI) (codec mpeg2video)
 V....D vp8_vaapi            VP8 (VAAPI) (codec vp8)
 V....D vp9_vaapi            VP9 (VAAPI) (codec vp9)
 V..... vp9_qsv              VP9 video (Intel Quick Sync Video acceleration) (codec vp9)
ubuntu@intel-arc:~$ 
10
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?