WebGPU를 활용한 브라우저 내 LLM 추론의 원리, WebLLM과 MLC LLM의 아키텍처, 실전 구현, 그리고 브라우저 AI의 가능성과 한계를 다룹니다.
4장에서 살펴본 GPTQ, AWQ 등의 양자화 기법은 서버 GPU나 로컬 GPU 환경을 전제로 합니다. 그러나 모든 사용자가 고성능 GPU를 보유하고 있지는 않습니다. 만약 웹 브라우저만으로 LLM 추론이 가능하다면 어떨까요? 이번 장에서는 WebGPU를 기반으로 한 브라우저 내 LLM 추론의 현황과 실전 구현 방법을 다룹니다.
WebGPU는 WebGL의 후속으로 설계된 차세대 웹 그래픽/컴퓨팅 API입니다. WebGL이 OpenGL ES를 기반으로 했다면, WebGPU는 Vulkan, Metal, Direct3D 12와 같은 현대적 그래픽 API의 설계 철학을 반영합니다.
LLM 추론 관점에서 WebGPU가 중요한 이유는 다음과 같습니다.
async function checkWebGPUSupport(): Promise<GPUDevice | null> {
if (!navigator.gpu) {
console.error("이 브라우저는 WebGPU를 지원하지 않습니다.");
return null;
}
const adapter = await navigator.gpu.requestAdapter({
powerPreference: "high-performance",
});
if (!adapter) {
console.error("적합한 GPU 어댑터를 찾을 수 없습니다.");
return null;
}
const device = await adapter.requestDevice({
requiredLimits: {
maxBufferSize: 1024 * 1024 * 1024, // 1GB 버퍼
maxStorageBufferBindingSize: 1024 * 1024 * 1024,
},
});
console.log("WebGPU 디바이스 초기화 완료:", adapter.info);
return device;
}2026년 현재 WebGPU는 Chrome, Edge, Firefox, Safari에서 모두 지원됩니다. 다만 브라우저별로 지원하는 기능 수준과 성능에는 차이가 있으므로, 기능 감지(feature detection)를 통한 폴백 처리가 필수적입니다.
WebLLM은 MLC AI 팀이 개발한 브라우저 내 LLM 추론 엔진입니다. Apache TVM 컴파일러 인프라를 기반으로, 사전 컴파일된 모델을 WebGPU Compute Shader로 실행합니다. 서버 통신 없이 순수하게 클라이언트 측에서 텍스트 생성이 이루어지므로, 사용자의 프롬프트가 외부로 전송되지 않습니다.
WebLLM의 동작 구조는 다음과 같습니다.
WebLLM을 React 애플리케이션에 통합하는 예제를 살펴보겠습니다.
import { CreateMLCEngine, MLCEngine } from "@mlc-ai/web-llm";
let engine: MLCEngine | null = null;
// 엔진 초기화 및 모델 로딩
async function initEngine(
onProgress: (progress: number, text: string) => void
): Promise<MLCEngine> {
engine = await CreateMLCEngine("Llama-3.1-8B-Instruct-q4f16_1-MLC", {
initProgressCallback: (report) => {
onProgress(report.progress, report.text);
},
logLevel: "SILENT",
});
return engine;
}
// 스트리밍 채팅 완성
async function* chatStream(
userMessage: string
): AsyncGenerator<string, void, unknown> {
if (!engine) throw new Error("엔진이 초기화되지 않았습니다.");
const chunks = await engine.chat.completions.create({
messages: [
{ role: "system", content: "당신은 도움이 되는 한국어 AI 어시스턴트입니다." },
{ role: "user", content: userMessage },
],
temperature: 0.7,
max_tokens: 1024,
stream: true,
});
for await (const chunk of chunks) {
const delta = chunk.choices[0]?.delta?.content;
if (delta) yield delta;
}
}WebLLM은 OpenAI 호환 API를 제공합니다. 기존에 OpenAI API를 사용하던 코드를 WebLLM으로 전환할 때 최소한의 수정만으로 마이그레이션이 가능합니다.
WebLLM은 다운로드한 모델 가중치를 Cache API에 저장합니다. 8B 모델의 4비트 양자화 버전은 약 4-5GB 크기이므로, 최초 로딩에는 네트워크 속도에 따라 수 분이 소요될 수 있습니다. 하지만 한 번 캐싱되면 이후에는 로컬에서 즉시 로딩됩니다.
// 캐시된 모델 목록 확인
async function listCachedModels(): Promise<string[]> {
const cache = await caches.open("webllm/model");
const keys = await cache.keys();
return keys.map((req) => new URL(req.url).pathname);
}
// 특정 모델 캐시 삭제
async function clearModelCache(modelId: string): Promise<boolean> {
const cache = await caches.open("webllm/model");
const keys = await cache.keys();
let deleted = false;
for (const request of keys) {
if (request.url.includes(modelId)) {
await cache.delete(request);
deleted = true;
}
}
return deleted;
}Transformers.js는 Hugging Face가 개발한 JavaScript 라이브러리로, ONNX Runtime을 백엔드로 사용합니다. WebLLM이 대형 언어 모델에 특화되어 있다면, Transformers.js는 텍스트 분류, 번역, 임베딩, 이미지 처리 등 더 다양한 태스크를 지원합니다.
import { pipeline } from "@huggingface/transformers";
// 텍스트 분류 파이프라인
const classifier = await pipeline(
"text-classification",
"Xenova/distilbert-base-uncased-finetuned-sst-2-english",
{ device: "webgpu" }
);
const result = await classifier("This product is amazing!");
console.log(result); // [{ label: "POSITIVE", score: 0.9998 }]
// 텍스트 생성 파이프라인
const generator = await pipeline(
"text-generation",
"Xenova/Phi-3-mini-4k-instruct",
{ device: "webgpu", dtype: "q4" }
);
const output = await generator("Explain quantum computing in simple terms:", {
max_new_tokens: 256,
});wllama는 llama.cpp를 WebAssembly로 컴파일하여 브라우저에서 실행하는 프로젝트입니다. WebGPU가 아닌 CPU(WASM SIMD)로 추론을 수행하므로 속도는 느리지만, WebGPU를 지원하지 않는 브라우저에서도 동작한다는 장점이 있습니다. 또한 GGUF 포맷을 직접 사용할 수 있어, 3장에서 다룬 GGUF 모델을 브라우저에서 그대로 활용 가능합니다.
브라우저 환경은 네이티브 환경 대비 여러 제약이 존재합니다.
메모리 제한이 가장 큰 병목입니다. 브라우저 탭 하나에 할당 가능한 메모리는 일반적으로 4-8GB 수준이며, 이는 운영체제와 브라우저에 따라 다릅니다. 따라서 브라우저에서 실행 가능한 모델은 4비트 양자화 기준으로 7-8B 파라미터가 현실적인 상한선입니다.
성능 차이도 무시할 수 없습니다. WebGPU를 통한 추론은 네이티브 CUDA 대비 일반적으로 2-5배 느립니다. 이는 WebGPU의 추상화 계층 오버헤드, Shader 컴파일 최적화 한계, 그리고 메모리 대역폭 차이에 기인합니다.
| 환경 | Llama 3.1 8B (4bit) | 토큰/초 | 최초 로딩 |
|---|---|---|---|
| CUDA (RTX 4090) | vLLM AWQ | 90-120 | 수 초 |
| Metal (M3 Max) | llama.cpp | 40-60 | 수 초 |
| WebGPU (Chrome) | WebLLM | 15-25 | 수 분 (최초) |
| WASM (Chrome) | wllama | 3-8 | 수 분 (최초) |
브라우저 추론은 탭을 닫으면 GPU 메모리가 해제됩니다. 장시간 대화가 필요한 경우 컨텍스트 윈도우 관리와 메모리 해제 타이밍에 주의해야 합니다. 모바일 브라우저에서는 백그라운드 탭이 OS에 의해 종료될 가능성도 있습니다.
제약에도 불구하고 브라우저 AI가 특히 유리한 시나리오가 있습니다.
개인정보 보호가 중요한 경우, 사용자의 데이터가 서버로 전송되지 않으므로 의료 기록 요약, 개인 문서 분석 등에 적합합니다. 오프라인 환경에서도, 모델이 한 번 캐싱되면 인터넷 연결 없이 추론이 가능합니다. 데모 및 프로토타입 용도로도, 서버 인프라 없이 LLM 기능을 시연할 수 있어 초기 개발 단계에서 유용합니다.
브라우저 내 LLM 추론은 아직 성능과 모델 크기 면에서 네이티브 환경에 미치지 못하지만, WebGPU의 성숙과 양자화 기법의 발전에 따라 격차가 빠르게 좁혀지고 있습니다. 특히 프라이버시와 접근성이 중요한 애플리케이션에서는 이미 실용적인 선택지가 되고 있습니다.
다음 6장에서는 스마트폰과 태블릿, 즉 모바일 디바이스에서의 LLM 추론을 다룹니다. iOS의 Core ML, Android의 MediaPipe 등 모바일 플랫폼 고유의 AI 프레임워크와 개발 패턴을 살펴보겠습니다.
이 글이 도움이 되셨나요?
관련 주제 더 보기
iOS와 Android에서의 LLM 추론 기법 — Apple MLX, Core ML, MediaPipe, Qualcomm AI Engine, 그리고 모바일 AI 앱 개발 패턴을 다룹니다.
GPU 추론에 최적화된 AWQ와 GPTQ 양자화 기법의 원리, 차이점, 그리고 GGUF와의 비교를 통해 상황별 최적 양자화 전략을 제시합니다.
온디바이스 AI를 위한 하드웨어 가속기 — Apple Neural Engine, Qualcomm NPU, NVIDIA Jetson, Intel NPU의 아키텍처와 성능 특성을 비교합니다.