NVEnc 4.34

English version of changelog>>

NVEnc 4.33
・[x64版のみ] CUDA 10.1に移行。

・3つめのインタレ解除フィルタを追加。(--vpp-nnedi)

・Turing世代のGPUが2倍のコア数として表示されてしまっていたのを修正。

NVEnc 4.34 [2019.03.21 0:00更新]
・x64版でnppライブラリを使用するフィルタ(resizeアルゴリズムの一部やノイズ除去の一部)が使えなくなっていたのを修正。
CUDA更新に伴い、npp*_10.dllが必要です。これらのdllも別のアーカイブで用意したので、必要な場合はこれらもダウンロードしてください。

・--helpに--vpp-nnediについて追記。

CUDA 10.1に移行 (x64のみ)



これまでずっとCUDA 8.0を使ってきたのだけど、Turingでfp16を使用するため、CUDA 10.1に移行した。fp16演算対応自体はCUDA 9から行われているが、fp16の演算を普通の記号(+-*/とかの演算子)で書くことができず、いちいち組み込み関数を使用する必要があったり、CPU側でfp16を取り扱うことができないなど、やたらと不便だった箇所がCUDA 10では見事解消されている。

なお、後にも書いたけど、CUDA 9.0以降はなぜかVisual Studio 2015環境下でのx86ビルドに対応していなくて、そのためx86版はCUDA 8.0のままとしている。



3つめのインタレ解除フィルタの追加



NVENCでは、Turing世代になってH.264のインタレ保持エンコが省略されてしまい、インタレ保持でのエンコードができなくなっているので、基本的にはQSVかx264でインタレ保持エンコするか、あるいはNVENCを使うならインタレ解除してエンコードするしかない。

NVEncにはインタレ解除フィルタとして、
・cuvidのhwインタレ解除
・vpp-afs (自動フィールドシフト)
があるのだけど、cuvidのhwインタレ解除はhwデコード時しか使えないし、自動フィールドシフトのほうはそれなりにくせがあるので、もう一つぐらい選択肢があってもいいのかなと思って、3つめのインタレ解除フィルタとして、nnediをCUDAで実装して追加した。



nnediは、基本的には片方フィールドは捨てて、もう片方のフィールドからニューラルネットを使って輪郭を補正しながらフレームを再構築することでインタレ解除するフィルタ。一般に高品質だといわれている。

一方で比較的重めのフィルタとされていて、最初CUDAで普通に実装したら1フレームに100ms以上かかって8fpsとかしか出なかった…。そこから最適化をいろいろ頑張ってだいぶ速くなり、Turing世代ならfp16が使えるのもあって、それなりの速度は出せるようになってきた。

実装できたのはCPU版の一部の機能で、すべての機能ではないのだけど、かなり疲れてきた(主に高速化のために無駄に複雑化した実装のせいだが…)のでひとまず公開。詳細はこちら



環境
GPU GTX1080 GTX1060 RTX2070
GPUドライバ 419.35
OS Win10 x64
CPU R7 1700 i9 7980XE
RAM DDR4-2400, 2ch DDR4-3600, 4ch
16GB 16GB

入力: ts 1920x1080i, 29.97fps, 10240frame (hwデコード)

出力: HEVC 1080p, 29.97fps

実行コマンド:
NVEncC64.exe --avhw -c hevc --cqp 18:20:23 --audio-copy --tff --vpp-perf-monitor --vpp-nnedi prescreen=[下の表を参照],prec=<fp16/fp32>,nsize=32x4,nns=32

vpp-perf-monitorによる1フレーム当たりの平均処理時間 (ms)
prescreen format GTX1060 GTX1080 RTX2070
fp32 fp32 fp32 fp16
new_block yuv420 8bit 5.18 ms 2.69 ms 2.21 ms 1.11 ms
yuv420 10bit 6.00 ms 2.85 ms 2.22 ms 1.17 ms
none yuv420 8bit 13.79 ms 6.50 ms 6.96 ms 3.14 ms
yuv420 10bit 15.20 ms 7.22 ms 7.13 ms 3.19 ms


やはり、もともと重めなフィルタだけあって、GTX1060などだと完全にフィルタのほうが足を引っ張ってしまい、hwエンコーダに十分な速度でフレームを提供できなくなってしまって、あまり嬉しくない感じ。

一方、Turingで使えるfp16はfp32と比べて理論的には倍速で計算できるので、それ専用に実装してみると、やはりかなり速く、hwエンコードの速度にそれなりについていけるように思う。RTX2070だから速いというのもあるけど、Turingならfp16は使えるはずなので、GTX1660ぐらいでもそこそこ速度が出るのではないだろうか?

まあ、nns/nsize等いじればいくらでも重くできるのがこのフィルタの怖いところ。デフォルトのパラメータは、hwエンコに適するよう比較的軽めのものにしてある。

なお、Turingであってもfp16が使えるのはx64版だけな点に注意。これは、fp16に対応しているCUDA 9.0以降がなぜかVisual Studio 2015環境下でのx86ビルドに対応していないためなので、すみませんがどうしようもないのです…。

もっともAviutlでもエンコーダはプロセスを分けているので、普通にx64 OSなら特に問題はない気もする。



Q: 24fps化したい場合は?
A: たぶんできないで、そちらはvpp-afsでお願いします。

Q: Tensorコアでもっと速くなる?
A: うまく使えばきっと速いのだろうけど、実装が大変そうなのと、GTX1660Ti以下で恩恵がない実装になるのがちょっと…。将来、下位シリーズまでTensorコアが展開されていけばうれしいけど…。

その他不具合・要望等ありましたらコメントください。



ダウンロード>>
ダウンロード (ミラー) >>
OneDriveの調子がいまいちの時はミラー(GDrive)からどうぞ。同じものです。

NVEncCのオプションについてはこちら。
NVEncCオプション一覧>

ソースはこちら>>


スポンサーサイト



コメントの投稿

非公開コメント

No title

ここの記事で良いのか分かりませんが…初歩的な質問すみません

nvencでファイル容量に上限を設けたり、フレームレートの設定は出来ますか?
エンコ初心者なので辛うじてモードをCQP以外にすると最大ビットレートの数値を変えられるようになる程度です(汗)

グラボ使わないx264出力ですと設定出来ますけどエンコに多少時間がかかるので…

Re: No title

> nvencでファイル容量に上限を設けたり、フレームレートの設定は出来ますか?
申し訳ありませんが、NVEncでのファイル容量の上限等の指定はないので、ビットレート指定で調整するしかない状態です。

…個人的にあまりファイルサイズを指定してのエンコードをやらないもので…。

No title

返答有難うございます。
ディスコードは8MBまでなので、ファイル容量に気をつけて変換したかったのですが…そういう時はCPUでの出力と適宜分けて使っていきたいと思います

No title

nnediを実装された件についてお尋ねしたいことがあります
本文中でご指摘のように、Turing世代からインタレ保持エンコードができなくなったが故に、何らかの方法にてエンコード前にインターレース解除をする必要が出ていますが、
実装されたnnediとは別にQTGMCを実装することは可能でしょうか?

インターレース解除の品質としてはnnediよりQTGMCのほうがよいと聞いたことがあるのですが(その分処理が重たくなりますが)、
Amatsukazeの作者曰く
「AmatsukazeのQTGMCフィルタは、QTGMC単独のフィルタではありません。NNEDI3(Bob化)ベースのQTGMCなので、そのままだと細かい文字等が潰れます。
KFMモジュールに実装されている、KStaticAnalyzeとKStaticMergeを使って、止まっている細かい文字等をソースから補間しています。」

との指摘もあり、AviUtlで「NNEDI3(Bob化)ベースのQTGMC」をもちいてインターレース解除をしようとするとAmatsukazeより細かい文字などでの品質が劣ることになろうかと思われます
かといってAviUtlにてAmatsukazeに使用されている「KFMモジュール」というようなものを組み込んで使用するのは一般人にはハードルが高すぎて利用することは困難であろうかと思われます

NVEncにQTGMCを組み込んでいただくことができれば、上記の問題が解消されるのではないかと思われるのですが難しいでしょうか?
また、実装が可能であればなのですが、インターレース解除のみの動作も可能なようにしていただけると汎用性が非常に高くなろうかと思われます

お忙しいことかと思いますが検討いただければと存じます

Re: No title

たしかにQTGMCは高品質であると聞いたことがあります。

問題は、QTGMCの解説(http://avisynth.nl/index.php/QTGMC)などを見ると、最低でも5つのフィルタに依存したとても複雑なフィルタになっているようだということです。

また、KFMモジュールというのは下記リンクのものでよろしいのでしょうか。ぱっと見た感じ「KFMモジュール」というのも非常に複雑そうに見えます。
https://github.com/nekopanda/AviSynthCUDAFilters/tree/master/KFM

QTGMCの関連モジュール(最低5つ?)やKFMモジュールなどのものをすべてNVEncに一からGPUで実装するとなると、わたしがこれらの処理を理解できるかという問題もありますし、できたとしても時間的にかなり困難と思います。nnediは比較的簡単なはずなのですが、わたしがGPUのコードを書いたりするのが下手なせいか、実装に3か月もかかってしまってちょっと辛かったというのがありまして…。(うまくいかなかったりあまりに速度が出なかったりで、途中でしばらく放置したというのもあるのですが)

No title

2019-04-09(22:57)にて書き込みしたものです
KFMモジュールは、リンクされているもので間違いないかと思います

QTGMCはやはりかなり難易度の高いものなのですね
どのように実装するか含め相当時間を要することにはなろうかと思いますが、思い出したときに少しづつというペースでも構いませんので、何卒ご検討よろしくお願いいたします

(おそらくQTGMC以上の品質でインターレース解除できるものは現状存在しないかと思われるのと、Amatsukazeが行うようなVFRベースの解除は、
HDMI 2.1の普及およびハードウェアプレーヤーでのVFRファイル再生対応機器の普及が先々の話になる現状においては、時期尚早の感が強く致しますので、
現時点では60i→60pでの解除を基本とするインターレース解除を誰もが簡単にあとで後悔しなくて済むような品質で解除できることが一番良い選択肢かと思っております)

Re: No title

横からだけど、AmatsukazeのQTGMCと同じように
60i->60p処理を行いたいなら、
AvisynthNeo と AviSynthCUDAFilters を導入して

 SetDeviceOpt(DEV_CUDA_PINNED_HOST)
 infile="D:\input.ts"
 LwLibavVideoSource(infile)
 OnCPU(2)
 KFMDeint(mode=1, ucf=false, nr=false, cuda=true)

のような感じで KFMDeint() を mode=1(QTGMCによる60fps) で
呼び出すスクリプト(avs)を書けばいいだけだと思うよ。
(Amatsukazeで「フィルタをテキストでコピー」してみるといい)

 https://github.com/nekopanda/AviSynthPlus/wiki/Avisynth-Neo
 https://github.com/nekopanda/AviSynthCUDAFilters
 https://github.com/nekopanda/AviSynthCUDAFilters/wiki/KFMDeint
 https://github.com/nekopanda/AviSynthCUDAFilters/wiki/KTGMC

KFMDeint()を呼び出せば、その中で QTGMC または
KTGMC(QTGMCをCUDAで高速化したもの) が呼び出されて、
更に KAnalyzeStatic と KMergeStatic を使った補間も行ってくれる。
そのavsをAviUtlで読み込むなりNVEncCに直接渡すなりして
エンコードすればいいだけ。
一般人でも Avisynth(Neo) の使い方を少し勉強すれば割と簡単にできる。

そんなわけなので、NVEnc側に実装を求めるよりも先に
素直に Avisynth(Neo) の勉強をした方がよいのではないかと思う。
プロフィール

rigaya

Author:rigaya
アニメとか見たり、エンコードしたり。
連絡先(@を半角にしてください!)
rigaya34589@live.jp
github

最新記事
最新コメント
カテゴリ
月別アーカイブ
カウンター
検索フォーム
いろいろ
公開中のAviutlプラグインとかのダウンロード

○Aviutlプラグイン
x264guiEx 2.xx (ミラー)
- x264を使用したH264出力
- x264guiExの導入>
- x264.exeはこちら>

x265guiEx (ミラー)
- x265を使用したH.265/HEVC出力
- x265.exeはこちら>

QSVEnc + QSVEncC (ミラー)
- QuickSyncVideoによるH264出力
- QSVEncCはコマンドライン版
- QSVEncC 導入/使用方法>
- QSVEncCオプション一覧>

NVEnc + NVEncC (ミラー)
- NVIDIAのNVEncによるH264出力
- NVEncCオプション一覧>

VCEEnc + VCEEncC (ミラー)
- AMDのVCEによるH.264出力
- VCEEncCオプション一覧>

svtAV1guiEx (ミラー)
- SVT-AV1によるAV1出力

ffmpegOut (ミラー)
- ffmpeg/avconvを使用した出力

自動フィールドシフト (ミラー)
- SSE2~AVX2による高速化版
- オリジナル: aji様

エッジレベル調整MT (ミラー)
- エッジレベル調整の並列化/高速化
- SSE2~AVX対応
- オリジナル: まじぽか太郎様

バンディング低減MT (ミラー)
- SSE2~AVX2による高速化版
- オリジナル: まじぽか太郎様

PMD_MT (ミラー)
- SSE2~FMA3による高速化版
- オリジナル: スレ48≫989氏

透過性ロゴ (ミラー)
- SSE2~FMA3によるSIMD版
- オリジナル: MakKi氏

AviutlColor (ミラー)
- BT.2020nc向け色変換プラグイン
- BT.709/BT.601向けも同梱

○その他
x264afs (ミラー)
- x264のafs対応版

aui_indexer (ミラー使い方>)
- lsmashinput.aui/m2v.auiの
 インデックス事前・一括生成

auc_export (ミラー使い方>)
- Aviutl Controlの
 エクスポートプラグイン版
 エクスポートをコマンドから

aup_reseter (ミラー)
- aupプロジェクトファイルの
 終了フラグを一括リセット

CheckBitrate (ミラー, 使い方, ソース)
- ビットレート分布の分析(HEVC対応)

チャプター変換 (ミラー使い方>)
- nero/appleチャプター形式変換

エッジレベル調整 (avisynth)
- Avisynth用エッジレベル調整

メモリ・キャッシュ速度測定
- スレッド数を変えて測定

○ビルドしたものとか
L-SMASH (ミラー)
x264 (ミラー)
x265 (ミラー)

○その他
サンプル動画
その他

○読みもの (ミラー)
Aviutl/x264guiExの色変換
動画関連ダウンロードリンク集
簡易インストーラの概要

○更新停止・公開終了
改造版x264gui
x264guiEx 0.xx
RSSリンクの表示
リンク
QRコード
QR