FastAPI를 사용하여 고성능, 프로덕션 준비 LLM API 구축: 단계별 가이드
# FastAPI를 사용하여 고성능, 프로덕션 준비 LLM API 구축: 단계별 가이드
FastAPI는 현대적이고 고성능 Python 웹 프레임워크로서 사용 편의성, 속도 및 자동 생성 API 문서로 인해 널리 사용됩니다. 특히 LLM (Large Language Model) 애플리케이션의 백엔드 API를 구축하는 데 있어서 FastAPI는 강력한 장점을 보여줍니다. 이 글에서는 FastAPI를 사용하여 프로덕션 준비 LLM API를 구축하는 방법을 단계별로 안내하고 몇 가지 모범 사례를 살펴봅니다.
## 왜 FastAPI를 선택해야 할까요?
LLM 애플리케이션의 API를 구축할 때 FastAPI는 다음과 같은 중요한 이점을 제공합니다.
* **고성능:** ASGI를 기반으로 하는 FastAPI는 높은 동시성 요청을 처리할 수 있으며 빠른 응답이 필요한 LLM 애플리케이션에 매우 중요합니다.
* **비동기 지원:** FastAPI는 `async` 및 `await` 키워드에 대한 기본 지원을 제공하여 LLM 추론 호출과 같은 비동기 작업을 쉽게 처리하고 주 스레드를 차단하지 않도록 할 수 있습니다.
* **자동 API 문서:** FastAPI는 OpenAPI 및 JSON Schema를 사용하여 대화형 API 문서 (Swagger UI)를 자동으로 생성하여 개발자가 API를 테스트하고 사용하는 데 편리합니다.
* **데이터 유효성 검사:** FastAPI는 Pydantic을 사용하여 데이터 유효성 검사를 수행하여 요청 매개변수의 정확성을 보장하고 오류를 줄입니다.
* **의존성 주입:** FastAPI의 의존성 주입 시스템을 사용하면 LLM 모델과 같은 리소스를 쉽게 관리하고 공유할 수 있습니다.
* **활발한 커뮤니티:** FastAPI는 방대하고 활발한 커뮤니티를 보유하고 있어 풍부한 리소스와 지원을 얻을 수 있습니다.
## 준비 작업
1. **Python 설치:** Python 3.7 이상이 설치되어 있는지 확인합니다.
2. **FastAPI 및 Uvicorn 설치:** pip를 사용하여 FastAPI 및 Uvicorn (ASGI 서버)을 설치합니다.
```bash
pip install fastapi uvicorn
- LLM 모델 선택: 사용하려는 LLM 모델을 선택합니다. OpenAI의 모델이거나 TinyLlama와 같은 오픈 소스 모델일 수 있습니다. OpenAI를 선택하는 경우 OpenAI API 키를 얻어야 합니다. TinyLlama를 선택하는 경우 모델 파일을 다운로드해야 합니다.
1단계: FastAPI 애플리케이션 생성
main.py라는 파일을 만들고 다음 코드를 추가합니다.
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI(title="LLM API", description="LLM과 상호 작용하기 위한 간단한 API입니다.")
class InputText(BaseModel):
text: str
class OutputText(BaseModel):
generated_text: str
이 코드는 FastAPI 애플리케이션을 정의하고 두 개의 Pydantic 모델을 정의합니다. InputText는 입력 텍스트를 수신하는 데 사용되고 OutputText는 생성된 텍스트를 반환하는 데 사용됩니다.
2단계: LLM 추론 로직 추가
선택한 LLM 모델에 따라 해당 추론 로직을 추가합니다. 여기서는 OpenAI API를 사용하는 예를 들어 설명합니다.
import openai
import os
# OpenAI API 키 가져오기
openai.api_key = os.environ.get("OPENAI_API_KEY") # 환경 변수를 사용하는 것이 좋습니다.
```@app.post("/generate", response_model=OutputText)
async def generate_text(input_text: InputText):
"""
Generates text based on the input text using OpenAI.
"""
try:
response = openai.Completion.create(
engine="text-davinci-003", # 모델 선택
prompt=input_text.text,
max_tokens=150,
n=1,
stop=None,
temperature=0.7,
)
generated_text = response.choices[0].text.strip()
return OutputText(generated_text=generated_text)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
이 코드는 /generate 라우트를 정의합니다. 이 라우트는 InputText 객체를 입력으로 받아 OpenAI API를 호출하여 텍스트를 생성하고, 생성된 텍스트를 OutputText 객체로 반환합니다. text-davinci-003을 선택한 적절한 모델로 바꾸십시오.
TinyLlama와 같은 로컬 모델을 사용하는 경우 transformers와 같은 해당 라이브러리를 설치하고 모델을 메모리에 로드해야 합니다. 코드 예시는 다음과 같습니다:
from transformers import pipeline
import torch
generator = pipeline('text-generation', model="TinyLlama/TinyLlama-1.1B-Chat-v1.0", torch_dtype=torch.bfloat16, device_map="auto")
@app.post("/generate", response_model=OutputText)
async def generate_text(input_text: InputText):
"""
Generates text based on the input text using TinyLlama.
"""
try:
generated_text = generator(input_text.text, max_length=50, do_sample=True, temperature=0.7)[0]['generated_text']
return OutputText(generated_text=generated_text)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
3단계: FastAPI 애플리케이션 실행
Uvicorn을 사용하여 FastAPI 애플리케이션을 실행합니다.
uvicorn main:app --reload
```이것은 로컬 서버를 시작하며, 브라우저에서 `http://127.0.0.1:8000/docs`에 접속하여 자동 생성된 API 문서를 볼 수 있습니다. `--reload` 파라미터는 코드 수정 후 서버를 자동으로 재시작하여 개발을 용이하게 합니다.
## 4단계: API 테스트
API 문서 또는 curl 등의 도구를 사용하여 API를 테스트합니다. 예를 들어, curl을 사용하여 POST 요청을 보냅니다:
```bash
curl -X POST -H "Content-Type: application/json" -d '{"text": "Tell me a joke about cats."}' http://127.0.0.1:8000/generate
생성된 텍스트를 포함하는 JSON 응답을 받아야 합니다.
5단계: 프로덕션 배포
FastAPI 애플리케이션을 프로덕션 환경에 배포합니다. 예를 들어:
- Docker: Docker를 사용하여 애플리케이션을 컨테이너화하여 배포 및 관리를 용이하게 합니다.
- 클라우드 플랫폼: AWS, Google Cloud Platform 또는 Azure와 같은 클라우드 플랫폼에 배포합니다. 언급된 Azure Cosmos DB 및 Azure Functions는 서버리스 API를 구축하는 데 사용할 수 있습니다. Modal은 자동 확장되는 FastAPI 애플리케이션을 배포하는 데에도 사용할 수 있습니다.
- 서버: 자신의 서버에 배포합니다.
모범 사례
- 환경 변수를 사용하여 민감한 정보 저장: 코드에 API 키와 같은 민감한 정보를 하드 코딩하지 말고 환경 변수를 사용합니다.
- 로그 기록 추가: 로그 기록 모듈을 사용하여 API의 실행 상태를 기록하여 디버깅 및 모니터링을 용이하게 합니다.
- 오류 처리 추가:
try...except블록을 사용하여 발생할 수 있는 예외를 처리하고 적절한 오류 정보를 반환합니다. - 속도 제한: 속도 제한기를 사용하여 API가 남용되는 것을 방지합니다. FastAPI에는 몇 가지 즉시 사용 가능한 속도 제한 라이브러리가 있습니다.
- 캐싱: 반복적인 요청의 경우 캐싱을 사용하여 성능을 향상시킬 수 있습니다.
- 모니터링: 모니터링 도구를 사용하여 API의 성능과 가용성을 모니터링합니다.
고급 기술
- 비동기 처리: 시간이 오래 걸리는 LLM 추론의 경우
async및await키워드를 사용하여 비동기적으로 처리하여 주 스레드가 차단되는 것을 방지합니다. - 스트리밍 응답: 스트리밍 응답 (StreamingResponse)을 사용하여 생성된 텍스트를 실시간으로 반환하여 사용자 경험을 향상시킬 수 있습니다.
- 다중 스레드/다중 프로세스: CPU 집약적인 LLM 추론의 경우 다중 스레드 또는 다중 프로세스를 사용하여 성능을 향상시킬 수 있습니다.
- GPU 가속: LLM 모델이 GPU 가속을 지원하는 경우 CUDA 또는 기타 GPU 가속 라이브러리를 사용하여 추론 속도를 높일 수 있습니다.





