🤖 AI/ML

Text Generation WebUI

Oobabooga WebUI

로컬 환경에서 다양한 대규모 언어 모델(LLM)을 실행하고 채팅할 수 있는 오픈소스 웹 인터페이스입니다. Gradio 기반으로 확장성이 뛰어나며, GGUF, GPTQ, AWQ 등 다양한 양자화 모델을 지원합니다.

📖 상세 설명

Text Generation WebUI(흔히 "Oobabooga"로 불림)는 로컬 컴퓨터에서 LLM을 실행할 수 있게 해주는 오픈소스 프로젝트입니다. ChatGPT와 유사한 채팅 인터페이스를 제공하면서도, 인터넷 연결 없이 완전한 프라이버시를 보장합니다. Python과 Gradio로 구축되어 커스터마이징이 용이하며, 다양한 확장 기능을 플러그인 형태로 추가할 수 있습니다.

이 도구의 핵심 강점은 모델 포맷 호환성입니다. Hugging Face의 Transformers 모델, llama.cpp의 GGUF 포맷, ExLlamaV2의 EXL2 포맷, GPTQ, AWQ 양자화 모델 등 거의 모든 형태의 LLM을 로드할 수 있습니다. 이를 통해 사용자는 자신의 하드웨어 사양에 맞는 최적의 모델 형식을 선택할 수 있습니다.

Text Generation WebUI는 다양한 로더(loader)를 제공합니다. llama.cpp 로더는 CPU와 GPU를 혼합 사용할 수 있어 VRAM이 제한된 환경에서 유용합니다. ExLlamaV2 로더는 순수 GPU 추론으로 가장 빠른 속도를 제공합니다. Transformers 로더는 표준 Hugging Face 모델과 완벽하게 호환됩니다.

확장 기능으로는 음성 인식(Whisper), 음성 합성(TTS), 이미지 생성(Stable Diffusion 연동), LoRA 어댑터 로드, 긴 컨텍스트 처리(RoPE 스케일링) 등이 있습니다. API 서버 기능도 내장되어 있어, 다른 애플리케이션에서 REST API를 통해 모델을 호출할 수 있습니다. 특히 OpenAI 호환 API를 제공하여 기존 OpenAI SDK를 사용하는 앱과 쉽게 통합됩니다.

💻 코드 예제

Text Generation WebUI 설치 및 API 활용 예제입니다.

# 1. Text Generation WebUI 설치 (Linux/WSL)
git clone https://github.com/oobabooga/text-generation-webui
cd text-generation-webui

# 원클릭 설치 스크립트 실행
# Linux: ./start_linux.sh
# Windows: start_windows.bat
# Mac: ./start_macos.sh

# 2. 모델 다운로드 (예: Llama-2-7B-Chat-GGUF)
python download-model.py TheBloke/Llama-2-7B-Chat-GGUF

# 3. API 서버 모드로 실행
python server.py --api --model TheBloke_Llama-2-7B-Chat-GGUF

# ==========================================
# Python에서 API 호출하기
# ==========================================
import requests
import json

# Text Generation WebUI API 엔드포인트
API_URL = "http://localhost:5000/api/v1/generate"

def generate_text(prompt, max_tokens=200, temperature=0.7):
    """Text Generation WebUI API로 텍스트 생성"""
    payload = {
        "prompt": prompt,
        "max_new_tokens": max_tokens,
        "temperature": temperature,
        "top_p": 0.9,
        "top_k": 40,
        "repetition_penalty": 1.15,
        "do_sample": True,
        "seed": -1,
        "stopping_strings": ["", "User:", "\n\n"]
    }

    response = requests.post(API_URL, json=payload)
    if response.status_code == 200:
        result = response.json()
        return result['results'][0]['text']
    else:
        raise Exception(f"API Error: {response.status_code}")

# 사용 예시
prompt = """### System: 당신은 친절한 AI 어시스턴트입니다.

### User: Python에서 리스트를 정렬하는 방법을 알려주세요.

### Assistant:"""

response = generate_text(prompt)
print(response)


# ==========================================
# OpenAI 호환 API 사용 (--extensions openai 플래그 필요)
# ==========================================
from openai import OpenAI

# 로컬 Text Generation WebUI에 연결
client = OpenAI(
    base_url="http://localhost:5000/v1",
    api_key="not-needed"  # 로컬 서버는 API 키 불필요
)

# ChatCompletion API 호출
response = client.chat.completions.create(
    model="local-model",  # 실제 모델명은 무시됨
    messages=[
        {"role": "system", "content": "당신은 친절한 AI 어시스턴트입니다."},
        {"role": "user", "content": "대한민국의 수도는 어디인가요?"}
    ],
    temperature=0.7,
    max_tokens=100
)

print(response.choices[0].message.content)

🗣️ 실무에서 이렇게 말하세요

"우바부가로 로컬에서 라마 돌려보니까 생각보다 빠르더라고요"

→ Text Generation WebUI(Oobabooga)로 LLaMA 모델을 로컬 실행한 경험 공유

"GGUF 4비트 양자화 모델 쓰니까 8GB VRAM에서도 13B 돌아가요"

→ 양자화된 모델로 낮은 사양에서 큰 모델 실행 가능함을 설명

"OpenAI 호환 API 켜두면 기존 코드 거의 안 고치고 로컬 모델로 바꿀 수 있어요"

→ OpenAI API 호환 기능으로 마이그레이션이 쉬움을 강조

⚠️ 흔한 실수 & 주의사항

VRAM 부족으로 인한 크래시

모델 로드 시 VRAM을 초과하면 크래시가 발생합니다. n-gpu-layers 옵션으로 GPU에 올릴 레이어 수를 조절하세요.

로더와 모델 포맷 불일치

GGUF 모델은 llama.cpp 로더, GPTQ 모델은 AutoGPTQ/ExLlama 로더를 사용해야 합니다. 포맷에 맞지 않는 로더를 선택하면 에러가 발생합니다.

컨텍스트 길이 초과

모델의 기본 컨텍스트 길이를 초과하면 출력이 이상해집니다. RoPE scaling을 활성화하거나 긴 컨텍스트 버전 모델을 사용하세요.

채팅 템플릿 미적용

각 모델에는 고유한 프롬프트 템플릿이 있습니다. Instruction 탭에서 올바른 템플릿을 선택하지 않으면 품질이 저하됩니다.

🔗 관련 용어

📚 더 배우기