use std::net::SocketAddr;
use std::time::Duration;
use fandhe_ai_autodiff::distributed::{CollectiveOptions, RendezvousConfig};
use super::error::DistributedError;
#[derive(Debug, Clone)]
pub struct DistributedConfig {
pub(crate) rendezvous: RendezvousConfig,
pub(crate) collective: CollectiveOptions,
}
impl DistributedConfig {
pub fn builder(
world_size: usize,
rank: usize,
rendezvous_addr: SocketAddr,
) -> DistributedConfigBuilder {
DistributedConfigBuilder {
world_size,
rank,
rendezvous_addr,
allow_non_loopback: false,
session_id: None,
connect_timeout: None,
establish_timeout: None,
io_timeout: None,
op_timeout: None,
}
}
pub fn world_size(&self) -> usize {
self.rendezvous.world_size()
}
pub fn rank(&self) -> usize {
self.rendezvous.rank()
}
pub fn rendezvous_addr(&self) -> SocketAddr {
self.rendezvous.rendezvous_addr()
}
pub fn is_non_loopback_allowed(&self) -> bool {
self.rendezvous.is_non_loopback_allowed()
}
}
#[derive(Debug, Clone)]
#[must_use]
pub struct DistributedConfigBuilder {
world_size: usize,
rank: usize,
rendezvous_addr: SocketAddr,
allow_non_loopback: bool,
session_id: Option<u64>,
connect_timeout: Option<Duration>,
establish_timeout: Option<Duration>,
io_timeout: Option<Duration>,
op_timeout: Option<Duration>,
}
impl DistributedConfigBuilder {
pub fn allow_non_loopback(mut self, allow: bool) -> Self {
self.allow_non_loopback = allow;
self
}
pub fn session_id(mut self, id: u64) -> Self {
self.session_id = Some(id);
self
}
pub fn connect_timeout(mut self, d: Duration) -> Self {
self.connect_timeout = Some(d);
self
}
pub fn establish_timeout(mut self, d: Duration) -> Self {
self.establish_timeout = Some(d);
self
}
pub fn io_timeout(mut self, d: Duration) -> Self {
self.io_timeout = Some(d);
self
}
pub fn op_timeout(mut self, d: Duration) -> Self {
self.op_timeout = Some(d);
self
}
pub fn build(self) -> Result<DistributedConfig, DistributedError> {
let mut rendezvous =
RendezvousConfig::new(self.world_size, self.rank, self.rendezvous_addr)
.map_err(DistributedError::from_inner)?
.allow_non_loopback(self.allow_non_loopback);
let mut collective = CollectiveOptions::default();
if let Some(id) = self.session_id {
rendezvous = rendezvous.session_id(id);
}
if let Some(d) = self.connect_timeout {
rendezvous = rendezvous.connect_timeout(d);
}
if let Some(d) = self.establish_timeout {
rendezvous = rendezvous.establish_timeout(d);
}
if let Some(d) = self.io_timeout {
rendezvous = rendezvous.io_timeout(d);
collective = collective.io_timeout(d);
}
if let Some(d) = self.op_timeout {
collective = collective.op_timeout(d);
}
rendezvous
.validate()
.map_err(DistributedError::from_inner)?;
collective
.validate()
.map_err(DistributedError::from_inner)?;
Ok(DistributedConfig {
rendezvous,
collective,
})
}
}