mirror of
https://github.com/MLSysBook/TinyTorch.git
synced 2026-07-18 12:06:22 -05:00
- Update GitHub workflow for publishing - Update December 2024 release notes - Update module about template and testing documentation - Update milestone template
339 lines
11 KiB
Markdown
339 lines
11 KiB
Markdown
# Gradient Flow Testing Strategy
|
|
|
|
## 🎯 Overview
|
|
|
|
Gradient flow tests are **critical** for TinyTorch because they validate that the autograd system works correctly end-to-end. A component might work perfectly in isolation, but if gradients don't flow through it, training will fail silently.
|
|
|
|
**Key Principle**: Every module that has trainable parameters or processes gradients should have gradient flow tests.
|
|
|
|
---
|
|
|
|
## ✅ Current Gradient Flow Test Coverage
|
|
|
|
### **Comprehensive Integration Tests** ✅
|
|
- `tests/integration/test_gradient_flow.py` - **CRITICAL**: Tests entire training stack
|
|
- Basic tensor operations
|
|
- Layer gradients (Linear)
|
|
- Activation gradients (Sigmoid, ReLU, Tanh)
|
|
- Loss gradients (MSE, BCE, CrossEntropy)
|
|
- Optimizer integration (SGD, AdamW)
|
|
- Full training loops
|
|
- Edge cases
|
|
|
|
- `tests/test_gradient_flow.py` - Comprehensive suite
|
|
- Simple linear networks
|
|
- MLP networks
|
|
- CNN networks
|
|
- Gradient accumulation
|
|
|
|
### **Module-Specific Gradient Tests** ✅
|
|
- `tests/05_autograd/test_gradient_flow.py` - Autograd operations
|
|
- Arithmetic operations (add, sub, mul, div)
|
|
- GELU activation
|
|
- LayerNorm operations
|
|
- Reshape operations
|
|
|
|
- `tests/13_transformers/test_transformer_gradient_flow.py` - Transformer components
|
|
- MultiHeadAttention gradients
|
|
- LayerNorm gradients
|
|
- MLP gradients
|
|
- Full GPT model gradients
|
|
- Attention masking gradients
|
|
|
|
- `tests/integration/test_cnn_integration.py` - CNN components
|
|
- Conv2d gradient flow
|
|
- Complete CNN forward/backward
|
|
- Pooling operations
|
|
|
|
- `tests/regression/test_nlp_components_gradient_flow.py` - NLP components
|
|
- Tokenization
|
|
- Embeddings
|
|
- Positional encoding
|
|
- Attention mechanisms
|
|
- Full GPT model
|
|
|
|
### **System-Level Tests** ✅
|
|
- `tests/system/test_gradients.py` - System validation
|
|
- Gradient existence in single layers
|
|
- Gradient existence in deep networks
|
|
|
|
---
|
|
|
|
## 🔍 Gap Analysis: What's Missing?
|
|
|
|
### **Module-by-Module Coverage**
|
|
|
|
| Module | Has Gradient Flow Tests? | Status | Notes |
|
|
|--------|-------------------------|--------|-------|
|
|
| 01_tensor | ✅ Partial | Good | Basic operations covered in integration tests |
|
|
| 02_activations | ⚠️ Partial | Needs Work | Some activations tested, not all |
|
|
| 03_layers | ✅ Good | Good | Linear layer well tested |
|
|
| 04_losses | ✅ Good | Good | All major losses tested |
|
|
| 05_autograd | ✅ Excellent | Complete | Comprehensive autograd tests |
|
|
| 06_optimizers | ✅ Good | Good | Optimizer integration tested |
|
|
| 07_training | ✅ Good | Good | Training loops tested |
|
|
| 08_dataloader | ❌ Missing | **Gap** | No gradient flow tests |
|
|
| 09_spatial | ✅ Good | Good | CNN tests cover Conv2d |
|
|
| 10_tokenization | ✅ Partial | Good | Covered in NLP regression tests |
|
|
| 11_embeddings | ✅ Good | Good | Covered in NLP regression tests |
|
|
| 12_attention | ✅ Good | Good | Covered in transformer tests |
|
|
| 13_transformers | ✅ Excellent | Complete | Comprehensive transformer tests |
|
|
| 14_profiling | ⚠️ N/A | N/A | Profiling doesn't need gradients |
|
|
| 15_memoization | ⚠️ N/A | N/A | Caching doesn't need gradients |
|
|
| 16_quantization | ⚠️ Unknown | Needs Check | Quantization might need gradient tests |
|
|
| 17_compression | ⚠️ Unknown | Needs Check | Compression might need gradient tests |
|
|
| 18_acceleration | ⚠️ N/A | N/A | Acceleration doesn't need gradients |
|
|
| 19_benchmarking | ⚠️ N/A | N/A | Benchmarking doesn't need gradients |
|
|
|
|
### **Specific Gaps Identified**
|
|
|
|
1. **Module 02_activations** - Not all activations have gradient tests
|
|
- ✅ Sigmoid tested
|
|
- ✅ ReLU tested (partial)
|
|
- ⚠️ Tanh not fully tested
|
|
- ⚠️ GELU tested in autograd but not in activations module
|
|
- ⚠️ Softmax not tested
|
|
|
|
2. **Module 08_dataloader** - No gradient flow tests
|
|
- Dataloader doesn't have trainable parameters, but should test:
|
|
- Data doesn't break gradient flow
|
|
- Batched operations preserve gradients
|
|
|
|
3. **Module 03_layers** - Missing some layer types
|
|
- ✅ Linear well tested
|
|
- ⚠️ Dropout not tested
|
|
- ⚠️ BatchNorm not tested (if exists)
|
|
- ⚠️ LayerNorm tested in transformers but not in layers module
|
|
|
|
4. **Edge Cases** - Some gaps
|
|
- ⚠️ Vanishing gradients detection
|
|
- ⚠️ Exploding gradients detection
|
|
- ⚠️ Gradient clipping
|
|
- ⚠️ Mixed precision (if applicable)
|
|
|
|
---
|
|
|
|
## 📋 Recommended Test Structure
|
|
|
|
### **For Each Module with Trainable Parameters**
|
|
|
|
Create: `tests/XX_modulename/test_gradient_flow.py`
|
|
|
|
**Template**:
|
|
```python
|
|
"""
|
|
Gradient Flow Tests for Module XX: [Module Name]
|
|
|
|
Tests that gradients flow correctly through all components in this module.
|
|
"""
|
|
|
|
def test_[component]_gradient_flow():
|
|
"""Test that [Component] preserves gradient flow."""
|
|
# 1. Create component
|
|
component = Component(...)
|
|
|
|
# 2. Forward pass
|
|
x = Tensor(..., requires_grad=True)
|
|
output = component(x)
|
|
|
|
# 3. Backward pass
|
|
loss = output.sum()
|
|
loss.backward()
|
|
|
|
# 4. Verify gradients exist
|
|
assert x.grad is not None, "Input should have gradients"
|
|
|
|
# 5. Verify component parameters have gradients (if trainable)
|
|
if hasattr(component, 'parameters'):
|
|
for param in component.parameters():
|
|
assert param.grad is not None, f"{param} should have gradient"
|
|
assert np.abs(param.grad).max() > 1e-10, "Gradient should be non-zero"
|
|
|
|
def test_[component]_with_previous_modules():
|
|
"""Test that [Component] works with modules 01 through XX-1."""
|
|
# Use previous modules
|
|
from tinytorch.core.tensor import Tensor
|
|
from tinytorch.core.layers import Linear # if applicable
|
|
|
|
# Test integration
|
|
...
|
|
```
|
|
|
|
### **Critical Checks for Every Module**
|
|
|
|
1. **Gradient Existence**: Do gradients exist after backward?
|
|
2. **Gradient Non-Zero**: Are gradients actually computed (not all zeros)?
|
|
3. **Parameter Coverage**: Do all trainable parameters receive gradients?
|
|
4. **Shape Correctness**: Do gradient shapes match parameter shapes?
|
|
5. **Integration**: Does it work with previous modules?
|
|
|
|
---
|
|
|
|
## 🎯 Priority Recommendations
|
|
|
|
### **High Priority** (Must Have)
|
|
|
|
1. **Complete Module 02_activations gradient tests**
|
|
- Create `tests/02_activations/test_gradient_flow.py`
|
|
- Test all activations: Sigmoid, ReLU, Tanh, GELU, Softmax
|
|
- Verify gradients are correct (not just exist)
|
|
|
|
2. **Add Module 08_dataloader gradient flow tests**
|
|
- Create `tests/08_dataloader/test_gradient_flow.py`
|
|
- Test that dataloader doesn't break gradient flow
|
|
- Test batched operations preserve gradients
|
|
|
|
3. **Complete Module 03_layers gradient tests**
|
|
- Add Dropout gradient tests
|
|
- Add LayerNorm gradient tests (if in layers module)
|
|
- Add BatchNorm gradient tests (if exists)
|
|
|
|
### **Medium Priority** (Should Have)
|
|
|
|
4. **Add vanishing/exploding gradient detection**
|
|
- Create `tests/debugging/test_gradient_vanishing.py`
|
|
- Create `tests/debugging/test_gradient_explosion.py`
|
|
- Provide helpful error messages for students
|
|
|
|
5. **Add per-module progressive integration gradient tests**
|
|
- Each module should test: "Do gradients flow through module N with modules 1-N-1?"
|
|
- Example: `tests/07_training/test_gradient_flow_progressive.py`
|
|
|
|
### **Low Priority** (Nice to Have)
|
|
|
|
6. **Add numerical stability gradient tests**
|
|
- Test with very small values
|
|
- Test with very large values
|
|
- Test with NaN/Inf handling
|
|
|
|
7. **Add gradient accumulation tests per module**
|
|
- Test that gradients accumulate correctly
|
|
- Test zero_grad() works correctly
|
|
|
|
---
|
|
|
|
## 🔧 Implementation Plan
|
|
|
|
### **Step 1: Create Missing Module Gradient Flow Tests**
|
|
|
|
For each module missing gradient flow tests:
|
|
|
|
```bash
|
|
# Create test file
|
|
touch tests/XX_modulename/test_gradient_flow.py
|
|
|
|
# Add template with:
|
|
# - Component gradient flow tests
|
|
# - Integration with previous modules
|
|
# - Edge cases
|
|
```
|
|
|
|
### **Step 2: Enhance Existing Tests**
|
|
|
|
For modules with partial coverage:
|
|
|
|
1. Review existing tests
|
|
2. Identify missing components
|
|
3. Add tests for missing components
|
|
4. Ensure all trainable parameters are tested
|
|
|
|
### **Step 3: Add Debugging Tests**
|
|
|
|
Create helpful debugging tests:
|
|
|
|
```python
|
|
# tests/debugging/test_gradient_vanishing.py
|
|
def test_detect_vanishing_gradients():
|
|
"""Detect and diagnose vanishing gradients."""
|
|
# Deep network
|
|
# Check gradient magnitudes
|
|
# Provide helpful error message
|
|
```
|
|
|
|
### **Step 4: Add Progressive Integration Gradient Tests**
|
|
|
|
For each module, add:
|
|
|
|
```python
|
|
# tests/XX_modulename/test_gradient_flow_progressive.py
|
|
def test_module_N_gradients_with_all_previous():
|
|
"""Test that module N gradients work with modules 1 through N-1."""
|
|
# Use all previous modules
|
|
# Test gradient flow through complete stack
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 Test Execution Strategy
|
|
|
|
### **During Development**
|
|
```bash
|
|
# Test specific module gradient flow
|
|
pytest tests/XX_modulename/test_gradient_flow.py -v
|
|
|
|
# Test integration gradient flow
|
|
pytest tests/integration/test_gradient_flow.py -v
|
|
|
|
# Test all gradient flow tests
|
|
pytest tests/ -k "gradient" -v
|
|
```
|
|
|
|
### **Before Committing**
|
|
```bash
|
|
# Run all gradient flow tests
|
|
pytest tests/integration/test_gradient_flow.py tests/*/test_gradient_flow.py -v
|
|
|
|
# Critical: Must pass before merging
|
|
pytest tests/integration/test_gradient_flow.py -v
|
|
```
|
|
|
|
### **CI/CD Integration**
|
|
- Add gradient flow tests to CI pipeline
|
|
- Fail build if critical gradient flow tests fail
|
|
- Report gradient flow test coverage
|
|
|
|
---
|
|
|
|
## ✅ Success Criteria
|
|
|
|
A module has **complete gradient flow coverage** when:
|
|
|
|
1. ✅ All trainable components have gradient flow tests
|
|
2. ✅ All activations preserve gradient flow
|
|
3. ✅ Integration with previous modules is tested
|
|
4. ✅ Edge cases are covered (zero gradients, small values, etc.)
|
|
5. ✅ Tests verify gradients are non-zero (not just exist)
|
|
6. ✅ Tests verify gradient shapes match parameter shapes
|
|
7. ✅ Tests provide helpful error messages when they fail
|
|
|
|
---
|
|
|
|
## 🎓 Educational Value
|
|
|
|
Gradient flow tests teach students:
|
|
|
|
1. **Gradient flow is critical**: Components must preserve gradients
|
|
2. **Integration matters**: Components must work together
|
|
3. **Debugging skills**: How to diagnose gradient flow issues
|
|
4. **Best practices**: Proper gradient handling patterns
|
|
|
|
---
|
|
|
|
## 📚 References
|
|
|
|
- **Critical Test**: `tests/integration/test_gradient_flow.py` - Must pass before merging
|
|
- **Comprehensive Suite**: `tests/test_gradient_flow.py` - Full coverage
|
|
- **Module Tests**: `tests/XX_modulename/test_gradient_flow.py` - Per-module coverage
|
|
- **Transformer Tests**: `tests/13_transformers/test_transformer_gradient_flow.py` - Example of comprehensive module tests
|
|
|
|
---
|
|
|
|
**Last Updated**: 2025-01-XX
|
|
**Status**: Analysis complete, implementation in progress
|
|
**Priority**: High - Gradient flow is critical for training to work
|
|
|
|
|
|
|
|
|
|
|