Перейти к основному содержимому

Федеративное обучение (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)?;