Федеративное обучение (FL)
Savitri Network включает on-chain систему Федеративного обучения для децентрализованного обучения ИИ-моделей. Контракты FL управляют регистрацией моделей, раундами обучения, отправкой обновлений, распределением вознаграждений и управлением.
Архитектура
Governance (proposals + voting)
│
▼
Model Registry
│ register model, assign roles, version tracking
▼
Job Lifecycle
│ create round → open → submit updates → seal → finalize
▼
Reward Pool
│ Merkle-proof reward claims
▼
Trainers + Aggregators
Реестр моделей
Модели регистрируются on-chain с метаданными, версионированием и управлением доступом на основе ролей.
Регистрация модели
// Register a new model
FlModelRegistry::register_model(
&mut storage,
&db,
&creator, // [u8; 32] - model creator address
"sentiment-v1", // model name
"ipfs://Qm.../meta", // metadata URI
"MIT", // license URI
"ipfs://Qm.../weights", // initial weights URI
&mut events,
Some(&mut gas),
)?;
Версионирование моделей
Модели имеют неизменяемые цепочки версий. Каждая новая версия ссылается на родительскую:
v1 (initial) → v2 (fine-tuned) → v3 (production)
Метаданные версии включают:
metadata_uri: описание архитектуры моделиweights_uri: местоположение обученных весовaggregator: адрес, создавший данную версиюparent_version: ссылка на предыдущую версию
Управление доступом на основе ролей (RBAC)
| Роль | Права |
|---|---|
Creator | Регистрация моделей, управление версиями, установка политик |
Viewer | Чтение метаданных и версий модели |
Trainer | Отправка обновлений обучения в раунды |
Aggregator | Агрегация обновлений, финализация раундов, создание версий |
Доступ тренеров контролируется через список разрешений/запрещений для каждой модели.
Управление политиками
Каждая модель имеет настраиваемые политики:
| Политика | Описание |
|---|---|
access_policy_hash | Кто может получить доступ к данным модели |
reward_policy_hash | Как распределяются вознаграждения |
max_trainers | Максимальное количество одновременных тренеров |
aggregator_whitelist | Одобренные агрегаторы |
Жизненный цикл задачи
Обучение FL организовано в раунды с определённым жизненным циклом:
Planned → Open → Sealed → Finalized
↘ Aborted (via governance)
Состояния раунда
| Состояние | Описание | Допустимые действия |
|---|---|---|
Planned | Раунд создан, обновления ещё не принимаются | Открыть |
Open | Принимаются обновления от тренеров | Отправить обновление, Запечатать |
Sealed | Обновления больше не принимаются, идёт агрегация | Финализировать, Прервать |
Finalized | Вознаграждения распределены, раунд завершён | Получить вознаграждения |
Aborted | Раунд отменён через систему управления | Нет |
Создание раунда
FlJobLifecycle::create_round(
&mut storage,
&db,
&creator,
&model_id, // [u8; 32]
round_id, // u64
reward_pool_amount, // u128
&mut events,
Some(&mut gas),
)?;
Отправка обновления обучения
Тренеры отправляют обновления модели в фазе Open:
FlJobLifecycle::submit_update(
&mut storage,
&db,
&trainer, // [u8; 32]
&model_id,
round_id,
&update_data, // training update bytes
nonce, // replay protection
&mut events,
Some(&mut gas),
)?;
Защита от повтора: у каждого тренера есть nonce для каждого раунда, который должен строго возрастать.
Запечатывание и финализация
// Seal round (stop accepting updates)
FlJobLifecycle::seal_round(&mut storage, &db, &aggregator, &model_id, round_id, ...)?;
// Finalize round (distribute rewards)
FlJobLifecycle::finalize_round(
&mut storage, &db, &aggregator, &model_id, round_id,
&merkle_root, // reward distribution Merkle root
&new_weights_uri, // aggregated model weights
...
)?;
Получение вознаграждений
Тренеры получают вознаграждения с помощью доказательств Меркла:
FlJobLifecycle::claim_reward(
&mut storage, &db, &trainer, &model_id, round_id,
amount, // reward amount
&merkle_proof, // proof of inclusion in reward distribution
...
)?;
Комиссия казны
Настраиваемый процент (fee_treasury_bps, макс. 10000 = 100%) удерживается из пула вознаграждений в казну сети. Расчёт использует арифметику с фиксированной точкой для предотвращения ошибок округления.
Предложения FL в управлении
Действия управления, специфичные для FL:
SetFlPolicy
Предложить изменения параметров FL:
ProposalAction::SetFlPolicy {
fee_treasury_bps: 500, // 5% treasury fee
max_models: 100, // max registered models
aggregator_whitelist: vec!["addr1", "addr2"],
}
Валидация: fee_treasury_bps <= 10000, max_models > 0, непустой белый список.
ApproveFlModel
Утвердить модель для продакшена:
ProposalAction::ApproveFlModel {
model_id: "abc123...64hex", // 32-byte hex model ID
}
AbortFlRound
Аварийное прерывание активного раунда обучения:
ProposalAction::AbortFlRound {
model_id: "abc123...64hex",
round_id: 5,
}
Валидация: round_id > 0, корректный 32-байтовый model_id.
Схема хранилища
Контракты FL используют слоты хранилища начиная со 100:
| Диапазон слотов | Назначение |
|---|---|
| 100+ | Метаданные моделей |
| 200+ | Цепочки версий |
| 300+ | Состояние раунда |
| 400+ | Отправленные обновления |
| 500+ | Пулы вознаграждений |
| 600+ | Маппинги ролей |
Интеграция через SDK
use savitri_sdk::{TransactionBuilder, GovernanceAction};
// Create FL governance proposal
let tx = TransactionBuilder::new()
.create_fl_proposal(
"governance_contract_address",
"Approve sentiment model v2",
"Production-ready model with 95% accuracy",
604800, // 7-day voting period
)
.nonce(nonce)
.fee(5_000_000_000_000_000)
.build_and_sign(&wallet)?;