느릿늘있

[WebGPU]에 대해서 Araboza...(1) 본문

개발공부

[WebGPU]에 대해서 Araboza...(1)

JHKim93 2023. 6. 13. 23:56
본 게시글은 W3C에 게시된 WebGPU Explainer 글을 학습을 위해 번역한 글입니다.

1. 소개

  WebGPU는 웹 페이지에서 시스템의 GPU를 사용하여 연산 및 복잡한 이미지 생성을 가능하도록 만들기 위해 제안된 Web API이다. 이는 기존에 WebGL이 제공하는 API와 그 목적이 유사하다. 하지만 WebGPU는 시스템 GPU(하드웨어)에 대해 한층 더 발전된 형태의 접근을 가능하게 한다. WebGL이 주로 이미지 생성과 관련된 기능을 제공하고 (엄청난 노력을 통해) 다른 종류의 연산 기능도 제공하게 된 반면에, WebGPU는 태생부터 시스템 GPU의 일반 연산 성능을 웹에서 지원하기 위해 개발되었다.

2. 이용 사례

  • WebGL vs WebGPU 비교
  1. CAD 모델과 같은 다양한 객체를 매우 상세한(highly-detailed) 이미지로 생성합니다. WebGPU의 이미지 생성 명령어들은 독립적으로 WebGL보다 리소스 비용이 작습니다.
  2. realistic한 장면들을 그리기 위한 발전된 알고리즘들을 실행합니다. 많은 최신 렌더링 기술과 최적화 기술들은 일반 연산 성능 부족으로 인해 WebGL에서는 실행할 수 없습니다.
  3. WebGPU를 활용하여 웹에서 머신 러닝 모델을 효율적으로 실행합니다. WebGL에서도 범용GPU(General Purpose GPU, GPGPU)를 사용하여 이러한 연산이 가능하지만 이는 사용하기가 훨씬 더 어렵습니다.
  • 구체적인 사례들
  1. Babylon.js와 Three.js 같은 자바스크립트 3D 라이브러리들의 성능을 새로운 렌더링 기술(compute-based particles, fancier post-processing 등)을 통해 향상시킵니다. 그리고 현재 CPU에서 수행하는 비용이 큰 연산 기능들(culling, skinned model transformation 등)을 GPU에서 수행합니다.
  2. 최신 게임 엔진들을 웹으로 연동하여 더 나은 렌더링 기능들을 선보일 수 있게 만듭니다. 예를 들어, Unity에서 내보내기 기능과 관련하여 WebGL은 가장 낮은 feature set(?)을 사용하지만 WebGPU는 가장 높은 feature set(?)을 사용합니다.
  3. 새로운 종류의 웹 어플리케이션 연동 : 많은 productivity application들의 연산 부하를 GPU로 이동시킵니다. 그리고 일반 연산을 위한 WebGPU의 지원을 요청합니다. (무슨 말인지 모르겠어서 원문을 남깁니다...)
    Porting new classes of applications to the Web: many productivity applications offload computations to the GPU and need WebGPU’s support for general computations.
  4. 화상 회의 어플리케이션들의 성능을 발전시킵니다. 예를 들어, Google Meet은 배경으로부터 유저를 구분하기 위해 머신러닝을 사용합니다. WebGPU로 머신러닝을 실행하는 것은 이를 더 빠르고 효율적으로 만듭니다. 이를 통해 (1) 상대적으로 더 저렴한 장비에서도 접근 가능하게 하며 (2) 더 복잡하고 강력한 모델을 사용할 수 있게 만듭니다.

3. 목적

  1. 온스크린/오프스크린 모두에서 최신 그래픽 렌더링을 가능하게 한다.
    * onscreen/offscreen : 말 그대로 디바이스 화면과 함께 실행하는 상태가 onscreen이고 화면 보여주는 것 없이 기능만 동작하는 상태가 offscreen이다.
  2. GPU에서 범용 연산(general purpose computations)을 효율적으로 실행합니다.
  3. Microsoft의 D3D12, Apple의 Metal 및 Khronos의 Vulkan과 같은 다양한 native GPU API와 호환이 가능합니다.
  4. 특정한 연산을 GPU에서 실행할 수 있도록 고급(human-authorable) 언어를 제공합니다.
  5. 브라우저의 멀티 프로세스 아키텍쳐 구현이 가능하고 웹의 보안을 한층 더 강화한다.
  6. 어플리케이션들이 서로 다른 유저 시스템과 브라우저를 자유롭게 넘나들면서 일할 수 있다.
  7. 유용하지만 신중하게 정의된 방식으로 웹 플랫폼의 나머지 부분과 상호 작용합니다. (본질적으로 어떤 식으로든 이미지를 공유합니다.)
  8. 최신 GPU 기능들이 웹에서 활용될 수 있는 기반을 제공합니다. WebGPU는 모든 최신 native GPU API들의 모든 기능을 제공한다고 할 수는 없지만 유사한 구조를 갖고 있습니다. 그리고 아직까지 포함하지 못하는 최신 기능들은 추후 확장을 통해 제공할 계획이 있습니다.

4. 목적이 아닌 것들

  1. DSP(Digital Signal Processor?) 또는 특화된 머신러닝 하드웨어와 같이 프로그래밍이 완전 불가능하거나 유연하지 못한 하드웨어에 대한 지원
  2. PC/Mobile의 구형 GPU와 같은 범용 연산을 할 수 없는 하드웨어에 대한 지원
  3. native GPU API의 100% 지원 (단일 공급 업체의 기능 혹은 너무 틈새 시장이어서 지원하기 어려운 기능은 WebGPU에 추가하지 않습니다.)
  4. WebGL과 코드 레벨의 광범위한 혼합과 일치화 지원
  5. *CSS Houdini(후디니)와 같은 페이지 렌더링 흐름과 긴밀한 통합

* CSS 엔진에 직접적으로 접근하는 API들을 제공한다. 이를 통해 아직 브라우저에서 제공하지 않는 기능들을 구현하거나(polyfill), 레이아웃을 새로운 방법으로 시도하거나, 창의적인 이펙트들을 추가해볼 수 있다.

5. WebGL 3가 아닌 WebGPU인 이유

  WebGL 1.0과 WebGL 2.0은 각각 OpenGL ES 2.0과 OpenGL ES 3.0 API의 Javascript 버전입니다. WebGL의 설계는 1992년에 출시된 OpenGL 1.0 API까지 거슬러 올라갑니다.(더 나아가 1980년대의 IRIS GL까지도 거슬러 올라갑니다.) 이 계보는 방대한 지식 체계와 OpenGL과 WebGL을 쉽게 연동하도록 하는 등 많은 이점이 있습니다.

  하지만, 이는 WebGL이 최신 GPU들의 설계 방식과 호환되지 않는다는 것을 의미하고 CPU와 GPU의 성능 이슈로 귀결됩니다. 또한, 앞으로도 최신 native GPU API들에 기반한 WebGL을 구현하는 것은 점점 더 어려워 질 것입니다. WebGL 2.0 Compute 또한 범용 연산기능을 추가하려는 시도였지만 native GPU API들과의 impedance(교류회로에서 전압과 전류의 비) 불일치로 인해 구현이 아주 아주 어려웠습니다. WebGL 2.0 Compute의 컨트리뷰터들은 그 대신에 WebGPU에 노력을 집중하기로 결정했습니다.

* WebGL 2는 여전히 구형 설계를 따르고 WebGPU는 설계부터 최신 GPU의 설계 방식과 유사하게 구현하여 하드웨어-소프트웨어 간 호환성이 좋아졌다는 의미. 설계 자체의 fundamental한 변화가 있었기 때문에 WebGL 3가 아닌 WebGPU로 이름을 정함.