AI 모델을 실제 서비스에 배포할 때 가장 큰 고민은 바로 비용과 성능입니다. GPU는 강력하지만 비싸고, CPU는 저렴하지만 느립니다. 이런 딜레마를 해결하기 위해 AWS가 내놓은 해답이 바로 Inferentia입니다.
오늘은 AWS Inferentia가 무엇인지부터 실제 PyTorch 모델을 배포하는 방법까지, 실무에서 바로 활용할 수 있는 내용들을 정리해보겠습니다.
AWS Inferentia는 Amazon Web Services가 자체 개발한 머신러닝 추론(ML Inference) 전용 가속기 칩입니다. 한글 발음으로는 "인퍼렌셔"라고 읽으시면 됩니다 (/ˌɪn.fəˈrɛn.ʃə/
).
먼저 AWS Neuron SDK를 설치해야 합니다:
# Inf2 인스턴스에서 Neuron SDK 설치
pip install torch-neuronx neuronx-cc
import torch
import torchvision.models as models
# 예시: ResNet50 모델 로드
model = models.resnet50(pretrained=True)
model.eval()
import torch_neuronx
# 더미 입력 생성 (모델 입력 크기와 동일해야 함)
example = torch.rand(1, 3, 224, 224)
# Inferentia용으로 모델 변환
neuron_model = torch_neuronx.trace(model, example)
# 추론 수행
with torch.no_grad():
output = neuron_model(example)
print(output.shape)
.trace()
메서드의 한계PyTorch의 torch_neuronx.trace()
메서드는 정적 그래프만 캡처할 수 있습니다. 즉, 다음과 같은 동적 컨트롤 플로우는 제대로 처리되지 않습니다:
class ProblematicModel(torch.nn.Module):
def forward(self, x):
if x.sum() > 0: # 데이터 의존적 조건문
return x * 2
else:
return x - 2
[클라이언트] → HTTP 요청
↓
[FastAPI 서버]
├─ 데이터 전처리 (CPU)
├─ Inferentia 추론 (가속)
├─ 결과 후처리 (CPU)
↓
HTTP 응답 → [클라이언트]
from fastapi import FastAPI, UploadFile
from PIL import Image
import io
import torch
import torchvision.transforms as transforms
import torchvision.models as models
import torch_neuronx
# FastAPI 앱 생성
app = FastAPI()
# 모델 로드 및 Neuron 변환
model = models.resnet50(pretrained=True).eval()
example = torch.rand(1, 3, 224, 224)
neuron_model = torch_neuronx.trace(model, example)
# 이미지 전처리 파이프라인
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
])
# 추론 엔드포인트
@app.post("/predict")
async def predict(file: UploadFile):
# 이미지 로드 및 전처리
image = Image.open(io.BytesIO(await file.read())).convert("RGB")
input_tensor = transform(image).unsqueeze(0)
# Inferentia에서 추론 수행
with torch.no_grad():
output = neuron_model(input_tensor)
# 결과 반환
predicted_class = int(torch.argmax(output, dim=1))
return {"class_id": predicted_class}
uvicorn main:app --host 0.0.0.0 --port 8000
docker pull amazon/aws-neuron:latest
FROM ubuntu:20.04
# 기본 패키지 설치
RUN apt-get update && apt-get install -y \
python3 python3-pip git wget
# AWS Neuron SDK 설치
RUN pip3 install torch-neuronx neuronx-cc torchvision \
fastapi uvicorn pillow
# 애플리케이션 코드 복사
WORKDIR /app
COPY main.py .
# FastAPI 서버 실행
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
docker build -t neuron-api .
docker run --device=/dev/neuron0 -p 8000:8000 neuron-api
resnet-api
: 이미지 분류bert-api
: 자연어 처리 tts-api
: 음성 합성장점: 독립적 배포/스케일링, 장애 격리
단점: 인프라 복잡성 증가
/predict/image
, /predict/text
등장점: 관리 단순성
단점: 컨테이너 크기 증가, 장애 격리 어려움
구분 | CUDA (GPU) | NeuronX (Inferentia) |
---|---|---|
백엔드 | CUDA Runtime | Neuron Runtime |
모델 배치 | model.to("cuda") | torch_neuronx.trace() |
추론 실행 | model(input) | neuron_model(input) |
동적 그래프 | 지원 | 제한적 |
비용 | 높음 | 저렴 |
AWS Inferentia는 AI 추론 서비스의 비용 효율성과 성능을 동시에 해결해주는 강력한 솔루션입니다. 특히 대규모 서비스 운영 시 GPU 대비 상당한 비용 절감 효과를 얻을 수 있습니다.
다만 정적 그래프라는 제약사항이 있으므로, 모델 설계 단계에서부터 이를 고려한 아키텍처를 구성하는 것이 중요합니다.
PyTorch 모델을 Inferentia로 마이그레이션할 때는 torch_neuronx.trace()
를 활용하여 쉽게 변환할 수 있으며, FastAPI와 도커를 조합하면 production-ready한 API 서버를 빠르게 구축할 수 있습니다.
다음 글에서는 더 구체적인 성능 벤치마크와 실제 서비스 운영 사례를 다뤄보겠습니다.