어푸푸

DLSS: 그 허와 실에 대하여 본문

잡동사니/IT

DLSS: 그 허와 실에 대하여

예수님부처 2020. 6. 30. 19:43

시간이 흐르면서 생각이 바뀌었다. 현재의 DLSS는 매우 제약이 많고 성능이 불충분하나, 딥러닝으로 아주 좋은 성능의 스케일링을 하는 것은 가능하다. 명백히 가능하다. 아래 글은 embedding vector를 제외하고 생각하면 그렇게까지 틀린 이야기는 아니다. 하지만 embedding vector를 생각해보면 인공신경망이 언젠가는 분명히 좋은 리스케일링을 수행할 수 있을 것이다. 당시의 내 생각을 보존하기 위해서 취소선 처리만 하고 남긴다. 근데 생각이 또 바뀌면 지울 수도 있다. 사람이 왜 그러냐고? 몰?루

아마도 비디오 기술 및 비디오 게임에 관심이 있는 사람이라면 DLSS에 대하여 한 번쯤은 들어봤을 것이다. 그러나 우리는 할 것 많고 바쁜 현대인이다. 궁금하다고 해도 알아보기에는 시간이 들고, 심지어 시간을 들여 알아봐도 내 전공 분야가 아니라면 도대체 뭐라는 것인지 알 수가 없는 것이다. 더 큰 문제는 온갖 뇌피셜과 가짜 정보들이 인터넷에 난무한다는 것이다. 슬프게도 시간을 많이 써서 DLSS에 대해 인터넷에서 찾아보고 이해했다고 할지라도 틀린 정보일 수 있다는 것이다. 그렇다면 온갖 뇌피셜과 가짜 뉴스가 넘쳐나는 세상에 도대체 DLSS에 대한 정보를 어디에서 찾아보고 이해해야 할 것인가?

이에 이 포스트에 필자 나름대로 DLSS에 대해서 정리를 하고자 한다. 물론 필자는 전산학부 전공도 아니요, 컴퓨터 그래픽스 전공도, nVidia에서 일하는 것도 아니다. 하지만 인공신경망으로 연구를 수행하는 비루한 대학원생으로서 DLSS의 자세한 내부적인 구조는 몰라도 뭐가 어떻게 돌아가는 것인지는 파악이 된다고 할 수 있겠다. 마침 DLSS과 모티브가 비슷한 연구를 하고 있기 때문에 그런 것 같기도 하다. 특히 근거없는 자신감을 가지는 사람들이 꽤나 많고, 그들이 확신과 잘못된 신념을 가지고 잘못된 정보를 퍼뜨리고 있으니 걸러 듣자. (어쩌면 이 포스트도 예외가 아닐지도 모른다.)

DLSS는 엔비디아사에서 개발한 기술로 Deep Learning Super Sampling의 약자이다. 말 그대로 딥 러닝을 이용하여 수퍼 샘플링을 수행하는 모델이다. 다시 말하자면 인공신경망을 이용하여 조그만한 그림을 더 큰 그림으로 바꿔주는 모델이라고 할 수 있다. 그렇다면 도대체 조그만한 그림을 왜 큰 그림으로 바꿔야되는 것이며 듣기로는 간단한 작업 같은데 그걸 뭐 굳이 요즘 핫한 기술인 인공신경망까지 동원해가면서 한단 말인가? 그거 그냥 포토샵에서 하는 것처럼 대충 늘리면 안되는 것인가? 이 두 질문이 DLSS를 이해하는데에 시작이 된다.

우리는 모두 게임을 할 때 모니터를 본다. 바꿔 말하면 컴퓨터에서는 CPU와 램에서 정신없게 돌아가고 있는 결과물을 모니터에 어떻게 표현할지를 또 다시 정신없게 계산해서 해당 결과를 모니터로 뿌려줘야 한다는 이야기이다. 이러한 렌더링 과정에 걸리는 시간은 해상도에 크게 영향을 받는다. 문제는 그래픽카드 및 연산 기술의 발전 속도보다 모니터의 발전 속도가 빠르다는 것이다. 모니터는 QHD, UHD 해상도로 나오는 시대에 들어왔는데, 게임을 풀 옵션으로 UHD 해상도에서 돌리기에는 엄두도 안나는 것이요, 특히 레이트레이싱을 고려하여 렌더링 할 경우 한 화면을 계산하는데에 시간이 너무 많이 걸리는 것이다. 이렇게 계산 시간이 늘어나게되면 1초에 그릴 수 있는 화면의 수가 (FPS) 줄어들게 되므로 60FPS에 길들여진 현대인은 온갖 거북한 감정을 느끼게 된다.

그렇다면 해상도를 높이면서 계산을 더 하지 않는 방법이 있지 않을까? 불행히도 아직까지 그런 방법은 존재하지 않는 것으로 보인다. 그런 방법을 개발만 한다면 돈 방석에 올라앉을 수 있을지도 모른다. 먼 훗날 누군가가 개발을 할 지도 모르지만 현재로써는 요원한 방법이라고 할 수 있겠다. 따라서 해당 방법은 논외가 된다. 두 번째로 그래픽 옵션을 적당히 타협하면 당연히 연산 시간이 줄어든다. 하지만 그래픽 퀄리티를 높이기 위해 레이 트레이싱을 집어넣느라 연산량이 많아져서 FPS가 떨어졌고, 이를 해결하려고 하는 것인데 그래픽 옵션을 줄인다는 것이 말이나 되는 이야기인가? 그래서 엔비디아에서는 다른 방법으로 눈을 돌리게 된다.

"그럼 그냥 해상도를 낮춰서 렌더링을 하고, 그 결과물을 높은 해상도로 바꾸면 되는거 아니야?" 얼핏 들으면 꽤나 그럴싸한 이야기이다. 하지만 간과하면 안되는 것은 이미 작은 해상도를 높은 해상도로 바꿔주는 기술은 이미 충분히 많이 연구가 된 기술이라는 것이다. 이러한 기술을 업스케일링이라고 한다. 이 기술은 기본적으로 사용이 되는 기술인데, 게임을 전체화면으로 설정한다면 게임 내에서 아무리 해상도를 낮춰도 모니터에 꽉 차게 나올 것이다. 이는 그래픽카드가 자동으로 업스케일링을 해주기 때문에 모니터에 꽉 차게 나오는 것인데, 필자가 예전에 테스트를 해봤을 때에는 bi-linear 방법은 아니고 bi-cubic 방법이 아닐까 싶다. 여기에서 지금까지 굳이 낮은 해상도에서 게임을 하지 않았던 이유가 나오는데, 낮은 해상도로 렌더링을 하고 꽤나 최신 방법으로 업스케일링을 하더라도, 애초부터 높은 해상도에서 렌더링을 한 결과물과 차이가 크게 나온다는 것이 바로 그 이유이다.

엔비디아는 다시 생각한다. "그렇다면 통상적인 업스케일 방법이 아니라, 기똥차게 좋은 업스케일 방법을 적용하면 되지 않나?"하고 말이다. 물론 다음과 같은 생각이 뒤따랐을 것이다. "물론 그 기똥하게 좋은 업스케일 방법이 뭔지는 모르지만 말이야. ㅎ" 이때 빛과 같은 존재가 있었으니 바로 딥 러닝이 그것이다. 딥 러닝에서는 데이터 베이스를 잘 구성해주거나, GAN 같은 방법을 쓰기만 하면 어떻게 생겨먹었는지 모르겠는 방법도 구현이 가능하다. 다시 말해 딥 러닝을 사용하면 원리를 알 필요도 없이 '기똥차게 좋은 업스케일링 방법'을 구현할 수 있을지도 모르는 것이다. 이에 따라 엔비디아에서는 딥 러닝을 이용해서 낮은 해상도 이미지를 높은 해상도 이미지로 바꿔주는 DLSS를 개발하게 된다.

사실 여기까지만 들었을 때에는 "그럼 잘된거 아냐?"라는 말이 절로 나올만하다. 사실 아이디어가 좋기도 하고, 요즘 인공신경망은 이미지처리, 자연어처리 등 온갖 분야에서 활약을 하고 있으니까 마치 '마법의 요술봉'처럼 보이기 때문이다. 사실 필자도 그렇게 생각하고 졸업 주제로 인공신경망 분야에 뛰어들었다. 제길... 인공신경망이 휘릭 하고 휘두르면 뿅 하고 결과물이 나오는 요술 지팡이가 아니라는 것을 아무도 얘기해주지 않았기 때문이다. 연일 언론과 연구자들이 인공신경망 예찬론을 펼치니 나도 모르게 당하고 만 것이었다. 하지만 인공신경망은 결국 수치 대리 모델이고 (numerical surrogate model), 모든 모델들이 그러하듯이 장점도 있고 단점도 있다.

이러한 단점은 DLSS 1.0에서 적나라하게 드러난다. 해외에서도 꽤나 다루어진 주제인데, DLSS를 썼더니 오히려 통상적인 업스케일 기능을 사용한 것보다 더 안좋은 결과가 나올 때가 상당히 많았던 것이다.(https://www.techspot.com/article/1873-radeon-image-sharpening-vs-nvidia-dlss/)
아마 엔비디아는 크게 당황했을것이다. 더 높은 해상도에서 FPS를 올려준다는 말장난을 치면서 야심차게 추진했던 프로젝트인데 통상적인 업스케일 방법보다 더 안좋은 결과물이 나온다니... 심지어 FPS를 올려준다는 것도 말장난인게 렌더링은 저해상도에서 해놓고 '높은 해상도에서 FPS가 증가해요'라고 말하는 것은 명백한 사기이다. 그렇다면 그래픽카드가 업스케일을 해주도록 게임 전체화면 해상도를 낮춰놓으면 항상 FPS가 증가한다고 말할 수 있게?

심지어 모션이 있는 부분에서는 일그러지거나, 아예 플리커링이 생기는 경우도 많았는데, 필자가 생각하기에 이는 DLSS를 사용하는 이미지 영역을 크게 잡아서 그런 것으로 보인다. 왜냐하면 local pixel distribution이 변하지 않는데 인공 신경망의 결과물이 달라질 리가 없기 때문이다. 모션이 있다면 local pixel distribution은 그대로일지라도 global pixel ditribution이 달라지므로, 모션근처에서의 이미지는 전혀 다른 이미지가 되기 때문이다. 어찌보면 이는 인공신경망의 한계라고 볼 수도 있고, 그냥 학습 데이터베이스 구성을 잘못했다고 볼 수도 있다. 애초에 저런 경우를 잘 처리하도록 학습을 잘 했으면 그런 문제를 최소화 시킬 수 있다. (발생하는 것 자체를 막기는 힘들다.)

라데온에서는 조금 다른 접근 방법을 취했는데, 이미지를 업스케일링하면서 흐려진다면, 애초에 낮은 해상도 이미지를 인위적으로 더 선명하게 만들면 되지 않느냐는 것이었다. 이후에 통상적인 방법을 통해 업스케일하면 '짜잔 좋은 품질로 업스케일링이 되었습니다.'가 된다. 당연히 해외에서도 이러한 사실을 알아차렸고 라데온의 이미지 선명화 방법인 RIS의 판정승으로 모든 것이 마무리되는 듯 했다. 원본보다 더 안좋은 품질을 보여주기도 하는 DLSS를 쓰느니, 계산 비용도 작고, 품질도 확실하게 향상이 되는 RIS를 쓰면 되는 것이니 말이다. 화들짝 놀란 엔비디아는 라데온의 RIS와 거의 동일한 결과를 내는 이미지 선명화 방법을 업데이트했는데, 진실은 엔비디아 내부 개발진만이 알 것이다. 다만 킹리적 갓심으로는 RIS를 참고해서 거의 그대로 베끼지 않았을까 싶다. RIS는 소스가 공개되어있기 때문이다.

그렇지만 수 많은 인건비를 투입한 엔비디아에서 가만히 있을리가 없었다. 사실 인공신경망으로 업스케일링 (super resolution이라고 표현하기도 한다)를 수행하는 것 자체는 꽤나 많이 연구가 진행되고 있는 부분이기도 하고, 아이디어 자체도 괜찮기 때문이다. 그리하여 엔비디아에서는 DLSS의 버전 업을 거듭하여 드디어 DLSS 2.0을 냈고, 꽤나 많은 것들이 개선된 것처럼 보였다. 화면 자체도 DLSS 1.0보다 훨씬 더 선명해졌고, 모션이 있는 부분에서 디테일이 뭉개지는 것도 해결이 된 것처럼 설명해줬기 때문이다. 하지만, 나는 여전히 DLSS 2.0가 갈 길이 멀었다고 생각한다. 앞서 말했듯이 인공 신경망은 장점도 매우 크지만, 고유한 단점도 있는데, 그런 단점들이 해결되지 않는 모습이 보이기 때문이다.

엔비디아는 모션이 있는 경우 이렇게 개선되었다고 홍보했다

당연히 해결됐다니 축하할 일이지만... 인공신경망을 사용하는데 저런 문제를 원천적으로 회피할 수 있을까? 그에 대한 내 대답은 "매우 힘들껄?"이다. GAN에도 최초 데이터베이스가 필요하고, GAN을 쓰지 않더라도 인공신경망을 훈련하기 위해서는 데이터베이스가 필요하다. 그런데 실시간으로 변화하는 이미지에 대해서 일관되게 적용될 수 있는 데이터베이스를 만들 수 있을까? 이는 사진에 딥러닝을 적용하는 것과는 약간 다르다. 연속된 사진에 적용하려면 사진이 조금 변한다고 해서 결과물에 flickering이 생기면 안되기 때문이다. 결국 더 촘촘한 데이터베이스가 필요하고, 시간에 대하여 결과물을 평균 내는 등의 기법을 적용해야 하기 때문이다. DLSS 영상을 보았을 때 움직이는 부분 근처에서 퀄리티가 떨어지는 것을 보니 평균내는 기법은 적용된 것으로 보이고, 문제는 데이터베이스가 된다.

데이터베이스가 방대하게 구성될수록, 그리고 인공신경망이 성공적으로 학습될수록 DLSS는 더 좋은 결과물을 보일 것이다. 그러나 문제가 있다. 데이터베이스가 너무 많아지면, 이에 대응하는 인공신경망 크기가 커져야하고, 이는 인공 신경망의 연산 시간이 늘어나게 된다는 치명적인 단점이 있다. 그렇다고 데이터베이스를 줄이자니 모델의 성능이 나빠질 것이다. FHD 기준으로 이론적인 최대 데이터베이스의 경우의 수는 255 ^ (1920*1080)개이다. 당연히 현실적으로 이를 구성할 수는 없으니 적당한 이미지들을 모아서 데이터베이스를 구성해야 하는데, 앞서 말한 딜레마가 문제가 된다. 데이터 베이스의 사이즈가 작으면 모델의 성능이 안좋을것이요, 데이터베이스의 크기만 늘리면 학습이 잘 안될것이요, 데이터베이스와 모델의 크기를 같이 늘리면 연산 시간이 늘어나는 것이다.

이에 대한 해결책으로 엔비디아가 어떤 방법을 채택했는지는 알 수 없다. 혹은 공개되었어도 내가 굳이 안찾아봤다. 다만 현실성 있는 대안은 데이터 베이스 자체의 해상도를 줄이는 것이 유일한 것으로 생각된다. 예를 들자면 1920*1080 이미지를 100개의 192*108 이미지로 자르고, 이를 다 데이터베이스에 포함시키는 것이다. 이렇게 할 경우 이론적인 최대 데이터베이스 크기도 줄어들고, 인공신경망 크기도 줄어들어 연산량이 줄어든다. 다만 여전히 이론적인 데이터베이스의 크기는 255^(192*108)정도가 될 텐데, 여전히 말도 안되는 크기라는 것이다. 그래도 이제는 다소 성기게 데이터베이스를 구성해도 어느정도 돌아가게 된다. 다시 말하자면 1억개의 이미지들은 FHD 해상도에서 불충분한 데이터베이스일 수 있으나, 192*108 해상도에서는 꽤나 그럴싸한 데이터베이스가 될 수 있다는 것이다. (당연한 이야기이다.) 문제는 과연 몇 개의 이미지가 그럴싸한 데이터베이스냐는 것이요, 과연 인경 신경망이 그만한 데이터베이스를 감당할 수 있냐는 것이다. 또한 데이터베이스에 빠진 이미지가 없는 것인지도 문제가 된다.

필자가 보았을 떄 DLSS가 어느정도 성공적으로 동작하고 있으므로 데이터베이스의 크기는 그래도 적당히 동작할 정도는 되어보이고, DLSS 1.0 개발 이후 피드백에서 데이터베이스에서 어떤 이미지들이 보강되어야 하는지 찾은 것으로 보인다. 아마 데이터베이스를 보강하여 모션이 있는 경우에 디테일이 뭉개지는 것을 개선하지 않았나 싶다. 문제를 개선하는 것과 일반적으로 보았을 때 높은 퀄리티의 결과를 일관성 있게 내는 것은 다른 문제이다. 학술적으로 봤을 때 DLSS 1.0은 꽤나 가치 있는 결과물이지만, 욕을 왕창 먹었던 이유와 일맥상통한다.

DLSS 2.0의 control에의 적용 (ref: 보드나라 기획 특집)

(https://www.bodnara.co.kr/bbs/article.html?num=162343)

위 그림은 게임 control에 DLSS 2.0을 적용한 경우와 끈 경우를 비교한 것이다. DLSS quality balance, performance는 렌더링 해상도와 관련이 있다고 하는데, 보나마나 두 경우 중 하나이다. 인공 신경망 자체의 크기가 다르거나, 한 사진 안에서 인공신경망을 호출하는 횟수가 다르거나. 전등 부분을 보면 바로 티가 나는 것이 artifact가 생긴다. 심지어 DLSS를 끈 것에 비해 퀄리티가 눈에 띄게 낮아졌다고 볼 수 있는 부분이므로 DLSS 2.0가 또 다른 한계를 보였다고 생각할 수도 있다. 그래도 내 생각에 이정도는 대비가 심한 이미지를 데이터베이스가 포함해서 고칠 수 있는 부분이라고 보인다. 또 다른 문제점은 빛이 자연스럽게 퍼지지 못하고, 마치 미세한 가로줄과 세로줄이 있는 것처럼 보인다는 것이다. 필자는 이러한 부분이 인공신경망 자체의 문제에서 기인했거나, 혹은 인공 신경망을 여러 번 호출하여 얻은 출력 이미지를 평균낼 때 미세한 fluctuation이 눈에 보이는 형태로 나타난 것으로 생각한다.

DLSS 1.9 및 2.0 비교: 글자에 Artifact가 생긴다.
DLSS 2.0에서 조금 줄어들긴 했지만, 모션이 있을 때 외곽선이 일그러지고, 주변 디테일이 깨지는 현상이 여전히 있다

https://www.youtube.com/watch?v=YWIKzRhYZm4

위 그림들에서 볼 수 있듯이 DLSS 2.0에는 없던 artifact 문제가 생기기도 했으며, 그 정도가 줄어들긴 했으나 움직이는 물체 외곽선이 일그러지고, 주변 디테일이 깨지는 현상이 여전히 나타난다. 왜 이런 현상이 생기느냐면 여전히 데이터베이스가 충분하지 않기 때문이다. 데이터베이스를 만들 때 저런 그림이 있었다면 당연히 잘 동작했을 것이다. 그러나 모든 게임에 적용되기에 충분하도록 데이터베이스를 만들라는 것은 꽤나 가혹한 이야기이다. 게다가 인공 신경망이 그렇게 만든 데이터베이스를 다 소화하도록 잘 학습이 되느냐는 것도 다른 이야기이다. 어쨌거나.. 이러한 그림들과 영상에서 볼 수 있듯이 DLSS 2.0은 여전히 갈 길이 멀다. 그리고 인공신경망을 연구하는 입장에서 보자면 이러한 문제들을 완벽히 해결 할 수 있을지도 미지수라고 본다. 알고리즘은 어느 데이터에나 적용할 수 있지만, 인공신경망은 데이터베이스에 없는 데이터를 다룰 수 없고, 그 데이터 자체가 크기 때문이다. 심지어 artifact가 생기는 원인은 DLSS로 샤프닝이 충분히 되지 않는다고 생각해서 과도하게 sharp하게 만드려다가 생긴 참사로 보인다.

다만 위와 같은 문제들은 다음과 같이 완화될 수 있을 것으로 생각한다. (만약에 이미 적용이 되지 않았다면)

1. 그림의 데이터가 RGB라면 이를 분리시키고 호출할 때 R, G, B에 대하여 따로 호출하기. 이렇게 하면 데이터베이스를 줄이는 효과가 나는 동시에, 데이터베이스를 세 배 키울 수 있다. CAS를 가지고 이것저것 해봤던 경험으로 보았을 때 오히려 더 결과가 좋아질 수도 있다.

2. Activation function에 binary mask 역할을 할 수 있는 softplus나 Heaviside step function을 사용하여 sharpening이 적용되는 곳과, 그렇지 않은 곳을 구별하기: 이건 라데온의 CAS에서도 사용되는 방법이고, 꽤나 효과가 있을 것으로 생각된다. Binary mask를 수치적으로 따로 구현해도 되겠지만, 이럴 경우 불연속한 지점이 보일 수도 있다. 혹은 Binary mask를 계산해주는 인공신경망을 하나 더 써도 될 듯하다.

3. 데이터베이스에 샤프닝을 적용하려고 하지 말고 결과물에 적용하기

4. Multi-modal 딥러닝 모델 사용하기. 나도 간과했던 사실인데 DLSS에는 ground truth가 있다. 한 번씩 원본 해상도를 multi-input 중 하나로 주면 꽤 많은 문제점이 해결될 것으로 예상한다.

 

더 풀어쓰고 자세하게 더 많은 내용을 다루고 싶은데, 그러기에는 들이는 시간이 좀 아깝다. 대충 여기에서 끝내고자 한다.

총총