Files
rustytorch/crates/models/rtx-diffuse/lora_diffusion_test.rs
T
2026-03-04 00:08:42 +00:00

74 lines
2.7 KiB
Rust

// Standalone test for LoRA diffusion functionality
use rtx_diffuse::{
LoRAConfig, LoRAAdapter, AttentionLoRALayer, LayerTargeting, LoRAUNet,
DiffusionError, Result, UNetConfig
};
use rtx_tensor::{Device, Tensor};
fn main() -> Result<()> {
println!("Testing LoRA for Diffusion Models");
let device = Device::cuda(0).unwrap_or(Device::default());
// Test 1: LoRA Config and scaling
let config = LoRAConfig {
rank: 16,
alpha: 32.0,
..Default::default()
};
println!("✓ LoRA config created with scaling: {}", config.alpha / config.rank as f32);
// Test 2: Create LoRA adapter
let adapter = LoRAAdapter::new("test_adapter", config.clone(), &device)?;
println!("✓ LoRA adapter '{}' created with rank {}", adapter.name(), adapter.rank());
// Test 3: Layer targeting
let targeting = LayerTargeting::new(vec!["attn".to_string(), "cross_attn".to_string()]);
assert!(targeting.should_apply_lora("encoder.0.attn.q_proj"));
assert!(!targeting.should_apply_lora("decoder.mlp.fc1"));
println!("✓ Layer targeting works correctly");
// Test 4: Attention LoRA layer
let layer = AttentionLoRALayer::new(
"test_layer",
512,
256,
config,
&device
)?;
println!("✓ Attention LoRA layer created:");
println!(" - Input features: {}", layer.in_features());
println!(" - Output features: {}", layer.out_features());
println!(" - Parameters: {}", layer.num_parameters());
println!(" - Compression ratio: {:.2}x", layer.compression_ratio());
// Test 5: LoRA UNet integration
let unet_config = UNetConfig::default();
let mut lora_unet = LoRAUNet::new(unet_config, &device)?;
lora_unet.apply_lora_adapter(adapter)?;
assert!(lora_unet.has_lora_adapter("test_adapter"));
assert_eq!(lora_unet.num_lora_adapters(), 1);
println!("✓ LoRA UNet integration successful");
// Test 6: Multiple adapters with weighting
let adapter2 = LoRAAdapter::new("style2", LoRAConfig::default(), &device)?;
lora_unet.apply_lora_adapter(adapter2)?;
lora_unet.set_adapter_weights(vec![0.7, 0.3])?;
assert_eq!(lora_unet.num_lora_adapters(), 2);
println!("✓ Multiple adapters with weighting successful");
println!("\n🎉 All LoRA diffusion tests passed!");
println!("LoRA for Diffusion implementation complete with:");
println!("- Low-rank adaptation for UNet attention layers");
println!("- Configurable ranks (4, 8, 16, 32)");
println!("- Alpha scaling factor control");
println!("- Selective layer targeting");
println!("- Weight merging/unmerging");
println!("- Multiple adapter support");
Ok(())
}