use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct TensorShard {
pub dim: usize,
pub ranks: Vec<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ExpertPlacement {
pub rank: u32,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub replicas: Vec<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct Placement {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub parallelism: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub world_size: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub topology: Option<String>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub tensors: BTreeMap<String, TensorShard>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub experts: BTreeMap<String, ExpertPlacement>,
}
impl Placement {
pub fn ranks_for(&self, tensor: &str) -> Option<&[u32]> {
self.tensors.get(tensor).map(|s| s.ranks.as_slice())
}
pub fn has_tensor_map(&self) -> bool {
!self.tensors.is_empty() || !self.experts.is_empty()
}
}