[인공지능 기술] WebLLM 소개와 구조 분석
2024.11.07 18:32
[인공지능 기술] WebLLM 소개와 구조 분석
WebLLM 소개와 구조 분석
2022년 11월 ChatGPT가 초기 베타버전을 출시한 이후 많은 사용자들이 이러한 언어 모델에 관심을 가지고 한동안 폭발적인 반응과 시장의 변화를 가져오면서 관심이 집중되고 있습니다.
한번쯤 사용해 보셨을(혹은 들어 보셨을) LLM과 컴파일, 빌드 과정에 대해 간단히 소개하고 최근 크롬에 정식 탑재된 WebGPU를 사용한 WebLLM의 구조 형태를 가볍게 분석해보고자 합니다.
관련 용어와 개념 소개
일반적인 어플리케이션 위주의 개발을 수행해온 저는 새로운 도메인이자 엔지니어링 영역이기도 한 AI 및 Machine learning에 대해 학습하면서 다양한 용어와 개념들을 새로 학습해야 했습니다. 이와 같은 분들을 위해 WebLLM의 구조에 대해 이야기하기 전에 먼저 용어와 기반 개념들을 소개하고자 합니다.
LLM
대형 언어 모델(Large Language Model)이라고도 불리는 LLM은 ChatGPT 베타 출시 이후로 더욱 유명해진 딥러닝 모델입니다. 기본적인 개념으로는 입력값으로 들어오는 자연어를 기반으로, 통계학적으로 가장 적절한 출력값을 내는 원리로 되어 있습니다. 간단하게 이야기하자면 다음 단어가 나올 확률을 계산하여 그럴듯한 문장을 만들어내는 것이라고 할 수 있습니다.
MLC-LLM 프로젝트
MLC-LLM 프로젝트는 LLM을 다양한 환경에서 배포하고 범용 API를 통해 쉽게 사용할 수 있도록 돕는 배포 솔루션입니다. 위 이미지와 같은 일련의 과정을 통해 모델을 정의하고 컴파일한 후 각 디바이스 플랫폼별 런타임에서 LLM을 실행할 수 있도록 구성되어 있습니다.
- MLC에서 미리 정의해 둔 모델(Llama2 등)을 사용하거나, TVM Unity 인터페이스 기반의 파이썬으로 작성된 모델을 구현해야 합니다.
- 후술할 TVM Unity를 통해 컴파일되며, 이 때 model lib, weights, config 결과물이 export됩니다. 우리가 사용하게 될 웹 브라우저의 라이브러리(WebAssembly)는 .wasm의 형태로 떨어지게 됩니다.
- 각 디바이스 플랫폼별 런타임에서 컴파일된 모델 라이브러리와 가중치(weights), 설정 등을 로드하여 실행되며, 각 런타임별 API가 제공됩니다.
TVM
이러한 LLM 등의 AI 어플리케이션을 생성하고 하드웨어 장치에서 실행하기 위해서는 우리가 어플리케이션을 만들 때와 동일하게 소스 코드를 변환하여 저수준의 layer에서 인식할 수 있는 코드로 변환하고 실행하는 과정이 필요합니다. 예를 들어 윈도우 환경의 Nvidia 그래픽 연산 카드에서 AI 어플리케이션을 구동해야 할 경우, python으로 설계한 모델 코드는 C++ 및 CUDA 코드로 변환되고 최종적으로 각 하드웨어를 위한 어셈블리 언어로써 변환됩니다.
Apache TVM이라는 end-to-end 오픈소스 컴파일러에서는 이러한 과정(딥러닝 시스템 스택)에 대해 인터페이스를 제공하며 아래에서 살펴볼 WebLLM을 위한 WebAssembly 런타임 또한 제공됩니다.
WebLLM
MLC에서는 TVM에서 제공하는 WebAssembly 런타임 및 자바스크립트 인터페이스를 응용하여 Chat 형식으로 구성된 WebLLM을 배포했습니다. 이를 사용하면 서버와의 통신 없이 오로지 웹 브라우저에서 WebGPU의 가속을 사용하여 LLM을 구동할 수 있습니다.
WebGPU
WebGPU는 WebGL의 후속 버전 API입니다. 이미지 등 그래픽 연산에 집중되던 WebGL과는 다르게 GPU에서 일반적인 계산을 수행하는 데 더 최적화되어 있습니다. 또한 네이티브 API를 직접 미러링하지 않고 자체적인 추상화를 도입하여 웹용 API에 적합하지 않은 개념들(저수준의 메모리 관리 등)을 숨기고 편하게 사용될 수 있도록 설계되었습니다.
WebLLM 환경 구축하기
???? 순서: emscripten 설치 → tvmjs 컴파일 → web-llm 빌드
WebLLM을 로컬에서 빌드하고 패키징하기 위해서는 몇 가지 작업이 필요합니다. WebLLM 빌드에 앞서 의존성 패키지를 살펴보면, tvmjs만 유일하게 패키지로 제공되지 않고 소스 컴파일이 필요합니다.
tvmjs 컴파일을 위해서는 emscripten을 먼저 설치해야 합니다. emscripten은 LLVM을 사용하는 언어(C/C++)를 웹 어셈블리로 컴파일할 수 있도록 제공하는 툴체인이며, TVM의 WebAssembly 런타임을 컴파일하고 시스템 라이브러리 지원을 제공하기 위해 필요합니다.
emscripten 설치가 완료되었다면, WebLLM repo의 스크립트(scripts/prep_deps.sh)를 실행하여 순서대로 tvmjs를 컴파일하고 패키지를 빌드할 수 있습니다.
WebLLM 구조
WebLLM의 Javascript단 API 구조는 상대적으로 단순하게 구성되어 있습니다. 우리가 흔히 접해왔던 ChatGPT와 같은 형태의 LLM을 서포트하기 위해서 아래와 같이 chat 서비스에 초점이 맞춰진 핵심 모듈들로 구성되어 있습니다.
ChatModule
: 사용자 단의 메소드를 제공하는 외부 인터페이스를 구현하고 있으며,LLMChatPipeline
을 직접 제어하며 WebLLM 초기화, 프롬프트 전송 등의 추상화된 개념을 구현하고 있습니다.LLMChatPipeline
: TVM 런타임 인스턴스의 초기화/실행 등의 직접 제어를 수행하고,Conversation
데이터에 접근하면서 프롬프트 메시지를 제어합니다.Conversation
: 메세지와 관련된 데이터의 제어를 수행하며, 각 LLM별로 적합한 Instruction config를 정의하고 있습니다.
이 외에도 WebLLM에서 사용할 설정의 인터페이스를 구현한 Config
, WebWorker 형태로 ChatModule
을 사용할 수 있도록 구성된 ChatWorkerHandler
등이 존재합니다.
WebLLM의 Javascript단 API를 실행하는 샘플 로직과 내부 Flow는 아래와 같습니다.
[출처] https://medium.com/@widoint/webllm-%EC%86%8C%EA%B0%9C%EC%99%80-%EA%B5%AC%EC%A1%B0-%EB%B6%84%EC%84%9D-2cfeac159454
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.