LLM 통합을 위한 API 활용
LLM을 코드베이스에 통합하는 방법은 다양하지만, 프로덕션 배포에는 OpenAI 호환 API를 사용하는 것이 좋습니다. 이 접근 방식은 빠르게 변화하는 모델 환경에 적응할 수 있는 유연성을 제공합니다. 몇 달 전에 최첨단으로 여겨졌던 모델도 빠르게 구식이 될 수 있습니다.
2022년 ChatGPT와 함께 시작된 AI 붐 이후 OpenAI의 API 인터페이스는 애플리케이션을 LLM에 연결하기 위한 사실상의 표준으로 부상했습니다. 이 표준을 통해 개발자는 노트북의 Llama.cpp에서 Mistral 7B로 시작하여 프로덕션 배포를 위해 Mistral AI의 API 서버로 원활하게 전환하는 등 사용 가능한 리소스를 사용하여 애플리케이션을 구축할 수 있습니다. 이를 통해 단일 모델, 추론 엔진 또는 API 공급업체에 갇히는 것을 방지할 수 있습니다.
클라우드 기반 추론 서비스는 AI 배포를 확장하는 데 자본 지출(capex) 친화적인 수단을 제공합니다. 이러한 서비스는 하드웨어 관리 및 모델 구성의 필요성을 없애고 대신 애플리케이션 통합을 위한 API를 제공합니다.
주요 모델 구축 회사의 API 제품 외에도 점점 더 많은 AI 인프라 스타트업이 오픈 웨이트 모델에 대한 서비스로서의 추론을 제공하고 있습니다. 이러한 제공업체는 접근 방식이 다양합니다. SambaNova, Cerebras 및 Groq와 같은 일부는 추론을 가속화하기 위해 전문 하드웨어 또는 추측 디코딩과 같은 기술을 활용하지만 더 작은 모델 선택을 제공합니다. Fireworks AI와 같은 다른 회사는 LoRA(Low Rank Adaptation) 어댑터를 사용하여 사용자 정의 미세 조정 모델의 배포를 지원합니다. AI 생태계의 다양성으로 인해 특정 제공업체에 커밋하기 전에 철저한 연구가 필요합니다.
온프레미스 LLM 배포 고려 사항
개인 정보 보호, 규정 또는 기존 인프라 제약 조건(예: 회사가 이미 GPU 서버에 투자한 경우)으로 인해 클라우드 기반 접근 방식이 불가능한 경우 온프레미스 배포가 필요합니다. 이는 여러 가지 어려움을 야기할 수 있습니다. 발생하는 일반적인 질문은 다음과 같습니다.
- 모델 선택: 적절한 모델은 특정 사용 사례에 따라 다릅니다. 고객 서비스 챗봇용으로 설계된 모델은 검색 증강 생성 또는 코드 지원으로 사용되는 모델과 다른 요구 사항을 갖습니다. API 공급업체와 시간을 보내 요구 사항을 충족하는 모델을 식별하는 것이 좋습니다.
- 하드웨어 요구 사항: 필요한 하드웨어를 결정하는 것은 GPU가 비싸고 획득하기 어려울 수 있으므로 매우 중요합니다. 모델 자체는 실행하는 데 필요한 하드웨어에 대한 통찰력을 제공할 수 있습니다. 더 큰 모델에는 더 많은 하드웨어가 필요합니다. 최소 GPU 메모리의 대략적인 추정치는 16비트 정밀도로 훈련된 모델의 경우 매개변수 수(10억 단위)에 2GB를 곱하여 계산할 수 있습니다. 8비트 모델의 경우 매개변수 10억 개당 1GB가 필요합니다. 양자화와 같은 모델 압축 기술은 이를 매개변수 10억 개당 512MB로 줄일 수 있습니다. 이것은 하한선입니다. 모델의 단기 기억 역할을 하는 키-값 캐시로 인해 모델을 여러 사용자에게 동시에 제공하려면 추가 메모리가 필요합니다. Nvidia의 지원 매트릭스는 다양한 모델을 실행하는 데 필요한 GPU에 대한 지침을 제공합니다.
- 중복성: 모델에 맞는 하드웨어 크기 조정 외에도 중복성을 고려해야 합니다. 단일 GPU 노드는 오류에 취약하므로 장애 조치 및 로드 밸런싱을 위해 두 개 이상의 시스템을 배포하는 것이 중요합니다.
- 배포 방법: LLM은 로드 밸런서가 있는 베어 메탈, 가상 머신 또는 Docker 또는 Kubernetes의 컨테이너와 같은 다양한 방법을 사용하여 프로덕션 환경에서 배포하고 제공할 수 있습니다. Kubernetes는 컨테이너 생성, 네트워킹 및 로드 밸런싱을 자동화하여 대규모 배포를 단순화합니다.
LLM 배포를 위한 Kubernetes
Kubernetes는 컨테이너 생성, 네트워킹 및 로드 밸런싱을 자동화하여 대규모 배포와 관련된 복잡성을 많이 추상화합니다. 많은 기업에서 이미 Kubernetes를 채택하고 이해하고 있습니다. Nvidia, Hugging Face 등은 일반적인 워크로드 및 배포에 대해 사전 구성된 NIM(Nvidia Inference Microservices) 및 HUGS(Hugging Face Generative AI Services)가 있는 컨테이너화된 환경을 선호합니다.
추론 엔진
다양한 하드웨어와 호환되는 Ollama 및 Llama.cpp를 포함하여 모델을 실행하는 데 사용할 수 있는 다양한 추론 엔진이 있습니다. 모델 확장의 경우 vLLM, TensorRT LLM, SGLang 및 PyTorch와 같은 라이브러리가 종종 사용됩니다. 이 가이드는 vLLM을 사용하여 모델을 배포하는 데 중점을 둡니다. vLLM은 널리 사용되는 모델을 폭넓게 선택할 수 있으며 Nvidia, AMD 및 기타 하드웨어에 대한 폭넓은 지원 및 호환성을 제공하기 때문입니다.
Kubernetes 환경 준비
GPU와 함께 작동하도록 Kubernetes 환경을 설정하려면 일반적인 Kubernetes 설정에 비해 추가 드라이버 및 종속성이 필요합니다. 설정 프로세스는 AMD 및 Nvidia 하드웨어에 따라 다릅니다.
이 가이드에서는 단일 노드 구성에서 K3S를 사용합니다. 기본 단계는 다중 노드 환경과 유사하지만 각 GPU 작업자 노드에서 종속성을 충족해야 하며 스토리지 구성을 조정해야 할 수 있습니다.
목표는 프로덕션 친화적인 방식으로 추론 워크로드를 배포하기 위한 견고한 기반을 제공하는 것입니다. 다음 필수 조건이 필요합니다.
- 지원되는 AMD 또는 Nvidia GPU 보드가 하나 이상 있는 서버 또는 워크스테이션
- Ubuntu 24.04 LTS 새로 설치
Nvidia 종속성
Nvidia 가속 K3S 환경을 설정하려면 CUDA 드라이버 Fabric Manager 및 헤드리스 서버 드라이버를 설치해야 합니다. 드라이버 문제를 디버깅하려면 Nvidia의 서버 유틸리티를 설치합니다.
Ubuntu 24.04 LTS를 새로 설치한 후 다음 단계를 수행하여 Nvidia 드라이버를 설치합니다. 먼저 소프트웨어 및 업데이트 유틸리티를 열고 ‘추가 드라이버’ 탭으로 이동합니다. Nvidia 드라이버가 나열되어야 합니다. 최신 드라이버를 선택하고 변경 사항을 적용합니다. 드라이버가 설치되면 다음 명령을 실행하여 설치를 확인합니다.
1 | nvidia-smi |
Nvidia System Management Interface (nvidia-smi) 유틸리티는 Nvidia GPU 장치의 관리 및 모니터링에 사용됩니다. 설치가 성공하면 GPU에 대한 정보가 표시됩니다.
다음 단계는 Nvidia Container Toolkit을 설치하는 것입니다. Nvidia Container Toolkit을 사용하면 Docker와 같은 컨테이너 런타임에서 GPU를 사용할 수 있습니다. 다음 명령을 실행하여 Nvidia Container Toolkit을 설치합니다.
1 | distribution=$(. /etc/os-release;echo "$ID$VERSION_ID" | sed -e 's/\./_/g') \ |
그런 다음 패키지 저장소를 추가하고 Nvidia Container Toolkit을 설치합니다.
1 | curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - |
설치가 완료되면 Docker가 GPU에 액세스할 수 있는지 확인합니다.
1 | docker run --rm --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi |
이 명령은 CUDA 11.6.2를 실행하는 Nvidia에서 제공하는 컨테이너를 다운로드하고 실행합니다. 컨테이너 내에서 nvidia-smi 유틸리티가 실행되고 GPU에 대한 정보가 표시됩니다.
AMD 종속성
AMD GPU를 사용하려면 최신 AMD 드라이버가 설치되어 있는지 확인해야 합니다. Ubuntu에서 이 작업은 다음 명령을 사용하여 수행할 수 있습니다.
1 | sudo apt update |
다음 단계는 AMD ROCm(Radeon Open Compute Platform)을 설치하는 것입니다. ROCm은 다양한 워크로드를 위한 AMD GPU에서 GPU 계산을 허용하는 오픈 소스 플랫폼입니다.
1 | wget -q -O - https://repo.radeon.com/rocm/rocm.gpg.key | sudo apt-key add - |
ROCm을 설치한 후 K3S에서 사용할 수 있도록 Docker를 구성해야 합니다. 먼저 사용자에게 ‘video’ 그룹에 대한 액세스 권한이 있는지 확인합니다.
1 | sudo usermod -a -G video $USER |
그런 다음 AMD ROCm을 Docker에 노출합니다.
1 | echo '{"runtimes": {"roc": {"path": "/opt/rocm/libexec/docker/rocm-runtime", "runtimeArgs": []}}}' | sudo tee /etc/docker/daemon.json |
Docker를 다시 시작한 후 AMD GPU에 액세스할 수 있는지 확인합니다.
1 | docker run --rm --device=/dev/kfd --device=/dev/dri/card0 -v /opt/rocm:/opt/rocm rocm/rocm-terminal:latest bash -c "rocminfo" |
이 명령은 ROCm 터미널 컨테이너를 다운로드하고 실행합니다. 컨테이너 내에서 rocminfo 유틸리티가 실행되고 GPU에 대한 정보가 표시됩니다.
K3S 설치
Nvidia 및 AMD 종속성을 설치한 후 K3S를 설치할 수 있습니다. K3S는 경량 Kubernetes 배포판으로 리소스 제한된 환경에 적합합니다. 다음 명령을 실행하여 K3S를 설치합니다.
1 | curl -sfL https://get.k3s.io | sh -s -- --disable traefik --docker |
이 명령은 K3S를 설치하고 기본 로드 밸런서인 Traefik을 비활성화합니다. 또한 Docker를 컨테이너 런타임으로 사용합니다. K3S가 설치되면 노드가 준비되었는지 확인합니다.
1 | kubectl get nodes |
이 명령은 Kubernetes 클러스터의 노드 목록을 표시합니다. 노드 상태가 ‘Ready’여야 합니다.
GPU 지원 활성화
K3S가 설치되면 GPU 지원을 활성화해야 합니다. 이는 Nvidia Device Plugin 또는 AMD Device Plugin을 설치하여 수행할 수 있습니다.
Nvidia Device Plugin을 설치하려면 다음 명령을 실행합니다.
1 | kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.1/nvidia-device-plugin.yml |
AMD Device Plugin을 설치하려면 먼저 다음 파일을 다운로드해야 합니다.
1 | wget https://raw.githubusercontent.com/ROCm/k8s-device-plugin/main/deploy/k8s-device-plugin.yaml |
그런 다음 다음 명령을 실행하여 AMD Device Plugin을 설치합니다.
1 | kubectl apply -f k8s-device-plugin.yaml |
Device Plugin을 설치한 후 Kubernetes 클러스터에서 GPU를 사용할 수 있는지 확인합니다.
1 | kubectl describe node | grep -i nvidia.com/gpu |
이 명령은 GPU에 대한 정보가 표시됩니다.
vLLM을 사용하여 LLM 배포
Kubernetes 환경이 설정되면 vLLM을 사용하여 LLM을 배포할 수 있습니다. vLLM은 높은 처리량으로 LLM을 제공하기 위한 빠르고 사용하기 쉬운 라이브러리입니다.
vLLM을 사용하여 LLM을 배포하려면 vLLM 서버 이미지를 배포해야 합니다. 다음은 vLLM 서버 이미지를 배포하는 데 사용할 수 있는 샘플 Kubernetes 배포 파일입니다.
1 | apiVersion: apps/v1 |
이 배포 파일은 vLLM 서버 이미지의 복제본 하나를 배포합니다. 또한 Mistralai/Mistral-7B-Instruct-v0.1 모델을 로드하도록 vLLM 서버를 구성합니다. 배포 파일을 적용하려면 다음 명령을 실행합니다.
1 | kubectl apply -f vllm-deployment.yaml |
배포가 완료되면 vLLM 서버에 액세스할 수 있도록 Kubernetes 서비스를 만들어야 합니다. 다음은 vLLM 서버에 액세스할 수 있도록 Kubernetes 서비스를 만드는 데 사용할 수 있는 샘플 Kubernetes 서비스 파일입니다.
1 | apiVersion: v1 |
이 서비스 파일은 80번 포트에서 트래픽을 수신 대기하고 vLLM 서버의 8000번 포트로 트래픽을 전달하는 LoadBalancer 유형의 Kubernetes 서비스를 만듭니다. 서비스 파일을 적용하려면 다음 명령을 실행합니다.
1 | kubectl apply -f vllm-service.yaml |
서비스가 생성되면 LLM 모델을 사용할 수 있습니다.
결론
이 가이드에서는 Kubernetes 환경을 설정하고 vLLM을 사용하여 LLM을 배포하는 단계를 살펴보았습니다. 또한 LLM을 프로덕션 환경에 배포하는 데 필요한 다양한 고려 사항에 대해서도 논의했습니다.