mirror of
https://github.com/MLSysBook/TinyTorch.git
synced 2026-06-04 23:10:55 -05:00
MAJOR MILESTONE: Successfully balanced robustness with educational accessibility
Core Changes:
- **TinyTorch Assumptions Framework**: docs/tinytorch-assumptions.md
- "Production Concepts, Educational Implementation" philosophy
- 20% complexity for 80% learning objectives
- Clear guidelines for type systems, error handling, memory analysis
- **Module 02 Tensor Simplifications**:
- Simplified dtype system: Union[str, np.dtype, type] → string-only
- Added module-level assumption documentation
- Enhanced visual diagrams with narrative descriptions ("The Story")
- Preserved core concepts while reducing implementation barriers
- **Narrative Learning Enhancement**:
- Step-by-step explanations for complex visual diagrams
- "What's happening" sections for memory layout, broadcasting
- Concrete analogies (memory as library, cache as city blocks)
Team Consensus Achieved:
- Educational Review Expert: Progressive disclosure, cognitive load management
- ML Framework Advisor: Essential vs optional complexity identification
- Education Architect: Learning objective alignment
- Module Developer: Implementation feasibility validation
- Technical Program Manager: Coordinated framework implementation
Validation Results:
- Module 02 passes all tests with simplified complexity
- Students can implement tensor concepts without Union type confusion
- Production context preserved in advanced sections
- Clear path from educational to production understanding
Next: Apply framework to remaining modules for consistent complexity management
187 lines
7.7 KiB
Markdown
187 lines
7.7 KiB
Markdown
# TinyTorch Educational Assumptions
|
|
|
|
## 🎯 Why We Make Assumptions
|
|
|
|
TinyTorch prioritizes **learning ML systems concepts through implementation**. We make deliberate simplifications to focus on core learning objectives while preserving essential understanding that transfers to production ML frameworks like PyTorch and TensorFlow.
|
|
|
|
**Core Philosophy**: "Production Concepts, Educational Implementation"
|
|
- Implement 20% of production complexity to achieve 80% of learning objectives
|
|
- Students should recognize PyTorch patterns without implementation barriers
|
|
- Every simplification must preserve the essential systems concept
|
|
|
|
## 🔧 Core TinyTorch Assumptions
|
|
|
|
### **Type System Assumptions**
|
|
- **Dtype Support**: String-based types only (`"float32"`, `"int32"`, `"bool"`)
|
|
- **No Complex Unions**: Avoid `Union[str, np.dtype, type]` complexity
|
|
- **Explicit Conversion**: Require explicit dtype specification when needed
|
|
- **Why**: Students learn that dtypes matter without Python type system complexity
|
|
|
|
### **Memory Management Assumptions**
|
|
- **Conceptual Understanding**: Focus on "this operation copies data" vs detailed stride analysis
|
|
- **Basic Profiling**: Wall-clock time and memory usage patterns, not kernel-level optimization
|
|
- **Contiguous Awareness**: Teach contiguous vs non-contiguous without full stride computation
|
|
- **Why**: Students understand memory implications without implementation complexity
|
|
|
|
### **Error Handling Assumptions**
|
|
- **Educational Assertions**: Clear error messages that explain what went wrong and how to fix
|
|
- **Essential Validation Only**: Check core requirements, skip comprehensive edge case handling
|
|
- **Focus on Correct Usage**: Teach proper patterns rather than defensive programming
|
|
- **Why**: Students learn correct usage patterns without debugging complexity
|
|
|
|
### **Device Handling Assumptions**
|
|
- **CPU-First Development**: All implementations work on CPU
|
|
- **Simple Device Concepts**: "cpu" vs "cuda" distinction without synchronization complexity
|
|
- **Conceptual GPU Understanding**: Explain acceleration without implementation details
|
|
- **Why**: Students understand device placement concepts without deployment complexity
|
|
|
|
### **Performance Analysis Assumptions**
|
|
- **Algorithmic Complexity**: Big-O analysis and scaling behavior understanding
|
|
- **Conceptual Profiling**: "This is slow because..." explanations with basic measurements
|
|
- **Production Context**: "PyTorch optimizes this using..." comparisons
|
|
- **Why**: Students understand performance implications without micro-optimization details
|
|
|
|
## 📚 Learning Progression Strategy
|
|
|
|
### **Foundation Modules (01-04): Maximum Simplicity**
|
|
- **Focus**: "Can I build this component?"
|
|
- **Assumptions**: Perfect inputs, minimal error handling
|
|
- **Goal**: Build confidence and core understanding
|
|
|
|
### **Systems Modules (05-11): Controlled Complexity**
|
|
- **Focus**: "Why does this design choice matter?"
|
|
- **Assumptions**: Add memory/performance analysis
|
|
- **Goal**: Systems thinking through measurement
|
|
|
|
### **Integration Modules (12-16): Realistic Complexity**
|
|
- **Focus**: "How do I debug and optimize?"
|
|
- **Assumptions**: Real-world constraints and trade-offs
|
|
- **Goal**: Production readiness
|
|
|
|
## 🎯 Specific Implementation Guidelines
|
|
|
|
### **Type System Implementation**
|
|
```python
|
|
# ✅ TINYTORCH APPROACH
|
|
def tensor(data, dtype="float32", requires_grad=False):
|
|
"""Create tensor with educational simplicity."""
|
|
|
|
# ❌ PRODUCTION COMPLEXITY
|
|
def tensor(data: Any, dtype: Optional[Union[str, np.dtype, type]] = None):
|
|
"""Complex type handling that blocks student learning."""
|
|
```
|
|
|
|
### **Error Handling Implementation**
|
|
```python
|
|
# ✅ TINYTORCH APPROACH
|
|
assert len(data) > 0, "Empty data not supported. Provide at least one element."
|
|
|
|
# ❌ PRODUCTION COMPLEXITY
|
|
try:
|
|
validate_comprehensive_inputs(data)
|
|
except (ValueError, TypeError, RuntimeError) as e:
|
|
handle_specific_error_cases(e)
|
|
```
|
|
|
|
### **Memory Analysis Implementation**
|
|
```python
|
|
# ✅ TINYTORCH APPROACH
|
|
def analyze_memory_efficiency():
|
|
"""Conceptual understanding of memory patterns."""
|
|
print("Contiguous arrays are faster because CPU cache loads 64-byte chunks")
|
|
print("Non-contiguous access = cache misses = slower performance")
|
|
|
|
# ❌ PRODUCTION COMPLEXITY
|
|
import tracemalloc, psutil
|
|
def detailed_memory_profiling():
|
|
# Complex profiling that students can't implement
|
|
```
|
|
|
|
## 🔍 Quality Assurance Framework
|
|
|
|
### **Implementation Success Metrics**
|
|
- **85%+ completion rate**: Students can finish implementations
|
|
- **2-3 hour module time**: Completable in one focused session
|
|
- **Conceptual transfer**: Students understand "why" not just "how"
|
|
- **PyTorch recognition**: Students can read production framework code
|
|
|
|
### **Complexity Warning Signs**
|
|
- **<50% completion rate**: Too complex, needs simplification
|
|
- **>3x time variance**: Implementation barriers blocking some students
|
|
- **Syntax focus**: Students ask "what to write" vs "why does this work"
|
|
- **Copy-paste behavior**: Students copy without understanding
|
|
|
|
## 🔗 Production Context Integration
|
|
|
|
### **"In Production..." Sidebars**
|
|
Every module includes production context without implementation complexity:
|
|
|
|
```markdown
|
|
💡 **Production Reality**: PyTorch tensors handle 47+ dtype formats with complex validation. Our string-based approach teaches the core concept that dtypes matter for memory usage and performance, which transfers directly to understanding torch.float32, torch.int64, etc.
|
|
```
|
|
|
|
### **Transfer Readiness Goals**
|
|
Students completing TinyTorch should:
|
|
- Recognize PyTorch/TensorFlow patterns and design choices
|
|
- Understand why production systems make certain trade-offs
|
|
- Appreciate the complexity that frameworks abstract away
|
|
- Debug performance issues using systems thinking
|
|
|
|
## 📋 Module-Level Assumption Documentation
|
|
|
|
### **Standard Module Header**
|
|
```python
|
|
# %% [markdown]
|
|
"""
|
|
## 🎯 Module Assumptions
|
|
|
|
For this module, we assume:
|
|
- [Specific assumption with educational rationale]
|
|
- [What this enables us to focus on]
|
|
- [Production context reference]
|
|
|
|
These assumptions let us focus on [core learning objective] without [specific complexity].
|
|
"""
|
|
```
|
|
|
|
### **Method-Level Assumption Documentation**
|
|
```python
|
|
def core_method(self, input_data):
|
|
"""
|
|
Implement [specific functionality].
|
|
|
|
TINYTORCH ASSUMPTIONS:
|
|
- Input data is well-formed (educational focus)
|
|
- Memory is sufficient for operation (no out-of-memory handling)
|
|
- Single-threaded execution (algorithmic clarity)
|
|
|
|
These assumptions let us focus on [core concept] implementation.
|
|
"""
|
|
```
|
|
|
|
## 🔄 Continuous Improvement Process
|
|
|
|
### **Assessment Checkpoints**
|
|
- **Week 3, 6, 9, 12**: Student feedback on implementation challenges
|
|
- **Module completion data**: Track completion rates and time-to-completion
|
|
- **Learning outcome assessment**: Can students read PyTorch implementations?
|
|
|
|
### **Iteration Strategy**
|
|
1. **Monitor implementation success rates** across modules
|
|
2. **Gather qualitative feedback** on complexity appropriateness
|
|
3. **Adjust assumptions** based on real student performance data
|
|
4. **Document changes** and rationale for future semesters
|
|
|
|
## 🎯 Success Definition
|
|
|
|
**TinyTorch achieves the right complexity balance when:**
|
|
- Students spend 80% of time thinking about ML systems concepts
|
|
- Students spend 20% of time on implementation mechanics
|
|
- Students complete implementations successfully and understand why they work
|
|
- Students can read and appreciate production ML framework code
|
|
|
|
**The goal**: Students should think "I understand how PyTorch works and why they made these design choices" not "This is too complicated to implement" or "This is just a toy that doesn't relate to real systems."
|
|
|
|
---
|
|
|
|
*This document guides all TinyTorch development decisions. When in doubt, prioritize student learning success while preserving essential ML systems concepts.* |