Kubernetes에서 생성 모델을 마이크로서비스로 배포


다음은 Kubernetes를 사용하여 생성 모델을 마이크로서비스로 배포하는 방법에 대한 몇 가지 팁입니다.

AI에 관심이 있으세요? 저는 컨테이너화된 모델 제공 및 주기적인 재교육을 통해 Kubernetes에서 컨벌루션 및 변환기 기반 생성 모델을 마이크로서비스로 배포하는 방법에 대한 이 튜토리얼을 통해 LHB에 AI 터치를 추가하고 있습니다.

이 튜토리얼에서는 다음 내용을 배우게 됩니다.

  • GPU 가속 추론을 위해 PyTorch 및 TensorFlow 모델 컨테이너화

  • 점진적인 생성 모델 업데이트를 위한 카나리아 배포 구현

  • 새로운 데이터로 생성 모델을 자동으로 지속적으로 재교육

  • 생성적 마이크로서비스를 재해 복구 워크플로우에 통합

이 기사가 끝나면 주문형 고품질 이미지, 텍스트, 오디오 또는 비디오 콘텐츠를 생성하고 최신 데이터 및 피드백으로 최신 상태를 유지할 수 있는 생성적 마이크로서비스를 생성 및 배포할 수 있게 됩니다. .

생성 모델이란 무엇입니까?

생성 모델은 훈련받은 데이터와 유사한 새로운 데이터를 생성하는 방법을 학습할 수 있는 일종의 기계 학습 모델입니다. 예를 들어 생성 모델은 기존 이미지의 대규모 데이터 세트를 기반으로 얼굴, 동물, 풍경 또는 예술 작품의 사실적인 이미지를 만드는 방법을 학습할 수 있습니다. 생성 모델은 캡션, 스토리, 노래, 애니메이션과 같은 텍스트, 오디오 또는 비디오 콘텐츠를 생성하는 방법도 학습할 수 있습니다.

생성 모델에는 VAE(변형 자동 인코더), GAN(생성 적대 네트워크), 변환기 등 다양한 유형이 있습니다.

이 기사에서는 컨볼루션 및 변환기 기반 생성 모델에 중점을 둘 것입니다.

컨볼루션 생성 모델은 컨볼루션 레이어를 사용하여 이미지나 동영상의 공간 정보를 처리합니다.

변환기 기반 생성 모델은 변환기 레이어를 사용하여 텍스트나 오디오의 순차 정보를 처리합니다.

생성 모델을 마이크로서비스로 배포하는 이유는 무엇입니까?

마이크로서비스는 잘 정의된 API를 통해 서로 통신하는 작고 독립적이며 느슨하게 결합된 서비스입니다. 마이크로서비스는 프로덕션 환경에 기계 학습 모델을 배포할 때 다음과 같은 여러 가지 이점을 제공합니다.

  • 확장성: 수요 및 리소스 가용성에 따라 각 마이크로서비스를 독립적으로 확장할 수 있습니다.

  • 가용성: 여러 노드 또는 지역에 걸쳐 각 마이크로서비스를 복제하고 로드 밸런싱하여 고가용성과 내결함성을 보장할 수 있습니다.

  • 모듈성: 시스템의 나머지 부분에 영향을 주지 않고 각 마이크로서비스를 개별적으로 개발, 테스트, 배포 및 업데이트할 수 있습니다.

  • 다양성: 특정 요구 사항 및 기본 설정에 따라 각 마이크로서비스에 대해 다양한 기술, 프레임워크, 언어 및 도구를 사용할 수 있습니다.

GPU 가속 추론을 위해 PyTorch 및 TensorFlow 모델 컨테이너화

기계 학습 모델을 마이크로서비스로 배포할 때의 과제 중 하나는 다양한 환경에서 일관되고 효율적으로 실행되도록 하는 것입니다.

일반적인 솔루션은 코드, 라이브러리, 종속성, 구성 등 애플리케이션을 실행하는 데 필요한 모든 것을 포함하는 격리되고 이식 가능한 소프트웨어 단위인 컨테이너를 사용하는 것입니다.

GPU 가속 추론을 위해 PyTorch 또는 TensorFlow 모델을 컨테이너화하려면 다음 단계를 수행해야 합니다.

  • 필요한 운영 체제와 프레임워크 버전이 포함된 기본 이미지를 선택하세요. 예를 들어 Docker Hub 또는 NVIDIA NGC의 공식 PyTorch 또는 TensorFlow 이미지를 사용할 수 있습니다.

  • 모델이나 애플리케이션에 필요한 추가 종속성 또는 패키지를 설치합니다. 데이터 로딩 및 처리를 위해 torchvision 또는 tensorflow_datasets를 설치해야 할 수도 있습니다.

  • 애플리케이션에 필요한 모델 파일(예: .pt 또는 .h5)과 기타 파일(예: .json 또는 .txt)을 컨테이너 이미지에 복사합니다.

  • 파일에서 모델을 로드하고 추론 논리를 실행하는 진입점 스크립트를 정의합니다. 입력 데이터를 전처리하여 모델에 제공하고 출력 데이터를 후처리하여 응답으로 반환합니다.

  • 애플리케이션이 다른 서비스와 통신할 수 있도록 포트를 노출합니다. Flask 또는 FastAPI를 사용하여 모델 추론을 위한 RESTful API를 생성할 수 있습니다.

  • docker build 또는 Podman 빌드 명령을 사용하여 컨테이너 이미지를 빌드합니다. 예를 들어:

# Use PyTorch base image from NVIDIA NGC
FROM nvcr.io/nvidia/pytorch:21.03-py3

# Install torchvision for data loading
RUN pip install torchvision

# Copy model file and entrypoint script
COPY model.pt /app/model.pt
COPY app.py /app/app.py

# Expose port 5000 for Flask API
EXPOSE 5000

# Run entrypoint script
CMD ["python", "/app/app.py"]
docker build -t generative-model:v2 .

다음과 같은 내용이 표시됩니다.

docker push 명령을 사용하여 컨테이너 이미지를 레지스트리에 푸시합니다. 예를 들어:

docker push myregistry/generative-model:v2

점진적인 생성 모델 업데이트를 위한 카나리아 배포 구현

마이크로서비스의 장점 중 하나는 시스템의 나머지 부분에 영향을 주지 않고 각 서비스를 독립적으로 업데이트할 수 있다는 것입니다.

그러나 기계 학습 모델을 업데이트하면 버그, 오류 또는 성능 저하가 발생할 수 있으므로 위험할 수 있습니다.

따라서 완전히 롤아웃하기 전에 사용자 또는 트래픽의 하위 집합에서 모델의 새 버전을 테스트할 수 있는 카나리아 배포 전략을 사용하는 것이 좋습니다.

카나리아 배포 전략에는 다음 단계가 포함됩니다.

  • 기존 버전과 함께 별도의 마이크로서비스로 모델의 새 버전을 배포합니다. 예를 들어 컨테이너 이미지와 배포에 서로 다른 태그나 레이블을 사용하여 버전을 구분할 수 있습니다.

  • 로드 밸런서 또는 서비스 메시를 사용하여 두 버전 간에 트래픽을 분할합니다. 예를 들어 Istio 또는 Linkerd를 사용하여 서비스에 대한 라우팅 규칙 및 가중치 기반 배포를 생성할 수 있습니다.

  • 측정항목, 로그, 알림을 사용하여 두 버전의 성능과 동작을 모니터링하고 비교하세요. 예를 들어 Prometheus 또는 Grafana를 사용하여 대기 시간, 처리량, 오류율, 정확도 등과 같은 지표를 수집하고 시각화할 수 있습니다.

  • 기대와 기준을 충족하는 경우 새 버전에 대한 트래픽을 점차적으로 늘립니다. 예를 들어 트래픽의 10%로 시작하여 100%에 도달할 때까지 매시간 10%씩 늘릴 수 있습니다.

  • 새 버전에서 문제나 이상이 발견되면 이전 버전으로 롤백하세요. 예를 들어 Kubernetes 명령이나 Helm 차트를 사용하여 배포 및 서비스를 되돌릴 수 있습니다.

다음은 TensorFlow 변환기 기반 생성 모델을 카나리아로 배포하기 위한 Helm 차트의 예입니다.

# Define values for deployment name, image tag, and traffic weight
name: generative-model
imageTag: v2
weight: 10

# Define deployment template
deployment:
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: {{ .Values.name }}-{{ .Values.imageTag }}
    labels:
      app: {{ .Values.name }}
      version: {{ .Values.imageTag }}
  spec:
    replicas: 1
    selector:
      matchLabels:
        app: {{ .Values.name }}
        version: {{ .Values.imageTag }}
    template:
      metadata:
        labels:
          app: {{ .Values.name }}
          version: {{ .Values.imageTag }}
      spec:
        containers:
        - name: {{ .Values.name }}
          image: myregistry/{{ .Values.name }}:{{ .Values.imageTag }}
          ports:
          - containerPort: 5000

# Define service template
service:
  apiVersion: v1
  kind: Service
  metadata:
    name: {{ .Values.name }}
    labels:
      app: {{ .Values.name }}
  spec:
    selector:
      app: {{ .Values.name }}
    ports:
    - port: 80
      targetPort: 5000

# Define virtual service template for Istio routing
virtualService:
  apiVersion: networking.istio.io/v1alpha3
  kind: VirtualService
  metadata:
    name: {{ .Values.name }}
  spec:
    hosts:
    - {{ .Values.name }}
    http:
    - route:
      - destination:
          host: {{ .Values.name }}
          subset: v1
        weight: {{ sub 100 .Values.weight }}
      - destination:
          host: {{ .Values.name }}
          subset: v2
        weight: {{ .Values.weight }}

# Define destination rule template for Istio subsets
destinationRule:
  apiVersion: networking.istio.io/v1alpha3
  kind: DestinationRule
  metadata:
    name: {{ .Values.name }}
  spec:
    host: {{ .Values.name }}
    subsets:
    - name: v1
      labels:
        version: v1
    - name: v2
      labels:
        version: v2

이 Helm 차트를 사용하여 생성 모델을 카나리아로 배포하려면 다음 명령을 실행할 수 있습니다.

helm upgrade generative-model generative-model-chart --set imageTag=v2 --set weight=10

다음과 같은 내용이 표시됩니다.

새로운 데이터로 생성 모델의 지속적인 재학습을 자동화합니다.

기계 학습 모델을 마이크로서비스로 배포할 때의 또 다른 과제는 최신 데이터와 피드백을 통해 최신 상태를 유지하는 것입니다. 한 번 학습되고 업데이트되지 않는 정적 모델은 데이터 배포, 사용자 행동 또는 비즈니스 요구 사항의 변화로 인해 시간이 지남에 따라 더 이상 사용되지 않거나 부정확해질 수 있습니다. 따라서 새로운 데이터로 생성 모델의 지속적인 재교육을 자동화하는 것이 좋습니다.

생성 모델의 지속적인 재교육 자동화에는 다음 단계가 포함됩니다.

  • 사용자 피드백, 로그, 센서 등과 같은 다양한 소스에서 새로운 데이터를 수집하고 저장합니다. 예를 들어 Kafka 또는 Azure Event Hubs를 사용하여 데이터를 데이터 레이크 또는 데이터 웨어하우스로 스트리밍할 수 있습니다.

  • 새로운 데이터를 전처리하고 훈련에 적합한 형식으로 변환합니다. 예를 들어 Spark 또는 Databricks를 사용하여 데이터 정리, 기능 엔지니어링 및 데이터 증대를 수행할 수 있습니다.

  • 새 데이터와 기존 모델을 시작점으로 사용하여 생성 모델의 새 버전을 교육합니다. 예를 들어, PyTorch Lightning 또는 TensorFlow Extended를 사용하여 분산 클러스터 또는 클라우드 플랫폼에서 실행되는 훈련 파이프라인을 생성할 수 있습니다.

  • 다양한 측정항목과 테스트를 사용하여 생성 모델의 새 버전을 평가하고 검증하세요. 예를 들어 TensorBoard 또는 MLflow를 사용하여 다양한 데이터 세트 및 작업에서 다양한 모델 버전의 성능을 추적하고 비교할 수 있습니다.

  • 카나리아 배포 전략을 사용하여 생성 모델의 새 버전을 마이크로서비스로 배포합니다. 예를 들어 Helm 또는 Kustomize를 사용하여 Kubernetes 배포 및 서비스를 생성하고 업데이트할 수 있습니다.

이러한 단계를 자동화하려면 Airflow 또는 Kubeflow와 같은 도구를 사용하여 주기적으로 실행되거나 이벤트에 의해 트리거되는 워크플로를 만들고 조정할 수 있습니다. Argo CD 또는 Flux와 같은 도구를 사용하여 Git을 코드 및 구성에 대한 단일 진실 소스로 사용하는 방법인 GitOps를 구현할 수도 있습니다.

다음은 PyTorch 컨벌루션 생성 모델의 지속적인 재학습을 자동화하기 위한 Airflow DAG의 예입니다.

# Import modules
from airflow import DAG
from airflow.operators.bash import BashOperator
from airflow.operators.python import PythonOperator
from airflow.utils.dates import days_ago

# Define DAG parameters
dag = DAG(
    dag_id='generative_model_retraining',
    schedule_interval='@daily',
    start_date=days_ago(1),
    catchup=False
)

# Define tasks
collect_data = BashOperator(
    task_id='collect_data',
    bash_command='python collect_data.py',
    dag=dag
)

preprocess_data = BashOperator(
    task_id='preprocess_data',
    bash_command='python preprocess_data.py',
    dag=dag
)

train_model = BashOperator(
    task_id='train_model',
    bash_command='python train_model.py',
    dag=dag
)

evaluate_model = BashOperator(
    task_id='evaluate_model',
    bash_command='python evaluate_model.py',
    dag=dag
)

deploy_model = BashOperator(
    task_id='deploy_model',
    bash_command='helm upgrade generative-model generative-model-chart --set imageTag=v2 --set weight=10',
    dag=dag
)

# Define dependencies
collect_data >> preprocess_data >> train_model >> evaluate_model >> deploy_model

생성적 마이크로서비스를 재해 복구 워크플로우에 통합

생성 모델을 마이크로서비스로 배포하는 마지막 단계는 재해나 장애 발생 시 복원력과 안정성을 보장하는 것입니다.

생성적 마이크로서비스를 재해 복구 워크플로에 통합하려면 다음 단계를 수행해야 합니다.

  • 데이터와 모델을 정기적으로 백업하고 안전하고 접근 가능한 위치에 저장하세요. 예를 들어 Azure Blob Storage 또는 Amazon S3를 사용하여 데이터와 모델을 클라우드에 저장할 수 있습니다.

  • Velero 또는 KubeDB와 같은 도구를 사용하여 데이터 및 모델에 대한 백업 및 복원 절차를 구현하세요. 예를 들어 Velero를 사용하여 배포, 서비스, 볼륨 등을 포함한 Kubernetes 클러스터 상태와 리소스를 백업하고 복원할 수 있습니다.

  • Kubernetes 또는 Istio와 같은 도구를 사용하여 마이크로서비스에 대한 상태 확인 및 활성 프로브를 구현합니다. 예를 들어 Kubernetes 활성 프로브를 사용하여 마이크로서비스가 실행 중인지 확인하고 실패하면 다시 시작할 수 있습니다.

  • Kubernetes 또는 Istio와 같은 도구를 사용하여 마이크로서비스에 대한 준비 프로브 및 회로 차단기를 구현합니다. 예를 들어 Kubernetes 준비 프로브를 사용하여 마이크로서비스가 트래픽을 수신할 준비가 되었는지 확인하고 그렇지 않은 경우 로드 밸런서에서 이를 제거할 수 있습니다.

  • Istio 또는 Resilience4j와 같은 도구를 사용하여 마이크로서비스에 대한 재시도 및 시간 초과 정책을 구현합니다. 예를 들어 Istio 재시도 정책을 사용하면 특정 횟수까지 또는 특정 제한 시간에 도달할 때까지 마이크로서비스에 대한 실패한 요청을 재시도할 수 있습니다.

  • Istio 또는 Hystrix와 같은 도구를 사용하여 마이크로서비스에 대한 대체 및 복구 전략을 구현하세요. 예를 들어 기본 서비스를 사용할 수 없는 경우 Istio 폴백 정책을 사용하여 요청을 대체 서비스로 라우팅할 수 있습니다.

다음은 TensorFlow 변환기 기반 생성 모델에 대한 회로 차단기 및 대체 정책을 구현하기 위한 Istio 대상 규칙의 예입니다.

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: generative-model
spec:
  host: generative-model
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  trafficPolicy:
    connectionPool:
      http:
        http1MaxPendingRequests: 100
        maxRequestsPerConnection: 10
    outlierDetection:
      consecutiveErrors: 5
      interval: 10s
      baseEjectionTime: 30s
      maxEjectionPercent: 50
    loadBalancer:
      simple: LEAST_CONN
    mirror:
      host: generative-model-fallback
      subset: v1
    mirrorPercent: 10

결론

이 튜토리얼에서는 컨테이너화된 모델 제공 및 주기적인 재학습을 통해 Kubernetes에서 컨벌루션 및 변환기 기반 생성 모델을 마이크로서비스로 배포하는 방법을 배웠습니다.

또한 생성적 마이크로서비스에 대한 카나리아 배포, 백업 및 복원 절차, 상태 확인, 활동성 및 준비 상태 프로브, 재시도 및 시간 초과 정책, 회로 차단기, 대체 및 복구 전략을 구현하는 방법도 배웠습니다. 또한 각 단계에 대한 코드 및 구성 파일의 몇 가지 예도 확인했습니다.

새롭고 유용한 것을 배웠기를 바랍니다. 질문이나 의견이 있으시면 언제든지 아래에 의견을 남겨주세요.

✍🏻
Barry Ugochukwu는 데이터, AI, ML에 대한 지식을 공유하는 것을 좋아하는 데이터 과학자입니다.