195 lines
5.6 KiB
Rust
195 lines
5.6 KiB
Rust
#!/usr/bin/env rust-script
|
|
//! Simple RED phase verification for Router Z-loss implementation
|
|
|
|
// Minimal tensor simulation for testing
|
|
#[derive(Debug, Clone)]
|
|
pub struct Tensor;
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct Device;
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub enum DType {
|
|
F32,
|
|
}
|
|
|
|
impl Device {
|
|
pub const CPU: Device = Device;
|
|
}
|
|
|
|
// Minimal error types
|
|
#[derive(Debug)]
|
|
pub struct TransformerError(String);
|
|
|
|
impl TransformerError {
|
|
pub fn config(msg: String) -> Self {
|
|
Self(msg)
|
|
}
|
|
}
|
|
|
|
type Result<T> = std::result::Result<T, TransformerError>;
|
|
|
|
/// Configuration for Router Z-loss regularization
|
|
#[derive(Debug, Clone)]
|
|
pub struct RouterZLossConfig {
|
|
pub z_loss_weight: f32,
|
|
pub entropy_regularization_weight: f32,
|
|
pub gradient_penalty_weight: f32,
|
|
pub temperature: f32,
|
|
pub epsilon: f32,
|
|
}
|
|
|
|
impl Default for RouterZLossConfig {
|
|
fn default() -> Self {
|
|
Self {
|
|
z_loss_weight: 1e-3,
|
|
entropy_regularization_weight: 1e-4,
|
|
gradient_penalty_weight: 1e-5,
|
|
temperature: 1.0,
|
|
epsilon: 1e-8,
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Router Z-loss regularization for MoE training stability
|
|
pub struct RouterZLoss {
|
|
config: RouterZLossConfig,
|
|
device: Device,
|
|
}
|
|
|
|
impl RouterZLoss {
|
|
/// Create a new Router Z-loss regularizer
|
|
pub fn new(config: RouterZLossConfig, device: Device) -> Result<Self> {
|
|
config.validate()?;
|
|
|
|
Ok(Self {
|
|
config,
|
|
device,
|
|
})
|
|
}
|
|
|
|
/// Compute Z-loss - should fail in RED phase
|
|
pub fn compute_loss(&mut self, _router_logits: &Tensor) -> Result<Tensor> {
|
|
Err(TransformerError::config("Router Z-loss not yet implemented".to_string()))
|
|
}
|
|
|
|
/// Apply normalization - should fail in RED phase
|
|
fn normalize_logits(&self, _logits: &Tensor) -> Result<Tensor> {
|
|
Err(TransformerError::config("Logit normalization not yet implemented".to_string()))
|
|
}
|
|
|
|
/// Get current configuration
|
|
pub fn config(&self) -> &RouterZLossConfig {
|
|
&self.config
|
|
}
|
|
}
|
|
|
|
impl RouterZLossConfig {
|
|
/// Validate the Router Z-loss configuration
|
|
pub fn validate(&self) -> Result<()> {
|
|
if self.z_loss_weight < 0.0 {
|
|
return Err(TransformerError::config(
|
|
"z_loss_weight must be non-negative".to_string()
|
|
));
|
|
}
|
|
|
|
if self.entropy_regularization_weight < 0.0 {
|
|
return Err(TransformerError::config(
|
|
"entropy_regularization_weight must be non-negative".to_string()
|
|
));
|
|
}
|
|
|
|
if self.gradient_penalty_weight < 0.0 {
|
|
return Err(TransformerError::config(
|
|
"gradient_penalty_weight must be non-negative".to_string()
|
|
));
|
|
}
|
|
|
|
if self.temperature <= 0.0 {
|
|
return Err(TransformerError::config(
|
|
"temperature must be positive".to_string()
|
|
));
|
|
}
|
|
|
|
if self.epsilon <= 0.0 {
|
|
return Err(TransformerError::config(
|
|
"epsilon must be positive".to_string()
|
|
));
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
println!("Router Z-loss TDD RED Phase Verification");
|
|
println!("========================================");
|
|
|
|
// Test 1: Configuration validation passes
|
|
println!("\n1. Testing RouterZLossConfig validation...");
|
|
let config = RouterZLossConfig::default();
|
|
match config.validate() {
|
|
Ok(_) => println!("✓ Default config validation PASSED"),
|
|
Err(_) => {
|
|
println!("✗ Default config validation FAILED");
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Test configuration failures
|
|
let mut bad_config = RouterZLossConfig::default();
|
|
bad_config.z_loss_weight = -0.1;
|
|
match bad_config.validate() {
|
|
Err(_) => println!("✓ Negative z_loss_weight validation FAILED (expected)"),
|
|
Ok(_) => {
|
|
println!("✗ Negative z_loss_weight validation should have FAILED");
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Test 2: RouterZLoss creation passes
|
|
println!("\n2. Testing RouterZLoss creation...");
|
|
let device = Device::CPU;
|
|
let zloss = RouterZLoss::new(config.clone(), device);
|
|
match zloss {
|
|
Ok(zloss) => {
|
|
println!("✓ RouterZLoss creation PASSED");
|
|
assert_eq!(zloss.config().z_loss_weight, config.z_loss_weight);
|
|
println!("✓ Config access works");
|
|
},
|
|
Err(_) => {
|
|
println!("✗ RouterZLoss creation FAILED");
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Test 3: Methods should fail (RED phase)
|
|
println!("\n3. Testing that computation methods fail in RED phase...");
|
|
let mut zloss = RouterZLoss::new(config, Device::CPU).unwrap();
|
|
let router_logits = Tensor;
|
|
|
|
// compute_loss should fail
|
|
match zloss.compute_loss(&router_logits) {
|
|
Err(_) => println!("✓ compute_loss FAILED (expected in RED phase)"),
|
|
Ok(_) => {
|
|
println!("✗ compute_loss should FAIL in RED phase");
|
|
return;
|
|
}
|
|
}
|
|
|
|
// normalize_logits should fail
|
|
match zloss.normalize_logits(&router_logits) {
|
|
Err(_) => println!("✓ normalize_logits FAILED (expected in RED phase)"),
|
|
Ok(_) => {
|
|
println!("✗ normalize_logits should FAIL in RED phase");
|
|
return;
|
|
}
|
|
}
|
|
|
|
println!("\n🎉 RED PHASE VERIFICATION COMPLETE!");
|
|
println!("All tests behave as expected:");
|
|
println!(" - Configuration validation works");
|
|
println!(" - Router creation works");
|
|
println!(" - All computation methods fail (as expected in RED phase)");
|
|
println!("\n✅ Ready to proceed to GREEN phase implementation!");
|
|
} |