Files
foxhunt/AGENT_205_SMOKE_TEST_RESULTS.md
jgrusewski 7ac4ca7fed 🚀 Wave 9: TFT INT8 Quantization Complete (20 Agents, TDD)
- Implemented INT8 quantization for all TFT components (VSN, LSTM, Attention, GRN)
- Enhanced Quantizer with actual U8 dtype conversion (18/18 tests passing)
- Memory reduction: 2,952MB → 738MB (75% reduction achieved)
- Latency speedup: P95 12.78ms → 3.2ms (4x speedup confirmed)
- Accuracy validation: <5% loss verified on 519 validation bars
- Test coverage: 840/840 ML tests passing (100%)
- GPU memory budget: 880MB total for 4-model ensemble (89.3% headroom on RTX 3050 Ti)
- 4-model ensemble: DQN+PPO+MAMBA-2+TFT-INT8 operational

Files changed: 84 files (+4,386, -5,870 lines)
Documentation: 47 agent reports (15,000+ words)
Test methodology: Test-Driven Development (TDD) applied across all agents

Agent breakdown:
- Wave 9.1: Research (quantization infrastructure analysis)
- Wave 9.2: VSN INT8 quantization (5/5 tests passing)
- Wave 9.3: LSTM INT8 quantization (10/10 tests passing)
- Wave 9.4: Attention INT8 quantization (7/7 tests passing)
- Wave 9.5: GRN INT8 quantization (6/6 tests passing)
- Wave 9.6: U8 dtype Quantizer (18/18 tests passing)
- Wave 9.7: Complete TFT INT8 integration (9 tests)
- Wave 9.8: Calibration dataset (1,000 ES.FUT bars)
- Wave 9.9: Accuracy validation (<5% loss)
- Wave 9.10: Latency benchmark (P95 3.2ms validated)
- Wave 9.11: Memory benchmark (738MB validated)
- Wave 9.12-16: Integration & validation
- Wave 9.17: GPU memory budget update (880MB total)
- Wave 9.18: Module exports and visibility
- Wave 9.19: Comprehensive documentation
- Wave 9.20: CLAUDE.md + gradient norm dtype fix (F32→F64)

Technical highlights:
- Quantized VSN: Forward pass with U8 weights → F32 dequantization
- Quantized LSTM: Hidden state quantization with per-channel support
- Quantized Attention: Multi-head attention INT8 with symmetric quantization
- Quantized GRN: Gated residual network INT8 with context vector support
- Gradient norm fix: Added to_dtype(F64) before to_scalar<f64>() in backward pass
- Calibration: 1,000 ES.FUT bars for quantization statistics
- Validation: 519 ES.FUT bars for accuracy testing

Performance metrics:
- Latency: P50 1.8ms, P95 3.2ms, P99 4.1ms (4x speedup vs F32)
- Memory: 738MB (batch_size=32, sequence_length=100) - 75% reduction
- Accuracy: <5% validation loss degradation (production acceptable)
- Throughput: 312 inferences/sec (batch_size=32)
- GPU memory: 880MB total ensemble (DQN 120MB + PPO 150MB + MAMBA-2 170MB + TFT 440MB)

Production status:  TFT-INT8 PRODUCTION READY (4/4 ML models operational)

Known issues (deferred to Wave 10):
- 3 INT8 integration tests need QuantizationConfig API updates
- Core functionality validated via 840 passing ML library tests

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-15 21:38:04 +02:00

6.2 KiB
Raw Blame History

Agent 205: MAMBA-2 3-Epoch Smoke Test Results

Date: 2025-10-15 Status: FAILED - Shape mismatch in training loop Duration: ~9 seconds (failed at first batch)


Executive Summary

The smoke test FAILED with a shape mismatch error during the first training batch. The error occurs in prepare_scan_input_with_gradients function where batch matrix multiplication is not properly handling 3D tensors.

Root Cause: Missing batch dimension broadcast in gradient-enabled forward pass.


Test Execution

Command

cargo run -p ml --example train_mamba2_dbn --release --features cuda -- --epochs 3

Success Checkpoints

Compilation successful (0.37s) CUDA initialization successful (RTX 3050 Ti detected) Data loading successful (7,223 messages from 4 DBN files) Feature extraction successful (72 sequences created) Train/val split successful (57 train, 15 val) Model initialization successful (211,200 parameters) FAILED at first training batch


Error Analysis

Error Message

Error: Training failed

Caused by:
    Model error: Candle error: shape mismatch in matmul, lhs: [32, 60, 512], rhs: [512, 16]

Stack Trace

ml::mamba::Mamba2SSM::forward_with_gradients
ml::mamba::Mamba2SSM::train_batch

Tensor Shapes

  • Input to prepare_scan_input_with_gradients: [32, 60, 512] (batch, seq, d_inner)
  • B matrix: [16, 512] (d_state, d_inner)
  • B.t(): [512, 16] (d_inner, d_state)
  • Attempted matmul: [32, 60, 512] × [512, 16]FAILS

Root Cause

The prepare_scan_input_with_gradients function (line 1186) uses:

let Bu = input.matmul(&B.t()?)?;

This works for 2D tensors but fails for 3D batch tensors because Candle's matmul doesn't automatically broadcast the batch dimension.

The inference version (prepare_scan_input, line 707) correctly broadcasts B:

let batch_size = input.dim(0)?;
let B_t = B.t()?.contiguous()?;
let d_inner = B_t.dim(0)?;
let d_state = B_t.dim(1)?;
let B_broadcasted = B_t.unsqueeze(0)?.broadcast_as((batch_size, d_inner, d_state))?;
let Bu = input.matmul(&B_broadcasted)?;

The training version is missing this broadcast logic.


Configuration

Model Parameters

  • d_model: 256
  • d_state: 16
  • d_inner: 512 (d_model × expand = 256 × 2)
  • seq_len: 60
  • batch_size: 32
  • num_layers: 6
  • total_parameters: 211,200

Data

  • Symbols: 6E.FUT (Euro FX futures)
  • Files: 4 DBN files (2024-01-02 to 2024-01-05)
  • Total messages: 7,223 OHLCV bars
  • Sequences: 72 total (57 train, 15 val)
  • Memory: ~4MB

Hardware

  • GPU: RTX 3050 Ti (CUDA enabled)
  • Device ID: 2

Required Fix

Location

ml/src/mamba/mod.rs:1179-1188

Current Code (BROKEN)

fn prepare_scan_input_with_gradients(
    &self,
    input: &Tensor,
    _A: &Tensor,
    B: &Tensor,
) -> Result<Tensor, MLError> {
    // Multiply input by B matrix for state transition
    let Bu = input.matmul(&B.t()?)?;  // ❌ FAILS: [32,60,512] × [512,16]
    Ok(Bu)
}

Fixed Code (REQUIRED)

fn prepare_scan_input_with_gradients(
    &self,
    input: &Tensor,
    _A: &Tensor,
    B: &Tensor,
) -> Result<Tensor, MLError> {
    // FIXED: Broadcast B to match batch dimension
    // input: [batch, seq, d_inner], B: [d_state, d_inner]
    // B.t(): [d_inner, d_state] → broadcast to [batch, d_inner, d_state]
    let batch_size = input.dim(0)?;
    let B_t = B.t()?.contiguous()?;
    let d_inner = B_t.dim(0)?;
    let d_state = B_t.dim(1)?;
    let B_broadcasted = B_t.unsqueeze(0)?.broadcast_as((batch_size, d_inner, d_state))?;
    let Bu = input.matmul(&B_broadcasted)?;  // ✅ WORKS: [32,60,512] × [32,512,16] = [32,60,16]
    Ok(Bu)
}

Impact Assessment

Blocking Issues

  1. Critical: Training loop completely blocked by shape mismatch
  2. Scope: Affects all MAMBA-2 training (DQN/PPO/TFT unaffected)
  3. Workaround: None - must fix before training

Non-Blocking Success

  • Data loading: 100% functional (0.70ms for 1,674 bars)
  • Model initialization: 100% functional (211K parameters)
  • CUDA integration: 100% functional (RTX 3050 Ti)
  • Feature extraction: 100% functional (72 sequences)

Next Steps

Immediate (Agent 206)

  1. Apply the fix to prepare_scan_input_with_gradients (5 lines)
  2. Recompile with cargo build -p ml --release --features cuda
  3. Rerun smoke test: cargo run -p ml --example train_mamba2_dbn --release --features cuda -- --epochs 3
  4. Verify first epoch completes without errors
  5. Monitor for finite loss (not NaN)

Expected After Fix

  • First batch processes successfully
  • Loss is finite (expect ~0.01-1.0 range initially)
  • Gradients computed correctly
  • Model weights update
  • Validation loss computed
  • Checkpoint saved after each epoch

Timeline

  • Fix duration: 2 minutes (5 lines of code)
  • Recompile: ~30 seconds
  • Smoke test: ~5-10 minutes (3 epochs)
  • Total: ~12 minutes to validate fix

Lessons Learned

Code Quality Issues

  1. Inconsistency: Inference path has correct broadcast logic, training path doesn't
  2. Missing tests: No unit tests caught this before integration
  3. Code duplication: prepare_scan_input and prepare_scan_input_with_gradients should share logic

Testing Gaps

  • No shape validation tests for batch matmul operations
  • No smoke tests run before Agent 205
  • Missing unit tests for SSM operations with batch dimensions

Recommendations

  1. Run smoke tests before declaring "compilation success"
  2. Add unit tests for all SSM tensor operations
  3. Refactor to eliminate code duplication between inference/training paths
  4. Add shape assertions at function boundaries

Conclusion

The smoke test successfully identified a critical shape mismatch bug in the training loop that would have blocked all MAMBA-2 training. The fix is simple (5 lines) and mirrors existing working code from the inference path.

Agent 206 should apply this fix immediately and rerun the smoke test.


Test Log: /tmp/mamba2_smoke_test.log Agent: 205 Predecessor: Agent 204 (compilation) Successor: Agent 206 (apply fix, retest)