조회 수 28129 추천 수 1 댓글 6
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

웬 뚱딴지 같은 제목이냐 하실 분들도 계시겠지만, 일반적인 상황이 아니라 추가 그래픽 카드가 있는 상황이어서 하드웨어 가속 인코더를 사용하지만 CPU 사용 비중이 높은 소프트웨어 필터(대표적으로 샤나의 리사이즈/해상도 변경 필터인 scale)를 사용하는 경우에 한해서 드리는 말씀입니다.

 

좀 원론적인 얘기를 드리자면, 샤나에서 하드웨어 가속을 선택해서 얼마나 속도 향상을 얻을 수 있느냐 하는 문제에 대한 답을 구하기 위해서는 하드웨어 가속의 작동 메커니즘을 파악해야 합니다.

 

샤나에서 하드웨어 가속 인코딩, 그중에서도 NVENC를 이용하는 경우를 예를 들어 보겠습니다. (AMD의 AMF 계열 인코더는 샤나에서 메뉴로 제공하지 않습니다.)

 

'인코딩'이라고 통칭하는 재인코딩, 혹은 트랜스코딩 과정은 개념적으로 간략하게 다음과 같습니다. (워크플로우 자체는 샤나든 다른 프로그램이든 동일합니다.)

 


 

디코딩: 선택에 따라 소프트웨어 디코딩(CPU) vs 하드웨어 디코딩(GPU. 샤나에서는 DXVA2를 통해서만 가능했으나 4.9 버전부터는 D3D11, NVDEC 등 좀 더 다양해짐.)

 

---> 해상도 변경: 리사이징/해상도 변경 필터에 따라 CPU 또는 GPU가 담당하지만 샤나는 소프트웨어 필터인 scale(CPU)만 가능

        (+ 기타 필터 작업)

 

---> 인코딩: 소프트웨어 인코딩(예를 들면 HEVC(x265)나 H264(x264))은 CPU가, 하드웨어 인코딩(NVENC 계열)은 GPU가 담당

 


 

엔비디아 측에서는 하드웨어(GPU) 인코딩 시 해상도 변경(scaling)을 GPU 단계에서 할 수 있도록 하드웨어 필터인 NPP 필터 라이브러리를 제공하는데 이걸 FFmpeg에 포함시키기 위해서는 FFmpeg 바이너리를 컴파일하는 단계에서 해야 합니다. (--enable-libnpp) 샤나인코더는 이 기능을 제외했기 때문에 해상도 변경에 소프트웨어 필터(scale)를 사용해 CPU가 이 역할을 담당합니다.

 

따라서 Nvidia 계열 하드웨어 가속 관련해서 샤나에서는 두 가지 선택밖에 없습니다.

 

  1. [환경설정]에서 '하드웨어 가속 디코딩(DXVA2 또는 D3D11 또는 NVDEC)'을 선택
  2. NVENC 계열 코덱을 선택

 

엔비디아 그래픽 카드(NVENC가 가능한)가 따로 있다면 2번은 당연히 선택해야겠지요.

 

이 문제는 인텔 내장 그래픽 카드를 이용하려 할 때도 마찬가지입니다. 이때는 디코딩을 QSV로, 인코딩을 QSV 계열 코덱을 선택해야겠지요.

 

 

문제는 1번입니다.

 

요즘 나오는 CPU는 GPU를 내장하는 경우가 대부분이기 때문에 엔비디아 그래픽 카드가 따로 있다면 GPU가 두 개가 됩니다. CPU 내장 GPU(인텔의 경우 QSV가 가능한)를 GPU0, 그래픽 카드의 GPU를 GPU1이라고 한다면 가장 이상적인 상황은 1번을 선택할 때 GPU0이 디코딩을 담당해 GPU 간의 밸런스를 맞추는 것입니다. 그러나 문제는 샤나 내에서는 DXVA2/D3D11/NVDEC 옵션을 켜면 그걸 GPU1이 담당하게 된다는 겁니다. (그렇다고 해서 QSV를 선택하면 GPU0이 기능을 하느냐면, NVENC가 선택된 상황에서 QSV 하드웨어 가속 디코딩은 작동하지 않습니다.) 그래서 GPU1이 디코딩과 인코딩을 동시에 담당하여 작업 플로우는 GPU1 -> CPU -> GPU1으로 진행되는데, 대부분의 경우 병목 현상이 생겨 인코딩 성능이 저하되어 속도가 떨어집니다.

 

(이 현상은 다른 프로그램에서도 마찬가지로 발생합니다. FFmpeg CLI와 XMeida Recode를 통해서 확인했습니다.)

 

이때 CPU 점유율은 상당히 낮아집니다. 디코딩과 인코딩을 모두 GPU1이 담당하기 때문에 당연한 현상이겠지요.

 

결론적으로 말하자면, 하드웨어 가속 디코딩을 켜면 GPU1은 효율도 떨어지고 죽어나는데 CPU는 탱자탱자 놀게 됩니다. GPU0은 아예 모른 척하고요.

 

 

이 경우 하드웨어 가속 디코딩을 끄면 오히려 CPU가 디코딩을 담당하면서 CPU 점유율도 충분히 높아지고 더불어 GPU1의 인코딩 효율도 향상되어 속도가 올라가더군요. 물론 CPU의 성능이 충분히 괜찮고 이를 최대한 활용할 수 있어야 한다는 전제가 있긴 합니다.

 

 

----------------------------------------

 

 

속도 향상은 이렇게 해결하게 됐지만 의문은 남습니다.

 

"하드웨어 가속 디코딩을 GPU0이 담당하고 하드웨어 가속 인코딩은 GPU1이 담당하도록 할 수 없을까?"

 

이게 원래 불가능한 건지, 샤나 자체의 문제인지 제가 세팅을 못하는 건지 모르겠습니다. 저로서는 아무리 용을 써도 불가능하더군요.

혹시 이 문제에 대한 답을 알고 계시다면 댓글로 알려 주시면 감사하겠습니다. 그리고 그게 가능할 경우 속도 향상 효과가 있는지도 궁금하군요.

 

<- 이 문제에 대한 답변은 댓글로 추가했습니다.

이 글을 추천한 사람
로엔
Facebook Twitter Pinterest Kakao
  • ?
    핥아버지 2018.06.20 10:25
    많이 배워갑니다 인코딩옵션 많이 아시네요

    그런데 님이 주신 webm 프리셋을 사용해봤는데요

    hevc로 인코딩한거에 비해 깍두기 현상이 많이 생기던데

    님이 인코딩한 영상은 또 괜찮고.. 프리셋 그대로 사용한건데 말이에요

    그리고 비트레이트를 더 높일수 없나요? 4000이상
  • ?
    JKyle 2018.06.20 14:43
    프리셋은 가이드라인으로만 생각하시면 됩니다. 원본의 화질과 원하는 목표 결과물의 해상도, 화질 등에 따라 당연히 옵션을 조정해서 써야 합니다.

    당연히 비트레이트도 높여서 시도해 볼 수 있죠. 단, 높아진 비트레이트에 맞춰 다른 옵션들도 조정하시는 게 좋습니다.

    예를 들어 비트레이트를 4000으로 주고 싶으시면,

    -crf 26 -b:v 4000k -minrate 2000k -maxrate 5600k

    와 같은 식으로 높아진 비트레이트에 맞춰 crf 값을 낮추고(낮출수록 고화질) minrate를 절반 정도, maxrate을 1.45배 정도 맞춰서 설정합니다.

    그리고 추가적으로 quality를 best로 하거나 speed를 4보다 낮은 정수값 (0~3)을 줘서 속도는 느린 대신 화질을 올릴 수도 있습니다. 예를 들어,

    -quality best -speed 4

    다른 옵션들은 굳이 수정할 필요가 없어 보입니다.

    옵션들의 의미와 설정값들을 알아 보시려면 Google의 권고안 문서를 참고하세요.

    https://developers.google.com/media/vp9/the-basics/

    한 가지 팁을 드리자면, 설정하신 값들이 제대로 작동하는지 미리 알아보시려면 좁은 구간(이전 인코딩에서 만족스럽지 못했던 부분)을 설정해서 테스트해 보시고 설정값을 계속 변경하면서 조정하시면 됩니다.
  • ?
    동물들의수다 2018.06.30 14:57
    NVENC 이용해 인코딩 하는데 사나인코딩이 gpu 점유율이 낮아서 속도가 생각보다 안나오더라구요 이번에 4.9버젼으로 업데이트 하고 그래픽드라이버도 업데이트 해서 좀 달라졌을려나했더니 점유율은 역시 비슷하더군요 10프로에서 30프로 왔다갔다 합니다. 요새 풀hd 고화질 고용량이 믾이 나와 기본 hd사이즈로 인코딩해서 폰에 넣어 보는데 그냥 시피유로만 인코딩하면 답이 안나오더라구요 gpu 점유율이 낮아도 확실히 그래픽카드 써서 인코딩 하는게 배 이상 빠릅니다.
  • ?
    JKyle 2018.08.23 13:29

    좀 더 찾아본 결과, 위의 질문

     

    "하드웨어 가속 디코딩을 GPU0이 담당하고 하드웨어 가속 인코딩은 GPU1이 담당하도록 할 수 없을까?"

     

    에 대한 답은, 제가 현재까지 파악하기로는 '불가능하다'입니다.

    디코딩과 인코딩을 서로 다른 GPU가 담당하는 것은 structure가 다른 두 개의 GPU surface를 동시에 이용하는 것이므로 현재 기술로는 불가능한 것 같습니다.

     

    샤나 버전 4.9부터 하드웨어 가속 디코딩이 DXVA2 외에 D3D11(MS Direct3D 11), NVDEC(Nvidia CUDA 하드웨어 디코더), QSV(Intel Quick Sync Video) 등 다양해졌습니다만 기본적으로 중간에 필터 처리 과정에서 소프트웨어 필터(대표적으로 해상도 변경을 위한 scale 필터)를 사용하게 된다면 디코딩을 하드웨어 가속을 하더라도 병목 현상 때문에 속도 저하가 생기는 것은 마찬가지입니다. 그래서 차라리 디코딩을 소프트웨어적으로 처리하는 것(하드웨어 가속 디코딩을 꺼서)이 오히려 속도 향상에 도움이 되는 것은 동일한 것 같습니다.

  • ?
    드로이얀7 2019.03.13 22:04
    좋은 글입니다. 다만 결론 부분의 '디코딩과 인코딩을 모두 GPU1이 담당하기 때문에'는 약간 부정확한 표현으로 보입니다.


    그 위에 적으신 'GPU1 -> CPU -> GPU1으로 진행'이 좀 더 정확한 원인에 가깝습니다. 일례로 요즘 GPU의 VRAM 대역폭은 1TB/s (테라비트 아닙니다. 바이트 맞음)가 나오는 녀석도 있고, CPU의 메인메모리 대역폭도 50GB/s가 넘는 세팅이 충분히 나오는데(당장 DDR4 3200MHz = PC4 25600를 듀얼 채널하면 스펙상 대역폭은 51.2GB/s가 됩니다) PCIE 3.0 16레인의 스펙상 대역폭은 16GB/s (이것도 대충 반올림한 거고 정확히는 15.75 GB/s)에 불과하기 때문에 PCIE를 통해 CPU와 GPU 사이를 왔다갔다 하는 데서 성능을 다 까먹는 겁니다.

    그러니깐 CPU 필터를 쓰지 않고 GPU 내에서 다 처리하는 상황을 만든다면, 디코딩과 인코딩을 모두 GPU1이 담당하더라도 상대적으로 성능이 잘 나올 거라는 얘깁니다.

    실제로 그 때문에 AMD가 만든 게 APU (HSA 사상)이고, NVIDIA는 NVLINK (2세대 풀스펙 기준 양방향 300GB/s)를 만들었고, 구글 딥마인드가 자기들 전용으로 TPU를 만든 이유 중에 하나이기도 합니다. 구글에서 발표한 뉴럴기계번역 논문에 의하면 특정 조건하에서 TPU의 속도는 Tesla K80이라는 고가 전문 연산용 그래픽카드(당시 해외직구 시 480만원짜리)보다 10배 이상 빠르다고 하는데, 이에 대해 사람들이 팩트체크 해보니 순수 칩의 연산 능력이 10배가 아니라 CPU와 통신하느라 성능 다 까먹는 상황에 비해 10배가 빠르다는 결론이 나온 바 있죠.(비교에 사용한 연산 자체가 GPU에서만 돌릴 수 없고 CPU와 데이터를 주고받으면서 처리해야 한다고 하네요.)
  • ?
    Windows10 2022.01.04 07:28
    결국 끄는 방법은 없나보네요..

List of Articles
번호 제목 글쓴이 날짜 조회 수 추천 수
2 SSIM, PSNR로 측정한 NVENC 인코딩 4 file JKyle 2018.09.09 4268 0
» 하드웨어 가속 디코딩을 꺼서 인코딩 속도를 높이기 6 JKyle 2018.06.19 28129 1
Board Pagination Prev 1 Next
/ 1