TrustyAI Service (TAS)
Содержание
OverviewPrerequisitesDeploy TrustyAIServiceDATABASE modePVC modeVerify deployment readinessAccess the TAS APIService overview and authenticationObtain a tokenBearer token and base URLData ingestionTraining and reference data (POST /data/upload)Live inference data (POST /consumer/kserve/v2)Column name mapping (POST /info/names)Data drift metricsDrift metric typesRegister scheduled drift metricsOne-shot drift requestsList and delete scheduled drift jobsPrometheus metrics (drift)Bias metricsSPD and DIRRegister scheduled bias metricsList and delete scheduled bias jobsPrometheus metrics (bias)Overview
TrustyAI Service (TAS) собирает данные инференса модели (входные запросы и выходные ответы), сохраняет их и организует в наборы данных для анализа, включая обнаружение дрейфа и оценку смещения по сравнению с эталонным и текущим трафиком.
Основные возможности:
- Захват и хранение записей инференса.
- Организация записей по
model_nameиdata_tag. - Предоставление API метаданных для просмотра собранных данных.
- Настройка человекочитаемых названий столбцов для записанных полей для упрощения последующего анализа.
- Запуск обнаружения дрейфа (например, тест KS, сдвиг среднего) по сравнению с эталонным подмножеством и текущими данными в продакшене.
- Запуск метрик смещения (например, SPD и DIR) по защищённым атрибутам и результатам.
На этой странице описывается развертывание TrustyAIService, загрузка эталонных данных через POST /data/upload и живого инференса через POST /consumer/kserve/v2, регистрация метрик дрейфа и смещения через HTTP API, а также экспонирование временных рядов в Prometheus для мониторинга.
Prerequisites
- Установлен TrustyAI Operator (см. Install TrustyAI).
- Если используется
storage.format: DATABASE, требуется база данных MySQL 8.x. - Если используется
storage.format: PVC, убедитесь, что в кластере есть рабочий дефолтныйStorageClass(поддерживаемый CSI драйвером) для динамического выделения томов, чтобы созданный оператором PVC мог быть привязан.
Deploy TrustyAIService
Выберите один вариант хранения: DATABASE (MySQL) или PVC (локальное файловое хранилище на томе). Следующие два подраздела — это альтернативы, а не последовательные шаги.
DATABASE mode
Секрет с учётными данными MySQL
Создайте секрет, содержащий ключи, необходимые для развертывания TAS при использовании storage.format: DATABASE:
Примечания:
- Схема MySQL (база данных), указанная в
databaseName, должна быть создана заранее. TAS не создаёт базу данных самостоятельно. - База данных должна быть доступна из пода TAS.
databaseGenerationконтролирует, как обрабатываются изменения схемы при запуске TAS.
CR TrustyAIService
Пример:
В режиме DATABASE поле storage.databaseConfigurations должно содержать имя созданного выше секрета с учётными данными MySQL в том же namespace, что и TrustyAIService.
Аннотации в metadata.annotations необязательны и используются для того, чтобы оператор создал ServiceMonitor для сбора метрик Prometheus (чтобы платформа могла автоматически собирать данные мониторинга).
- При установке
trustyai.cpaas.io/monitor-enable: "true"оператор создаётServiceMonitor. trustyai.cpaas.io/monitor-intervalиtrustyai.cpaas.io/monitor-metric-regexнеобязательны; при отсутствии используются значения по умолчанию.
trustyai.cpaas.io/monitor-interval задаёт частоту опроса метрик Prometheus (по умолчанию 30s).
trustyai.cpaas.io/monitor-metric-regex задаёт, какие имена метрик сохраняются после опроса (по умолчанию ^trustyai_.*).
Поля spec.metrics:
schedule(обязательно): как часто TAS запускает вычисление метрик (например, каждые5s). Значение — строка длительности.batchSize(необязательно): сколько записей инференса TAS включает в каждое вычисление метрик (большее значение использует больше данных за один запуск). Если не задано, оператор использует значение по умолчанию5000.
PVC mode
Используйте этот вариант, если storage.format — PVC (без секрета MySQL). Пример:
В режиме PVC:
storage.folder: путь внутри примонтированного PVC, где TAS хранит и читает данные.storage.size: запрашиваемый размер PVC (например,1Gi).- Оператор автоматически создаёт PVC с именем
<tas-name>-pvcв том же namespace, что иTrustyAIService. Поскольку PVC использует дефолтныйStorageClassкластера (явноstorageClassNameне задан), кластер должен предоставлять рабочий дефолтныйStorageClass(иначе PVC может оставаться в состоянииPending).
Когда манифест TrustyAIService для выбранного режима готов, примените его (одинаковая команда для YAML DATABASE или PVC):
Verify deployment readiness
Ожидаемый status.phase — Ready.
Также проверьте поды:
Access the TAS API
Service overview and authentication
В развертывании TAS kube-rbac-proxy работает как сайдкар для обеспечения аутентификации.
Оператор создаёт два сервиса в том же namespace:
<tas-name>: маршрутизирует трафик напрямую в контейнер TAS (сырой сервис).<tas-name>-tls: маршрутизирует трафик через сайдкарkube-rbac-proxy; это аутентифицированная точка доступа, требующая заголовокAuthorization: Bearer <token>.
Obtain a token
Создайте ServiceAccount, Role (с правами get, create, delete на services/proxy) и RoleBinding в том же namespace, что и TrustyAIService; затем создайте токен для ServiceAccount:
Опционально можно задать длительность токена, например --duration=8760h для одного года. Последняя команда выводит токен; используйте его в заголовке Authorization: Bearer <token>.
Bearer token and base URL
Используйте токен из предыдущего раздела как заголовок Authorization: Bearer <token> для каждого запроса к защищённому API TAS.
Выберите базовый URL (хост) для вызовов:
- Прямой сервис (без прокси-аутентификации):
https://<tas-name>.<your-namespace>.svc.cluster.local - Аутентифицированная точка (
kube-rbac-proxy):https://<tas-name>-tls.<your-namespace>.svc.cluster.local— используйте этот хост, когда API требуетAuthorization: Bearer <token>(обычно сервис с-tls).
Например, GET /info можно отправить так:
Замените <tas-host> на аутентифицированный хост (обычно URL с -tls), когда требуется заголовок.
Data ingestion
Training and reference data (POST /data/upload)
POST /data/upload — путь для загрузки JSON с пакетами обучающих и эталонных данных: каждый вызов содержит объединённый запрос и ответ для одной записи с data_tag, например TRAINING для эталонного подмножества. Живой инференс в продакшене загружается отдельно через POST /consumer/kserve/v2 (см. ниже).
TAS может хранить записи инференса, созданные при запуске моделей. Запись содержит:
request: входные признаки, отправленные моделиresponse: выходные данные, возвращённые моделью
Набор данных определяется по model_name и data_tag.
Подготовка подмножества набора данных
- Выберите
model_nameдля группировки загружаемых записей. - Выберите
data_tagдля эталонного подмножества. Для обучающих/эталонных данных используйтеdata_tag: TRAINING. - Для каждого инференса загрузите один объединённый
request+responsepayload.
Поля тела запроса
Тело запроса должно содержать:
model_name: идентификатор модели для группировки собранных записейdata_tag: метка подмножества набора данныхis_ground_truth: является ли загруженный выход эталонной меткой (установите вfalse, если payload содержит выходы модели, а не проверенные метки)request:id: идентификатор инференса для этой записиinputs: список входных тензоров
response:model_name: должно совпадать сmodel_nameid: должно совпадать сrequest.idoutputs: список выходных тензоров
Семантика одной записи: TAS не обучает модели; он хранит строки для мониторинга. Для data_tag: TRAINING каждая загрузка — это один эталонный образец. request содержит входные признаки, которые были бы отправлены модели (одинаковый id связывает пару). response содержит наблюдаемые выходы для этого инференса — обычно предсказания модели и любые поля результата, используемые для оценки справедливости (например, оценка одобрения и решение). Метрики дрейфа и справедливости сравнивают это эталонное подмножество с живыми данными, собранными через /consumer/kserve/v2.
Пример ниже использует небольшой набор признаков в стиле кредитного скоринга: числовые входы и поле группы (gender), а также выходы с именами predict-0 и approved.
Загрузка с помощью curl
Live inference data (POST /consumer/kserve/v2)
Данные инференса в реальном времени отправляются в TAS через конечную точку потребителя KServe v2. Каждый логический инференс использует два вызова POST с одинаковым корреляционным id: сначала вход модели (kind: "request"), затем выход модели (kind: "response"). Тело запроса — JSON; полезные нагрузки тензоров — это Base64-кодированные protobuf-сообщения ModelInferRequest / ModelInferResponse, определённые в KServe prediction API v2 (grpc_predict_v2.proto), а не плоский JSON тензоров, используемый /data/upload.
Поля JSON:
Пример последовательности (заполните Base64-блоки):
Метрики дрейфа, у которых referenceTag установлен в TRAINING, сравнивают это эталонное подмножество (из /data/upload) с органическими строками, собранными через этот путь потребителя. GET /info/tags может вывести теги, такие как TRAINING и немаркированную/органическую сторону живого потока.
Column name mapping (POST /info/names)
После загрузки обучающих/эталонных данных через /data/upload и живого инференса через /consumer/kserve/v2, TAS может сообщить, что было записано, и сопоставить записанные имена столбцов входов/выходов с человекочитаемыми именами через POST /info/names.
Пример:
Data drift metrics
Метрики дрейфа данных сравнивают эталонное подмножество (например, строки с тегом TRAINING из POST /data/upload) с текущими производственными данными (обычно загружаемыми через POST /consumer/kserve/v2). Регистрация, список и удаление выполняются по тому же шаблону запросов/ответов, что и другие запланированные метрики.
Drift metric types
GET /metrics/drift/<name>/definition возвращает человекочитаемую документацию по каждой метрике.
Register scheduled drift metrics
Используйте POST /metrics/drift/<metricName>/request с JSON телом. Общие поля:
modelId: идентификатор набора данных (должен совпадать с загрузками /modelidв consumer).requestName: уникальное имя для этой запланированной задачи.metricName: должно совпадать с сегментом пути (kstest,meanshift,approxkstestилиfouriermmd).batchSize: количество записей инференса, включаемых в каждое вычисление.referenceTag: тег эталонного подмножества (обычноTRAINING).fitColumns: имена входных столбцов для оценки (записанные имена полей, например имена тензоров до сопоставления черезPOST /info/names).
KSTest — пример:
MeanShift — пример:
ApproxKSTest — добавляет thresholdDelta и epsilon (см. GET /metrics/drift/approxkstest/definition для семантики):
FourierMMD — добавляет thresholdDelta, gamma и объект parameters (см. GET /metrics/drift/fouriermmd/definition):
One-shot drift requests
Для однократного запуска (не запланированного) POST /metrics/drift/kstest и POST /metrics/drift/meanshift принимают тот же формат JSON тела, что и регистрация, но без суффикса /request в пути.
List and delete scheduled drift jobs
Список запланированных задач:
Остановить задачу по requestId из ответа списка:
Замените kstest в пути на meanshift, approxkstest или fouriermmd для других типов дрейфа. GET /metrics/all/requests выводит все запланированные метрики по категориям.
Prometheus metrics (drift)
Результаты запланированных метрик дрейфа публикуются как Micrometer gauges на GET /q/metrics, например:
- KSTest:
trustyai_kstest - MeanShift:
trustyai_meanshift - ApproxKSTest:
trustyai_approxkstest - FourierMMD:
trustyai_fouriermmd
Каждая серия дрейфа содержит метки, идентифицирующие запланированную задачу и измеряемый параметр. Типичные семантические метки на trustyai_kstest / trustyai_meanshift / trustyai_approxkstest / trustyai_fouriermmd включают:
Scrape / target метки (имена зависят от кластера и настройки ServiceMonitor) часто включают namespace, pod, service, job и instance. Фактические значения для развертывания следует получать из Prometheus (например, имена меток на trustyai_kstest в UI метрик или через label_values()), а не копировать из документации — специфичные для среды идентификаторы и адреса меняются в каждом кластере.
Пример PromQL (фильтрация по одной модели и имени запроса):
Чтобы отфильтровать по одному столбцу или признаку, добавьте матчинг по subcategory, если эта метка присутствует.
Bias metrics
В этом разделе описывается мониторинг смещения (метрики групповой справедливости, такие как SPD и DIR) через HTTP API TAS (POST / GET / DELETE на /metrics/group/fairness/...).
SPD and DIR
TAS предоставляет две связанные метрики групповой справедливости по одному и тому же защищённому атрибуту и результату:
Обе метрики используют одинаковые поля запроса (protectedAttribute, outcomeName, favorableOutcome и т.д.). HTTP путь и metricName различают SPD (spd) и DIR (dir).
Register scheduled bias metrics
Создайте периодический запрос метрики смещения для развернутого набора данных модели, вызвав:
POST /metrics/group/fairness/spd/request(Statistical Parity Difference, SPD)POST /metrics/group/fairness/dir/request(Disparate Impact Ratio, DIR)
Пример (SPD):
Поля запроса SPD:
modelId: идентификатор набора данных модели, для которого вычисляется метрика (должен совпадать с набором/моделью, используемой в загрузках).requestName: уникальное имя для этого запланированного запроса метрики (используется для различения периодических задач).metricName: имя типа метрики; для этого эндпоинта используйтеspd.batchSize: количество записей инференса, включаемых при вычислении запланированной метрики.protectedAttribute: признак (после сопоставления имён, если используется), определяющий сравниваемые группы.privilegedAttribute: значениеprotectedAttribute, представляющее привилегированную группу.unprivilegedAttribute: значениеprotectedAttribute, представляющее непривилегированную группу.outcomeName: поле результата, оцениваемое на справедливость (например, исход классификации).favorableOutcome: значениеoutcomeName, считающееся благоприятным исходом.
Для DIR используйте тот же JSON с "metricName": "dir" и вызовите POST /metrics/group/fairness/dir/request. GET /metrics/group/fairness/dir/definition описывает метрику текстово.
List and delete scheduled bias jobs
Чтобы остановить периодический расчёт, выведите список задач, затем отправьте requestId из ответа на соответствующий URL удаления:
Пример (SPD):
Используйте тот же JSON с requestId для URL удаления .../dir/request для задач DIR.
Prometheus metrics (bias)
TAS экспонирует метрики Prometheus на /q/metrics. TrustyAI Operator создаёт ServiceMonitor, который сохраняет метрики, связанные со смещением (по умолчанию серии, соответствующие trustyai_(spd|dir).*).
Базовые имена метрик:
- SPD (Statistical Parity Difference):
trustyai_spd - DIR (Disparate Impact Ratio):
trustyai_dir
Каждая серия содержит метки, идентифицирующие запланированный расчёт и его конфигурацию справедливости. Типичные семантические метки на trustyai_spd / trustyai_dir включают:
Scrape / target метки (имена зависят от кластера и настройки ServiceMonitor) часто включают namespace, pod, service, job и instance.
Пример: выбрать SPD для одной модели и одного имени запланированного запроса:
Пример: последнее значение за окно (согласуйте интервал с интервалом опроса):
Аналогичные фильтры меток применимы к trustyai_dir, когда зарегистрирована запланированная задача DIR.