Asya: Фреймворк для AI/ML-ворклоув на Kubernetes
Asya (от Async Actors) — это основанный на очередях фреймворк для оркестрации AI/ML-нагрузок на Kubernetes. Ключевая идея: вы пишете чистые Python-функции, а Asya берёт на себя очереди, маршрутизацию, масштабирование и мониторинг.
Протестирован в Delivery Hero для AI-обработки изображений на глобальном масштабе, сейчас используется для LLM- и агентных ворклоувов.
📘 Документация • 🚀 Быстрый старт • 🏗️ Архитектура • 💡 Концепции
Когда стоит использовать Asya
✅ Подходит для
- Многошаговые AI/ML-пайплайны: обработка документов (OCR → классификация → извлечение → сохранение), пайплайны изображений (изменение размера → детекция → классификация → тегирование), LLM-ворклоувы (поиск → промпт → генерация → оценка → уточнение), видеоаналитика (разбивка → транскрибация → суммаризация → перевод)
- Event-driven нагрузки: обработка вебхуков (GitHub, Stripe, Twilio), пакетные предсказания, асинхронные API-бэкенды (загрузка пользователем → фоновая обработка)
- Cost-sensitive развёртывания: GPU-инференс (масштабирование до нуля между батчами), пиковый трафик (увеличение в 10x в часы пик, ноль в остальное время), dev/staging-среды (минимизация потребления ресурсов)
❌ Не подходит для
- Real-time инференс с латентностью < 100 мс: накладные расходы очереди добавляют задержку (используйте KServe/Seldon)
- Задачи обучения: используйте Kubeflow, Ray Train или нативные Kubernetes Jobs
Подробнее: Мотивация | Основные концепции | Примеры использования
Для Data Scientists
Пишите чистые Python-функции — без декораторов, DAG и инфраструктурного кода:
# handler.py
def process(payload: dict) -> dict:
return {
**payload, # Сохраняем существующие данные
"result": my_model.predict(payload["input"])
}
Классовые обработчики для инициализации с состоянием (загрузка модели):
class MyActor:
def __init__(self, model_path: str = "/models/default"):
self.model = load_model(model_path) # Загружается один раз при старте пода
def process(self, payload: dict) -> dict:
return {
**payload,
"prediction": self.model.predict(payload["text"])
}
Режим envelope для динамической маршрутизации (агенты, LLM-судьи):
class LLMJudge:
def __init__(self, threshold: float = 0.8):
self.model = load_llm("/models/judge")
self.threshold = float(threshold)
def process(self, envelope: dict) -> dict:
payload = envelope["payload"]
score = self.model.judge(payload["llm_response"])
payload["judge_score"] = score
route = envelope["route"]
if score < self.threshold:
route["actors"].insert(route["current"] + 1, "llm-refiner")
route["current"] += 1
return envelope
Паттерн: обогащаете payload результатами и передаёте следующему актору. Полная история пайплайна сохраняется.
Подробнее: Быстрый старт для Data Scientists | Примеры обработчиков
Для Platform Engineer'ов
Развёртывание акторов через Kubernetes CRD:
apiVersion: asya.sh/v1alpha1
kind: AsyncActor
metadata:
name: text-classifier
spec:
transport: sqs # или rabbitmq
scaling:
enabled: true
minReplicas: 0
maxReplicas: 100
queueLength: 5 # Цель: 5 сообщений на под
workload:
kind: Deployment
template:
spec:
containers:
- name: asya-runtime
image: my-classifier:latest
env:
- name: ASYA_HANDLER
value: "classifier.TextClassifier.process"
resources:
limits:
nvidia.com/gpu: 1
Что происходит:
- Оператор создаёт очередь
asya-text-classifier
- Оператор внедряет sidecar для маршрутизации сообщений
- KEDA мониторит глубину очереди, масштабирует 0→100 подов
- Sidecar маршрутизирует сообщения: Queue → Unix socket → Ваш код → Next queue
Транспорты: SQS (AWS), RabbitMQ (self-hosted), Kafka/NATS (планируются)
Подробнее: Быстрый старт для Platform Engineer'ов | Инструкции по установке | Примеры AsyncActor
Архитектура
Asya использует паттерн sidecar для маршрутизации сообщений:
- Оператор следит за AsyncActor CRD, внедряет sidecar'ы, настраивает KEDA
- Sidecar обрабатывает потребление из очереди, маршрутизацию, повторные попытки (на Go)
- Runtime выполняет ваш Python-обработчик через Unix socket
- Gateway (опционально) предоставляет MCP HTTP API для отправки сообщений и SSE-стриминга
- KEDA мониторит глубину очереди, масштабирует акторы 0→N
Поток сообщений: Queue → Sidecar → Ваш код → Sidecar → Next Queue
Подробнее: Документация по архитектуре — диаграмма системы, детали компонентов, протоколы и паттерны развёртывания.
Быстрый старт
Разработка
Мы приветствуем вклад! См. CONTRIBUTING.md по:
- Настройке окружения (Go, Python, Docker, Make)
- Тестированию (unit, component, integration, E2E)
- Стандартам кода и линтингу
- Процессу Pull Request
Требования: Go 1.23+, Python 3.13+, Docker, Make, uv
Основные команды:
make build # Сборка всех компонентов
make test-unit # Unit-тесты (Go + Python)
make test-integration # Интеграционные тесты (Docker Compose)
make test-e2e # E2E-тесты (Kind cluster)
make lint # Линтеры с автоисправлением
Лицензия
Copyright © 2025 Delivery Hero SE. Лицензия Apache 2.0. Подробности в LICENSE.
Статус проекта
Alpha — активная разработка, API могут меняться. Для production-использования требуется тщательное тестирование.
Мейнтейнеры: Artem Yushkovskiy ( @atemate, @atemate-dh )
Планы (см. GitHub Discussions):
- Стабилизация и уточнение API
- Дополнительные транспорты (Kafka, NATS, Google Pub/Sub)
- Быстрый старт подов (PVC для моделей)
- Интеграции: KAITO, Knative
- Улучшенная наблюдаемость (OpenTelemetry tracing)
- Маршрутизация между кластерами
Обратная связь: Открывайте issue или обсуждение на GitHub ❤️
Комментарии
Комментариев пока нет. Будьте первым.