Saltar al contenido principal

Aprendizaje Federado (FL)

Savitri Network incluye un sistema de Aprendizaje Federado en cadena para el entrenamiento descentralizado de modelos de IA. Los contratos FL gestionan el registro de modelos, las rondas de entrenamiento, el envío de actualizaciones, la distribución de recompensas y la gobernanza.

Arquitectura

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

Registro de Modelos

Los modelos se registran en cadena con metadatos, versionado y control de acceso basado en roles.

Registro de un Modelo

// 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),
)?;

Versionado de Modelos

Los modelos tienen cadenas de versiones inmutables. Cada nueva versión referencia a su versión padre:

v1 (initial) → v2 (fine-tuned) → v3 (production)

Los metadatos de versión incluyen:

  • metadata_uri: Descripción de la arquitectura del modelo
  • weights_uri: Ubicación de los pesos entrenados
  • aggregator: Dirección que produjo esta versión
  • parent_version: Enlace a la versión anterior

Control de Acceso Basado en Roles (RBAC)

RolPermisos
CreatorRegistrar modelos, gestionar versiones, establecer políticas
ViewerLeer metadatos y versiones del modelo
TrainerEnviar actualizaciones de entrenamiento a rondas
AggregatorAgregar actualizaciones, finalizar rondas, producir versiones

El acceso de entrenadores se controla mediante listas de permitidos/denegados por modelo.

Gestión de Políticas

Cada modelo tiene políticas configurables:

PolíticaDescripción
access_policy_hashQuién puede acceder a los datos del modelo
reward_policy_hashCómo se distribuyen las recompensas
max_trainersMáximo de entrenadores concurrentes
aggregator_whitelistAgregadores aprobados

Ciclo de Vida de Trabajos

El entrenamiento FL se organiza en rondas con un ciclo de vida definido:

Planned → Open → Sealed → Finalized
↘ Aborted (via governance)

Estados de Ronda

EstadoDescripciónAcciones Permitidas
PlannedRonda creada, aún no acepta actualizacionesAbrir
OpenAcepta actualizaciones de entrenadoresEnviar actualización, Sellar
SealedSin más actualizaciones, agregación en progresoFinalizar, Abortar
FinalizedRecompensas distribuidas, ronda completaReclamar recompensas
AbortedRonda cancelada mediante gobernanzaNinguna

Crear una Ronda

FlJobLifecycle::create_round(
&mut storage,
&db,
&creator,
&model_id, // [u8; 32]
round_id, // u64
reward_pool_amount, // u128
&mut events,
Some(&mut gas),
)?;

Enviar Actualización de Entrenamiento

Los entrenadores envían actualizaciones del modelo durante la fase Abierta:

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),
)?;

Protección contra repetición: cada entrenador tiene un nonce por ronda que debe incrementarse estrictamente.

Sellar y Finalizar

// 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
...
)?;

Reclamar Recompensas

Los entrenadores reclaman recompensas con pruebas de Merkle:

FlJobLifecycle::claim_reward(
&mut storage, &db, &trainer, &model_id, round_id,
amount, // reward amount
&merkle_proof, // proof of inclusion in reward distribution
...
)?;

Tarifa al Tesoro

Un porcentaje configurable (fee_treasury_bps, máximo 10000 = 100%) se deduce del fondo de recompensas para el tesoro de la red. El cálculo usa aritmética de punto fijo para prevenir errores de redondeo.

Propuestas de Gobernanza FL

Acciones de gobernanza específicas para FL:

SetFlPolicy

Proponer cambios en los parámetros FL:

ProposalAction::SetFlPolicy {
fee_treasury_bps: 500, // 5% treasury fee
max_models: 100, // max registered models
aggregator_whitelist: vec!["addr1", "addr2"],
}

Validación: fee_treasury_bps <= 10000, max_models > 0, lista blanca no vacía.

ApproveFlModel

Aprobar un modelo para uso en producción:

ProposalAction::ApproveFlModel {
model_id: "abc123...64hex", // 32-byte hex model ID
}

AbortFlRound

Abortar de emergencia una ronda de entrenamiento activa:

ProposalAction::AbortFlRound {
model_id: "abc123...64hex",
round_id: 5,
}

Validación: round_id > 0, model_id válido de 32 bytes.

Disposición del Almacenamiento

Los contratos FL usan ranuras de almacenamiento a partir del 100:

Rango de RanulasPropósito
100+Metadatos del modelo
200+Cadenas de versiones
300+Estado de ronda
400+Envíos de actualizaciones
500+Fondos de recompensas
600+Mapeos de roles

Integración mediante el 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)?;