Skip to content

Scheduler

The Scheduler analyzes an ExecutionPlan’s topology and distributes nodes across available workers.

  1. Sequential phases → single worker (avoids data transfer)
  2. Parallel branches → round-robin across workers by capability
  3. Differentiable connected nodes → same worker (gradient flow must be preserved)
  4. Cache hits → resolved at runtime on the assigned worker (the plan itself carries no cached nodes)
  5. Loop/Branch bodies → same worker as controller

The scheduler produces a DistributionPlan containing:

FieldDescription
assignmentsNode → worker mapping with reason
phasesSequential/parallel groupings
data_transfersS3 transfers needed between workers
warningsCapacity issues, single-worker fallback
Graph: [Load] → [Normalize] → [Train SVM]
→ [Train KNN]
Scheduler with 2 workers:
Worker A (GPU): Load → Normalize → Train SVM (sequential, data locality)
Worker B (CPU): Train KNN (parallel branch)
Data Transfer: Normalize → Train KNN (via S3)
use somatize_compiler::{schedule, WorkerInfo};
let workers = vec![
WorkerInfo { id: "gpu-1", gpu: true, cpu_cores: 16, ... },
WorkerInfo { id: "cpu-1", gpu: false, cpu_cores: 64, ... },
];
let plan = schedule(&execution_plan, &workers, &differentiable_nodes);
// plan.assignments, plan.data_transfers, plan.warnings