로컬에서 ChatGPT 돌리기 - vLLM + GPT-OSS:20B 설치부터 실행까지
vLLM으로 GPT-OSS:20B 실행하기 - 완벽 가이드
들어가며
2025년 8월 5일, OpenAI가 GPT-2 이후 첫 번째 오픈소스 모델인 GPT-OSS 시리즈를 공개했습니다. 이 중 GPT-OSS:20B는 16GB 메모리만으로도 실행할 수 있는 강력한 추론 모델로, 로컬 환경에서 ChatGPT 수준의 AI를 경험할 수 있게 해줍니다.
하지만 모델을 다운로드했다고 해서 바로 사용할 수 있는 것은 아닙니다. 효율적인 추론을 위해서는 vLLM과 같은 최적화된 추론 엔진이 필요합니다. 이 글에서는 vLLM이 무엇인지 알아보고, GPT-OSS:20B를 실제로 실행해보는 과정을 단계별로 살펴보겠습니다.
vLLM이란 무엇인가?
vLLM의 정의
vLLM(Very Large Language Model)은 대규모 언어 모델의 빠르고 효율적인 추론을 위한 오픈소스 라이브러리입니다. UC Berkeley에서 개발된 이 프로젝트는 기존 방식 대비 최대 24배 빠른 성능을 제공하면서도 GPU 메모리 사용량을 절반으로 줄이는 혁신적인 기술입니다.
vLLM의 핵심 기술: PagedAttention
vLLM의 가장 큰 혁신은 PagedAttention 기술입니다. 기존 LLM들이 연속적인 메모리 할당을 사용하는 반면, vLLM은 운영체제의 가상 메모리 설계에서 영감을 얻어 비연속적인 메모리 저장 방식을 채택했습니다.
기존 방식의 문제점:
- KV 캐시를 위한 정적 메모리 할당
- 최대 시퀀스 길이를 위해 과도한 메모리 예약
- 내부/외부 단편화로 인한 메모리 낭비
PagedAttention의 해결책:
- 동적 메모리 할당
- 필요한 만큼만 메모리 사용
- 메모리 단편화 최소화
vLLM vs 기타 도구 비교
| 도구 | 용도 | 속도 | 메모리 효율성 | 사용 난이도 |
|---|---|---|---|---|
[object Object] | 프로덕션 서빙 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 중간 |
Transformers | 연구/개발 | ⭐⭐ | ⭐⭐ | 쉬움 |
Ollama | 개인 사용 | ⭐⭐⭐ | ⭐⭐⭐ | 매우 쉬움 |
시스템 요구사항
최소 요구사항 (GPT-OSS:20B 기준)
GPU:
- 16GB VRAM (RTX 4090, RTX 3090, A100 등)
- CUDA 호환 GPU 필수
시스템 메모리:
- 32GB 이상 권장 (vLLM은 상당한 시스템 RAM 사용)
저장공간:
- 최소 50GB 여유 공간 (모델 다운로드 및 캐시용)
소프트웨어:
- Python 3.8 이상
- CUDA 11.8 이상
GPU 메모리 부족 시 대안
12GB 이하 GPU:
- CPU 오프로딩 활용
- 모델 양자화 적용
- 텐서 병렬화 사용
vLLM 설치하기
1. Python 환경 설정
vLLM은 uv를 사용한 Python 환경 관리를 권장합니다:
# uv 설치 (macOS/Linux) curl -LsSf https://astral.sh/uv/install.sh | sh # 가상환경 생성 uv venv --python 3.12 --seed source .venv/bin/activate
2. vLLM 설치
GPT-OSS 모델을 위한 특별 버전의 vLLM을 설치합니다:
uv pip install --pre vllm==0.10.1+gptoss \ --extra-index-url https://wheels.vllm.ai/gpt-oss/ \ --extra-index-url https://download.pytorch.org/whl/nightly/cu128 \ --index-strategy unsafe-best-match
3. 설치 확인
python -c "import vllm; print('vLLM 설치 완료!')"
GPT-OSS:20B 실행하기
1. 서버 모드로 실행
가장 간단한 방법은 vLLM의 서버 모드를 사용하는 것입니다:
vllm serve openai/gpt-oss-20b
이 명령어는:
- Hugging Face에서 자동으로 모델 다운로드
localhost:8000에서 OpenAI 호환 API 서버 실행- 첫 실행 시 모델 다운로드로 시간이 소요됨 (약 20분)
2. 실행 확인
서버가 정상적으로 시작되면 다음과 같은 로그를 볼 수 있습니다:
INFO: Started server process [12345]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000
3. 테스트 스크립트
별도 터미널에서 테스트 스크립트를 실행해보세요:
import openai # vLLM 서버에 연결 client = openai.OpenAI( api_key="dummy-key", # vLLM 로컬 서버는 키 불필요 base_url="http://localhost:8000/v1" ) # 간단한 테스트 response = client.chat.completions.create( model="gpt-oss-20b", messages=[ {"role": "user", "content": "Python으로 피보나치 수열을 구현해줘"} ], max_tokens=500 ) print(response.choices[0].message.content)
실제 성능 테스트
1. 추론 속도 측정
import time import openai client = openai.OpenAI( api_key="dummy-key", base_url="http://localhost:8000/v1" ) def measure_inference_speed(): start_time = time.time() response = client.chat.completions.create( model="gpt-oss-20b", messages=[ {"role": "user", "content": "인공지능의 미래에 대해 500자로 설명해줘"} ], max_tokens=500 ) end_time = time.time() content = response.choices[0].message.content tokens = len(content.split()) # 대략적인 토큰 수 print(f"응답 시간: {end_time - start_time:.2f}초") print(f"생성된 토큰 수: {tokens}") print(f"토큰/초: {tokens / (end_time - start_time):.2f}") print(f"\n응답 내용:\n{content}") measure_inference_speed()
2. 추론 능력 테스트
def test_reasoning(): test_cases = [ "25 * 47 + 123을 계산하고 단계별로 설명해줘", "다음 문제를 해결해줘: 한 농부가 닭과 토끼를 기르는데, 머리는 총 30개, 다리는 총 84개입니다. 닭과 토끼는 각각 몇 마리인가요?", "Python으로 이진 검색 알고리즘을 구현하고 시간복잡도를 설명해줘" ] for i, question in enumerate(test_cases, 1): print(f"\n=== 테스트 {i} ===") print(f"질문: {question}") response = client.chat.completions.create( model="gpt-oss-20b", messages=[{"role": "user", "content": question}], max_tokens=800 ) print(f"답변: {response.choices[0].message.content}") print("-" * 50) test_reasoning()
고급 설정 및 최적화
1. 메모리 사용량 조절
# GPU 메모리 사용률 조절 (기본 90%) vllm serve openai/gpt-oss-20b --gpu-memory-utilization 0.8 # 텐서 병렬화 (다중 GPU 사용) vllm serve openai/gpt-oss-20b --tensor-parallel-size 2
2. 배치 처리 최적화
# 동시 요청 처리 테스트 import asyncio import aiohttp async def concurrent_requests(): async with aiohttp.ClientSession() as session: tasks = [] for i in range(5): # 5개 동시 요청 task = asyncio.create_task( send_request(session, f"질문 {i+1}: 1부터 10까지의 합은?") ) tasks.append(task) responses = await asyncio.gather(*tasks) for i, response in enumerate(responses): print(f"응답 {i+1}: {response}") async def send_request(session, content): payload = { "model": "gpt-oss-20b", "messages": [{"role": "user", "content": content}], "max_tokens": 100 } async with session.post( "http://localhost:8000/v1/chat/completions", json=payload, headers={"Authorization": "Bearer dummy-key"} ) as response: result = await response.json() return result['choices'][0]['message']['content'] # 실행 # asyncio.run(concurrent_requests())
3. 추론 레벨 조정
GPT-OSS 모델은 추론 레벨을 조정할 수 있습니다:
# 빠른 응답 (Low reasoning) response = client.chat.completions.create( model="gpt-oss-20b", messages=[ {"role": "system", "content": "Reasoning: low"}, {"role": "user", "content": "안녕하세요!"} ] ) # 깊은 분석 (High reasoning) response = client.chat.completions.create( model="gpt-oss-20b", messages=[ {"role": "system", "content": "Reasoning: high"}, {"role": "user", "content": "기후 변화의 경제적 영향을 분석해줘"} ] )
문제 해결
자주 발생하는 오류와 해결방법
1. CUDA Out of Memory 오류
# 해결방법: GPU 메모리 사용률 줄이기 vllm serve openai/gpt-oss-20b --gpu-memory-utilization 0.7
2. 모델 다운로드 실패
# Hugging Face 토큰 설정 export HF_TOKEN="your_hugging_face_token"
3. 느린 추론 속도
- GPU 드라이버 업데이트 확인
- CUDA 버전 호환성 확인
- 시스템 리소스 모니터링
성능 벤치마크
테스트 환경
- GPU: RTX 4090 (24GB)
- CPU: AMD Ryzen 9 7950X
- RAM: 64GB DDR5
- Storage: NVMe SSD
측정 결과
- 평균 추론 속도: 15-25 토큰/초
- 첫 토큰까지 시간: 0.5-1.5초
- 메모리 사용량: GPU 14GB, RAM 8GB
- 동시 요청 처리: 최대 4개 요청
마무리
vLLM과 GPT-OSS:20B의 조합은 로컬 환경에서 강력한 AI 모델을 실행할 수 있는 훌륭한 방법입니다. 특히 다음과 같은 장점이 있습니다:
장점:
- OpenAI API와 완벽 호환
- 높은 추론 성능
- 메모리 효율성
- 오픈소스의 투명성
활용 분야:
- 개인 AI 어시스턴트 구축
- 기업 내부 AI 서비스
- AI 연구 및 개발
- 프라이버시가 중요한 애플리케이션
다음 단계:
- 파인튜닝을 통한 도메인 특화 모델 개발
- 다양한 추론 엔진 비교 실험
- 프로덕션 환경 배포 검토
AI 기술의 민주화가 가속화되는 지금, 누구나 강력한 AI 모델을 직접 실행하고 커스터마이징할 수 있는 시대가 열렸습니다. vLLM과 GPT-OSS로 여러분만의 AI 여정을 시작해보세요!
이 글이 도움이 되셨나요? 댓글로 경험을 공유해주시거나 궁금한 점을 남겨주세요!
Write by :
개발하는남자
Developer
💬댓글 (0)
댓글을 작성하려면 로그인이 필요합니다.
댓글을 불러오는 중...