인셔셔RSS 관심 있는 블로그, 뉴스, 기술 정보를 효율적으로 추적하고 읽으세요
원문 읽기 InertiaRSS에서 열기

추천 피드

雷峰网
雷峰网
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The GitHub Blog
The GitHub Blog
博客园 - Franky
Google DeepMind News
Google DeepMind News
J
Java Code Geeks
Last Week in AI
Last Week in AI
V
Visual Studio Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Blog — PlanetScale
Blog — PlanetScale
D
Docker
GbyAI
GbyAI
V
V2EX
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 聂微东
博客园_首页
月光博客
月光博客
量子位
罗磊的独立博客

DEV Community

Gemma 4 on Android: Tricks for Faster On-Device Inference Your AI agent has amnesia. You've just normalized it. I built an AI that reviews every PR automatically (because nobody was reviewing mine) 🌿 Git Mastery: The Complete Developer Guide Bringing Gemma 4 E2B to the Edge: Building a Privacy-First Dream Analyzer with Flutter & LiteRT Google I/O 2026 Wasn’t About Features — It Was About AI Becoming the Developer Environment Building an AI Vedic Astrology App in 25 Days — What Actually Worked (and What Didn't) Hermes Agent Has Four Memories — And That's Why It Doesn't Forget You Pressure Isn't Killing You -Your Relationship With It Is 🐳 How to Run Any Project in Docker: A Complete Guide AccessLens — a blind person's lanyard, powered by Gemma 4 on-device Glyph v0.2: the release is the joinery How I Built a Blazingly Fast, Privacy-First Batch Image Converter in the Browser Using OPFS and Web Workers Cómo solucionar \"Text content does not match server-rendered HTML\" en Next.js App Router FCoP 3.0: Why AI Agents Need a Track, Not a Brake Fibonacci: Quiz app which anyone can make revenue by viewing ads to the quiz contestants. The Subconscious Powered by Edge AI GPU Utilization Is Becoming the New Cloud Waste Crisis Cómo solucionar `docker run` con exit code 1 en Raspberry Pi JWT is a scam and your app doesn't need it 7 Agent Skill Packs That Actually Make AI Coders Better More Control, More Cost: Why Commanding AI Isn't Delegation SecureScan Synthadoc: We Built an AI Judge for Our AI Wiki Compiler - Here's What We Learned Cómo solucionar el error de permiso al ejecutar `pip.exe` en entorno virtual (Python 3.10 en Windows) Postgres-grade Serializable at 20k+ ops/s — on a laptop. Don’t try this at home. Pure Core, Imperative Shell in Rust with Stillwater Lean 4 for Programmers: Building a Todo List with Proof Trustless Bug Bounty Releases with a PoW-Gated DLC Oracle Building Autonomous DevOps Agents with MCP and LangChain Multimodal Gemma 4 Visual Regression & Patch Agent Git Time Machine — How Version Control Can Save Your Project My Dad Got an Electricity Bill He Couldn't Understand. Google I/O 2026 Just Made That Problem Solvable. My Dad Got an Electricity Bill He Couldn't Understand. Google I/O 2026 Just Made That Problem Solvable. Read Replicas Lie About Consistency. 4 Sync Modes Behind the Lie. Reviving My Coding Project with GitHub Copilot I Tried Gemini 3.5 Flash After Google I/O 2026 - Here is What I Found :)) Zero-Cost AI in VS Code Blueprints Might Be More Important Than Frameworks AI CareCompanion - Offline Health Assistant Long-Context Models Killed RAG. Except for the 6 Cases Where They Made It Worse. An In-Depth Overview of the Apache Iceberg 1.11.0 Release Your Agent Just Called the Same Tool 47 Times. Here's the 20-Line Detector. How I Built a Multi-System Astrology Bot in Python (And What Meta Banned Me For) Gemma 4 Has Four Variants. Here's How to Pick the Right One Before You Write a Single Line of Code. Log Level Strategies: Balancing Observability and Cost Why WebMCP Is the Most Important Thing Google Announced at I/O 2026 (And Nobody's Talking About It) Making LLM Calls Reliable: Retry, Semaphore, Cache, and Batch Google's 2x Energy Efficiency Claim Is Real — But Here's What They're Not Measuring What's actually going on with CORS, under the hood
C#에서 브라우저에서 실행되는 신경망 엔진을 만들었습니다 - ONNX Runtime 없이, JavaScript Bridge 없이, 네이티브 바이너리 없이
Todd Tanner · 2026-05-24 · via DEV Community

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

SqueezeNet classifying a cat photo in the browser

이미지를 넣으시면 상위-K 레이블과 신뢰도를 얻으세요. ONNX 파일은 HuggingFace의 CDN에서 로드되고, 브라우저의 OPFS에 캐시되어 이후 방문에 사용됩니다. 그래프로 파싱되어 페이지가 실행 중인 백엔드로 전달됩니다. 서버 없이. 업로드 없이. 이미지는 결코 디바이스를 벗어나지 않습니다.

단안 깊이 추정 - Depth Anything V2 Small (95MB)

Depth Anything V2 producing a depth map of a house from a single photo

A 95MB 모델. 가중치를 하나의 텐서씩 스트리밍하여 WASM 힙이 터지지 않도록 합니다. 출력은 GPU 이중선형 리사이즈 커널을 통해 원본 이미지의 정확한 종획비로 업스케일링되고, 이후 일부 선형 컬러맵 커널(플라즈마 / 빛바랜색 / 인퍼노 / 흑백)을 통해 처리됩니다 - 팔레트 전환은 하나의 가속기 디스패치로 이루어지며 재 추론이 필요 없습니다.

신경망 스타일 전이 - 모자이크

Style transfer applying a mosaic look to a cat photo

고전적인 Gatys 스타일의 전송 모델, 전적으로 클라이언트 측에서 실행됩니다. 결과는 라이브러리의 GPU-direct 렌더러를 통해 직접 <canvas>로 렌더링됩니다.

배경 제거 - RMBG-1.4

Background removal cleanly extracting a person from a brick-wall background

브라우저에서의 부드러운 물체 분할. 마스크는 가속기에서 계산되고, 가속기에서 소스 이미지의 알파 채널에 적용되며, CPU 루프가 픽셀 데이터에 접근하지 않고 투명 / 흰색 / 흐릿한 배경 옵션으로 합성됩니다.

3배 초고해상도 - ESPCN (타일 기반)

Super-resolution tripling the resolution of a tree sunset photo in full color

이것은 심각한 리팩토링이었습니다. 발표된 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 : unmanaged Zero-copy reshape / slice / sub-tensor.
  • OwnedTensor<T> - IDisposable, owns a MemoryBuffer1D<T>. What pipelines return. Implicit conversions to Tensor<T> and TensorView<T> mean you never have to type .AsTensor or .View at 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/월 총액은 크루를 다시 워프 속도로 되돌립니다.

🖖🚀