본문으로 건너뛰기
Kreath Archive
TechProjectsBooksAbout
TechProjectsBooksAbout

내비게이션

  • Tech
  • Projects
  • Books
  • About
  • Tags

카테고리

  • AI / ML
  • 웹 개발
  • 프로그래밍
  • 개발 도구

연결

  • GitHub
  • Email
  • RSS
© 2026 Kreath Archive. All rights reserved.Built with Next.js + MDX
홈TechProjectsBooksAbout
//
  1. 홈
  2. 테크
  3. 5장: WebLLM과 브라우저에서의 LLM 추론
2026년 3월 5일·AI / ML·

5장: WebLLM과 브라우저에서의 LLM 추론

WebGPU를 활용한 브라우저 내 LLM 추론의 원리, WebLLM과 MLC LLM의 아키텍처, 실전 구현, 그리고 브라우저 AI의 가능성과 한계를 다룹니다.

12분414자8개 섹션
llmperformancemlops
공유
on-device-ai5 / 10
12345678910
이전4장: AWQ, GPTQ, 양자화 기법 비교다음6장: 모바일 디바이스에서의 AI 추론

들어가며

4장에서 살펴본 GPTQ, AWQ 등의 양자화 기법은 서버 GPU나 로컬 GPU 환경을 전제로 합니다. 그러나 모든 사용자가 고성능 GPU를 보유하고 있지는 않습니다. 만약 웹 브라우저만으로 LLM 추론이 가능하다면 어떨까요? 이번 장에서는 WebGPU를 기반으로 한 브라우저 내 LLM 추론의 현황과 실전 구현 방법을 다룹니다.

WebGPU: 브라우저 GPU 컴퓨팅의 새 시대

WebGPU는 WebGL의 후속으로 설계된 차세대 웹 그래픽/컴퓨팅 API입니다. WebGL이 OpenGL ES를 기반으로 했다면, WebGPU는 Vulkan, Metal, Direct3D 12와 같은 현대적 그래픽 API의 설계 철학을 반영합니다.

LLM 추론 관점에서 WebGPU가 중요한 이유는 다음과 같습니다.

  • Compute Shader 네이티브 지원: 범용 GPU 연산(GPGPU)을 위한 Compute Shader를 1급 시민으로 지원합니다
  • 명시적 메모리 관리: 버퍼와 텍스처의 생성, 바인딩, 해제를 개발자가 직접 제어할 수 있습니다
  • 파이프라인 사전 컴파일: Shader 컴파일을 사전에 수행하여 런타임 오버헤드를 줄입니다
webgpu_check.ts
typescript
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;
}
Info

2026년 현재 WebGPU는 Chrome, Edge, Firefox, Safari에서 모두 지원됩니다. 다만 브라우저별로 지원하는 기능 수준과 성능에는 차이가 있으므로, 기능 감지(feature detection)를 통한 폴백 처리가 필수적입니다.

WebLLM: MLC AI의 브라우저 LLM 엔진

WebLLM은 MLC AI 팀이 개발한 브라우저 내 LLM 추론 엔진입니다. Apache TVM 컴파일러 인프라를 기반으로, 사전 컴파일된 모델을 WebGPU Compute Shader로 실행합니다. 서버 통신 없이 순수하게 클라이언트 측에서 텍스트 생성이 이루어지므로, 사용자의 프롬프트가 외부로 전송되지 않습니다.

아키텍처

WebLLM의 동작 구조는 다음과 같습니다.

  1. 모델 변환: PyTorch 모델을 MLC 형식으로 변환하고, 양자화를 적용합니다
  2. Shader 사전 컴파일: TVM이 각 연산을 WebGPU Compute Shader(WGSL)로 컴파일합니다
  3. 가중치 전송: 양자화된 가중치를 GPU 버퍼로 전송합니다
  4. 추론 실행: Compute Shader가 GPU에서 행렬 연산을 수행합니다

실전 구현

WebLLM을 React 애플리케이션에 통합하는 예제를 살펴보겠습니다.

web-llm-chat.ts
typescript
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;
  }
}
Tip

WebLLM은 OpenAI 호환 API를 제공합니다. 기존에 OpenAI API를 사용하던 코드를 WebLLM으로 전환할 때 최소한의 수정만으로 마이그레이션이 가능합니다.

모델 캐싱 전략

WebLLM은 다운로드한 모델 가중치를 Cache API에 저장합니다. 8B 모델의 4비트 양자화 버전은 약 4-5GB 크기이므로, 최초 로딩에는 네트워크 속도에 따라 수 분이 소요될 수 있습니다. 하지만 한 번 캐싱되면 이후에는 로컬에서 즉시 로딩됩니다.

cache_management.ts
typescript
// 캐시된 모델 목록 확인
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의 브라우저 AI

Transformers.js는 Hugging Face가 개발한 JavaScript 라이브러리로, ONNX Runtime을 백엔드로 사용합니다. WebLLM이 대형 언어 모델에 특화되어 있다면, Transformers.js는 텍스트 분류, 번역, 임베딩, 이미지 처리 등 더 다양한 태스크를 지원합니다.

transformers_js_example.ts
typescript
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의 WASM 포팅

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 AWQ90-120수 초
Metal (M3 Max)llama.cpp40-60수 초
WebGPU (Chrome)WebLLM15-25수 분 (최초)
WASM (Chrome)wllama3-8수 분 (최초)
Warning

브라우저 추론은 탭을 닫으면 GPU 메모리가 해제됩니다. 장시간 대화가 필요한 경우 컨텍스트 윈도우 관리와 메모리 해제 타이밍에 주의해야 합니다. 모바일 브라우저에서는 백그라운드 탭이 OS에 의해 종료될 가능성도 있습니다.

브라우저 AI의 활용 시나리오

제약에도 불구하고 브라우저 AI가 특히 유리한 시나리오가 있습니다.

개인정보 보호가 중요한 경우, 사용자의 데이터가 서버로 전송되지 않으므로 의료 기록 요약, 개인 문서 분석 등에 적합합니다. 오프라인 환경에서도, 모델이 한 번 캐싱되면 인터넷 연결 없이 추론이 가능합니다. 데모 및 프로토타입 용도로도, 서버 인프라 없이 LLM 기능을 시연할 수 있어 초기 개발 단계에서 유용합니다.

마치며

브라우저 내 LLM 추론은 아직 성능과 모델 크기 면에서 네이티브 환경에 미치지 못하지만, WebGPU의 성숙과 양자화 기법의 발전에 따라 격차가 빠르게 좁혀지고 있습니다. 특히 프라이버시와 접근성이 중요한 애플리케이션에서는 이미 실용적인 선택지가 되고 있습니다.

다음 6장에서는 스마트폰과 태블릿, 즉 모바일 디바이스에서의 LLM 추론을 다룹니다. iOS의 Core ML, Android의 MediaPipe 등 모바일 플랫폼 고유의 AI 프레임워크와 개발 패턴을 살펴보겠습니다.

이 글이 도움이 되셨나요?

관련 주제 더 보기

#llm#performance#mlops

관련 글

AI / ML

6장: 모바일 디바이스에서의 AI 추론

iOS와 Android에서의 LLM 추론 기법 — Apple MLX, Core ML, MediaPipe, Qualcomm AI Engine, 그리고 모바일 AI 앱 개발 패턴을 다룹니다.

2026년 3월 7일·12분
AI / ML

4장: AWQ, GPTQ, 양자화 기법 비교

GPU 추론에 최적화된 AWQ와 GPTQ 양자화 기법의 원리, 차이점, 그리고 GGUF와의 비교를 통해 상황별 최적 양자화 전략을 제시합니다.

2026년 3월 3일·12분
AI / ML

7장: 엣지 하드웨어와 전용 가속기

온디바이스 AI를 위한 하드웨어 가속기 — Apple Neural Engine, Qualcomm NPU, NVIDIA Jetson, Intel NPU의 아키텍처와 성능 특성을 비교합니다.

2026년 3월 9일·15분
이전 글4장: AWQ, GPTQ, 양자화 기법 비교
다음 글6장: 모바일 디바이스에서의 AI 추론

댓글

목차

약 12분 남음
  • 들어가며
  • WebGPU: 브라우저 GPU 컴퓨팅의 새 시대
  • WebLLM: MLC AI의 브라우저 LLM 엔진
    • 아키텍처
    • 실전 구현
    • 모델 캐싱 전략
  • Transformers.js: Hugging Face의 브라우저 AI
  • wllama: llama.cpp의 WASM 포팅
  • 브라우저 추론의 제약 사항
  • 브라우저 AI의 활용 시나리오
  • 마치며