pub mod sync;
pub mod cpu_staging;
pub mod optimizer;
#[cfg(feature = "nccl")]
pub mod nccl;
pub use sync::{GradientSynchronizer, DistributedConfig, SyncBackend};
pub use cpu_staging::CpuStagingSynchronizer;
pub use optimizer::{DistributedAdamW, AdamWConfig, compute_grad_norm};
#[cfg(feature = "nccl")]
pub use nccl::NcclSynchronizer;
pub fn create_synchronizer(
config: &DistributedConfig,
) -> candle_core::Result<Box<dyn GradientSynchronizer>> {
if !config.enabled || config.gpu_ids.len() <= 1 {
return Ok(Box::new(CpuStagingSynchronizer::single_gpu(
config.gpu_ids.first().copied().unwrap_or(0),
)?));
}
match config.backend {
SyncBackend::Single => {
Ok(Box::new(CpuStagingSynchronizer::single_gpu(
config.gpu_ids[0],
)?))
}
SyncBackend::CpuStaging => {
Ok(Box::new(CpuStagingSynchronizer::new(&config.gpu_ids)?))
}
#[cfg(feature = "nccl")]
SyncBackend::Nccl => {
Ok(Box::new(NcclSynchronizer::new(&config.gpu_ids)?))
}
#[cfg(not(feature = "nccl"))]
SyncBackend::Nccl => {
Err(candle_core::Error::Msg(
"NCCL backend requested but 'nccl' feature is not enabled. \
Compile with --features nccl to enable NCCL support.".to_string()
))
}
}
}