録画サーバ構築 NVENCエンコード Ubuntu 16.04 編

ひっさびさのNVENC検証。ブログを見返すと、1年以上も前に調べて以来。以前はハードウェアエンコードくらいにしかGPUを使う用途がなかったので、エンコード品質がお粗末なことがわかった時点で処分してしまった。GTX750 tiでの検証だった。今回は機械学習やマイニングでも使ってみるつもりなので、GPUにかける予算は奮発するつもり。筐体の大きさもGPUのサイズにあわすので、その点における制約もない。他の用途での利用も考慮してGTX1080にする予定。中でも評判のよさそうなZotac GeForce GTX 1080 AMP Editionに決定した。

まずは取り付け作業から。PCの電源を落として届いたグラボをマザーボードのPCIE x16レーンに刺す。2スロット幅が必要となるので、隣のレーンはつぶれることに。続いて、電源ユニットから8ピンの補助電源を取り回す。1本のケーブルで2つ接続可能になっており、その2つをグラボに接続する。これで準備は整ったので電源を入れて起動する。lspciするとNVIDIAのVGAとAudioが認識されているのがわかる。このデバイスをOSからコントロールできるように、今度はドライバをインストールする。ドライバを入れると、キャラクタデバイスが登録されて制御可能となる。

さて、そのドライバだが、今回はちょっと工夫が必要。というのもホストOSはUbuntuだが、LXDにてCentOSのコンテナも作る予定があるので、コンテナ上ではCentOSでもUbuntuでも動いて欲しい。こんな都合のよいことが出来るかどうか自信なかったが、試行錯誤した結果、ドライバのバージョンが合っていれば動作することがわかった。Ubuntuの場合はリポジトリから最新のドライバをインストールできるのだが、あえてこれを使うことはできない。CentOSで同じバージョンのドライバが出ていないからだ。Fedoraだと、わりと新しいものも出ているようで苦々しい。

いろいろ悩んだ挙句、ドライバのバージョンを合わせる一番楽な方法はCUDA同梱のドライバを使ってしまうことだとわかった。NVIDIAのHPでCUDAに関しては、CentOS用のRPMパッケージとUbuntu用のdebパッケージがどちらも用意してある。双方のディストリビューションでこのパッケージをそのまま使うのが吉。まあ、CentOSについては、またいつかに稿を譲るとして、今回はUbuntuについて。邪魔になるnouveauドライバを外して再起動。その後にNVIDIAのサイトからダウンロードしたパッケージをdpkgでインストール。/var/cudaの下にcuda用のパッケージが展開される。これをaptでインストールする形。nvidia-smiコマンドでセットアップしたGPUが見えれば成功。

cat<<EOF>/etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
EOF
update-initramfs -u
reboot

dpkg -i cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64-deb
apt update
apt install cuda cuda-drivers
nvidia-smi

これだけでGPUが使えるようになるんだから、QSVに比べれば遥かに楽。ハードウェアやソフトウェアの制約もほとんどないし。運用面のこと考えれば、QSVからNVENCに移行した方が賢明だよね。QSVもせっかく優秀な機能なんだから、もっともっと進化してくれると嬉しいけど。続いて、nvencに対応したffmpegを作る。CentOSの時と同様にパッケージの形でnvenc対応したffmpegをビルドする。/etc/apt/source.listにdeb-secを加えて、依存するパッケージをインストール。ffmpegのパッケージソースをインストールしてdebuildすればOK。具体的には以下のような感じ。

apt update
apt build-dep -y ffmpeg
mkdir /usr/local/src/ffmpeg
cd /usr/local/src/ffmpeg
apt source ffmpeg
cd ffmpeg-2.8.11
DEB_BUILD_OPTIONS="--enable-nonfree --enable-nvenc" debuild -uc -us -b
cd ..
dpkg -i *.deb

簡単にまとめてるけど、なにぶん慣れていないUbuntuなので、まあ苦労したw あとはいつものコマンドでエンコードの所要時間や実際に生成された動画で品質をチェックする。せっかくなのでh264だけでなく、hevcもね。以前はずっとアメトーークの動画で検証していたんだけど、1時間の動画だとだるいので今回は30分で終わるガキの使いの動画を使った。結論から言えば、エンコードに関しては爆速。30分動画のエンコードに5分ほど。SkylakeのQSVだと10分ほどかかる認識なので、軽く倍くらいの速さ。すごい。まあ、かけた金額考えれば、これくらいは頑張って欲しいところか。

time ffmpeg -y -i gaki.ts -f mp4 -tune film -vcodec nvenc -s 1280x720 -vf yadif -vb 4500k -acodec aac -strict -2 -ac 2 -ar 48000 -ab 128k -threads 0 h264.mp4
time ffmpeg -y -i gaki.ts -f mp4 -tune film -vcodec nvenc_hevc -s 1280x720 -vf yadif -vb 4500k -acodec aac -strict -2 -ac 2 -ar 48000 -ab 128k -threads 0 hevc.mp4

画質に関して言うと、GTX750は目も当てられなかったんだけど、GTX1080はそれに比べると雲泥の差。QSVで生成した画質と比べてもほぼ遜色ない。同じ動画を食い入るように見比べて、若干グラデーションがのっぺりしてるかなあ、いや変わらないか、とか思うくらい。一方のhevcについては、bitrateが一緒なら同レベルの画質。bitrateを落としても画質が落ちないのが、hevcのいいところと思って、ちょっとずつbitrateを間引いていったんだけど、普通にbitrate相当の画質のように見えた。あまり使う意義も感じられなかったので使うならh264で充分。NVENCが使い物になってくれてよかった!

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)