Ollama와 FastAPI로 AWS에 DeepSeek R1 구축하기

DeepSeek-R1 개요
DeepSeek-R1은 Mixture of Experts(MoE) 아키텍처를 채택하며 파라미터 수는 6,710억에 달합니다. MoE 아키텍처는 370억 개의 파라미터를 활성화할 수 있어, 쿼리를 가장 관련성 높은 '전문가 클러스터'로 라우팅함으로써 효율적인 추론을 가능하게 합니다. 이 접근 방식은 모델이 전반적인 효율을 유지하면서 서로 다른 문제 영역에 특화할 수 있게 합니다. DeepSeek-R1은 FP8 형식으로 추론하려면 최소 800GB의 HBM 메모리가 필요합니다. 본 글에서는 NVIDIA T4 GPU를 탑재한 g4dn 인스턴스를 사용해 증류된 70억 파라미터 모델을 배포합니다. 이 인스턴스는 머신러닝 추론과 소규모 학습에 가장 비용 효율적이며, CUDA·CuDNN 같은 NVIDIA 라이브러리로 최적화된 그래픽 워크로드에서 높은 성능을 제공합니다.

AWS Bedrock을 쓰지 않는 이유
AWS Bedrock은 LLM 배포를 위한 훌륭한 관리형 솔루션을 제공하지만, 싱가포르와 홍콩 사용자에게는 큰 제약이 있습니다. 이 리전에서는 이용할 수 없기 때문입니다. Bedrock의 쉬운 설정과 AWS 서비스 통합이라는 장점에도 불구하고, 이러한 리전 제한 때문에 해당 지역 조직은 대안 배포 옵션을 검토할 수밖에 없습니다.
클라우드 배포의 장점
대규모 언어 모델을 로컬에서 실행하려면 GPU 등 상당한 컴puting 리소스가 필요합니다. DeepSeek R1 같은 모델을 효율적으로 돌릴 수 있는 그래픽 카드를 누구나 갖고 있지는 않습니다. 클라우드 배포에는 다음과 같은 여러 장점이 있습니다.
- 하드웨어 초기 투자 불필요
- 수요에 따른 확장 가능한 리소스
- 강력한 GPU 인스턴스(AWS g4dn·g5 등) 접근
- 종량제로 더 나은 비용 관리
Ollama 개요와 보안의 필요성
Ollama는 LLM을 로컬에서 관리·실행하기 위한 훌륭한 도구로, 다음을 제공합니다.
- 간단한 모델 관리 및 배포
- 사용하기 쉬운 API 인터페이스
- 효율적인 모델 로딩 및 서빙

출처: https://github.com/ollama/ollama
하지만 Ollama는 클라우드 배포를 위한 내장 보안 기능을 전제로 설계되지 않았습니다. Ollama 서버를 인터넷에 공개할 때는 추가 보안 계층이 필요합니다. 여기서 FastAPI가 API 키 인증, 속도 제한 등을 제공합니다.
제안하는 클라우드 아키텍처

1. FastAPI 서비스
AWS Fargate에 배포되어 8080 포트에서 요청을 수신합니다. 퍼블릭 서브넷의 HTTPS 트래픽을 전달하는 Application Load Balancer(ALB)를 통해 사용자 요청을 처리합니다.
2. Ollama 서비스
EC2 인스턴스(g4dn.xlarge)에서 실행되며 11434 포트에서 대기하고, FastAPI 요청을 처리해 특정 연산 작업을 수행합니다.
3. 통합 및 스케일링
FastAPI는 HTTP로 Ollama와 통신하고, Auto Scaling Group(ASG)은 수요에 따라 Ollama 인스턴스 1~2대를 유지합니다. Cloud Map이 서비스 디스커버리를 지원해 두 서비스 간 연동을 강화합니다.
4. 보안
이 아키텍처는 백엔드 서비스를 프라이빗 서브넷에 두고 퍼블릭 트래픽은 ALB로 라우팅해, 인터넷 직접 노출로부터 보호합니다.
구현 단계
1. Ollama와 FastAPI용 Docker 파일 준비
Ollama 서비스를 설정하기 위한 Dockerfile을 준비합니다. 아래 설정은 공식 Ollama 이미지를 베이스로 사용하는 이미지를 만듭니다. entrypoint 스크립트를 이미지에 복사하고 실행 가능하게 만든 뒤, 백그라운드에서 Ollama 서버를 시작하고 준비될 때까지 대기한 다음 DeepSeek R1 모델을 pull합니다. 마지막으로 entrypoint를 복사한 스크립트로 설정해 컨테이너 시작 시 서버가 완전히 가동되도록 합니다.
# Use official Ollama image
FROM ollama/ollama:latest
# Copy entrypoint script into the image
COPY entrypoint.sh /entrypoint.sh
# Make script executable
RUN chmod +x /entrypoint.sh
# Start the Ollama server in the background
RUN ollama serve & \
echo "Waiting for Ollama server to be ready..." && \
while [ "$(ollama list | grep 'NAME')" = "" ]; do sleep 1; done && \
echo "Ollama server is ready. Pulling model..." && \
ollama pull deepseek-r1:7b
# Set entrypoint
ENTRYPOINT ["/entrypoint.sh"]참고: 마찬가지로 FastAPI 서비스용 Dockerfile도 python:3.11-slim같은 베이스 이미지에서 시작해 의존성을 설치하고 애플리케이션 코드를 이미지에 복사하면 준비할 수 있습니다.
2. FastAPI 앱 준비
이 FastAPI 애플리케이션은 사용자가 언어 모델과 상호작용할 수 있는 API를 만듭니다. 환경 변수에서 설정을 읽고 검증용 요청 모델을 정의합니다. /query 엔드포인트를 통해 사용자 입력을 받고, 보안을 위해 API 키를 검증한 뒤 언어 모델로 요청을 처리합니다. 오류는 적절한 HTTP 상태 코드와 메시지로 처리합니다.
#app.py
from fastapi import FastAPI, HTTPException, Depends, Header, status
from fastapi.responses import JSONResponse
from langchain_ollama import ChatOllama
app = FastAPI()
def create_llm(temperature: float):
return ChatOllama(
base_url=OLLAMA_ENDPOINT,
model=MODEL_NAME,
temperature=temperature
)
@app.post('/query')
async def query(data: QueryRequest, authorization: str = Depends(verify_api_key)):
try:
llm = create_llm(data.temperature)
response = llm.invoke(data.message)
return JSONResponse(content={"response": response.content})
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
if __name__ == '__main__':
import uvicorn
uvicorn.run(app, host='0.0.0.0', port=8080)
3. CDK로 인프라 구성
AWS CDK로 다음을 포함한 인프라를 프로비저닝합니다.
GPU 지원 EC2 인스턴스(g4dn.xlarge)
// lib/infra-stack.js ollamaTaskDef.addContainer('OllamaContainer', { image: ecs.ContainerImage.fromAsset(path.join(__dirname, '../../ollama-service')), memoryReservationMiB: 4096, portMappings: [{ containerPort: 11434 }], }); // Create Capacity Provider for GPU instances (g4dn.xlarge) const autoScalingGroup = new autoscaling.AutoScalingGroup(this, 'OllamaASG', { vpc, instanceType: ec2.InstanceType.of(ec2.InstanceClass.G4DN, ec2.InstanceSize.XLARGE), machineImage: ecs.EcsOptimizedImage.amazonLinux2(), minCapacity: 1, maxCapacity: 2, });HTTPS 종단용 Application Load Balancer
// Create Application Load Balancer const zone = route53.HostedZone.fromLookup(this, 'HostedZone', { domainName }); const certificate = new acm.Certificate(this, 'Certificate', { domainName: <your-domain-name>, validation: acm.CertificateValidation.fromDns(zone), }); const lb = new elbv2.ApplicationLoadBalancer(this, 'LB', { vpc, internetFacing: true, securityGroup: fastapiSG }); const listener = lb.addListener('HttpsListener', { port: 443, certificates: [certificate], }); listener.addTargets('FastapiTarget', { port: 8080, targets: [fastapiService], healthCheck: { path: '/health', interval: cdk.Duration.seconds(30) } }); new route53.ARecord(this, 'ARecord', { zone, recordName: <your-record-name>, target: route53.RecordTarget.fromAlias(new targets.LoadBalancerTarget(lb)), });CDK로 AWS 인프라 배포
$cdk deploy --context env="your-environment"
결론
Ollama의 모델 관리 기능, FastAPI의 보안 기능, AWS 인프라를 결합하면 AWS Bedrock을 사용할 수 없는 리전에서도 프로덕션에 적합한 견고하고 안전하며 확장 가능한 DeepSeek R1 배포를 구축할 수 있습니다.
다음 단계:
support@alphamatch.ai 로 문의해 주시면 전체 코드와 안전한 DeepSeek R1 서버 구축을 위한 상세 구현 가이드(단계별 안내)를 보내드립니다.

