Ответ
Я разворачивал и поддерживал в Kubernetes кластерах (как managed, так и self-hosted) сервисы для инференса ML-моделей и оркестрации тренировочных джоб. Основные задачи:
- Деплой сервисов: Создание
Deployments,Services(включаяLoadBalancerиClusterIP) иIngress-контроллеров для доступа к API. - Конфигурация и секреты: Использование
ConfigMapsиSecretsдля управления настройками и чувствительными данными. - Масштабирование: Настройка
HorizontalPodAutoscaler (HPA)на основе CPU/памяти или кастомных метрик из Prometheus.
Пример манифеста для сервиса инференса с лимитами ресурсов и readiness-пробой:
apiVersion: apps/v1
kind: Deployment
metadata:
name: model-inference
spec:
selector:
matchLabels:
app: model-inference
template:
metadata:
labels:
app: model-inference
spec:
containers:
- name: api
image: my-registry/model-api:v1.2
ports:
- containerPort: 8000
readinessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 10
resources:
requests:
memory: '512Mi'
cpu: '250m'
limits:
memory: '1Gi'
cpu: '500m'
Также использовал Kubeflow Pipelines для организации воспроизводимых ML-воркфлоу и Helm для управления релизами сложных приложений.
Ответ 18+ 🔞
А, ну ты про куберы! Да, я с этой штукой на короткой ноге, ёпта. Разворачивал и поддерживал в этих самых Kubernetes кластерах (и те, что как услуга, и те, что сам собирал, с горем пополам) сервисы для инференса ML-моделей и для оркестрации тренировочных джоб. Задачи там были, я тебе скажу, на овердохуища.
Вот, например, что приходилось делать:
- Деплой сервисов: Создавать эти самые
Deployments,Services(включаяLoadBalancer, который денег стоит, иClusterIPдля внутреннего общения) иIngress-контроллеры, чтобы к API доступ был. Иногда так настроишь, что сам потом полдня ищешь, где косяк — волнение ебать, честно. - Конфигурация и секреты: Работа с
ConfigMapsиSecrets. Это чтобы настройки не в код пихать, а то потом, если что-то поменять надо, пересобирать всё — терпения ноль ебать. А секреты — ну, чтобы пароли и ключи не светить на каждом углу. - Масштабирование: Настройка
HorizontalPodAutoscaler (HPA). Чтобы поды сами плодились, когда нагрузка растёт, и умирали, когда она падает. Можно по CPU/памяти, а можно и по кастомным метрикам из Prometheus прикрутить — было дело.
Вот, смотри, пример манифеста для сервиса инференса. Тут и лимиты ресурсов, чтобы один жадный под всю память не сожрал, и readiness-проба, чтобы трафик на здоровые инстансы только шёл. Без этого — пиздец, а не сервис.
apiVersion: apps/v1
kind: Deployment
metadata:
name: model-inference
spec:
selector:
matchLabels:
app: model-inference
template:
metadata:
labels:
app: model-inference
spec:
containers:
- name: api
image: my-registry/model-api:v1.2
ports:
- containerPort: 8000
readinessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 10
resources:
requests:
memory: '512Mi'
cpu: '250m'
limits:
memory: '1Gi'
cpu: '500m'
А ещё, чувак, использовал Kubeflow Pipelines — штука для организации ML-воркфлоу, чтобы их можно было воспроизводить, а не как попало. И Helm, конечно. Без него управлять релизами сложных приложений — это как гвозди микроскопом забивать, ей-богу. Чарты эти, values.yaml... Но когда всё летает — красота.