Overview
인턴의 마지막(4번째) 프로젝트로 국내 대형 손해보험사의 벤치마크 테스트(BMT) 인프라를 단독으로 맡았다. BMT 주제는 'vLLM으로 LLM(Gemma)을 서빙해 보험금 지급 금액 심사를 수행하는 시스템을 고객사 환경에서 검증하는 것'이었다. DS팀은 개발 단계에서 Docker로 작업했지만, 고객사는 보안 정책상 Docker 사용을 제한하고 고정된 OS·Kubernetes 버전·CNI·Container Runtime을 조건으로 지정했다. 핵심 과제는 이 지정 조건들을 모두 만족시키면서 'BMT 시스템(vLLM·Gemma)을 파드로 띄워 고객사 환경에서 구동하는 것'이었다.
아키텍처
Kubernetes 리소스 설계: vLLM과 Backend를 각각 별도 파드로 분리하고, Backend가 호출하는 vLLM은 ClusterIP Service로 노출했다. 파드 IP는 재시작·재스케줄 때마다 바뀌지만, 외부 노출이 필요 없는 클러스터 내부 통신이므로 ClusterIP와 고정 DNS 이름을 사용해 Backend가 파드 IP 변화와 무관하게 vLLM에 안정적으로 접근하도록 구성했다.
mount/nomount 2종 준비: 현장에 Docker나 Podman이 설치돼 있지 않을 수 있어, 당일 코드가 바뀔 때 현장에서 이미지를 다시 빌드하는 것은 리스크가 컸다. 그래서 소스코드 전체를 컨테이너에 마운트해 빌드 없이 코드 변경을 반영하는 버전과 기본 nomount 버전을 함께 준비해 어느 상황에도 대응할 수 있도록 했다.
MIG 대응 GPU 리소스 설계: GPU 리소스를 처음에는 GPU Index 기반으로 설계했으나, 현장에서 고객사 H100이 MIG로 분할돼 있음을 확인했다. USB를 다시 구워야 하는 상황이라 서버실로 내려간 김에 사수분들께 구성을 확인하고, GPU Index 방식 대신 MIG 프로파일 리소스 기반 요청으로 GPU 리소스 설계를 다시 잡았다.
결론
현장이 폐쇄망이라, 똑같은 조건에서 미리 돌려보려고 AWS H100 서버를 하나 잡았다. 보안 그룹은 22번 포트만 열어두고 나머지 인바운드는 다 막아서 현장 폐쇄망이랑 최대한 똑같이 맞춰놨다. 현장에서는 이미지랑 vLLM 모델, Kubernetes Manifest를 USB로 반입하는데 EC2에는 USB를 꽂을 수가 없어서, SFTP로 같은 파일들을 올려서 배포까지 문제없이 되는지 확인했다. 테스트 당일에 문제가 하나 터졌다. USB 반입 자체는 됐는데 df -h로 확인해보니 59GB짜리가 1.7GB로 잡혀 있었다. USB가 제대로 안 구워져서 파일시스템이 온전히 안 들어온 거였다. GPU도 이슈가 있었다. 원래 vLLM은 GPU Index로 잡아서 관리했는데, 현장 서버는 MIG로 나눠져 있는 걸 확인했다. 그래서 USB 다시 반입할 때 이 부분까지 같이 고쳐서 정상 동작하는 걸 확인했다. DS팀 테스트 당일, Input Data(csv)에 문제가 생겨 즉석에서 수정이 필요했다. 시험 시간이 측정되는 만큼 수정에 드는 시간도 곧 성과에 영향을 주는 상황이라, 내가 바로 터미널에서 처리해 지연 없이 테스트를 이어갈 수 있게 했다.

