CUDA活用したい
機械学習&ゲーム用にGeforce RTX 4090を持ってるんだけど、大してゲームしないし機械学習だって年中やってるわけじゃないので、もうちょっと稼働させてペイした金額分働いてもらおうと思った。GPGPUといえば動画のエンコードってことで、AVCで保存している動画たちをHEVC化するにあたって、効率が良い方法を探していた。
メインPCで動かすのでCPU不可は減らしたい
GPGPUではあるあるだが、GPUは確かに使ってるんだけど、同じくらいCPUを使ってCPUがボトルネックになってしまうパターン。しかも、CPUがボトルネックになるとOSそもそのが重くなるわ、GPU使用率はさがって十分生かせないわであんまり嬉しくない。なので、極力CPUを使わないようにしたい。
Adobe Creative Cloud Media Encoder2024 でNVENCを使う
多分中身はNVENC+Cuda?だと思うんだけど、Media EncoderにあるハードウェアアクセラレーションであるMercury Playback Engine GPU Acceleration (CUDA)を有効にすると、GPU使用率はエンコード側と3D(たぶんcuda)でほぼ100%になる。が、デコードが多分ソフトウェア処理でCPU使用率もはねる。結果、速度は速いがOSが重くなってこれをしながらPCを使い続けるのが微妙だった。
ffmpegでNVENCを使う
結果から言うとこれが一番良かった。 cuda toolkit をセットアップした linux で、 ffmpeg をSourceからビルド( 2023/11/18現在最新の master)して使ってみた。 nvccは release 11.5, V11.5.119
。CPUは確かに若干上振れるんだけど、Encも Decも殆どGPUで処理できているように見える。ハードウェアアクセラレーションは昔から若干品質が悪いとか言うけれど、HEVCでエンコードするんだし、どのみち圧縮だしで個人的には気にしてない。ほんとに高画質でとっときたかったら生にするかBDとかにしちゃうと思うし。
教訓
手軽なツールとしてGUIアプリを使うのは超大好きなんだけど、やっぱメトリクスとか見て細かいこと気にしたりニッチなことしようとするとCLIツールが強かったりするんだよなあ・・・としみじみ。
久しぶりにコーデックとか動画ファイルのパッケージ構造とか触って、動画周りの扱いはソフトウェアエンジニアなら抑えておきたい一技術だなとも思った。特に今は動画見ないで過ごす日なんて殆ど無いしね・・・。