- Authors

- Name
- Youngju Kim
- @fjvbn20031
- 1. 클라우드 AI 플랫폼 개요
- 2. AWS AI/ML 서비스
- 3. GCP AI/ML 서비스
- 4. Azure AI Services
- 5. Kubernetes for AI (EKS/GKE/AKS)
- 6. 서버리스 AI 추론
- 7. 데이터 스토리지와 AI
- 8. 클라우드 AI 모니터링
- 9. MLOps on Cloud
- 10. 퀴즈
- 참고 자료
1. 클라우드 AI 플랫폼 개요
AI 엔지니어에게 클라우드 컴퓨팅은 이제 선택이 아닌 필수입니다. 수백 개의 GPU를 필요에 따라 즉시 프로비저닝하고, 모델 학습부터 서빙까지 관리형 서비스로 처리할 수 있는 환경이 갖춰져 있습니다.
IaaS, PaaS, SaaS 개념
클라우드 서비스는 세 가지 계층으로 나뉩니다.
- IaaS (Infrastructure as a Service): 가상 머신, 스토리지, 네트워크를 제공합니다. EC2 GPU 인스턴스가 대표적입니다. 최대 제어권을 갖지만 인프라 관리 부담이 큽니다.
- PaaS (Platform as a Service): 런타임과 미들웨어까지 관리해 줍니다. AWS SageMaker, GCP Vertex AI, Azure ML이 여기에 해당합니다. 모델 코드에 집중할 수 있습니다.
- SaaS (Software as a Service): 완성된 AI 기능을 API로 제공합니다. AWS Bedrock, GCP Gemini API, Azure OpenAI Service가 대표적입니다.
주요 클라우드 AI 서비스 비교
| 기능 | AWS | GCP | Azure |
|---|---|---|---|
| ML 플랫폼 | SageMaker | Vertex AI | Azure ML |
| LLM API | Bedrock | Vertex AI (Gemini) | Azure OpenAI |
| 관리형 노트북 | SageMaker Studio | Vertex AI Workbench | Azure ML Studio |
| AutoML | SageMaker Autopilot | Vertex AutoML | Azure AutoML |
| Feature Store | SageMaker Feature Store | Vertex Feature Store | Azure ML Feature Store |
| 모델 레지스트리 | SageMaker Model Registry | Vertex Model Registry | Azure ML Registry |
| 서버리스 추론 | Lambda, Fargate | Cloud Run, Cloud Functions | Azure Functions, Container Apps |
GPU 인스턴스 유형 비교
AWS GPU 인스턴스:
p3.2xlarge: V100 1개, 61 GiB RAM — 소규모 학습p4d.24xlarge: A100 8개, 320 GiB RAM — 대규모 분산 학습p5.48xlarge: H100 8개, 2 TiB RAM — 최신 LLM 학습
GCP GPU 인스턴스:
n1-standard-8+ V100: 비용 효율적 학습a2-highgpu-8g: A100 8개 — Vertex AI 기본 학습a3-highgpu-8g: H100 8개 — 최신 대형 모델
Azure GPU 인스턴스:
NC6s_v3: V100 1개 — 개발/테스트ND96asr_v4: A100 8개 — 대규모 학습ND96amsr_A100_v4: A100 80GB 8개 — 최대 성능
비용 최적화 전략
클라우드 AI 비용의 70% 이상이 컴퓨팅에서 발생합니다. 주요 절감 전략은 다음과 같습니다.
- Spot/Preemptible 인스턴스: On-Demand 대비 최대 90% 절약. 인터럽션 대비 체크포인팅 필수
- Reserved Instances / Committed Use: 1
3년 약정으로 4060% 절약. 장기 프로젝트에 적합 - Auto Scaling: 추론 트래픽에 따라 인스턴스 수 자동 조정
- Savings Plans (AWS): 컴퓨팅 사용량 약정으로 유연한 인스턴스 타입 할인
2. AWS AI/ML 서비스
SageMaker 핵심 기능
Amazon SageMaker는 AWS의 통합 ML 플랫폼입니다. 데이터 준비부터 모델 배포, 모니터링까지 전체 ML 라이프사이클을 하나의 서비스에서 처리합니다.
import sagemaker
from sagemaker.pytorch import PyTorch
from sagemaker import get_execution_role
role = get_execution_role()
sess = sagemaker.Session()
# SageMaker Training Job
estimator = PyTorch(
entry_point='train.py',
source_dir='./src',
role=role,
instance_type='ml.p4d.24xlarge',
instance_count=4,
framework_version='2.1.0',
py_version='py310',
hyperparameters={
'epochs': 10,
'batch-size': 32,
'learning-rate': 0.001
},
distribution={
'torch_distributed': {'enabled': True}
}
)
estimator.fit({'train': 's3://bucket/train', 'val': 's3://bucket/val'})
SageMaker의 distribution 파라미터를 통해 PyTorch DDP 기반 분산 학습을 손쉽게 설정할 수 있습니다. instance_count=4와 torch_distributed 옵션을 함께 지정하면 4개 노드에 걸친 데이터 병렬 학습이 자동으로 구성됩니다.
SageMaker 모델 배포
from sagemaker.pytorch import PyTorchModel
model = PyTorchModel(
model_data='s3://bucket/model.tar.gz',
role=role,
framework_version='2.1.0',
py_version='py310',
entry_point='inference.py'
)
predictor = model.deploy(
initial_instance_count=2,
instance_type='ml.g4dn.xlarge',
endpoint_name='my-pytorch-endpoint'
)
# 예측 호출
result = predictor.predict({'inputs': 'Hello, cloud AI!'})
AWS Bedrock (LLM API)
AWS Bedrock은 Anthropic Claude, Meta Llama, Amazon Titan 등 여러 파운데이션 모델을 단일 API로 사용할 수 있는 서비스입니다.
import boto3
import json
bedrock = boto3.client('bedrock-runtime', region_name='us-east-1')
response = bedrock.invoke_model(
modelId='anthropic.claude-3-5-sonnet-20241022-v2:0',
body=json.dumps({
'anthropic_version': 'bedrock-2023-05-31',
'max_tokens': 1024,
'messages': [{'role': 'user', 'content': 'AI 트렌드를 설명해줘'}]
})
)
result = json.loads(response['body'].read())
print(result['content'][0]['text'])
AWS Lambda를 이용한 서버리스 추론
경량 모델은 Lambda로 서버리스 배포가 가능합니다.
import json
import boto3
import numpy as np
def lambda_handler(event, context):
# 이벤트에서 입력 데이터 파싱
body = json.loads(event['body'])
input_data = body['input']
# S3에서 모델 로드 (컨테이너 이미지에 번들로 포함 권장)
prediction = run_inference(input_data)
return {
'statusCode': 200,
'body': json.dumps({'prediction': prediction})
}
3. GCP AI/ML 서비스
Vertex AI Training
Google Cloud의 Vertex AI는 통합 ML 플랫폼으로, BigQuery와의 긴밀한 통합이 강점입니다.
from google.cloud import aiplatform
aiplatform.init(project='my-project', location='us-central1')
job = aiplatform.CustomTrainingJob(
display_name='pytorch-training',
script_path='train.py',
container_uri='us-docker.pkg.dev/vertex-ai/training/pytorch-gpu.2-0:latest',
requirements=['transformers', 'datasets']
)
model = job.run(
dataset=None,
machine_type='a2-highgpu-8g',
accelerator_type='NVIDIA_TESLA_A100',
accelerator_count=8,
args=['--epochs=10', '--batch_size=32']
)
Vertex AI 모델 배포
from google.cloud import aiplatform
# 모델 업로드
model = aiplatform.Model.upload(
display_name='my-pytorch-model',
artifact_uri='gs://bucket/model/',
serving_container_image_uri='us-docker.pkg.dev/vertex-ai/prediction/pytorch-gpu.2-0:latest'
)
# 엔드포인트 생성 및 배포
endpoint = aiplatform.Endpoint.create(display_name='my-endpoint')
model.deploy(
endpoint=endpoint,
dedicated_resources_machine_type='n1-standard-4',
dedicated_resources_accelerator_type='NVIDIA_TESLA_T4',
dedicated_resources_accelerator_count=1,
min_replica_count=1,
max_replica_count=5
)
BigQuery ML
BigQuery ML은 SQL 문법으로 ML 모델을 학습하고 예측할 수 있는 강력한 도구입니다.
-- BigQuery ML로 분류 모델 학습
CREATE OR REPLACE MODEL `dataset.fraud_model`
OPTIONS(
model_type = 'BOOSTED_TREE_CLASSIFIER',
num_parallel_tree = 1,
max_iterations = 50,
input_label_cols = ['is_fraud']
) AS
SELECT * FROM `dataset.transactions_train`;
-- 모델 평가
SELECT *
FROM ML.EVALUATE(MODEL `dataset.fraud_model`,
(SELECT * FROM `dataset.transactions_test`)
);
-- 예측 실행
SELECT *
FROM ML.PREDICT(MODEL `dataset.fraud_model`,
(SELECT * FROM `dataset.new_transactions`)
);
4. Azure AI Services
Azure Machine Learning
Azure ML은 Microsoft의 엔터프라이즈급 ML 플랫폼으로, Active Directory와의 통합 및 하이브리드 클라우드 지원이 강점입니다.
from azure.ai.ml import MLClient
from azure.ai.ml.entities import AmlCompute, Command
from azure.identity import DefaultAzureCredential
ml_client = MLClient(
DefaultAzureCredential(),
subscription_id="YOUR_SUBSCRIPTION",
resource_group_name="rg-ai",
workspace_name="ai-workspace"
)
# GPU 클러스터 생성
compute_config = AmlCompute(
name="gpu-cluster",
type="amlcompute",
size="Standard_ND96asr_v4",
min_instances=0,
max_instances=4,
idle_time_before_scale_down=120
)
ml_client.compute.begin_create_or_update(compute_config).result()
Azure ML 학습 잡 실행
from azure.ai.ml.entities import Command
from azure.ai.ml import Input
job = Command(
code="./src",
command="python train.py --epochs 10 --learning_rate 0.001",
environment="AzureML-pytorch-2.0-ubuntu20.04-py38-cuda11-gpu@latest",
compute="gpu-cluster",
inputs={
"train_data": Input(type="uri_folder", path="azureml://datastores/mydata/paths/train/")
},
display_name="pytorch-training-job"
)
returned_job = ml_client.jobs.create_or_update(job)
print(f"Job URL: {returned_job.studio_url}")
Azure OpenAI Service
from openai import AzureOpenAI
client = AzureOpenAI(
azure_endpoint="https://your-resource.openai.azure.com/",
api_key="YOUR_API_KEY",
api_version="2024-02-01"
)
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "You are an AI assistant."},
{"role": "user", "content": "클라우드 AI의 장점을 설명해줘"}
]
)
print(response.choices[0].message.content)
5. Kubernetes for AI (EKS/GKE/AKS)
Kubernetes는 대규모 AI 워크로드 오케스트레이션의 표준이 되었습니다.
GPU 노드 풀 설정
# GKE GPU 노드 풀 (Terraform)
resource "google_container_node_pool" "gpu_pool" {
name = "gpu-pool"
cluster = google_container_cluster.primary.name
node_count = 2
node_config {
machine_type = "a2-highgpu-1g"
guest_accelerator {
type = "nvidia-tesla-a100"
count = 1
}
oauth_scopes = ["https://www.googleapis.com/auth/cloud-platform"]
}
}
NVIDIA 디바이스 플러그인
kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.1/nvidia-device-plugin.yml
Kubeflow Pipeline 정의
import kfp
from kfp import dsl
@dsl.component(
base_image='python:3.10',
packages_to_install=['scikit-learn', 'pandas']
)
def train_model(
data_path: str,
model_path: kfp.dsl.OutputPath(str)
):
import pickle
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
df = pd.read_csv(data_path)
X = df.drop('label', axis=1)
y = df['label']
model = RandomForestClassifier(n_estimators=100)
model.fit(X, y)
with open(model_path, 'wb') as f:
pickle.dump(model, f)
@dsl.pipeline(name='ml-pipeline')
def ml_pipeline(data_path: str = 'gs://bucket/data.csv'):
train_task = train_model(data_path=data_path)
KEDA를 이용한 자동 스케일링
KEDA(Kubernetes Event-driven Autoscaling)는 큐 깊이나 HTTP 요청 수 기반으로 AI 추론 파드를 자동 스케일링합니다.
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: inference-scaler
spec:
scaleTargetRef:
name: inference-deployment
minReplicaCount: 1
maxReplicaCount: 20
triggers:
- type: aws-sqs-queue
metadata:
queueURL: https://sqs.us-east-1.amazonaws.com/123456789/inference-queue
queueLength: '5'
6. 서버리스 AI 추론
서버리스는 트래픽이 간헐적이거나 예측 불가능한 AI 서비스에 비용 효율적인 선택입니다.
콜드 스타트 최적화
ML 모델의 콜드 스타트는 수 초~수십 초 걸릴 수 있습니다. 최소화 방법:
- 프로비저닝된 동시성 (AWS Lambda): 미리 워밍업된 인스턴스 유지
- 컨테이너 이미지 최적화: 불필요한 패키지 제거, 멀티 스테이지 빌드
- 모델 양자화: FP16/INT8로 모델 크기 절반 이상 줄이기
- 지연 로딩: 핸들러 외부에서 모델 초기화 (전역 변수 활용)
# Lambda 콜드 스타트 최적화 패턴
import boto3
import json
from transformers import pipeline
# 전역 변수로 모델 로드 (핸들러 외부)
# 컨테이너가 재사용되면 이 코드는 다시 실행되지 않음
classifier = pipeline('sentiment-analysis', model='distilbert-base-uncased-finetuned-sst-2-english')
def lambda_handler(event, context):
body = json.loads(event['body'])
text = body['text']
result = classifier(text)
return {
'statusCode': 200,
'body': json.dumps(result)
}
AWS Fargate로 컨테이너 기반 서버리스
Fargate는 서버 관리 없이 컨테이너를 실행합니다. Lambda의 메모리/시간 제한 없이 대용량 모델 서빙이 가능합니다.
# ECS Task Definition (Fargate + GPU)
{
'family': 'ai-inference-task',
'networkMode': 'awsvpc',
'requiresCompatibilities': ['FARGATE'],
'cpu': '4096',
'memory': '16384',
'containerDefinitions':
[
{
'name': 'inference-container',
'image': '123456789.dkr.ecr.us-east-1.amazonaws.com/my-model:latest',
'portMappings': [{ 'containerPort': 8080 }],
'environment': [{ 'name': 'MODEL_PATH', 'value': '/opt/ml/model' }],
},
],
}
7. 데이터 스토리지와 AI
오브젝트 스토리지 비교
| 서비스 | 제공자 | 특징 |
|---|---|---|
| Amazon S3 | AWS | 99.999999999% 내구성, 강력한 SDK |
| Google Cloud Storage | GCP | BigQuery와 네이티브 통합 |
| Azure Blob Storage | Azure | Azure Data Lake Gen2 지원 |
데이터 레이크 아키텍처
효율적인 AI 데이터 파이프라인을 위한 레이크하우스 패턴:
Raw Layer (Bronze)
└── 원본 데이터 그대로 보존
└── 파티션: year/month/day/
Processed Layer (Silver)
└── 정제, 중복 제거, 스키마 강제
└── Parquet/Delta Lake 포맷
Feature Layer (Gold)
└── ML 피처 엔지니어링 완료
└── Feature Store에 등록
대용량 모델 체크포인트 관리
import boto3
from pathlib import Path
def save_checkpoint_to_s3(model, optimizer, epoch, loss, bucket, prefix):
"""모델 체크포인트를 S3에 저장"""
import torch
checkpoint = {
'epoch': epoch,
'model_state_dict': model.state_dict(),
'optimizer_state_dict': optimizer.state_dict(),
'loss': loss,
}
local_path = f'/tmp/checkpoint_epoch_{epoch}.pt'
torch.save(checkpoint, local_path)
s3 = boto3.client('s3')
s3_key = f'{prefix}/checkpoint_epoch_{epoch}.pt'
s3.upload_file(local_path, bucket, s3_key)
print(f'Checkpoint saved to s3://{bucket}/{s3_key}')
8. 클라우드 AI 모니터링
모델 성능 드리프트 감지
프로덕션 모델은 시간이 지남에 따라 성능이 저하될 수 있습니다. SageMaker Model Monitor 예시:
from sagemaker.model_monitor import DataCaptureConfig, DefaultModelMonitor
from sagemaker.model_monitor.dataset_format import DatasetFormat
# 데이터 캡처 설정
data_capture_config = DataCaptureConfig(
enable_capture=True,
sampling_percentage=20,
destination_s3_uri='s3://bucket/capture'
)
# 모델 모니터 생성
monitor = DefaultModelMonitor(
role=role,
instance_count=1,
instance_type='ml.m5.xlarge',
volume_size_in_gb=20,
max_runtime_in_seconds=3600
)
# 베이스라인 생성
monitor.suggest_baseline(
baseline_dataset='s3://bucket/train_data.csv',
dataset_format=DatasetFormat.csv(header=True)
)
CloudWatch 메트릭 커스텀 알림
import boto3
cloudwatch = boto3.client('cloudwatch', region_name='us-east-1')
# 커스텀 메트릭 전송
cloudwatch.put_metric_data(
Namespace='MLOps/ModelPerformance',
MetricData=[
{
'MetricName': 'PredictionAccuracy',
'Value': 0.94,
'Unit': 'None',
'Dimensions': [
{'Name': 'ModelName', 'Value': 'fraud-detector-v2'},
{'Name': 'Environment', 'Value': 'production'}
]
}
]
)
9. MLOps on Cloud
GitHub Actions + AWS CodePipeline CI/CD
name: ML Pipeline CI/CD
on:
push:
branches: [main]
jobs:
train-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Run SageMaker training
run: |
python scripts/run_training.py \
--instance-type ml.p3.2xlarge \
--output-path s3://bucket/models/
- name: Deploy to staging
run: |
python scripts/deploy_model.py \
--endpoint-name staging-endpoint \
--instance-type ml.g4dn.xlarge
MLflow + S3 모델 레지스트리
import mlflow
import mlflow.pytorch
mlflow.set_tracking_uri('s3://bucket/mlflow')
mlflow.set_experiment('fraud-detection')
with mlflow.start_run():
# 파라미터 기록
mlflow.log_params({
'learning_rate': 0.001,
'batch_size': 32,
'epochs': 10
})
# 학습 루프
for epoch in range(10):
train_loss = train_one_epoch(model, train_loader, optimizer)
val_accuracy = evaluate(model, val_loader)
mlflow.log_metrics({
'train_loss': train_loss,
'val_accuracy': val_accuracy
}, step=epoch)
# 모델 저장
mlflow.pytorch.log_model(model, 'model')
mlflow.register_model(
model_uri=f'runs:/{mlflow.active_run().info.run_id}/model',
name='fraud-detector'
)
카나리 배포
# SageMaker 카나리 배포
import boto3
sm = boto3.client('sagemaker')
# 트래픽의 10%를 새 모델로 전환
sm.update_endpoint_weights_and_capacities(
EndpointName='production-endpoint',
DesiredWeightsAndCapacities=[
{
'VariantName': 'current-model',
'DesiredWeight': 90,
'DesiredInstanceCount': 4
},
{
'VariantName': 'new-model',
'DesiredWeight': 10,
'DesiredInstanceCount': 1
}
]
)
10. 퀴즈
Q1. AWS SageMaker에서 분산 학습 시 PyTorch DDP를 활성화하는 올바른 설정은?
정답: distribution 파라미터에 {'torch_distributed': {'enabled': True}}를 지정하고, instance_count를 2 이상으로 설정합니다.
설명: SageMaker PyTorch Estimator는 distribution 옵션을 통해 여러 분산 학습 방식을 지원합니다. torch_distributed는 PyTorch의 기본 분산 학습 프레임워크를 활용하며, SageMaker가 자동으로 노드 간 통신을 설정해 줍니다.
Q2. Spot 인스턴스와 On-Demand 인스턴스의 주요 차이점은?
정답: Spot 인스턴스는 AWS의 유휴 용량을 활용하여 최대 90% 저렴하지만, AWS가 용량 필요 시 인터럽션(중단) 신호를 보낸 후 2분 안에 인스턴스를 회수할 수 있습니다. On-Demand는 언제든 사용 가능하지만 정가입니다.
설명: ML 학습 작업에 Spot을 사용할 때는 반드시 체크포인팅을 구현해야 합니다. SageMaker는 CheckpointConfig를 통해 S3로 자동 체크포인팅을 지원하며, 인터럽션 후 자동 재시작도 가능합니다.
Q3. BigQuery ML에서 CREATE OR REPLACE MODEL 구문의 input_label_cols 옵션은 무엇을 의미하나요?
정답: input_label_cols는 모델이 예측해야 할 타깃 컬럼(레이블)을 지정합니다. 지정된 컬럼은 피처에서 자동으로 제외됩니다.
설명: BigQuery ML은 SQL 쿼리 결과를 학습 데이터로 직접 사용합니다. input_label_cols를 올바르게 설정하지 않으면 타깃 값이 피처로 포함되어 데이터 누수(Data Leakage)가 발생할 수 있습니다.
Q4. Kubernetes에서 KEDA를 사용하는 주목적은 무엇인가요?
정답: KEDA는 이벤트 기반 오토스케일링을 제공합니다. SQS 큐 깊이, Kafka 토픽 오프셋, HTTP 요청 수 등 외부 이벤트 소스를 기반으로 파드 수를 자동 조정합니다. 기본 HPA(Horizontal Pod Autoscaler)가 CPU/메모리 기반인 것과 달리, 실제 워크로드 큐를 기반으로 스케일링합니다.
설명: AI 추론 서비스에서는 요청 큐가 쌓일 때 빠르게 스케일 아웃하고, 유휴 시에는 0까지 스케일 인하여 비용을 절약하는 패턴이 효과적입니다.
Q5. MLflow의 모델 레지스트리를 S3 백엔드로 사용할 때 mlflow.set_tracking_uri에 전달하는 값의 형식은?
정답: S3 URI 형식인 s3://bucket-name/prefix를 사용합니다. 예를 들어 s3://my-mlflow-bucket/mlflow와 같이 지정합니다.
설명: MLflow는 S3를 아티팩트 스토어로 사용할 수 있습니다. 트래킹 서버 없이 S3만으로도 실험 메타데이터와 모델 아티팩트를 중앙 관리할 수 있어, 팀 단위 MLOps 환경에서 유용합니다. EC2 또는 SageMaker 환경에서는 IAM 역할을 통해 자동 인증이 가능합니다.