AWS 기술 블로그

Amazon EKS에서 Friendli Container로 LLM 추론 최적화하기

FriendliAI는 AI 추론 효율을 크게 개선하는 고성능 서빙 엔진을 서비스하는 기업입니다. FriendliAI의 엔진은 높은 Throughput과 비용 절감 효과를 통해 기업이 생성형 AI 서비스를 효율적으로 운영할 수 있도록 지원합니다.

Figure 1: Friendli Container Logo

Friendli Container Amazon EKS Add-on은 AWS 인프라를 기반으로 생성형 AI 서비스를 확장하면서, Inference 효율을 극대화하는 솔루션입니다. 이 Add-on을 추가하면 기존 Amazon EKS 워크플로우에 Friendli Container를 즉시 통합할 수 있으며, 모든 비용은 AWS 통합 빌링 시스템을 통해 편리하게 관리됩니다. 이를 통해 Inference 비용 절감, 빠른 확장성(Scaling), 그리고 향상된 Throughput을 여러분의 워크로드에 즉각 적용할 수 있습니다.

지금부터 Friendli Container Add-on을 여러분의 EKS에 손쉽게 추가하는 방법을 확인해 보겠습니다.

Friendli Container 개요

Friendli Container는 FriendliAI의 고성능 서빙 솔루션을 고객의 환경에 바로 도입할 수 있도록 설계된 Docker 이미지입니다. 이 서비스는 FriendliAI의 핵심 최적화 기술들을 컨테이너 형태로 제공합니다. 이를 통해 고객의 설정 내에서 원활하게 작동하는, 현재 가장 빠른 Latency를 자랑하는 AI Inference 엔진을 사용할 수 있습니다. 비록 FriendliAI에서 관리하는 엔드포인트(Friendli Dedicated Endpoint)와 같이 모든 최적화가 포함된 것은 아니지만, 고객의 인프라 내에서 고성능 추론을 구동하기 위한 중요한 성능 강화 기능들을 갖추고 있습니다.

Friendli Container는 Latency를 줄이고 GPU 사용량을 최소화하여 비용 효율성을 극대화하도록 최적화된 제품입니다. 또한 AI 모델 배포를 위해 확장 가능하고 격리된 환경을 제공하여 최상의 성능을 달성할 수 있도록 돕습니다.

  • GPU 사용량 50% 이상 절감
  • Latency 2배 이상 개선
  • Throughput 2배 이상 향상

이때 Friendli Container가 그 역량을 온전히 발휘하기 위해서는, GPU 리소스를 효율적으로 관리하고 Orchestration을 지원할 수 있는 인프라가 필수적입니다. Amazon EKS와의 통합이 그것을 가능하게 만듭니다.

Amazon EKS 개요

Kubernetes(K8S)는 컨테이너화된 애플리케이션을 관리하기 위한 표준 솔루션으로, 기업이 다양한 환경에서 워크로드를 배포, 확장 및 관리할 수 있게 해줍니다. Auto Scaling, Load Balancing, Self-healing과 같은 강력한 기능을 통해 복잡한 애플리케이션 관리를 단순화합니다. 그러나 Kubernetes를 효율적으로 관리하려면 깊은 전문 지식이 필요한데, 이 때문에 Amazon EKS와 같은 관리형 서비스가 필요할 수 있습니다.

Amazon EKS는 AWS 환경에서 Kubernetes를 사용하여 컨테이너화된 애플리케이션을 손쉽게 배포, 관리 및 확장할 수 있게 해주는 완전 관리형 서비스입니다. EKS는 Kubernetes 클러스터 관리를 단순하게 만들고, 안전하고 확장 가능하며 가용성이 높은 플랫폼을 제공합니다. 또한 다른 AWS 서비스와 긴밀하게 통합되어 클라우드에서 컨테이너를 관리하기 위한 통합적인 솔루션을 제공합니다.

현재도 많은 기업들이 확장 가능한(Scalable) 생성형 AI Inference를 위해 Amazon EKS를 도입하고 있습니다.

  • Digital Creativity 분야의 선두 기업인 Adobe는 Amazon EKS를 사용하여 생성형 AI 솔루션인 Adobe Firefly를 구축했습니다.
  • 자율 주행 기술 기업인 Mobileye는 컴퓨터 비전 및 AI 애플리케이션을 위해 Amazon EKS를 활용합니다.
  • AI 기반 3D 렌더링 솔루션 스타트업인 Omi는 Amazon EKS를 사용하여 생성형 AI 모델을 구동하고 있습니다.

Amazon EKS의 주요 이점:

  • 완전 관리형 Kubernetes: AWS가 Kubernetes 컨트롤 플레인을 직접 관리하므로 수동 설정 및 유지보수 부담이 없습니다. 덕분에 팀은 인프라보다 애플리케이션 자체에 집중할 수 있습니다.
  • 원활한 AWS 통합: EKS는 Amazon EC2, AWS IAM, Amazon S3, Amazon CloudWatch와 같은 AWS 서비스와 매끄럽게 연동되어 풍부한 AWS 기능으로 애플리케이션을 강화할 수 있습니다.
  • 확장성 및 유연성: 수요에 따라 클러스터와 워크로드를 자동으로 확장합니다. 여러 AWS 가용 영역(AZ)에 걸쳐 애플리케이션을 실행할 수 있어 높은 가용성과 회복탄력성을 보장합니다.
  • 강화된 보안: AWS의 보안 인프라를 활용하여 암호화, IAM Role, 네트워크 정책 등을 기본으로 제공해 애플리케이션 접근을 제어하고 보호할 수 있습니다.

Figure 2: Kubernetes 클러스터 동작 과정

요컨대, Amazon EKS는 Kubernetes 관리를 단순화하여 애플리케이션의 기능을 구축하는 일에 집중할 수 있도록 돕습니다.

Friendli Container EKS Add-on 의 이점

AI 추론 서비스 운용 비용을 획기적으로 낮추고 즉각적인 성능 향상을 이루고 싶다면, Friendli Container를 EKS Add-on으로 추가해보세요. 기존 EKS 워크플로우 내에서 바로 운용할 수 있습니다.

  • 즉각적인 비용 절감: Friendli Container의 독자적인 기술을 통해 Inference GPU cost를 50% 이상 절감하여 ROI(Return-on-Investment)를 극대화하고 탁월한 성능을 제공합니다.
  • 간소화된 청구/결제: AWS 통합 빌링을 통해 비용 처리가 단순합니다. Friendli Container Add-on을 포함한 모든 AWS 서비스 비용이 하나의 청구서에 기재되어 추적과 예산 관리가 쉽습니다.
  • 간편한 구독: AWS가 번거로운 구독 관리를 대신 처리해 줍니다.
  • 자동 업데이트: Friendli Container Add-on의 정기 업데이트가 자동으로 적용되어 시스템을 항상 최신 상태로 유지하고 보안을 강화할 수 있습니다.

Friendli Container를 Amazon EKS에 배포함으로써, 생성형 AI 서비스 워크플로우를 신속하게 강화해 안정적이고, 확장 가능한 플랫폼에서 즉각적인 비용 절감 효과까지 누릴 수 있습니다.

Friendli Container 사용 방법

이번 챕터에서는 EKS 클러스터 설정부터 Friendli Container 배포까지 단계별로 안내해 드립니다. 이 과정을 마치면 여러분의 EKS 클러스터에서 실제 작동하는 Inference 서비스를 성공적으로 운영할 수 있게 됩니다.

Figure 3: Friendli Container EKS Add-on 설정 워크플로우

1. 준비 사항: EKS 클러스터에 GPU Node Group 추가하기

먼저 활성화된 Amazon EKS 클러스터가 필요합니다. 아직 클러스터가 없다면 Amazon EKS 문서를 참고하여 생성해 주세요.

이미 GPU Node Group을 추가한 경우 이 단계는 건너뛰셔도 좋습니다.

EKS 클러스터에 GPU Node Group 추가하기

참고: Friendli Container EKS Add-on은 Kubernetes 버전 1.28 이상을 요구합니다.

EKS 클러스터의 AWS 리전을 선택할 때 GPU 인스턴스 가용성을 확인하는 것이 중요합니다. 2026년 1월 현재, Friendli Container는 NVIDIA B200, H200, H100, A100, L40S, A10G, L4 디바이스를 지원합니다. 리전별 인스턴스 가용성은 여기에서 확인하실 수 있습니다.

Multi-GPU VM 인스턴스 타입을 사용하는 경우, 적절한 리소스 관리를 위해 NVIDIA GPU Operator 설치를 강력히 권장합니다. NVIDIA GPU Operator 가이드를 참고하실 수 있으며, Helm을 사용하여 GPU Operator를 설치하는 예시는 여기에서 확인하실 수 있습니다.

GPU Node Group 추가하기:

  1. Amazon EKS 콘솔에서 GPU Node Group을 생성할 대상 클러스터를 선택합니다.
  2. “Compute” 탭에서 “Add node group”을 클릭합니다.
  3. 새로운 Node Group의 이름, Node IAM role 등 configuration 정보를 설정합니다. (IAM Role이 없다면 “Create recommended role” 활용 가능) 그리고 ‘Next’를 클릭하세요.
  4. AMI type으로 “Amazon Linux 2023 (x86_64) Nvidia”를 선택합니다.
  5. 적절한 GPU Instance Type을 선택합니다.
  6. 디스크 크기를 설정합니다. 이때 디스크 크기는 사용자가 배포하려는 모델을 다운로드할 수 있을 만큼 충분해야 합니다. (본 가이드에 있는 예시를 따라하기 위해서는 60GB 이상으로 디스크 사이즈를 설정할 것을 권장합니다)
  7. 원하는 노드 그룹 크기를 설정합니다.
  8. 나머지 과정을 계속 진행하고, 마지막에 “Create”를 클릭하여 그룹 생성을 완료합니다.

2. Friendli Container EKS Add-on 구성하기

  1. Amazon EKS 콘솔에서 Add-on을 추가하고 싶은 클러스터를 선택합니다.
  2. “Add-ons” 탭에서 “Get more add-ons”를 클릭합니다.
  3. 스크롤을 내려 “AWS Marketplace add-ons” 섹션에서 “Friendli Container”를 검색하여 선택하고 “Next”를 클릭합니다.
  4. Friendli Container 구독을 진행합니다. 구매해야 할 라이선스 유닛 수는 Friendli Container 구동을 위해 유저가 사용할 GPU 디바이스 수에 따라 결정됩니다.
  5. ‘Next’ 버튼을 눌러 설정을 확인하고 “Create”를 클릭합니다.

참고: Friendli Container의 상세 가격 정보는 AWS Marketplace에서 확인 가능하며, 체험판이나 맞춤형 제안은 FriendliAI 공식 홈페이지로 문의해 주세요.

다음으로 Friendli Inference Deployment가 활성화될 수 있도록 Kubernetes ServiceAccount가 AWS License Manager와 연결될 수 있게 Pod Identity Association을 설정해야 합니다.

참고: 계속하기 전에 “Amazon EKS Pod Identity Agent” Add-on이 해당 클러스터에 설치되어 있는지 확인해 주세요. ‘Get more add-ons’ 버튼을 클릭하여 ‘AWS add-ons’ 섹션 아래에 있는 ‘Amazon EKS Pod Identity Agent’ 설정을 켜주시면 됩니다.

Pod Identity Association 설정하기

  1. Amazon EKS 콘솔에서 설정할 클러스터를 선택합니다.
  2. Access 탭을 선택합니다.
  3. Pod Identity associations 섹션에서 Create를 클릭합니다.
  4. Create Pod Identity association 페이지에서 IAM Role, Kubernetes namespace, 그리고 Kubernetes service account를 설정합니다.

IAM Role:

  1. ‘Create recommended role’을 클릭합니다.
  2. Step 1 (Select trusted entity): Use case로는 ‘EKS – Pod Identity’가 선택되어 있어야 합니다. Next를 클릭합니다.
  3. Step 2 (Add permissions): ‘AWSLicenseManagerConsumptionPolicy’를 검색하여 체크하고 활성화합니다. Next를 클릭합니다.
  4. Step 3 (Name, review, and create): 적절한 Role 이름을 입력하고 Create를 클릭합니다.
  5. 다시 Create Pod Identity association 페이지로 돌아와 방금 생성한 IAM Role을 선택합니다.

Kubernetes namespace:

  • Friendli Inference Deployment를 생성하려는 Kubernetes namespace를 선택합니다. 어떤 것을 선택할지 확신이 서지 않는다면 default를 선택하세요.
  • TIP: 나중에 다른 namespace에 Friendli Inference Deployment를 생성할 계획이라면, 해당 namespace에 대해서도 Pod Identity association을 생성해야 합니다.

Kubernetes service account:

  • 대부분의 경우 default를 사용하면 됩니다.
  • 나중에 커스텀 서비스 계정(service account)을 사용하도록 Friendli Inference Deployment를 설정한다면, 해당 서비스 계정에 대해서도 Pod Identity association을 생성해야 합니다.

마지막으로 Create를 클릭하면, Pod Identity associations 목록에서 방금 생성한 연결을 확인하실 수 있습니다.

Figure 4: Pod Identity associations 목록 예시

3. Friendli Deployment 생성하기

참고1: EKS 클러스터 접근을 위해 kubectl CLI 도구를 사용할 수 있어야 합니다. 해당 AWS 가이드를 참조해보세요.

참고2: HuggingFace의 비공개 모델(private/gated model)을 사용하려면 ‘read’ 권한이 부여된 Hugging Face 액세스 토큰이 필요합니다. 그리고 아래 명령어로 Kubernetes Secret을 생성해주세요.

$ kubectl create secret generic hf-secret --from-literal token=YOUR_TOKEN_HERE

FriendliDeployment는 Kubernetes의 pods, services, deployments 등 요소를 일일이 구성하지 않고도 간편하게 Inference 서비스를 생성할 수 있게 해주는 Kubernetes Custom Resource입니다. 아래는 Meta Llama 3.1 8B 모델을 g6.2xlarge 인스턴스 1개에 배포하는 샘플 FriendliDeployment configuration YAML 파일입니다. 사용하시려는 목적에 맞게 이 YAML 파일을 수정해 사용하세요.

apiVersion: friendli.ai/v1alpha1
kind: FriendliDeployment
metadata:
  namespace: default
  name: friendlideployment-sample
spec:
  model:
    huggingFace:
      repository: meta-llama/Llama-3.1-8B-Instruct
      # public 모델인 경우 token 섹션 생략 가능
      token:
        name: hf-secret
        key: token
  resources:
    nodeSelector:
      # 'gpu-l4'를 사용하려는 노드 그룹 이름에 맞게 수정
      eks.amazonaws.com/nodegroup: gpu-l4
    numGPUs: 1
    requests:
      cpu: "6"
      ephemeral-storage: 30Gi
      memory: 25Gi
    limits:
      cpu: "6"
      ephemeral-storage: 30Gi
      memory: 25Gi
  deploymentStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 0
      maxUnavailable: 1
  service:
    inferencePort: 6000
  • spec.model.huggingFace 아래의 token: 섹션은 HuggingFace 액세스 토큰을 저장하기 위해 생성한 Kubernetes Secret을 참조합니다. 모델 접근에 토큰이 필요하지 않은 경우 token: 섹션 전체를 생략할 수 있습니다.
  • 위 예시에서 nodeSelectoreks.amazonaws.com/nodegroup: gpu-l4로 설정되어 있습니다. 이는 GPU 노드 그룹의 이름이 gpu-l4라고 가정합니다. 실제 노드 그룹 이름과 일치하도록 nodeSelector 값을 수정해야 합니다.
  • CPU 및 메모리 리소스 설정 값들은 g6.2xlarge 인스턴스에 맞춰져 있습니다. 다른 타입의 인스턴스를 사용하는 경우 이 값을 수정해야 할 수 있습니다.

참고: 클러스터에 NVIDIA GPU Operator가 설치되어 있다면, requests:limits: 섹션에 nvidia.com/gpu 리소스를 추가해야 합니다. GPU 노드가 일반적인 cpumemory와 함께 nvidia.com/gpu 리소스가 있음을 알리기 때문입니다. 이 경우 FriendliDeployment에서 numGPUs는 생략할 수 있습니다. 아래는 NVIDIA GPU Operator가 활성화되었을 때 requests:limits: 섹션에 대한 설정 예시입니다.

resources:
  nodeSelector:
    eks.amazonaws.com/nodegroup: gpu-l4
  requests:
    cpu: '6'
    ephemeral-storage: 30Gi
    memory: 25Gi
    nvidia.com/gpu: '1'
  limits:
    cpu: '6'
    ephemeral-storage: 30Gi
    memory: 25Gi
    nvidia.com/gpu: '1'

해당 YAML 파일을 friendlideployment.yaml로 저장한 후 kubectl apply -f friendlideployment.yaml 명령어를 실행합니다.

$ kubectl apply -f friendlideployment.yaml
friendlideployment.friendli.ai/friendlideployment-sample created

$ kubectl get pods
NAME                                          READY   STATUS    RESTARTS   AGE
friendlideployment-sample-7d7b877c77-zjgqq    2/2     Running   0          3m18s

$ kubectl get services
NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
friendlideployment-sample   ClusterIP   172.20.95.224    <none>        6000/TCP   18m

이제 port-forward를 통해 로컬 환경에서 서비스에 접속할 수 있습니다.

$ kubectl port-forward svc/friendlideployment-sample 6000
Forwarding from 127.0.0.1:6000 -> 6000
Forwarding from [::1]:6000 -> 6000

다른 터미널에서 curl을 사용하여 Inference 요청을 보내 확인해 보세요.

$ curl http://localhost:6000/v1/completions -H 'Content-Type: application/json' --data-raw '{"prompt": "Hi!", "max_tokens": 10, "stream": false}'
{"choices":[{"finish_reason":"length","index":0,"seed":15349211611234757311,"text":" I'm Alex, and I'm excited to share","tokens":[358,2846,8683,11,323,358,2846,12304,311,4430]}],"id":"cmpl-b2e4b4cba711448c847ab89d763588da","object":"text_completion","usage":{"completion_tokens":10,"prompt_tokens":3,"total_tokens":13}}

Friendli Container 에 대해 문의 또는 더 많은 정보를 원하신다면, FriendliAI documentation을 참조하시거나 엔지니어링 팀에 연락해주세요.

4. 리소스 정리

FriendliDeployment는 kubectl CLI tool을 사용해 간편하게 제거할 수 있습니다.

$ kubectl delete friendlideployment friendlideployment-sample
friendlideployment.friendli.ai "friendlideployment-sample" deleted

또한, 사용하지 않는 GPU Instance에 대한 비용이 발생하지 않도록 GPU 노드 그룹을 Scale down하거나 삭제하는 것을 권장합니다.

이제 모든 단계가 완료되었습니다! 지금까지 Amazon EKS에서 Friendli Container를 활용하여 LLM Inference 워크플로우를 최적화하는 방법을 알아보았습니다. 더 자세한 내용이 궁금하시다면 github에 있는 상세 가이드를 참고해 보세요. 배포 프로세스를 더 깊이 있게 살펴보고 Amazon EKS가 제공하는 혜택을 최대한 활용하는 데 큰 도움이 될 것입니다.

결론

Friendli Container Amazon EKS Add-on은 프로덕션 환경에서 AI 모델을 배포할 때 확장 가능성과 비용 효율성을 보장하는 고성능 솔루션입니다. Amazon EKS와 Friendli Container의 강력한 최적화 기능을 결합하여, Inference 비용을 획기적으로 낮추고 워크로드의 Throughput을 개선합니다.

또한, FriendliAI는 Friendli Container 이외에도 Friendli Dedicated Endpoint, Friendli Serverless Endpoint등의 서비스를 제공하고 있습니다. 자세한 내용은 Friendli 팀에 문의해 주시거나 공식 문서를 확인해 주시기 바랍니다.

FriendliAI

서장호

서장호

서장호님은 FriendliAI의 DevOps Engineer입니다. 생성형 AI 기술의 설정과 배포를 단순화하기 위한 아키텍처 설계와 구현을 수행하고 있으며, EKS Add-on을 통해 기업 고객이 Friendli Inference를 AWS 인프라스트럭처에 효과적으로 통합하도록 지원하고 있습니다.

신안재

신안재님은 FriendliAI에서 Cloud팀을 이끌며 클라우드 인프라 위에서 동작하는 LLM 추론(Inference) 서비스와 관련 제품의 설계 및 책임을 맡았습니다. 대규모 AI 추론 워크로드를 위한 컨테이너 기반 아키텍처와 운영 자동화, 성능 최적화에 관심을 두고 있습니다.

이우진

이우진님은 FriendliAI에서 Chief of Staff와 Technical Program Manager를 겸임하며, 기술 프로젝트 관리 및 운영 효율화를 위해 리더십을 지원하고 관리 시스템 설계를 수행하고 있습니다.

AWS

YongHwan Yoo

YongHwan Yoo

유용환님은 AWS 스타트업팀 GenAI Solutions Architect입니다. 기업 고객이 생성형 AI를 비롯한 기계 학습(ML) 기술을 비즈니스에 효과적으로 도입할 수 있도록 아키텍처 설계와 최적화를 지원하고 있으며, 사내에서 AI/ML TFC(Technical Field Communities) 멤버로 활동하고 있습니다.

Sungbae Park

Sungbae Park

박성배님은 AWS 스타트업팀 어카운트 매니저입니다. 특히, B2B 소프트웨어 스타트업이 AWS와 함께 성장할 수 있도록 지원하고 있고, 사내에서 SaaS TFC(Technical Field Communities) 멤버로 활동하고 있습니다. 이전에는 파트너팀에서 MSP, SI, ISV 파트너와의 사업 제휴 및 개발 업무를 담당했습니다.