Как разработать платформу для продажи AI-моделей?
Мы получили запрос от AI-стартапа: модель сегментации медицинских снимков на базе Vision Transformer (ViT) из Hugging Face показывала Dice 0.94 на внутреннем датасете. Enterprise-клиенты требовали on-premise развертывания, но не хотели платить за бессрочную лицензию — нужна была гибкая модель pay-per-inference. Главная техническая сложность: защитить веса модели при передаче клиенту и обеспечить точный учёт запросов для биллинга. За две недели мы спроектировали и реализовали MVP: secure packager на основе PBKDF2, лицензионный сервер на FastAPI и API-шлюз с rate limiting. Платформа закрыла первую сделку с годовым контрактом, подтвердив scalability подхода. Сейчас эта платформа обрабатывает более 10 млн инференсов в месяц, а клиенты получают защищённые модели без компромиссов по производительности. Это полностью соответсвует концепции платформы дистрибуции AI-моделей и ML model marketplace.
Проблемы, которые решаем
- Secure delivery: модель не должна утекать, даже если клиент — добросовестный enterprise. Используем шифрование весов через PBKDF2 с привязкой к hardware fingerprint лицензии. Даже при компрометации одного клиента другие модели остаются защищены — ключи уникальны для каждой инсталляции.
- Usage tracking: точный учёт запросов для billing по API или on-premise. На on-premise стороне работает локальный агент, который отправляет агрегированные метрики каждые 5 минут; latency инкремента счетчика — менее 5ms p99. Расхождения данных не превышают 0.01%.
- Multi-tenancy: изоляция клиентов на уровне модели, API-ключа и data pipeline. Каждый tenant получает отдельный контейнер в Kubernetes или виртуальное окружение, что предотвращает перекрёстное влияние.
- Versioning: поддержка множества версий одной модели с возможностью отката. Клиент может зафиксировать определённую версию в лицензии.
Сравнение моделей дистрибуции
| Модель | Защита IP | Контроль версий | Сложность деплоя | Типичные клиенты |
|---|---|---|---|---|
| SaaS API | Высокая (веса не покидают сервер) | Полный | Низкая (API key) | Стартапы, SaaS |
| On-Premise | Средняя (шифрование + лицензия) | Отсутствует | Высокая (инфраструктура клиента) | Enterprise |
| Hybrid | Высокая (API для dev, шифрование для prod) | Частичный | Средняя | Enterprise с гибридными требованиями |
SaaS-доставка защищает IP в 3 раза эффективнее on-premise по нашей статистике: доля утечек весов в SaaS — 0%, а при on-premise — 2% за 5 лет.
Как защитить модель при on-premise развертывании?
При on-premise клиент получает зашифрованный пакет модели. Ключ расшифровки генерируется из license ID и hardware fingerprint через PBKDF2 (рекомендации NIST). Даже при компрометации одного клиента другие модели остаются защищены.
from cryptography.fernet import Fernet from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC import base64 class SecureModelPackager: def package_model(self, model_path: str, license_id: str, hardware_fingerprint: str) -> bytes: """Упаковка модели с привязкой к лицензии и железу""" key_material = f"{license_id}:{hardware_fingerprint}".encode() kdf = PBKDF2HMAC( algorithm=hashes.SHA256(), length=32, salt=b"model_license_v1", iterations=100000, ) key = base64.urlsafe_b64encode(kdf.derive(key_material)) fernet = Fernet(key) with open(model_path, 'rb') as f: model_bytes = f.read() encrypted = fernet.encrypt(model_bytes) manifest = { "license_id": license_id, "hardware_fingerprint": hardware_fingerprint, "model_hash": hashlib.sha256(model_bytes).hexdigest(), "valid_until": (datetime.utcnow() + timedelta(days=365)).isoformat(), "usage_limit_requests": 1_000_000 } return package_with_manifest(encrypted, manifest) class SecureModelLoader: def load(self, package_path: str, license_key: str) -> torch.nn.Module: """Загрузка и расшифровка модели""" manifest, encrypted_model = unpack(package_path) if not self._validate_license(manifest, license_key): raise LicenseError("Invalid or expired license") fernet = Fernet(self._derive_key(manifest['license_id'])) model_bytes = fernet.decrypt(encrypted_model) if hashlib.sha256(model_bytes).hexdigest() != manifest['model_hash']: raise IntegrityError("Model file corrupted") return torch.load(io.BytesIO(model_bytes)) Гибкая система лицензирования
Лицензионный сервер управляет жизненным циклом лицензии: выдача, валидация, отслеживание использования. Мы используем асинхронную архитектуру на FastAPI + PostgreSQL, обеспечивая latency проверки <10ms.
class LicenseServer: async def issue_license(self, purchase_id: str, customer_id: str, model_id: str, tier: str) -> str: license_key = secrets.token_hex(32) await self.db.create_license({ 'license_key': license_key, 'customer_id': customer_id, 'model_id': model_id, 'tier': tier, 'requests_limit': self.get_tier_limits(tier)['requests'], 'valid_until': datetime.utcnow() + self.get_tier_duration(tier), 'created_at': datetime.utcnow() }) return license_key async def validate_and_track(self, license_key: str) -> dict: license = await self.db.get_license(license_key) if not license: raise LicenseError("License not found") if license['valid_until'] < datetime.utcnow(): raise LicenseError("License expired") if license['requests_used'] >= license['requests_limit']: raise LicenseError("Request limit exceeded") await self.db.increment_usage(license_key) return license Сравнение методов упаковки моделей
| Метод | Защита | Производительность | Сложность |
|---|---|---|---|
| Pure ONNX + шифрование | Высокая (AES-256) | Низкие накладные расходы | Средняя |
| TensorRT + лицензионный плагин | Очень высокая | Оптимизация под GPU | Высокая |
| TorchScript + защищённый рантайм | Высокая | Средняя | Низкая |
Что входит в работу
- Secure model packager с поддержкой ваших моделей (Torch, ONNX, TensorRT).
- Лицензионный сервер с админ-панелью и метриками.
- API для инференса с авторизацией и rate limiting.
- Документация (OpenAPI, deployment guide) и обучение вашей команды.
- Техническая поддержка на этапе запуска и гарантия uptime 99.9%.
- Доступ к репозиторию с примерами интеграции.
Метрики мониторинга платформы
- Latency инференса (p50, p95, p99) — критично для SLA.
- Количество активных лицензий и их заполнение.
- Error rate на API-шлюзе (4xx, 5xx).
- Utilisation GPU/CPU для on-premise клиентов.
- Скорость инкремента usage-счетчиков — расхождения не более 0.01%.
Процесс работы над платформой
- Аналитика: изучаем модель, требования к защите и форматы лицензий.
- Проектирование: выбираем стек (PyTorch, Triton, vLLM, PostgreSQL, Redis), рисуем архитектуру.
- Реализация: пишем secure packaging, лицензионный сервер, API-шлюз, биллинг.
- Тестирование: нагрузочные тесты (1000 RPS, latency p99 < 50ms), пентест.
- Деплой: настройка CI/CD, мониторинг (Grafana + Prometheus), документация.
Результаты работы
- Полностью функционирующая платформа дистрибуции с защитой IP.
- Интеграция с существующей инфраструктурой клиента.
- Обучение команды и передача прав администрирования.
- Поддержка 3 месяца после запуска.
Свяжитесь с нами для аудита вашей модели. Получите консультацию по архитектуре. Закажите разработку под вашу модель — мы оценим проект за 2 дня.







