Module neuralops.tests.test_svd_audit_suite
Comprehensive Audit & Evaluation Suite for SVD and Low-Rank Attention Mechanisms & Compression Engines.
Audited Modules: 1. attentions/svd_linear_attention.py (SVDLinear, SVDLinearAttention, exact, linear, decay gating, step_recurrent) 2. attentions/adaptive_svd_attention.py (AdaptiveSVDLinear, AdaptiveSVDAttention, energy thresholding) 3. attentions/asvd_attention.py (ASVDLinear, ASVDAttention) 4. attentions/linformer_attention.py (LinformerAttention, sequence projection) 5. compression_engine/res_svd.py (ResSVDLinear, ResSVDCompressor, SpectralResidualLoRA) 6. compression_engine/adaptive_ranks.py (AdaptiveRanksCompressor, covariance whitening, energy thresholding) 7. compression_engine/direct_svd.py (DirectSVDCompressor, symmetrical SVD) 8. compression_engine/dobi_svd.py (DobiSVDLinearLayer, DobiSVDCompressor, spectral gating) 9. compression_engine/erc_svd.py (ERCCompressor, Frobenius error bound) 10. compression_engine/entropy_budget_allocation.py (EntropyBudgetCompressor, singular entropy allocation) 11. compression_engine/kronecker_tt_lora.py (KroneckerTTLoRALayer, KroneckerTTLoRACompressor, TT cores, LoRA bypass)
Functions
def get_dummy_config(hidden_size: int = 768, num_heads: int = 12, rank: int = 64)-
Expand source code
def get_dummy_config(hidden_size: int = 768, num_heads: int = 12, rank: int = 64): return types.SimpleNamespace( hidden_size=hidden_size, num_attention_heads=num_heads, num_heads=num_heads, dropout=0.1, hidden_dropout_prob=0.1, attention_probs_dropout_prob=0.1, max_position_embeddings=512, intermediate_size=hidden_size * 4, rank=rank, svd_rank=rank, asvd_rank=rank, residual_rank=8, energy_threshold=0.92, linear_attention_eps=1e-6, )
Classes
class MockMHA (hidden_size: int = 768, num_heads: int = 12)-
Expand source code
class MockMHA(nn.Module): """Mock standard Multi-Head Attention layer for weight copying tests.""" def __init__(self, hidden_size: int = 768, num_heads: int = 12): super().__init__() self.hidden_size = hidden_size self.num_heads = num_heads self.query = nn.Linear(hidden_size, hidden_size) self.key = nn.Linear(hidden_size, hidden_size) self.value = nn.Linear(hidden_size, hidden_size) self.out_proj = nn.Linear(hidden_size, hidden_size)Mock standard Multi-Head Attention layer for weight copying tests.
Initialize internal Module state, shared by both nn.Module and ScriptModule.
Ancestors
- torch.nn.modules.module.Module
class MockTransformerModel (hidden_size: int = 128, num_layers: int = 2)-
Expand source code
class MockTransformerModel(nn.Module): """Mock multi-layer transformer model for compression engine testing.""" def __init__(self, hidden_size: int = 128, num_layers: int = 2): super().__init__() self.layers = nn.ModuleList([ nn.ModuleDict({ "q_proj": nn.Linear(hidden_size, hidden_size), "k_proj": nn.Linear(hidden_size, hidden_size), "v_proj": nn.Linear(hidden_size, hidden_size), "out_proj": nn.Linear(hidden_size, hidden_size), "fc1": nn.Linear(hidden_size, hidden_size * 2), "fc2": nn.Linear(hidden_size * 2, hidden_size), }) for _ in range(num_layers) ]) self.classifier = nn.Linear(hidden_size, 2) # Should be excluded from compression def forward(self, x: torch.Tensor) -> torch.Tensor: for layer in self.layers: q = layer["q_proj"](x) k = layer["k_proj"](x) v = layer["v_proj"](x) attn = torch.matmul(q, k.transpose(-1, -2)) / math.sqrt(x.size(-1)) attn_out = torch.matmul(F.softmax(attn, dim=-1), v) x = x + layer["out_proj"](attn_out) ffn = layer["fc2"](F.gelu(layer["fc1"](x))) x = x + ffn return self.classifier(x[:, 0, :])Mock multi-layer transformer model for compression engine testing.
Initialize internal Module state, shared by both nn.Module and ScriptModule.
Ancestors
- torch.nn.modules.module.Module
Methods
def forward(self, x: torch.Tensor) ‑> torch.Tensor-
Expand source code
def forward(self, x: torch.Tensor) -> torch.Tensor: for layer in self.layers: q = layer["q_proj"](x) k = layer["k_proj"](x) v = layer["v_proj"](x) attn = torch.matmul(q, k.transpose(-1, -2)) / math.sqrt(x.size(-1)) attn_out = torch.matmul(F.softmax(attn, dim=-1), v) x = x + layer["out_proj"](attn_out) ffn = layer["fc2"](F.gelu(layer["fc1"](x))) x = x + ffn return self.classifier(x[:, 0, :])Define the computation performed at every call.
Should be overridden by all subclasses.
Note
Although the recipe for forward pass needs to be defined within this function, one should call the :class:
Moduleinstance afterwards instead of this since the former takes care of running the registered hooks while the latter silently ignores them.
class TestLeadSVDSpecialistAudit (methodName='runTest')-
Expand source code
class TestLeadSVDSpecialistAudit(unittest.TestCase): """Lead SVD & Factorization Specialist Comprehensive Audit Test Suite.""" def setUp(self): torch.manual_seed(42) self.hidden_size = 768 self.num_heads = 12 self.config = get_dummy_config(self.hidden_size, self.num_heads, rank=64) # ========================================================================= # 1. SVDLinear & SVDLinearAttention # ========================================================================= def test_svd_linear_forward_backward_and_stiefel(self): """Audit SVDLinear layer forward/backward, LoRA residual, and Stiefel orthogonality loss.""" layer = SVDLinear( in_features=768, out_features=768, rank=64, bias=True, freeze_svd=False, lora_rank=8, lora_alpha=16.0, ) x = torch.randn(2, 32, 768, requires_grad=True) out = layer(x) self.assertEqual(out.shape, (2, 32, 768)) self.assertFalse(torch.isnan(out).any()) # Test Stiefel manifold loss ortho_loss = layer.get_orthogonality_loss() self.assertTrue(torch.is_tensor(ortho_loss)) self.assertGreaterEqual(ortho_loss.item(), 0.0) # Backward pass total_loss = out.sum() + ortho_loss total_loss.backward() self.assertIsNotNone(x.grad) self.assertFalse(torch.isnan(x.grad).any()) self.assertIsNotNone(layer.U.grad) self.assertIsNotNone(layer.V.grad) self.assertIsNotNone(layer.lora_A.grad) self.assertIsNotNone(layer.lora_B.grad) def test_svd_linear_frozen_base(self): """Audit SVDLinear with frozen SVD base and active LoRA adapter.""" layer = SVDLinear( in_features=768, out_features=768, rank=64, bias=True, freeze_svd=True, lora_rank=8, ) x = torch.randn(2, 16, 768, requires_grad=True) out = layer(x) loss = out.sum() loss.backward() self.assertIsNone(layer.U.grad) self.assertIsNone(layer.V.grad) self.assertIsNotNone(layer.lora_A.grad) self.assertIsNotNone(layer.lora_B.grad) def test_svd_linear_attention_modes(self): """Audit SVDLinearAttention across exact, linear kernel, and decay-gated linear modes.""" for mode, use_decay in [("exact", False), ("linear", False), ("linear", True)]: attn = SVDLinearAttention( self.config, rank=64, mode=mode, use_decay_gating=use_decay, ) x = torch.randn(2, 16, self.hidden_size, requires_grad=True) mask = torch.ones(2, 16) mask[:, 12:] = 0 out, probs = attn(hidden_states=x, attention_mask=mask, output_attentions=(mode == "exact")) self.assertEqual(out.shape, (2, 16, self.hidden_size)) self.assertFalse(torch.isnan(out).any()) if mode == "exact": self.assertIsNotNone(probs) self.assertEqual(probs.shape, (2, self.num_heads, 16, 16)) loss = out.sum() loss.backward() self.assertIsNotNone(x.grad) self.assertFalse(torch.isnan(x.grad).any()) def test_svd_linear_decay_step_recurrent(self): """Audit step_recurrent streaming generation vs sequential forward in DecayGatedLinearAttention.""" attn = SVDLinearAttention( self.config, rank=64, mode="decay", use_decay_gating=True, ) attn.eval() x = torch.randn(1, 4, self.hidden_size) # Full sequential forward out_seq, _, (S_final, Z_final) = attn(hidden_states=x, return_state=True) # Step-by-step streaming recurrent forward state = None out_steps = [] for t in range(4): x_t = x[:, t : t + 1, :] out_t, state = attn.step_recurrent(x_t, past_state=state) out_steps.append(out_t) out_streamed = torch.cat(out_steps, dim=1) # Verify numerical equivalence between full sequence recurrence and step-by-step streaming max_diff = torch.max(torch.abs(out_seq - out_streamed)).item() self.assertLess(max_diff, 1e-5, f"Streaming recurrent output diverges from sequential: max_diff={max_diff}") # ========================================================================= # 2. AdaptiveSVDAttention & AdaptiveSVDLinear # ========================================================================= def test_adaptive_svd_attention_forward_backward_energy(self): """Audit AdaptiveSVDAttention forward/backward, cumulative energy thresholding, and residual adapter.""" attn = AdaptiveSVDAttention( self.config, svd_rank=64, residual_rank=8, energy_threshold=0.92, ) # Test copy_weights from pretrained MHA mock_mha = MockMHA(self.hidden_size, self.num_heads) attn.copy_weights(mock_mha) x = torch.randn(2, 24, self.hidden_size, requires_grad=True) mask = torch.ones(2, 24) mask[:, 20:] = 0 out, probs = attn(hidden_states=x, attention_mask=mask, output_attentions=True) self.assertEqual(out.shape, (2, 24, self.hidden_size)) self.assertFalse(torch.isnan(out).any()) self.assertIsNotNone(probs) loss = out.sum() loss.backward() self.assertIsNotNone(x.grad) self.assertFalse(torch.isnan(x.grad).any()) # Test energy rank selection function S = torch.tensor([10.0, 5.0, 3.0, 1.0, 0.5, 0.2, 0.1, 0.05]) r = attn._compute_energy_rank(S, max_rank=8, min_rank=1) self.assertEqual(r, 2) # ========================================================================= # 3. ASVDAttention & ASVDLinear # ========================================================================= def test_asvd_attention_forward_backward(self): """Audit ASVDAttention with explicit singular value vector S.""" attn = ASVDAttention(self.config, rank=64, lora_rank=0) mock_mha = MockMHA(self.hidden_size, self.num_heads) attn.copy_weights(mock_mha) x = torch.randn(2, 16, self.hidden_size, requires_grad=True) out, probs = attn(hidden_states=x, output_attentions=False) self.assertEqual(out.shape, (2, 16, self.hidden_size)) self.assertFalse(torch.isnan(out).any()) loss = out.sum() loss.backward() self.assertIsNotNone(x.grad) self.assertFalse(torch.isnan(x.grad).any()) self.assertIsNotNone(attn.query.S.grad) # ========================================================================= # 4. LinformerAttention # ========================================================================= def test_linformer_attention_forward_backward(self): """Audit LinformerAttention with sequence dimension projection matrices E and F.""" attn = LinformerAttention(self.config, k=32, max_seq_len=128) mock_mha = MockMHA(self.hidden_size, self.num_heads) attn.copy_weights(mock_mha) x = torch.randn(2, 48, self.hidden_size, requires_grad=True) mask = torch.ones(2, 48) mask[:, 40:] = 0 out, probs = attn(hidden_states=x, attention_mask=mask) self.assertEqual(out.shape, (2, 48, self.hidden_size)) self.assertFalse(torch.isnan(out).any()) loss = out.sum() loss.backward() self.assertIsNotNone(x.grad) self.assertFalse(torch.isnan(x.grad).any()) self.assertIsNotNone(attn.E.grad) self.assertIsNotNone(attn.F.grad) # ========================================================================= # 5. Res-SVD / Spectral Residual LoRA # ========================================================================= def test_res_svd_linear_and_compressor(self): """Audit ResSVDLinear residual tail initialization, forward/backward, and merge_weights.""" dense = nn.Linear(128, 128) res_layer = ResSVDLinear.from_linear( linear=dense, base_rank=32, residual_rank=8, scaling=1.0, factorize_base=True, freeze_base=True, ) self.assertEqual(res_layer.base_rank, 32) self.assertEqual(res_layer.residual_rank, 8) self.assertFalse(res_layer.base_U.requires_grad) self.assertTrue(res_layer.lora_A.requires_grad) # Forward / Backward x = torch.randn(2, 10, 128, requires_grad=True) out = res_layer(x) self.assertEqual(out.shape, (2, 10, 128)) loss = out.sum() loss.backward() self.assertIsNotNone(x.grad) self.assertIsNone(res_layer.base_U.grad) self.assertIsNotNone(res_layer.lora_A.grad) # Reconstruction error norm at init err = res_layer.get_residual_error_norm(dense.weight.data) self.assertLess(err, 1.0) # Merged weights merged = res_layer.merge_weights() self.assertIsInstance(merged, nn.Linear) diff = torch.norm(res_layer(x.detach()) - merged(x.detach())).item() self.assertLess(diff, 1e-4) # Compressor test model = MockTransformerModel(hidden_size=128, num_layers=2) comp_model, stats = ResSVDCompressor(model, base_rank=32, residual_rank=8).compress() self.assertIn("trainable_parameters", stats) self.assertIn("frozen_parameters", stats) out_comp = comp_model(torch.randn(2, 8, 128)) self.assertEqual(out_comp.shape, (2, 2)) # ========================================================================= # 6. AdaptiveRanksCompressor # ========================================================================= def test_adaptive_ranks_compressor_and_energy(self): """Audit AdaptiveRanksCompressor cumulative energy thresholding (tau=0.92) and rank floor.""" model = MockTransformerModel(hidden_size=128, num_layers=2) compressor = AdaptiveRanksCompressor( model, energy_threshold=0.92, min_rank=16, ) comp_model, stats = compressor.compress() out = comp_model(torch.randn(2, 8, 128)) self.assertEqual(out.shape, (2, 2)) self.assertFalse(torch.isnan(out).any()) for name, module in comp_model.named_modules(): if hasattr(module, "rank"): self.assertGreaterEqual(module.rank, 16) # ========================================================================= # 7. DirectSVDCompressor # ========================================================================= def test_direct_svd_compressor(self): """Audit DirectSVDCompressor symmetric factor allocation U sqrt(S), sqrt(S) V^T.""" model = MockTransformerModel(hidden_size=128, num_layers=2) compressor = DirectSVDCompressor(model, rank=32, min_rank=16) comp_model, stats = compressor.compress() out = comp_model(torch.randn(2, 8, 128)) self.assertEqual(out.shape, (2, 2)) self.assertFalse(torch.isnan(out).any()) self.assertLess(stats["compressed_parameters"], stats["original_parameters"]) # ========================================================================= # 8. DobiSVDCompressor & DobiSVDLinearLayer # ========================================================================= def test_dobi_svd_linear_and_compressor(self): """Audit Dobi-SVD differentiable spectral gating and forward/backward gradient flow.""" dense = nn.Linear(128, 128) dobi_layer, err, r = DobiSVDCompressor(nn.Sequential(dense), rank=32).compress_linear(dense, rank=32) self.assertEqual(dobi_layer.rank, 32) self.assertIsNotNone(dobi_layer.gate) x = torch.randn(2, 10, 128, requires_grad=True) out = dobi_layer(x) self.assertEqual(out.shape, (2, 10, 128)) loss = out.sum() loss.backward() self.assertIsNotNone(x.grad) self.assertIsNotNone(dobi_layer.gate.grad) self.assertIsNotNone(dobi_layer.U.grad) self.assertIsNotNone(dobi_layer.V.grad) # Full model compressor test model = MockTransformerModel(hidden_size=128, num_layers=2) comp_model, stats = DobiSVDCompressor(model, rank=32).compress() out_comp = comp_model(torch.randn(2, 8, 128)) self.assertEqual(out_comp.shape, (2, 2)) # ========================================================================= # 9. ERCCompressor (Error-Controlled SVD) # ========================================================================= def test_erc_compressor_frobenius_error_bound(self): """Audit ERC-SVD bounded Frobenius reconstruction error guarantee ||W - W_r||_F / ||W||_F <= eps.""" model = MockTransformerModel(hidden_size=128, num_layers=2) allowed_error = 0.10 linear = nn.Linear(128, 128) compressor = ERCCompressor(model, allowed_error=allowed_error) svd_res = compressor.compress_linear(linear) svd_layer = svd_res[0] if isinstance(svd_res, tuple) else svd_res W_orig = linear.weight.data.float() W_approx = (svd_layer.U @ svd_layer.V).float() rel_frob_error = (torch.norm(W_orig - W_approx, p="fro") / torch.norm(W_orig, p="fro")).item() self.assertLessEqual( rel_frob_error, allowed_error + 1e-5, f"ERC-SVD violated relative Frobenius error bound: {rel_frob_error} > {allowed_error}", ) comp_model, stats = compressor.compress() out = comp_model(torch.randn(2, 8, 128)) self.assertEqual(out.shape, (2, 2)) # ========================================================================= # 10. EntropyBudgetCompressor # ========================================================================= def test_entropy_budget_compressor(self): """Audit EntropyBudgetCompressor singular entropy global budget allocation.""" model = MockTransformerModel(hidden_size=128, num_layers=2) compressor = EntropyBudgetCompressor(model, total_budget_ratio=0.7) comp_model, stats = compressor.compress() self.assertIn("allocated_ranks", stats) for name, r in stats["allocated_ranks"].items(): self.assertGreaterEqual(r, 16, f"Layer {name} rank {r} below min rank floor 16") out = comp_model(torch.randn(2, 8, 128)) self.assertEqual(out.shape, (2, 2)) # ========================================================================= # 11. KroneckerTTLoRALayer & KroneckerTTLoRACompressor # ========================================================================= def test_kronecker_tt_lora_forward_backward_and_adapt(self): """Audit KroneckerTTLoRALayer Kronecker product, Tensor-Train cores, LoRA bypass, and rank adaptation.""" dense = nn.Linear(128, 128) layer = KroneckerTTLoRALayer.from_linear( base_layer=dense, tt_ranks=(1, 4, 4, 1), gamma=1.0, lora_r=4, lora_alpha=8.0, ) x = torch.randn(2, 10, 128, requires_grad=True) out = layer(x) self.assertEqual(out.shape, (2, 10, 128)) self.assertFalse(torch.isnan(out).any()) loss = out.sum() loss.backward() self.assertIsNotNone(x.grad) self.assertIsNotNone(layer.A1.grad) self.assertIsNotNone(layer.A2.grad) self.assertIsNotNone(layer.G1.grad) self.assertIsNotNone(layer.G2.grad) self.assertIsNotNone(layer.G3.grad) self.assertIsNotNone(layer.lora_A.grad) self.assertIsNotNone(layer.lora_B.grad) # Test TT rank adaptation layer.adapt_tt_ranks(delta_r=1) out_after_adapt = layer(x) self.assertEqual(out_after_adapt.shape, (2, 10, 128)) self.assertFalse(torch.isnan(out_after_adapt).any()) # Full model compression model = MockTransformerModel(hidden_size=128, num_layers=2) compressor = KroneckerTTLoRACompressor(model, rank=8, lora_r=4) comp_model, stats = compressor.compress() out_comp = comp_model(torch.randn(2, 8, 128)) self.assertEqual(out_comp.shape, (2, 2))Lead SVD & Factorization Specialist Comprehensive Audit Test Suite.
Create an instance of the class that will use the named test method when executed. Raises a ValueError if the instance does not have a method with the specified name.
Ancestors
- unittest.case.TestCase
Methods
def setUp(self)-
Expand source code
def setUp(self): torch.manual_seed(42) self.hidden_size = 768 self.num_heads = 12 self.config = get_dummy_config(self.hidden_size, self.num_heads, rank=64)Hook method for setting up the test fixture before exercising it.
def test_adaptive_ranks_compressor_and_energy(self)-
Expand source code
def test_adaptive_ranks_compressor_and_energy(self): """Audit AdaptiveRanksCompressor cumulative energy thresholding (tau=0.92) and rank floor.""" model = MockTransformerModel(hidden_size=128, num_layers=2) compressor = AdaptiveRanksCompressor( model, energy_threshold=0.92, min_rank=16, ) comp_model, stats = compressor.compress() out = comp_model(torch.randn(2, 8, 128)) self.assertEqual(out.shape, (2, 2)) self.assertFalse(torch.isnan(out).any()) for name, module in comp_model.named_modules(): if hasattr(module, "rank"): self.assertGreaterEqual(module.rank, 16)Audit AdaptiveRanksCompressor cumulative energy thresholding (tau=0.92) and rank floor.
def test_adaptive_svd_attention_forward_backward_energy(self)-
Expand source code
def test_adaptive_svd_attention_forward_backward_energy(self): """Audit AdaptiveSVDAttention forward/backward, cumulative energy thresholding, and residual adapter.""" attn = AdaptiveSVDAttention( self.config, svd_rank=64, residual_rank=8, energy_threshold=0.92, ) # Test copy_weights from pretrained MHA mock_mha = MockMHA(self.hidden_size, self.num_heads) attn.copy_weights(mock_mha) x = torch.randn(2, 24, self.hidden_size, requires_grad=True) mask = torch.ones(2, 24) mask[:, 20:] = 0 out, probs = attn(hidden_states=x, attention_mask=mask, output_attentions=True) self.assertEqual(out.shape, (2, 24, self.hidden_size)) self.assertFalse(torch.isnan(out).any()) self.assertIsNotNone(probs) loss = out.sum() loss.backward() self.assertIsNotNone(x.grad) self.assertFalse(torch.isnan(x.grad).any()) # Test energy rank selection function S = torch.tensor([10.0, 5.0, 3.0, 1.0, 0.5, 0.2, 0.1, 0.05]) r = attn._compute_energy_rank(S, max_rank=8, min_rank=1) self.assertEqual(r, 2)Audit AdaptiveSVDAttention forward/backward, cumulative energy thresholding, and residual adapter.
def test_asvd_attention_forward_backward(self)-
Expand source code
def test_asvd_attention_forward_backward(self): """Audit ASVDAttention with explicit singular value vector S.""" attn = ASVDAttention(self.config, rank=64, lora_rank=0) mock_mha = MockMHA(self.hidden_size, self.num_heads) attn.copy_weights(mock_mha) x = torch.randn(2, 16, self.hidden_size, requires_grad=True) out, probs = attn(hidden_states=x, output_attentions=False) self.assertEqual(out.shape, (2, 16, self.hidden_size)) self.assertFalse(torch.isnan(out).any()) loss = out.sum() loss.backward() self.assertIsNotNone(x.grad) self.assertFalse(torch.isnan(x.grad).any()) self.assertIsNotNone(attn.query.S.grad)Audit ASVDAttention with explicit singular value vector S.
def test_direct_svd_compressor(self)-
Expand source code
def test_direct_svd_compressor(self): """Audit DirectSVDCompressor symmetric factor allocation U sqrt(S), sqrt(S) V^T.""" model = MockTransformerModel(hidden_size=128, num_layers=2) compressor = DirectSVDCompressor(model, rank=32, min_rank=16) comp_model, stats = compressor.compress() out = comp_model(torch.randn(2, 8, 128)) self.assertEqual(out.shape, (2, 2)) self.assertFalse(torch.isnan(out).any()) self.assertLess(stats["compressed_parameters"], stats["original_parameters"])Audit DirectSVDCompressor symmetric factor allocation U sqrt(S), sqrt(S) V^T.
def test_dobi_svd_linear_and_compressor(self)-
Expand source code
def test_dobi_svd_linear_and_compressor(self): """Audit Dobi-SVD differentiable spectral gating and forward/backward gradient flow.""" dense = nn.Linear(128, 128) dobi_layer, err, r = DobiSVDCompressor(nn.Sequential(dense), rank=32).compress_linear(dense, rank=32) self.assertEqual(dobi_layer.rank, 32) self.assertIsNotNone(dobi_layer.gate) x = torch.randn(2, 10, 128, requires_grad=True) out = dobi_layer(x) self.assertEqual(out.shape, (2, 10, 128)) loss = out.sum() loss.backward() self.assertIsNotNone(x.grad) self.assertIsNotNone(dobi_layer.gate.grad) self.assertIsNotNone(dobi_layer.U.grad) self.assertIsNotNone(dobi_layer.V.grad) # Full model compressor test model = MockTransformerModel(hidden_size=128, num_layers=2) comp_model, stats = DobiSVDCompressor(model, rank=32).compress() out_comp = comp_model(torch.randn(2, 8, 128)) self.assertEqual(out_comp.shape, (2, 2))Audit Dobi-SVD differentiable spectral gating and forward/backward gradient flow.
def test_entropy_budget_compressor(self)-
Expand source code
def test_entropy_budget_compressor(self): """Audit EntropyBudgetCompressor singular entropy global budget allocation.""" model = MockTransformerModel(hidden_size=128, num_layers=2) compressor = EntropyBudgetCompressor(model, total_budget_ratio=0.7) comp_model, stats = compressor.compress() self.assertIn("allocated_ranks", stats) for name, r in stats["allocated_ranks"].items(): self.assertGreaterEqual(r, 16, f"Layer {name} rank {r} below min rank floor 16") out = comp_model(torch.randn(2, 8, 128)) self.assertEqual(out.shape, (2, 2))Audit EntropyBudgetCompressor singular entropy global budget allocation.
def test_erc_compressor_frobenius_error_bound(self)-
Expand source code
def test_erc_compressor_frobenius_error_bound(self): """Audit ERC-SVD bounded Frobenius reconstruction error guarantee ||W - W_r||_F / ||W||_F <= eps.""" model = MockTransformerModel(hidden_size=128, num_layers=2) allowed_error = 0.10 linear = nn.Linear(128, 128) compressor = ERCCompressor(model, allowed_error=allowed_error) svd_res = compressor.compress_linear(linear) svd_layer = svd_res[0] if isinstance(svd_res, tuple) else svd_res W_orig = linear.weight.data.float() W_approx = (svd_layer.U @ svd_layer.V).float() rel_frob_error = (torch.norm(W_orig - W_approx, p="fro") / torch.norm(W_orig, p="fro")).item() self.assertLessEqual( rel_frob_error, allowed_error + 1e-5, f"ERC-SVD violated relative Frobenius error bound: {rel_frob_error} > {allowed_error}", ) comp_model, stats = compressor.compress() out = comp_model(torch.randn(2, 8, 128)) self.assertEqual(out.shape, (2, 2))Audit ERC-SVD bounded Frobenius reconstruction error guarantee ||W - W_r||_F / ||W||_F <= eps.
def test_kronecker_tt_lora_forward_backward_and_adapt(self)-
Expand source code
def test_kronecker_tt_lora_forward_backward_and_adapt(self): """Audit KroneckerTTLoRALayer Kronecker product, Tensor-Train cores, LoRA bypass, and rank adaptation.""" dense = nn.Linear(128, 128) layer = KroneckerTTLoRALayer.from_linear( base_layer=dense, tt_ranks=(1, 4, 4, 1), gamma=1.0, lora_r=4, lora_alpha=8.0, ) x = torch.randn(2, 10, 128, requires_grad=True) out = layer(x) self.assertEqual(out.shape, (2, 10, 128)) self.assertFalse(torch.isnan(out).any()) loss = out.sum() loss.backward() self.assertIsNotNone(x.grad) self.assertIsNotNone(layer.A1.grad) self.assertIsNotNone(layer.A2.grad) self.assertIsNotNone(layer.G1.grad) self.assertIsNotNone(layer.G2.grad) self.assertIsNotNone(layer.G3.grad) self.assertIsNotNone(layer.lora_A.grad) self.assertIsNotNone(layer.lora_B.grad) # Test TT rank adaptation layer.adapt_tt_ranks(delta_r=1) out_after_adapt = layer(x) self.assertEqual(out_after_adapt.shape, (2, 10, 128)) self.assertFalse(torch.isnan(out_after_adapt).any()) # Full model compression model = MockTransformerModel(hidden_size=128, num_layers=2) compressor = KroneckerTTLoRACompressor(model, rank=8, lora_r=4) comp_model, stats = compressor.compress() out_comp = comp_model(torch.randn(2, 8, 128)) self.assertEqual(out_comp.shape, (2, 2))Audit KroneckerTTLoRALayer Kronecker product, Tensor-Train cores, LoRA bypass, and rank adaptation.
def test_linformer_attention_forward_backward(self)-
Expand source code
def test_linformer_attention_forward_backward(self): """Audit LinformerAttention with sequence dimension projection matrices E and F.""" attn = LinformerAttention(self.config, k=32, max_seq_len=128) mock_mha = MockMHA(self.hidden_size, self.num_heads) attn.copy_weights(mock_mha) x = torch.randn(2, 48, self.hidden_size, requires_grad=True) mask = torch.ones(2, 48) mask[:, 40:] = 0 out, probs = attn(hidden_states=x, attention_mask=mask) self.assertEqual(out.shape, (2, 48, self.hidden_size)) self.assertFalse(torch.isnan(out).any()) loss = out.sum() loss.backward() self.assertIsNotNone(x.grad) self.assertFalse(torch.isnan(x.grad).any()) self.assertIsNotNone(attn.E.grad) self.assertIsNotNone(attn.F.grad)Audit LinformerAttention with sequence dimension projection matrices E and F.
def test_res_svd_linear_and_compressor(self)-
Expand source code
def test_res_svd_linear_and_compressor(self): """Audit ResSVDLinear residual tail initialization, forward/backward, and merge_weights.""" dense = nn.Linear(128, 128) res_layer = ResSVDLinear.from_linear( linear=dense, base_rank=32, residual_rank=8, scaling=1.0, factorize_base=True, freeze_base=True, ) self.assertEqual(res_layer.base_rank, 32) self.assertEqual(res_layer.residual_rank, 8) self.assertFalse(res_layer.base_U.requires_grad) self.assertTrue(res_layer.lora_A.requires_grad) # Forward / Backward x = torch.randn(2, 10, 128, requires_grad=True) out = res_layer(x) self.assertEqual(out.shape, (2, 10, 128)) loss = out.sum() loss.backward() self.assertIsNotNone(x.grad) self.assertIsNone(res_layer.base_U.grad) self.assertIsNotNone(res_layer.lora_A.grad) # Reconstruction error norm at init err = res_layer.get_residual_error_norm(dense.weight.data) self.assertLess(err, 1.0) # Merged weights merged = res_layer.merge_weights() self.assertIsInstance(merged, nn.Linear) diff = torch.norm(res_layer(x.detach()) - merged(x.detach())).item() self.assertLess(diff, 1e-4) # Compressor test model = MockTransformerModel(hidden_size=128, num_layers=2) comp_model, stats = ResSVDCompressor(model, base_rank=32, residual_rank=8).compress() self.assertIn("trainable_parameters", stats) self.assertIn("frozen_parameters", stats) out_comp = comp_model(torch.randn(2, 8, 128)) self.assertEqual(out_comp.shape, (2, 2))Audit ResSVDLinear residual tail initialization, forward/backward, and merge_weights.
def test_svd_linear_attention_modes(self)-
Expand source code
def test_svd_linear_attention_modes(self): """Audit SVDLinearAttention across exact, linear kernel, and decay-gated linear modes.""" for mode, use_decay in [("exact", False), ("linear", False), ("linear", True)]: attn = SVDLinearAttention( self.config, rank=64, mode=mode, use_decay_gating=use_decay, ) x = torch.randn(2, 16, self.hidden_size, requires_grad=True) mask = torch.ones(2, 16) mask[:, 12:] = 0 out, probs = attn(hidden_states=x, attention_mask=mask, output_attentions=(mode == "exact")) self.assertEqual(out.shape, (2, 16, self.hidden_size)) self.assertFalse(torch.isnan(out).any()) if mode == "exact": self.assertIsNotNone(probs) self.assertEqual(probs.shape, (2, self.num_heads, 16, 16)) loss = out.sum() loss.backward() self.assertIsNotNone(x.grad) self.assertFalse(torch.isnan(x.grad).any())Audit SVDLinearAttention across exact, linear kernel, and decay-gated linear modes.
def test_svd_linear_decay_step_recurrent(self)-
Expand source code
def test_svd_linear_decay_step_recurrent(self): """Audit step_recurrent streaming generation vs sequential forward in DecayGatedLinearAttention.""" attn = SVDLinearAttention( self.config, rank=64, mode="decay", use_decay_gating=True, ) attn.eval() x = torch.randn(1, 4, self.hidden_size) # Full sequential forward out_seq, _, (S_final, Z_final) = attn(hidden_states=x, return_state=True) # Step-by-step streaming recurrent forward state = None out_steps = [] for t in range(4): x_t = x[:, t : t + 1, :] out_t, state = attn.step_recurrent(x_t, past_state=state) out_steps.append(out_t) out_streamed = torch.cat(out_steps, dim=1) # Verify numerical equivalence between full sequence recurrence and step-by-step streaming max_diff = torch.max(torch.abs(out_seq - out_streamed)).item() self.assertLess(max_diff, 1e-5, f"Streaming recurrent output diverges from sequential: max_diff={max_diff}")Audit step_recurrent streaming generation vs sequential forward in DecayGatedLinearAttention.
def test_svd_linear_forward_backward_and_stiefel(self)-
Expand source code
def test_svd_linear_forward_backward_and_stiefel(self): """Audit SVDLinear layer forward/backward, LoRA residual, and Stiefel orthogonality loss.""" layer = SVDLinear( in_features=768, out_features=768, rank=64, bias=True, freeze_svd=False, lora_rank=8, lora_alpha=16.0, ) x = torch.randn(2, 32, 768, requires_grad=True) out = layer(x) self.assertEqual(out.shape, (2, 32, 768)) self.assertFalse(torch.isnan(out).any()) # Test Stiefel manifold loss ortho_loss = layer.get_orthogonality_loss() self.assertTrue(torch.is_tensor(ortho_loss)) self.assertGreaterEqual(ortho_loss.item(), 0.0) # Backward pass total_loss = out.sum() + ortho_loss total_loss.backward() self.assertIsNotNone(x.grad) self.assertFalse(torch.isnan(x.grad).any()) self.assertIsNotNone(layer.U.grad) self.assertIsNotNone(layer.V.grad) self.assertIsNotNone(layer.lora_A.grad) self.assertIsNotNone(layer.lora_B.grad)Audit SVDLinear layer forward/backward, LoRA residual, and Stiefel orthogonality loss.
def test_svd_linear_frozen_base(self)-
Expand source code
def test_svd_linear_frozen_base(self): """Audit SVDLinear with frozen SVD base and active LoRA adapter.""" layer = SVDLinear( in_features=768, out_features=768, rank=64, bias=True, freeze_svd=True, lora_rank=8, ) x = torch.randn(2, 16, 768, requires_grad=True) out = layer(x) loss = out.sum() loss.backward() self.assertIsNone(layer.U.grad) self.assertIsNone(layer.V.grad) self.assertIsNotNone(layer.lora_A.grad) self.assertIsNotNone(layer.lora_B.grad)Audit SVDLinear with frozen SVD base and active LoRA adapter.