tám 개월 전에, ILGPU의 개발자는 Blazor WebAssembly을 백엔드로 지원하는 것이 너무 어려울 것이라고 말씀해 주셨습니다.
오늘 저는 SpawnDev.ILGPU.ML 4.0.0-preview.4를 NuGet으로 출시했습니다. 이는 브라우저, 노트북, 서버에서 신경망을 실행하며, 단일 C# 코드베이스에서 작동합니다. 여섯 개의 백엔드: WebGPU, WebGL, WebAssembly, CUDA, OpenCL, 그리고 CPU. ONNX Runtime이 없습니다. JavaScript 브릿지가 없습니다. 설치해야 할 네이티브 바이너리가 없습니다. 단지 C#만 있으며, 대상이 필요로 하는 셰이더 언어로 변환됩니다.
이 기사는 그 과정이 어떻게 일어났는지, 오늘 작동하는 것은 무엇이며, 완전한 속도로 계속할 수 있도록 도움이 필요한 진정한 요청에 대해 이야기합니다.
오늘 작동하는 것, 당신의 브라우저에서, 지금
도서관은 각 백엔드에서 끝에서 끝까지 검증된 다섯 가지 추론 파이프라인을 제공합니다. 이 이미지들은 모두 라이브 데모에서의 스크린샷입니다.lostbeard.github.io/SpawnDev.ILGPU.ML- GPU 버퍼에서 직접 렌더링된 모델 출력을 HTML로<canvas>도서관을 통해서ICanvasRendererPNG 인코딩 단계 없이, base64 데이터 URL 없이, 픽셀 데이터의 호스트 읽기 되지 않습니다.
이미지 분류 - SqueezeNet 1.1
이미지를 넣으시면 상위-K 레이블과 신뢰도를 얻으세요. ONNX 파일은 HuggingFace의 CDN에서 로드되고, 브라우저의 OPFS에 캐시되어 이후 방문에 사용됩니다. 그래프로 파싱되어 페이지가 실행 중인 백엔드로 전달됩니다. 서버 없이. 업로드 없이. 이미지는 결코 디바이스를 벗어나지 않습니다.
단안 깊이 추정 - Depth Anything V2 Small (95MB)
A 95MB 모델. 가중치를 하나의 텐서씩 스트리밍하여 WASM 힙이 터지지 않도록 합니다. 출력은 GPU 이중선형 리사이즈 커널을 통해 원본 이미지의 정확한 종획비로 업스케일링되고, 이후 일부 선형 컬러맵 커널(플라즈마 / 빛바랜색 / 인퍼노 / 흑백)을 통해 처리됩니다 - 팔레트 전환은 하나의 가속기 디스패치로 이루어지며 재 추론이 필요 없습니다.
신경망 스타일 전이 - 모자이크
고전적인 Gatys 스타일의 전송 모델, 전적으로 클라이언트 측에서 실행됩니다. 결과는 라이브러리의 GPU-direct 렌더러를 통해 직접 <canvas>로 렌더링됩니다.
배경 제거 - RMBG-1.4
브라우저에서의 부드러운 물체 분할. 마스크는 가속기에서 계산되고, 가속기에서 소스 이미지의 알파 채널에 적용되며, CPU 루프가 픽셀 데이터에 접근하지 않고 투명 / 흰색 / 흐릿한 배경 옵션으로 합성됩니다.
3배 초고해상도 - ESPCN (타일 기반)
이것은 심각한 리팩토링이었습니다. 발표된 ESPCN 모델은 고정된 224x224 밝기 입력을 사용합니다 - 비교적 간단한 구현은 원본을 224x224로 축소하고, 초고해상도로 처리한 다음, 완료하면 됩니다 (손실 및 흑백). 제 파이프라인은 이제 원본을 겹치는 224x224 패치로 나누고, 각 패치를 모델을 통해 실행한 다음, 가중 평균을 사용하여 겹친 영역에서 가속기의 목적지 밝기 평면으로 누적합니다. 그런 다음 결과를 원본 RGBA에서双선형으로 업샘플링된 Cb/Cr와 결합합니다. 전체 원본 해상도, 전체 색상, 원본 비율을 보존합니다.
작동 방식 - C#으로 입력, GPU 셰이더로 출력
라이브러리는 SpawnDev.ILGPU 위에서 구축되었으며, ILGPU의 내 풀(Fork)으로, 기존의 CUDA / OpenCL / CPU 뒷엔드에 세 가지 브라우저 GPU 뒷엔드를 추가했습니다.
ILGPU는 .NET CIL을 GPU 셰이더 코드로 변환합니다. 저가 추가한 브라우저 뒷엔드는 그 CIL을
- WGSL로 컴파일합니다. (WebGPU Shading Language) - 현대적인 GPU 컴퓨팅 경로입니다. 텍스처를 직접 캔버스에 복사합니다.
- GLSL (OpenGL Shading Language) - WebGL2 Transform Feedback을 컴퓨팅에 사용합니다. ~2017년까지 모든 브라우저에서 작동합니다.
- WebAssembly 바이너리 - SIMD + 스레드, SharedArrayBuffer를 통해 멀티워커 디스패치가 가능합니다.
이런 커널:
private static void DoubleKernel(Index1D idx,
TensorView<float> input, TensorView<float> output)
{
int w = idx % input.D3;
int h = (idx / input.D3) % input.D2;
int c = (idx / (input.D3 * input.D2)) % input.D1;
int n = idx / (input.D3 * input.D2 * input.D1);
output.Set4D(n, c, h, w, input.Get4D(n, c, h, w) * 2f);
}
...웹GPU의 WGSL 컴퓨트 셰이더가 되거나, 웹GL의 Transform Feedback을 사용하는 GLSL 정점/프래그먼트 셰이더가 되거나, 웹 워커를 통해 전파되는 Wasm 함수가 되거나, CUDA의 PTX 커널이 되거나, AMD/인텔 데스크톱의 OpenCL 커널이 되거나, CPU의 병렬-for가 됩니다.하나의 C# 함수, 여섯 개의 타겟 백엔드. 런타임에 선택됩니다.
그것은TensorView<float> 파라미터는 ILGPU가 커널의 파라미터 버퍼에 표준 Index1D 스레드 좌표와 함께 패킹하는 blittable 구조체입니다. 그의 D0..D3 필드는 텐서 모양을 인라인으로 가지고 있으며 - 커널은 구조체에서 차원을 읽는 대신 H와 W를 별도의 스칼라 파라미터로 받습니다. 이는 모양 관리가 이전에 커널 작성에서 가장 소음이 많고 오류가 많았기 때문에 중요합니다.
The Tensor API
이번 주 출시본은 Transformers.js / ONNX-Runtime 스타일의 API 표면을 관용적인 C#으로 제공했습니다.
using var session = await InferenceSession.CreateFromFileAsync(
accelerator, http, "models/squeezenet/model.onnx");
// Allocate the input as an OwnedTensor - wraps a fresh GPU buffer.
using var input = OwnedTensor<float>.FromHost(
accelerator, pixels, new[] { 1, 3, 224, 224 });
// Transformers.js-style call. Outputs come back as an OwnedTensorMap<float> -
// each output tensor lives in its own freshly-allocated GPU buffer, independent
// of the session's internal pool. The `using` disposes every output in one go.
using var outputs = await session.RunOwnedAsync(new Dictionary<string, Tensor<float>>
{
[session.InputNames[0]] = input,
});
var logits = outputs[session.OutputNames[0]]; // OwnedTensor<float>
var hostLogits = await logits.ToHostAsync(); // copy back to CPU only when needed
세 가지 텐서 유형이 있으며, MemoryBuffer<T> (호스트 측, 생애주기 관리 클래스)과 ArrayView<T> (커널 전달 가능 구조체) 사이의 분할을 반영합니다.
-
Tensor<T>- 호스트 측, 일반화되어T : unmanagedZero-copy reshape / slice / sub-tensor. -
OwnedTensor<T>-IDisposable, owns aMemoryBuffer1D<T>. What pipelines return. Implicit conversions toTensor<T>andTensorView<T>mean you never have to type.AsTensoror.Viewat a call site. -
TensorView<T>- blittable struct, passes directly into ILGPU kernels.
이것은 Transformers.js와 ONNX Runtime과 동일한 개념의 API입니다 - 동일한 패턴이 작동하며, 동일한 심리적 모델이 이어집니다 - 실제 타입 안전한 제네릭과 결정론적 소멸을 지원하는 언어로 구현되었습니다.
왜 이렇게 하는가
답의 반은 기술적 호기심입니다. 다른 반은 현재 브라우저 내 머신러닝 환경이 ONNX Runtime Web에 의해 지배되기 때문입니다는 기본적인 WebGPU 장치 공유 버그를 가지고 있으며, 이는 여섯 개월 동안 무시되었습니다(microsoft/onnxruntime#26107). 그 버그는 단일 브라우저 세션에서 여러 모델을 배포하려는 사람들에게 벽이 됩니다. 이는 저를 "이를 할 수 있을까요?"에서 "이를 하고 있습니다."로 밀어냈습니다.
더 깊은 동기: 신경망이 사용자의 디바이스에서 실행될 때, 사용자의 데이터는 사용자의 디바이스에 남습니다. 서버로 업로드하지 않습니다. "우리는 당신의 데이터를 훈련시키지 않을 것을 약속합니다."라고 말하지 않습니다. 전혀 데이터 플레인이 없습니다. 사용자는 자신의 하드웨어에서 자신의 데이터에 대해 모델을 실행합니다, 일단 그렇습니다.
그것이 SpawnDev 스택의 목적입니다. Blazor WebAssembly + WebGPU + ML 라이브러리 + WebRTC 피어-투-피어 모델 전달을 통해 SpawnDev.WebTorrent. 사용자의 브라우저에 전체 AI 작업이 존재하는 프로그레시브 웹 앱 스택으로, 모델 가중치는 동일한 앱을 실행 중인 다른 사용자로부터 BitTorrent을 통해 도착하며, 중앙 서버에 절대로 접촉하지 않습니다. 그것이 목적지입니다. 이 기사에서 발표하는 라이브러리는 기본적인 레이어 중 하나입니다.
제가 자금으로서 어디에 있는지 - 그리고 필요한 것은 무엇인지
이 라이브러리를 $20/월에 구축했습니다 예산.
저는 한 사람입니다. 예산이 허락하면 도움을 주는 작은 팀이 있습니다. 예산이 허락할 때, SpawnDev 스택 전체의 최고 생산량(6개 라이브러리, 수백 개의 연산자, 여러 테스트 세트, 웹RTC + 웹트로렌트 + BlazorJS 스택)은 하루에 410개의 커밋로 보입니다. 예산이 허락하지 않을 때, 일하는 시간을 제외한 저녁 시간 동안만 일이 느려집니다.
나는 $200/월 총액를 GitHub 후원금에 풀 크루를 배에 다시 태우기 위해 요청하고 있습니다.
이 프리뷰와 다음 열십 년 사이의 격차입니다.
- $11개의 다른 추론 파이프라인이 모든 백엔드에서 엔드-투-엔드로 검증되었습니다.
- 모든 남은 운영자 가족이 새로운 Tensor API로 이전되었습니다.
- FP16 attention + Flash Attention on WebGPU
- Llama와 Phi-4 LLM 브라우저 내 추론
- SD-Turbo를 통해 전체 텍스트-이미지 확산
- TripoSR 단일 이미지-3D
- SpawnDev.WebTorrent을 통해 피어-투-피어 분산 컴퓨팅
모든 것이 공중 비행 중입니다. 병목 현상은 시간이 아니라 아이디어입니다.
시도해보세요, 깨뜨려보세요, 버그를 신고하세요
도서관은 NuGet에 있습니다:
dotnet add package SpawnDev.ILGPU.ML --prerelease
소스는 github.com/LostBeard/SpawnDev.ILGPU.ML입니다. 실시간 데모는 lostbeard.github.io/SpawnDev.ILGPU.ML에서 확인할 수 있습니다. 브라우저 내에서 완전히 실행됩니다 - 페이지 자체는 GitHub Pages에서 제공되지만, 추론은 당신의 GPU에서 이루어지고 당신의 데이터는 결코 당신의 기계를 벗어나지 않습니다.
.NET 개발자로서 브라우저 ML 공간을 살펴보고 "이것을 원하지만 자바스크립트를 작성할 수 없어"고 생각했다면 이것이 당신을 위한 것입니다. Blazor 개발자로서 ML이 필요하지만 ONNX Runtime Web을 작동시킬 수 없다면이것은 당신을 위해입니다. Blazor WebAssembly가 중요한 AI 런타임이 될 수 있음을 증명할 사람을 기다려왔다면이것이 그 증명입니다.
데모를 시도해보세요. 당신 자신의 모델에서 이슈를 신고하세요. 이것이 계속될 것을 원하면 리포지토리를 스타합니다.
그리고 후원할 수 있다면: github.com/sponsors/LostBeard. $5/월은 신뢰의 투표입니다. $200/월 총액은 크루를 다시 워프 속도로 되돌립니다.
🖖🚀















