레이 트레이싱이라는 거대한 미래를 향한 항해가 막 시작되었을 무렵, 드미트리는 현재의 WebGPU가 가진 또 다른 근본적인 한계에 직면하게 되었다. 이번에도 그 신호는 텐서플로우(TensorFlow) 팀과의 기술 회의에서 왔다.
텐서플로우.js의 WebGPU 백엔드는 대성공을 거두었다. 하지만 텐서플로우 팀의 야망은 거기서 멈추지 않았다. 그들은 이제 단순히 모델 ‘추론(Inference)’을 넘어, 브라우저에서 직접 모델을 ‘훈련(Training)’시키는 기술을 연구하고 있었다.
텐서플로우의 리드 아키텍트, 샨카르가 설명했다.
“모델 훈련은 추론보다 훨씬 더 계산 집약적입니다. 순전파(Forward Pass)뿐만 아니라, 역전파(Backpropagation)를 통해 수백만 개의 가중치를 업데이트해야 하죠. 저희는 이 모든 연산을 WebGPU 컴퓨트 셰이더로 구현하는 데 성공했습니다. 문제는… 성능입니다.”
그는 프로파일링 데이터를 보여주었다. GPU는 맹렬하게 돌아가고 있었지만, 전체적인 훈련 속도는 네이티브 텐서플로우에 비해 현저히 느렸다.
“저희 분석 결과, 병목은 개별 셰이더의 연산 속도가 아니었습니다. 문제는, WGSL이 현대 AI 하드웨어의 특수한 능력을 충분히 활용하지 못한다는 점에 있었습니다.”
그는 한 줄의 텐서플로우 연산 코드를 보여주었다.
C = A * B + D;
“이것은 융합 행렬 곱셈-덧셈(Fused Multiply-Add, FMA)이라는, AI 연산의 가장 기본적인 빌딩 블록입니다. 현대 GPU들은 이 FMA 연산을 하드웨어 레벨에서 직접, 극도로 빠르게 처리하는 특수한 ‘텐서 코어(Tensor Cores)’나 ‘매트릭스 엔진(Matrix Engines)’을 내장하고 있습니다.”
그의 목소리에 아쉬움이 묻어났다.
“하지만 현재의 WGSL에는, 이 특수 하드웨어를 직접 호출할 수 있는 방법이 없습니다. 저희는 이 간단한 연산을 위해, 별도의 곱셈 셰이더와 덧셈 셰이더를 순차적으로 실행해야만 합니다. 하드웨어의 잠재력을 절반도 사용하지 못하고 있는 셈이죠.”
이것은 드미트리에게 충격적인 지적이었다.
그들은 지금까지 WebGPU를 범용 계산(General-Purpose) 플랫폼으로 설계해왔다. 하지만 AI의 시대는, 범용성을 넘어 ‘특정 작업에 고도로 특화된’ 하드웨어의 시대로 넘어가고 있었다. 그리고 WebGPU의 문법은 그 변화를 따라가지 못하고 있었다.
W3C 회의.
드미트리는 이 문제를 ‘매트릭스 연산을 위한 저수준 API’라는 이름으로 상정했다.
“우리는 WGSL에 새로운 문법을 추가해야 합니다. 개발자가 ‘이것은 단순한 계산이 아니라, 행렬 연산이다’라고 명시적으로 선언하고, 브라우저가 이를 인지하여 하드웨어의 텐서 코어를 직접 활용하도록 만들 수 있는 방법이 필요합니다.”
이 제안은 즉시 격렬한 논쟁을 불러일으켰다.
한 브라우저 엔지니어가 반박했다.
“너무 위험한 발상입니다! 그것은 WGSL을 특정 하드웨어 아키텍처에 종속시키는 일입니다. 만약 텐서 코어가 없는 구형 GPU에서는 어떻게 동작하게 할 겁니까? 웹 표준은 하드웨어 독립적이어야 한다는 대원칙이 깨지게 됩니다.”
그의 반론은 정당했다.
하지만 샨카르와 같은 AI 개발자들의 입장은 달랐다.
“그렇다면 웹은 영원히 AI 하드웨어 가속의 혜택을 받지 못하는 반쪽짜리 플랫폼으로 남을 겁니다. 우리는 선택권을 가져야 합니다. 하드웨어가 지원한다면 최고의 성능을 내고, 지원하지 않는다면 조금 느리더라도 범용 셰이더로 동작하는, 우아한 대체(Fallback) 메커니즘을 만들면 되지 않습니까?”
이것은 ‘보편성’과 ‘최고 성능’ 사이의 영원한 딜레마였다.
긴 논의 끝에, 커뮤니티는 ‘실험적 확장 기능’이라는 카드를 다시 한번 꺼내 들기로 했다.
그들은 matrix-multiply-add
와 같은, 매우 구체적인 이름의 새로운 내장 함수(Built-in Function)를 WGSL에 추가하는 방안을 탐색하기 시작했다.
let C = matrixMultiplyAdd(A, B, D);
개발자는 이 함수를 사용함으로써, 브라우저에게 자신의 의도를 명확히 전달한다.
브라우저는 이 함수 호출을 받으면, 먼저 현재 GPU가 하드웨어 매트릭스 엔진을 지원하는지 확인한다. 만약 지원한다면, 가장 빠른 네이티브 명령을 직접 호출한다. 만약 지원하지 않는다면, 브라우저는 이 함수를 일반적인 곱셈과 덧셈 연산을 수행하는 폴리필(Polyfill) 셰이더 코드로 내부적으로 대체하여 실행한다.
이것은 양쪽의 요구를 모두 만족시키는, 영리한 타협안이었다.
개발자는 하드웨어의 복잡성을 신경 쓸 필요 없이, 단지 의도만 선언하면 된다. 브라우저는 그 의도를 해석하여, 현재 환경에서 가능한 최선의 선택을 내린다.
Dawn 팀과 텐서플로우 팀은 이 새로운 내장 함수의 프로토타입 구현과 테스트에 착수했다.
이것은 단순히 함수 하나를 추가하는 것이 아니었다.
그것은 WGSL이라는 언어의 문법을, 기계 학습이라는 새로운 시대의 언어에 맞춰 진화시키는 첫걸음이었다.
드미트리는 깨달았다.
그가 만든 언어는 더 이상 그의 것이 아니었다.
그것은 이제 텐서플로우와 같은 거대한 파트너들의 요구와, 끊임없이 변화하는 하드웨어의 지형에 맞춰, 스스로의 문법을 바꾸고 확장해나가는 살아있는 유기체였다.
그의 역할은 이 언어의 주인이 아니라, 그 언어가 길을 잃지 않고 건강하게 성장할 수 있도록 돕는, 신중한 정원사였다. 그리고 그는 그 정원에, ‘기계 학습’이라는 이름의 새로운 씨앗이 뿌려지는 것을 경이로운 눈으로 지켜보고 있었다.