Ubuntu 18.04のAMDサーバにGPUを積んだのでエンコード環境を整えることにしました。
ffmpeg
サイト「俺の外付けHDD」様に良くまとまっているようです。encdecいろいろ出来るのがffmpegです。
https://nyanshiba.hatenablog.com/entry/2018/02/03/071256
環境の確認
私の環境はUbuntu18.04です。下記サイトを参照して実機のドライババージョンやnvcc環境、GPU使用状況を確認しました。
https://qiita.com/sao_rio/items/4ef5604d685f04669f74
NGCコンテナ
まず、ベースとなるコンテナをNVIDIAのコンテナカタログNGC からダウンロードします。
Pullコマンドをコピペさせるボタンもあり、簡単です。ここではTensorflowをダウンロードします。
docker pull nvcr.io/nvidia/tensorflow:21.11-tf2-py3
つぎに、 docker runコマンドを走らせます。--gpusの後は必ずしもallでなくともいいかもしれません。1-2でも良いかもしれません。
docker run --gpus all --runtime nvidia -it --rm -v local_dir:continer_dir -v /dev/video0:/dev/video0 nvcr.io/nvidia/tensorflow:21.11-tf-py3
- -itはインタラクティブモード、ターミナルへの入出力あり
- --rmはコンテナ終了時にコンテナが削除されます
- -v はマウント元ホストディレクトリ:マウント先ホストディレクトリです。コンテナ終了しても作業結果は残ります。Webカメラを使うなどで/dev/video0もマウントしました
その他run のオプションは --runtime nvidia, --privilegeあたりがあれば大丈夫と思います。詳細は下記にてご確認ください。
https://docs.nvidia.com/deeplearning/frameworks/user-guide/index.html#runcont
NVIDIAハードウェア対応ffmpeg
コンテナを起動したら、NVIDIA公式 ffmpegモジュールの追加を試みます。手順はリンク先の通りですが、 ポイントは下記3つだけとシンプルです。一か所 configure前にcd xxxが抜けているのでそこは適宜移動しましょう。
- nvcodecヘッダを取ってくる
- ffmpegをgit cloneする
- configure & make
nvcodec-headersを取ってきます
git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
ffnvcodecのインストール
cd nv-codec-headers && sudo make install && cd -
FFmpegを公式リポジトリからクローン
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg/
必須パッケージのインストール
apt update -U apt (これをしないとyasmが見つからなかった)
sudo apt-get install build-essential yasm cmake libtool libc6-dev wget unzip libbnuma2 libnuma-dev
Configure, make, install
./configure --enable-nonfree --enable-cuda-nvcc --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --disable-static -enable-shared
make -j 8
sudo make install
共有ライブラリの設定
hoge$ ldd /usr/bin/ffmpeg
# 必要な共有ライブラリが表示される
hoge$ echo LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib
これで ffmpeg -hwaccell が使えるようになりました。
myoshimi氏 docker_runでビデオエンコード
myoshimiさんもハードウェア対応ffmpegをGitHubに公開されています。
2016年の記事ですが、ソフトウェアコーデックもlibx264, libx265が有効です。ffmpeg-4.1.1 がダウンロードされますが、2021年現在 書き換えにより4.4.1がダウンロード可能です。Dockerfileには nvencの記載のみで、nvdecはありませんでした。書き足したらデコードもできるのでは...?
--enable-cuda \
--enable-cuvid \
--enable-nvenc \
--enable-libnpp \
buildしてみる
$ docker build -t ffmpeg-nvenc
とすると、 25/33: x264のダウンロード箇所でSSL証明書エラーが出てストップしました。曰く証明書がないため、git cloneが出来ません。
server certificate verification failed. CAfile: /etc/ssl/certs/cacertificates.crt
下記、回避策の1行を、Dockerfileの x264 gitアクセス行直前に追加し、SSLチェックを無効としたところ、イメージが無事に作成されました。
$ git config --global http.sslVerify false
https://qiita.com/TKR/items/5f23fe5a341e228cf9b5
https://qastack.jp/programming/21181231/server-certificate-verification-failed-cafile-etc-ssl-certs-ca-certificates-c
Step 34/34 : CMD ["--help"]
---> Running in 4dbd6489c0d4
Removing intermediate container 4dbd6489c0d4
---> d99d5d702eab
Successfully built d99d5d702eab
Successfully tagged ffmpeg-nvenc:latest
$ docker images
ffmpeg-nvenc
終わりに
NVIDIA製GPUのハードウェアを活用する ffmpegの設定方法を2種類ご紹介しました。Happy video encoding life!