언어의 경계

862025년 09월 14일5

바이너리 크기라는 보이지 않는 세금을 줄이기 위한 다이어트가 성공적으로 진행되면서, Dawn 팀은 다시 한번 기술의 최전선으로 눈을 돌릴 여유를 되찾았다. 하지만 그들이 마주한 다음 도전은, 코드의 양이 아닌 ‘언어’ 그 자체의 경계에서 시작되었다.

문제는 텐서플로우.js 팀과의 정기적인 협력 회의에서 제기되었다.
그들은 WebGPU 백엔드를 통해 놀라운 성능 향상을 이루었지만, 여전히 풀지 못한 숙제가 있었다.

텐서플로우의 샨카르가 설명했다.
“드미트리, 저희의 가장 복잡한 머신러닝 모델 중 일부는, 이미 C++와 CUDA(엔비디아의 병렬 컴퓨팅 플랫폼)로 작성된 고도로 최적화된 커널 라이브러리에 크게 의존하고 있습니다. 이 라이브러리들은 수십 년간 축적된 엔지니어링의 정수죠.”

그는 화면에 복잡한 CUDA 코드를 띄웠다.
“이 모든 코드를 WGSL로 다시 작성하는 것은 거의 불가능에 가깝습니다. 비용도 비용이지만, WGSL의 현재 기능만으로는 CUDA가 제공하는 저수준 메모리 제어나 스레드 동기화 기법들을 완벽하게 재현할 수 없습니다.”

그의 말은 AI와 고성능 컴퓨팅(HPC) 분야의 많은 개발자들이 공통적으로 겪는 문제였다. 그들에게는 이미 거대한 CUDA 자산이 있었고, 그것을 웹으로 가져올 수 있는 다리가 없었다.

샨카르가 조심스럽게 물었다.
“만약… WebGPU가 WGSL이 아닌, 다른 언어로 작성된 셰이더를 직접 실행할 수 있다면 어떨까요? 예를 들어, 저희가 기존 CUDA 코드를 Vulkan의 SPIR-V로 컴파일하면, WebGPU가 그 SPIR-V를 직접 받아 실행하는 겁니다.”

그의 제안은 W3C에서 이미 오래전에 기각되었던, 바로 그 아이디어였다.
WGSL이라는 단일 언어로 통일하여, 웹의 보안성과 플랫폼 독립성을 지키자는 것이 WebGPU의 핵심 철학이었다. SPIR-V를 직접 허용하는 것은, 그 대원칙을 무너뜨리는 판도라의 상자를 여는 것과 같았다.

드미트리는 원칙을 고수하며 대답했다.
“샨카르, 그 어려움은 이해합니다. 하지만 SPIR-V를 직접 허용하는 순간, 우리는 수많은 다른 버전의 SPIR-V와, 그 안에 숨겨진 잠재적인 보안 위협들을 모두 감당해야 합니다. 웹의 안전을 위해 그 길을 갈 수는 없습니다.”

회의는 무거운 분위기 속에서 끝났다. 드미트리의 결정은 옳았지만, 그의 마음은 편치 않았다. 그는 WebGPU가 AI 시대를 위한 최고의 플랫폼이 되기를 바랐지만, 정작 그 시대의 가장 중요한 유산(CUDA)을 품지 못하는 현실이 안타까웠다.

며칠 후, 그 교착 상태를 깬 것은 Dawn 팀의 컴파일러 전문가, 레나였다.
그녀는 드미트리를 찾아와, 대담하고 새로운 아이디어를 제시했다.

“드미트리, 우리가 SPIR-V를 ‘실행’하는 것이 아니라, SPIR-V를 WGSL로 ‘번역’한다면 어떨까요?”

드미트리는 그녀의 말에 집중했다.
“그게 무슨 말이지? 역컴파일(Decompilation)이라도 하자는 건가?”

“비슷하지만 다릅니다.”
레나가 화이트보드에 그림을 그렸다.

[CUDA 코드] -> (Nvidia 컴파일러) -> [PTX (중간 코드)] -> (오픈소스 변환기) -> [SPIR-V]
[SPIR-V] -> (???) -> [WGSL 코드]

“마지막 단계, 즉 SPIR-V를 WGSL로 번역하는 자동화된 변환기를 만드는 겁니다. 이것은 완벽한 역컴파일이 아닙니다. 우리는 셰이더의 모든 로직을 이해할 필요가 없어요. 단지 SPIR-V의 각 명령어에 대응하는, 기능적으로 동일한 WGSL 코드를 생성해내기만 하면 됩니다.”

이것은 발상의 대전환이었다.
브라우저가 위험한 바이너리를 직접 실행하는 대신, 개발자가 자신의 빌드 파이프라인 안에서, 신뢰할 수 없는 바이너리를 안전하고 검증 가능한 WGSL ‘소스 코드’로 변환하는 것이다.

이렇게 변환된 WGSL 코드는, 다른 평범한 WGSL 코드와 마찬가지로 브라우저의 엄격한 유효성 검사를 거치게 된다. 보안의 원칙은 지키면서도, 기존 CUDA 자산의 재사용이라는 목표를 달성할 수 있는 절묘한 방법이었다.

드미트리는 이 아이디어의 엄청난 잠재력을 즉시 알아보았다.
“이것은… CUDA뿐만이 아니야. HLSL, GLSL, 심지어 Metal Shading Language로 작성된 코드까지, 세상의 모든 셰이더 언어를 WGSL이라는 하나의 공용어로 번역할 수 있는 ‘만능 번역기’를 만드는 것과 같잖아!”

그는 레나에게 이 ‘SPIR-V to WGSL’ 변환기 프로젝트의 리더를 맡겼다.
그것은 구글의 공식 프로젝트가 아니었다. 드미트리와 레나는 이 프로젝트를 개인적인 오픈소스 활동으로 시작했다. 그들은 이것이 특정 기업의 이익이 아닌, 웹 생태계 전체를 위한 공공재가 되어야 한다고 믿었다.

프로젝트의 이름은 ‘Naga’라고 지었다. 힌두 신화에 등장하는, 강력하고 지혜로운 뱀의 신의 이름이었다.

Naga 프로젝트는 수많은 기술적 난관에 부딪혔다. SPIR-V의 저수준 포인터 연산을 안전한 WGSL 코드로 변환하는 것은 특히 어려운 문제였다.
하지만 레나와 동료들은 포기하지 않았다.

몇 달 후, Naga는 마침내 첫 번째 의미 있는 결과물을 내놓았다.
샨카르의 팀이 제공한 간단한 CUDA 커널을, Naga를 통해 WGSL 코드로 성공적으로 변환해낸 것이다. 변환된 코드는 사람이 직접 쓴 것처럼 아름답지는 않았지만, 기능적으로는 완벽하게 동일하게 동작했다.

샨카르는 그 결과를 보고 감격을 감추지 못했다.
“당신들이 해냈군요. 당신들은 언어의 경계를 허무는 다리를 놓았습니다.”

드미트리는 이 작은 오픈소스 프로젝트가 가져올 거대한 파급력을 보고 있었다.
WebGPU는 이제 더 이상 새로운 언어를 배워야 하는 장벽이 아니었다.
그것은 세상의 모든 셰이더 언어들이 만나는 거대한 용광로이자, 웹이라는 새로운 세계로 나아가는 관문이 되어가고 있었다. 그는 그 관문을 지키는 문지기가 아니라, 더 많은 사람들이 그 문을 통과할 수 있도록 새로운 다리를 놓는 건축가가 되어 있었다.