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에서 컨벌루션 및 변환기 기반 생성 모델을 마이크로서비스로 배포하는 방법을 배웠습니다.
또한 생성적 마이크로서비스에 대한 카나리아 배포, 백업 및 복원 절차, 상태 확인, 활동성 및 준비 상태 프로브, 재시도 및 시간 초과 정책, 회로 차단기, 대체 및 복구 전략을 구현하는 방법도 배웠습니다. 또한 각 단계에 대한 코드 및 구성 파일의 몇 가지 예도 확인했습니다.
새롭고 유용한 것을 배웠기를 바랍니다. 질문이나 의견이 있으시면 언제든지 아래에 의견을 남겨주세요.