Миграция AI-решения между облачными провайдерами
Миграция AI-workload между AWS, GCP и Azure — нетривиальная задача: нужно перенести не только код и модели, но и данные, инфраструктуру обучения, инференс-сервисы и интегрированные managed services. При этом важно минимизировать downtime и избежать деградации качества модели.
Типичные причины миграции
- Cost optimization: разница в стоимости GPU spot instances достигает 30-40%
- Vendor lock-in reduction: снижение зависимости от проприетарных сервисов
- Compliance: требования к расположению данных (data residency)
- Performance: конкретный облак предлагает лучший GPU (H100 доступны у разных провайдеров в разное время)
Аудит перед миграцией
Cloud-specific dependencies checklist:
□ Managed ML services (SageMaker / Vertex AI / Azure ML)
□ Data storage (S3 / GCS / Azure Blob)
□ Container registry (ECR / GCR / ACR)
□ Message queues (SQS+SNS / Pub/Sub / Event Hub)
□ Database services (RDS / Cloud SQL / Azure Database)
□ Secrets management (Secrets Manager / Secret Manager / Key Vault)
□ Monitoring (CloudWatch / Cloud Monitoring / Azure Monitor)
□ Networking (VPC, security groups, DNS)
Стратегия миграции
Strangler Fig pattern — постепенная замена, не big bang:
- Поднять параллельную инфраструктуру в новом облаке
- Перенести non-critical workload (batch training)
- Настроить shadow deployment: inference в обоих облаках
- Постепенно переключить трафик (canary migration)
- Вывести старую инфраструктуру
Абстракция от cloud-specific API
# Cloud-agnostic storage abstraction
from abc import ABC, abstractmethod
class ObjectStorage(ABC):
@abstractmethod
def upload(self, local_path: str, remote_path: str): ...
@abstractmethod
def download(self, remote_path: str, local_path: str): ...
class S3Storage(ObjectStorage):
def __init__(self, bucket: str, region: str = "us-east-1"):
self.client = boto3.client('s3', region_name=region)
self.bucket = bucket
def upload(self, local_path: str, remote_path: str):
self.client.upload_file(local_path, self.bucket, remote_path)
class GCSStorage(ObjectStorage):
def __init__(self, bucket: str):
self.client = storage.Client()
self.bucket = self.client.bucket(bucket)
def upload(self, local_path: str, remote_path: str):
blob = self.bucket.blob(remote_path)
blob.upload_from_filename(local_path)
# Переключение через конфиг
storage = S3Storage("my-bucket") if CLOUD == "aws" else GCSStorage("my-bucket")
Перенос данных
# AWS S3 → GCS через Storage Transfer Service (Google)
gcloud transfer jobs create \
--source-agent-pool=aws-pool \
--aws-source-bucket=my-aws-bucket \
--destination-bucket=my-gcs-bucket \
--do-not-delete-from-source
# Для больших датасетов (>TB): gsutil -m rsync -r
gsutil -m rsync -r s3://source-bucket gs://dest-bucket
Тестирование после миграции
Обязательная проверка: воспроизводимость предсказаний модели — одни и те же входные данные должны давать идентичный результат (с учётом стохастичности). Разница в распределении предсказаний между старым и новым окружением сигнализирует о проблемах с воспроизводимостью. Сравнение метрик на hold-out датасете должно показывать < 0.1% расхождения.
Типичный срок: 4-8 недель для full-scale AI платформы с ML pipelines, Feature Store и инференс-сервисами.







