huggingface/kernels 소개: 로컬 AI를 위한 200개 이상의 WebGPU 커널
요약
Hugging Face가 로컬 AI 구동을 위한 WebGPU 커널 라이브러리 `@huggingface/kernels`와 207개 이상의 최적화된 커널 컬렉션을 공개했습니다. 이 커널들은 머신러닝의 핵심 연산을 다루며, 각 커널은 버전 관리 및 명시적인 계약과 함께 제공됩니다. 또한, 브라우저 기반 성능 테스트 스위트인 Fleet을 출시하여 크라우드소싱 방식으로 하드웨어 전반의 정확성과 성능 증거를 수집합니다.
핵심 포인트
- WebGPU 커널 라이브러리로 로컬 AI 구동 환경 구축
- 207개 이상의 ML 핵심 연산에 대한 최적화된 커널 제공
- 커널별 명시적인 계약과 재현 가능한 테스트 케이스 포함
- Fleet을 통해 크라우드소싱 기반의 성능 및 정확성 벤치마킹 가능
오늘, 우리는 그 노력의 첫 번째 레이어를 공개합니다: @huggingface/kernels
이것은 Hugging Face Hub에서 최적화된 WebGPU 커널을 로드하고 실행하기 위한 최소한의 라이브러리이며, huggingface.co/webgpu-kernels에 초기 207개의 커널 컬렉션과 함께 제공됩니다.
이 컬렉션은 광범위한 머신러닝 아키텍처와 워크로드를 통해 사용되는 연산을 다룹니다. 더 중요한 것은, 각 커널이 완전하고 버전 관리되는 패키지로 게시된다는 점입니다: 인터페이스, 셰이더 템플릿, 정확성 케이스, 벤치마크 케이스 및 사용 지침이 모두 Hub에 함께 존재합니다.
또한, 우리는 브라우저 내 GPU 벤치마킹 및 테스트 스위트인 Fleet을 출시합니다. 이는 여러분의 하드웨어에서 커널을 실행하고 점수를 매깁니다. 자신의 장비에 대한 결과 외에도, Fleet은 커뮤니티가 기존 테스트 랩에서는 다룰 수 없었던 장치들로부터 성능 및 정확성 증거를 기여할 수 있는 방법을 제공합니다. 동의하에, 모든 실행은 실패(잘못된 결과, 병적으로 느린 경우 등)를 찾는 데 도움을 주고, 커널 변형을 개선하며, 실제 하드웨어 전반에 걸쳐 더 나은 최적화 결정을 내릴 수 있는 개인적인 증거를 추가합니다.
207개의 WebGPU 커널이 webgpu-kernels 조직의 개별 레포지토리로 게시되었습니다. Apache-2.0 라이선스입니다.JavaScript 로더인 @huggingface/kernels는 Hub에서 커널을 다운로드, 준비 및 실행합니다.매니페스트, 정확성 테스트, 벤치마크 케이스 및 WGSL 셰이더 템플릿을 포함하여 모든 커널에 대한 명시적인 계약과 재현 가능한 증거를 제공합니다.Fleet은 실제 GPU 전반에 걸쳐 정확성과 성능 증거를 크라우드소싱하는 브라우저 기반 벤치마킹 도구로, 커널 및 그 변형을 개선하는 데 도움을 줍니다.
브라우저에서 실행되는 모델은 결국 일련의 GPU 연산들로 구성됩니다. 즉, 행렬 곱셈(matrix multiplications), 정규화(normalizations), 컨볼루션(convolutions), 어텐션 기본 요소(attention primitives), 양자화 연산(quantization operations), 데이터 레이아웃 변환(data-layout transformations) 등 수많은 연산들입니다. WebGPU는 이러한 연산들을 이식 가능한 API를 통해 최신 브라우저 전반에 걸쳐 사용할 수 있게 하며, WGSL은 이를 실행하는 셰이더(shaders)를 위한 공통 언어를 제공합니다.
하지만 이식성이 곧 성능을 의미하지는 않습니다. 두 개의 셰이더가 동일한 연산을 구현하고 동일한 출력을 생성할 수 있지만, 서로 다른 가속기(accelerators)에서 완전히 다르게 작동할 수 있습니다. 워크그룹 크기(Workgroup sizes), 메모리 접근 패턴(memory access patterns), 벡터화(vectorization), 데이터 타입(data types), 융합 전략(fusion strategies) 등 모든 것이 성능에 영향을 미칠 수 있습니다. 최적의 선택은 입력 형태(input shape), 장치(device), 브라우저, 사용 가능한 WebGPU 기능에 따라 달라질 수도 있습니다.
이것이 바로 커널(kernels)이 빠르고 효율적인 브라우저 추론을 위한 기반 계층을 형성하는 이유입니다. 상위 레벨 런타임은 자신이 디스패치(dispatch)하는 연산만큼만 효율적일 수 있습니다. 이러한 연산들을 개별적으로 발견하고, 테스트하고, 벤치마킹하며, 버전을 관리할 수 있게 함으로써, 우리는 상위 계층에 안정적인 계약을 유지하면서도 기반 자체를 독립적으로 개선할 수 있습니다.
컬렉션의 각 커널은 자체 레포지토리와 커널 카드(kernel card)를 가지고 있습니다. 이 카드는 연산의 의미론적 정의(semantics), 입력, 출력, 속성(attributes), 지원되는 데이터 타입, 소스 파일 및 즉시 실행 가능한 @huggingface/kernels 예제를 문서화합니다.
예를 들어, ai.onnx.Add는 다중 방향 브로드캐스팅을 사용한 요소별 덧셈(elementwise addition)을 구현합니다. 이는 잔여 연결(residual connections)부터 편향 추가에 이르기까지 신경망의 모든 곳에서 사용되는 가장 간단한 연산 중 하나입니다. 이 커드는 두 개의 입력, 브로드캐스트된 출력 형태, 지원되는 데이터 타입 및 다양한 형태와 장치에 대해 사용 가능한 변형을 문서화합니다.

ai.onnx.Add 레포지토리는 매니페스트(manifest), 정확성 검증 사례(correctness cases) 및 벤치마크 케이스, 그리고 WGSL 셰이더 템플릿을 함께 패키징합니다. 이 카드 뒤에는 구현을 이해하고 평가하는 데 필요한 아티팩트들이 레포지토리에 포함되어 있습니다:
이는 연산 계약(operation contract)의 진실 공급원입니다. 입력, 출력, 속성, 타입 제약 조건 및 형태 도출 규칙을 정의합니다. manifest.json
커널 식별자, 다이제스트(digest), 출처(provenance)를 기록합니다. metadata.json
정확성 케이스를 포함하여 구현이 예상 동작과 비교될 수 있도록 합니다. test.json
커널을 평가하는 데 사용되는 워크로드를 나타내는 벤치마크 및 튜닝 케이스를 포함합니다. bench.json
파일들은 특정 요청 및 장치를 위해 셰이더를 생성하는 데 사용되는 매개변수화된 WGSL 구현을 담고 있습니다. *.wgsl.jinja
이 구조는 셰이더를 재사용 가능한 소프트웨어 아티팩트로 만듭니다. 인터페이스는 WGSL을 읽지 않고도 검사할 수 있으며, 정확성 및 성능 케이스가 구현과 함께 이동하고, 게시된 버전은 버전이 지정되지 않은 파일 URL에 의존하는 대신 명시적으로 로드될 수 있습니다. 또한 저희 커널들은 사용자 정의 WebGPU 커널을 구축하거나 이러한 연산을 자체 런타임에 통합하는 개발자를 위한 참조 구현체 역할을 할 수도 있습니다.
npm에서 패키지를 설치하세요:
npm install @huggingface/kernels@preview
이러한 커널들을 실행하려면 WebGPU를 지원하는 브라우저가 필요합니다. WebGPU 사용 가능 여부는 브라우저, 운영 체제, GPU 및 드라이버에 따라 달라집니다. JavaScript에서 다음 코드를 사용하여 확인할 수 있습니다.
"gpu" in navigator
@huggingface/kernels는 커널 레포지토리와 애플리케이션 간의 다리 역할을 합니다. Hub 리포지토리 ID와 계약 버전을 사용하여 getKernel을 호출한 다음, 타입이 지정된 입력 데이터 및 텐서 형태로 반환된 함수를 호출합니다. 여기 작은 바이어스 추가(bias-add) 예시가 있습니다:
import { getKernel } from "@huggingface/kernels";
const add = await getKernel("webgpu-kernels/ai.onnx.Add", { version: 1 });
const { c } = await add({
...
두 번째 입력은 첫 번째 차원을 가로로 확장(broadcast)하여 [2, 3] 형태의 출력을 생성합니다. 로더는 매니페스트 계약 및 입력으로부터 해당 출력 형태와 논리적 데이터 타입을 도출한 다음, c를 자동으로 할당합니다.
여섯 개의 float을 더하는 것은 의도적으로 가장 작은 데모입니다. 이 크기에서는 GPU 왕복 비용이 수학 연산 자체보다 훨씬 큽니다. 핵심은 호출 패턴입니다. 행렬 곱셈(ai.onnx.MatMul)과 같이 최적화된 커널이 실제로 효과를 발휘하는 무거운 작업의 경우에도 이 패턴은 정확히 동일하게 유지됩니다. 변경되는 것은 리포지토리 ID와 입력값뿐입니다.
심지어 이 기본적인 연산만으로도 왜 커널에 다양한 변형(variants)이 필요한지를 보여줍니다. 같은 모양의 덧셈은 직접적인 벡터화 경로를 사용할 수 있는 반면, 브로드캐스팅된 입력값은 다른 인덱싱 로직을 필요로 합니다. 공개된 Add 커널에는 같은 모양, 벡터화 브로드캐스팅, 스칼라 처리, 일반 브로드캐스팅에 대한 변형이 포함되어 있습니다. 런타임은 애플리케이션의 API를 변경하지 않으면서 현재 호출과 장치에 맞는 구현을 선택할 수 있습니다.
version: 1 옵션은 공개된 **커널 계약(kernel contract)**의 버전 1을 선택합니다. 이는 ONNX opset, 연산자의 since_version, 또는 모델 개정판과는 별개입니다. 이러한 개념들을 분리함으로써 애플리케이션이 안정적인 JavaScript 기반 계약에 의존할 수 있도록 하고, 커널 구현은 그 뒤에서 진화할 수 있게 합니다.
그렇다면 최적화된 커널이 실제로 얼마나 큰 차이를 만들까요? 저희는 ONNX Runtime Web 1.30.0-dev.20260826-b1f76d586a를 사용하여 Apple M4 GPU에서 자체 컬렉션을 ORT WebGPU와 직접 비교했습니다. 207개 연산 전체에 걸쳐 1,756개의 테스트 케이스로 시작하여, 양쪽 모두 일치하는 출력과 신뢰할 수 있는 타이밍을 생성한 809개 케이스를 유지했습니다.
이러한 비교 전반에서 저희 커널은 기하 평균으로 2.57배 빠르고 중앙값으로는 1.90배 빨랐으며, 총 629승, 176패, 4무의 기록을 세웠습니다. 네 가지 익숙한 연산에 대해 더 자세히 살펴보겠습니다:
| Operation | Compared cases | Our WebGPU Kernel | ORT WebGPU | Speedup |
|---|---|---|---|---|
| Add | 5 | 0.064 ms | 0.227 ms | 3.52x |
| ... |
크기 4096으로 실행했을 때 저희 커널은 0.136ms였던 반면 ORT WebGPU는 1,396ms가 걸려 10,000배 이상 빠릅니다. [256, 4096]에 대한 행별 CumSum은 4.784ms 대비 0.016ms로 301배 빨랐습니다. 이러한 사례들은 모든 곳에서 기대할 수 있는 속도 향상이라기보다는 특화된 커널이 일반 구현이 느린 경로(slow path)에 도달했을 때 얼마나 큰 도움이 될 수 있는지를 보여주는 비정형적인 경우입니다.
저희는 커널 로딩, 세션 생성, 입력 업로드, 셰이더 컴파일, 출력 읽기 등 설정 과정은 제외하고 GPU 자체에서 수행된 작업 시간에 대해서만 측정했습니다. 매우 짧은 워크로드는 측정하기가 자연적으로 어렵고, 작은 케이스의 경우 GPU 캐시의 이점을 얻을 수 있으므로, 이 수치들은 모든 애플리케이션에 대한 약속이라기보다는 유용한 비교 자료로 읽는 것이 가장 좋습니다.
또한, 여기 제시된 결과들은 개별 연산(individual operations)에 대한 것이지 완전한 모델(complete models)에 대한 것은 아닙니다. 정확한 성능은 GPU와 브라우저마다 달라질 수 있으며, 이것이 바로 Fleet이 더 넓은 그림을 그리는 데 중요한 이유입니다.
저희는 또한 이러한 개선 사항들이 광범위한 ONNX Runtime Web 생태계의 이점을 누릴 수 있도록 ONNX Runtime 팀과 협력하여 상향(upstream)시키는 작업을 진행하고 있습니다.
WebGPU 성능은 GPU, 브라우저, 드라이버마다 다르기 때문에 한 대의 장치에서 얻은 결과만으로는 전체 이야기를 다 알 수 없습니다. Fleet을 사용하면 누구나 브라우저에서 정확성 및 성능 검사를 실행해보고 커널이 자신의 하드웨어에서 어떻게 작동하는지 확인할 수 있습니다.
동의를 얻어 진행되는 각 실행은 저희가 장치별 실패 지점을 파악하고, 다양한 버전을 비교하며, 선택 규칙을 개선하는 데 도움이 되는 증거를 사적으로 기여합니다. 목표는 간단합니다: 광범위한 실제 환경 커버리지를 사용하여 모든 사람에게 커널을 더 빠르고 안정적으로 만드는 것입니다.
초기 207개의 커널은 시작점일 뿐, 최종 상태가 아닙니다. 커널들을 Hub에 독립적으로 게시함으로써 저희는 모든 셰이더를 모든 런타임에 직접 임베딩하지 않고도 계약(contracts)을 검사하고, 구현을 비교하며, 정확성 검사를 재현하고, 성능을 개선할 수 있는 공통의 장소를 확보하게 됩니다.
이 컬렉션은 Hub의 더 광범위한 커널 생태계의 일부이기도 합니다: Kernels 페이지에서 WebGPU 커널은 CUDA, ROCm, Metal 및 기타 플랫폼용 커널과 나란히 배치되어 있으며, Hub의 다른 모든 아티팩트처럼 필터링, 정렬 및 탐색할 수 있습니다.

이 요소들은 서로를 강화합니다:
- 커널 저장소는 투명하고 버전 관리되는 연산 계약(operation contracts)을 정의합니다.
@huggingface/kernels는 이러한 연산을 JavaScript에서 로드하고 실행하는 것을 간단하게 만듭니다. - Fleet은 기존의 벤치마크 실험실이 다룰 수 있는 범위를 훨씬 넘어선 광범위한 장치에 걸쳐 실제 세계의 증거(real-world evidence)를 크라우드소싱합니다. - 기여된 모든 실행은 실패를 밝혀내고, 튜닝을 안내하며, 변형 선택을 개선하고, 미래 커널 버전을 검증하는 데 도움을 줄 수 있습니다.
이것이 저희 브라우저 추론 스택(browser inference stack)의 다음 단계를 위한 저수준 기반입니다. 저희는 이러한 커널들을 더 높은 수준의 모델 도구링에 연결하고, 연산 범위를 계속 확장하며, WebAI 생태계 전반에서 빠르고 로컬한 추론을 더 사용하기 쉽게 만드는 것에 기대가 큽니다.
WebGPU 커널 컬렉션을 탐색하고, @huggingface/kernels를 사용해 보고, Fleet에 참여하여 여러분의 장치에서 증거를 기여함으로써 저희가 모든 사람들을 위해 커널을 개선하는 데 도움을 주세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Hugging Face Blog의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기