# --- # jupyter: # jupytext: # text_representation: # extension: .py # format_name: percent # format_version: '1.3' # jupytext_version: 1.17.1 # kernelspec: # display_name: Python 3 (ipykernel) # language: python # name: python3 # --- # %% [markdown] """ # Module 20: TinyTorch Olympics - Competition & Submission Welcome to the capstone module of TinyTorch! You've built an entire ML framework from scratch across 19 modules. Now it's time to compete in **TinyTorch Olympics** - demonstrating your optimization skills and generating professional competition submissions. ## ๐Ÿ”— Prerequisites & Progress **You've Built**: Complete ML framework with benchmarking infrastructure (Module 19) **You'll Build**: Competition workflow, submission generation, and event configuration **You'll Enable**: Professional ML competition participation and standardized submission packaging **Connection Map**: ``` Modules 01-19 โ†’ Benchmarking (M19) โ†’ Competition Workflow (M20) (Foundation) (Measurement) (Submission) ``` ## Learning Objectives By the end of this capstone, you will: 1. **Understand** competition events and how to configure your submission 2. **Use** the benchmarking harness from Module 19 to measure performance 3. **Generate** standardized competition submissions (MLPerf-style JSON) 4. **Validate** submissions meet competition requirements 5. **Package** your work professionally for competition participation **Key Insight**: This module teaches the workflow and packaging - you use the benchmarking tools from Module 19 and optimization techniques from Modules 14-18. The focus is on how to compete, not how to build models (that's Milestone 05). """ # %% [markdown] """ ## ๐Ÿ“ฆ Where This Code Lives in the Final Package **Learning Side:** You work in `modules/20_capstone/capstone_dev.py` **Building Side:** Code exports to `tinytorch.competition.submit` ```python # How to use this module: from tinytorch.competition.submit import OlympicEvent, generate_submission from tinytorch.benchmarking import Benchmark # From Module 19 # Use benchmarking harness from Module 19 benchmark = Benchmark([my_model], [{"name": "my_model"}]) results = benchmark.run_latency_benchmark() # Generate competition submission submission = generate_submission( event=OlympicEvent.LATENCY_SPRINT, benchmark_results=results ) ``` **Why this matters:** - **Learning:** Complete competition workflow using benchmarking tools from Module 19 - **Production:** Professional submission format following MLPerf-style standards - **Consistency:** Standardized competition framework for fair comparison - **Integration:** Uses benchmarking harness (Module 19) + optimization techniques (Modules 14-18) """ # %% nbgrader={"grade": false, "grade_id": "exports", "solution": true} #| default_exp competition.submit #| export # %% [markdown] """ ## ๐Ÿ”ฎ Introduction: From Measurement to Competition Over the past 19 modules, you've built the complete infrastructure for modern ML: **Foundation (Modules 01-04):** Tensors, activations, layers, and losses **Training (Modules 05-07):** Automatic differentiation, optimizers, and training loops **Architecture (Modules 08-09):** Spatial processing and data loading **Language (Modules 10-14):** Text processing, embeddings, attention, transformers, and KV caching **Optimization (Modules 15-19):** Profiling, acceleration, quantization, compression, and benchmarking In Module 19, you built a benchmarking harness with statistical rigor. Now in Module 20, you'll use that harness to participate in **TinyTorch Olympics** - a competition framework that demonstrates professional ML systems evaluation. ``` Your Journey: Build Framework โ†’ Optimize โ†’ Benchmark โ†’ Compete (Modules 01-18) (M14-18) (Module 19) (Module 20) ``` This capstone teaches the workflow of professional ML competitions - how to measure, compare, and submit your work following industry standards. """ # %% [markdown] """ ## ๐Ÿ“Š Competition Workflow: From Measurement to Submission This capstone demonstrates the complete workflow of professional ML competitions. You'll use the benchmarking harness from Module 19 to measure performance and generate standardized submissions. ### TinyTorch Olympics Competition Flow ``` ๐Ÿ… TINYTORCH OLYMPICS COMPETITION WORKFLOW ๐Ÿ… โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ STEP 1: CHOOSE YOUR EVENT โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ ๐Ÿƒ Latency Sprint โ†’ Minimize inference time (accuracy โ‰ฅ 85%) โ”‚ โ”‚ ๐Ÿ‹๏ธ Memory Challenge โ†’ Minimize model size (accuracy โ‰ฅ 85%) โ”‚ โ”‚ ๐ŸŽฏ Accuracy Contest โ†’ Maximize accuracy (latency < 100ms, memory < 10MB) โ”‚ โ”‚ ๐Ÿ‹๏ธโ€โ™‚๏ธ All-Around โ†’ Best balanced performance โ”‚ โ”‚ ๐Ÿš€ Extreme Push โ†’ Most aggressive optimization (accuracy โ‰ฅ 80%) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ STEP 2: MEASURE BASELINE (Module 19 Harness) โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ Baseline Model โ†’ [Benchmark] โ†’ Statistical Results โ”‚ โ”‚ (Module 19) โ”‚ โ”‚ โ”‚ โ”‚ Benchmark Output: โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ Latency: 45.2ms ยฑ 2.1ms (95% CI: [43.1, 47.3]) โ”‚ โ”‚ โ”‚ โ”‚ Memory: 12.4MB โ”‚ โ”‚ โ”‚ โ”‚ Accuracy: 85.0% โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ STEP 3: OPTIMIZE (Modules 14-18 Techniques) โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ Baseline โ†’ [Quantization] โ†’ [Pruning] โ†’ [Other Optimizations] โ†’ Optimized Model โ”‚ โ”‚ (Module 17) (Module 18) (Modules 14-16) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ STEP 4: MEASURE OPTIMIZED (Module 19 Harness Again) โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ Optimized Model โ†’ [Benchmark] โ†’ Statistical Results โ”‚ โ”‚ (Module 19) โ”‚ โ”‚ โ”‚ โ”‚ Benchmark Output: โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ Latency: 22.1ms ยฑ 1.2ms (95% CI: [20.9, 23.3]) โœ… 2.0x faster โ”‚ โ”‚ โ”‚ โ”‚ Memory: 1.24MB โœ… 10.0x smaller โ”‚ โ”‚ โ”‚ โ”‚ Accuracy: 83.5% (ฮ” -1.5pp) โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ STEP 5: GENERATE SUBMISSION (Module 20) โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ Benchmark Results โ†’ [generate_submission()] โ†’ submission.json โ”‚ โ”‚ (from Module 19) (Module 20) โ”‚ โ”‚ โ”‚ โ”‚ Submission JSON includes: โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ€ข Event type (Latency Sprint, Memory Challenge, etc.) โ”‚ โ”‚ โ”‚ โ”‚ โ€ข Baseline metrics (from Step 2) โ”‚ โ”‚ โ”‚ โ”‚ โ€ข Optimized metrics (from Step 4) โ”‚ โ”‚ โ”‚ โ”‚ โ€ข Normalized scores (speedup, compression, efficiency) โ”‚ โ”‚ โ”‚ โ”‚ โ€ข System information (hardware, OS, Python version) โ”‚ โ”‚ โ”‚ โ”‚ โ€ข Validation status โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ### Competition Workflow Summary **The Complete Process:** 1. **Choose Event**: Select your competition category based on optimization goals 2. **Measure Baseline**: Use Benchmark harness from Module 19 to establish baseline 3. **Optimize**: Apply techniques from Modules 14-18 (quantization, pruning, etc.) 4. **Measure Optimized**: Use Benchmark harness again to measure improvements 5. **Generate Submission**: Create standardized JSON submission file **Key Principle**: Module 20 provides the workflow and submission format. You use: - **Benchmarking tools** from Module 19 (measurement) - **Optimization techniques** from Modules 14-18 (improvement) - **Competition framework** from Module 20 (packaging) """ # %% nbgrader={"grade": false, "grade_id": "imports", "solution": true} import numpy as np import json from pathlib import Path from typing import Dict, List, Tuple, Optional, Any # Import competition and benchmarking modules ### BEGIN SOLUTION # Module 19: Benchmarking harness (for measurement) from tinytorch.benchmarking.benchmark import Benchmark, BenchmarkResult # Module 17-18: Optimization techniques (for applying optimizations) from tinytorch.optimization.quantization import quantize_model from tinytorch.optimization.compression import magnitude_prune # System information for submission metadata import platform import sys ### END SOLUTION print("โœ… Competition modules imported!") print("๐Ÿ“Š Ready to use Benchmark harness from Module 19") # %% [markdown] """ ## 1. Introduction: Understanding Competition Events TinyTorch Olympics offers five different competition events, each with different optimization objectives and constraints. Understanding these events helps you choose the right strategy and configure your submission correctly. """ # %% nbgrader={"grade": false, "grade_id": "olympic-events", "solution": true} #| export from enum import Enum class OlympicEvent(Enum): """ TinyTorch Olympics event categories. Each event optimizes for different objectives with specific constraints. Students choose their event and compete for medals! """ LATENCY_SPRINT = "latency_sprint" # Minimize latency (accuracy >= 85%) MEMORY_CHALLENGE = "memory_challenge" # Minimize memory (accuracy >= 85%) ACCURACY_CONTEST = "accuracy_contest" # Maximize accuracy (latency < 100ms, memory < 10MB) ALL_AROUND = "all_around" # Best balanced score across all metrics EXTREME_PUSH = "extreme_push" # Most aggressive optimization (accuracy >= 80%) # %% [markdown] """ ## 2. Competition Workflow: Using the Benchmarking Harness Module 19 provides the benchmarking harness. Module 20 shows you how to use it in a competition context. Let's walk through the complete workflow. """ # %% nbgrader={"grade": false, "grade_id": "normalized-scoring", "solution": true} #| export def calculate_normalized_scores(baseline_results: dict, optimized_results: dict) -> dict: """ Calculate normalized performance metrics for fair competition comparison. This function converts absolute measurements into relative improvements, enabling fair comparison across different hardware platforms. Args: baseline_results: Dict with keys: 'latency', 'memory', 'accuracy' optimized_results: Dict with same keys as baseline_results Returns: Dict with normalized metrics: - speedup: Relative latency improvement (higher is better) - compression_ratio: Relative memory reduction (higher is better) - accuracy_delta: Absolute accuracy change (closer to 0 is better) - efficiency_score: Combined metric balancing all factors Example: >>> baseline = {'latency': 100.0, 'memory': 12.0, 'accuracy': 0.89} >>> optimized = {'latency': 40.0, 'memory': 3.0, 'accuracy': 0.87} >>> scores = calculate_normalized_scores(baseline, optimized) >>> print(f"Speedup: {scores['speedup']:.2f}x") Speedup: 2.50x """ # Calculate speedup (higher is better) speedup = baseline_results['latency'] / optimized_results['latency'] # Calculate compression ratio (higher is better) compression_ratio = baseline_results['memory'] / optimized_results['memory'] # Calculate accuracy delta (closer to 0 is better, negative means degradation) accuracy_delta = optimized_results['accuracy'] - baseline_results['accuracy'] # Calculate efficiency score (combined metric) # Penalize accuracy loss: the more accuracy you lose, the lower your score accuracy_penalty = max(1.0, 1.0 - accuracy_delta) if accuracy_delta < 0 else 1.0 efficiency_score = (speedup * compression_ratio) / accuracy_penalty return { 'speedup': speedup, 'compression_ratio': compression_ratio, 'accuracy_delta': accuracy_delta, 'efficiency_score': efficiency_score, 'baseline': baseline_results.copy(), 'optimized': optimized_results.copy() } # %% [markdown] """ ## 3. Submission Generation: Creating Competition Submissions Now let's build the submission generation function that uses the Benchmark harness from Module 19 and creates standardized competition submissions. """ # %% [markdown] """ ## ๐Ÿ—๏ธ Stage 1: Competition Workflow - Complete Example Let's walk through a complete competition workflow example. This demonstrates how to use the Benchmark harness from Module 19 to measure performance and generate submissions. ### Complete Competition Workflow Example Here's a step-by-step example showing how to participate in TinyTorch Olympics: **Step 1: Choose Your Event** ```python from tinytorch.competition.submit import OlympicEvent event = OlympicEvent.LATENCY_SPRINT # Focus on speed ``` **Step 2: Measure Baseline Using Module 19's Benchmark** ```python from tinytorch.benchmarking import Benchmark # Create benchmark harness (from Module 19) benchmark = Benchmark([baseline_model], [{"name": "baseline"}]) # Run latency benchmark with statistical rigor baseline_results = benchmark.run_latency_benchmark() # Returns: BenchmarkResult with mean, std, confidence intervals ``` **Step 3: Apply Optimizations (Modules 14-18)** ```python from tinytorch.optimization.quantization import quantize_model from tinytorch.optimization.compression import magnitude_prune optimized = quantize_model(baseline_model, bits=8) optimized = magnitude_prune(optimized, sparsity=0.6) ``` **Step 4: Measure Optimized Model** ```python benchmark_opt = Benchmark([optimized], [{"name": "optimized"}]) optimized_results = benchmark_opt.run_latency_benchmark() ``` **Step 5: Generate Submission** ```python from tinytorch.competition.submit import generate_submission submission = generate_submission( event=OlympicEvent.LATENCY_SPRINT, baseline_results=baseline_results, optimized_results=optimized_results ) # Creates submission.json with all required fields ``` ### Key Workflow Principles **1. Use Module 19's Benchmark Harness**: All measurements use the same statistical rigor **2. Apply Optimizations Systematically**: Use techniques from Modules 14-18 **3. Generate Standardized Submissions**: Module 20 provides the submission format **4. Validate Before Submitting**: Ensure your submission meets event requirements Let's implement the submission generation function that ties everything together. """ # %% nbgrader={"grade": false, "grade_id": "submission-generation", "solution": true} #| export def generate_submission(baseline_results: Dict[str, Any], optimized_results: Dict[str, Any], event: OlympicEvent = OlympicEvent.ALL_AROUND, athlete_name: str = "YourName", github_repo: str = "", techniques: List[str] = None) -> Dict[str, Any]: """ Generate standardized TinyTorch Olympics competition submission. This function uses Benchmark results from Module 19 and creates a standardized submission JSON following MLPerf-style format. Args: baseline_results: Dict with 'latency', 'memory', 'accuracy' from Benchmark optimized_results: Dict with same keys as baseline_results event: OlympicEvent enum specifying competition category athlete_name: Your name for submission github_repo: GitHub repository URL (optional) techniques: List of optimization techniques applied Returns: Submission dictionary ready to be saved as JSON Example: >>> baseline = {'latency': 100.0, 'memory': 12.0, 'accuracy': 0.85} >>> optimized = {'latency': 40.0, 'memory': 3.0, 'accuracy': 0.83} >>> submission = generate_submission(baseline, optimized, OlympicEvent.LATENCY_SPRINT) >>> submission['normalized_scores']['speedup'] 2.5 """ ### BEGIN SOLUTION # Calculate normalized scores normalized = calculate_normalized_scores(baseline_results, optimized_results) # Gather system information system_info = { 'platform': platform.platform(), 'processor': platform.processor(), 'python_version': sys.version.split()[0], 'timestamp': time.strftime('%Y-%m-%d %H:%M:%S') } # Create submission dictionary submission = { 'submission_version': '1.0', 'event': event.value, 'athlete_name': athlete_name, 'github_repo': github_repo, 'baseline': baseline_results.copy(), 'optimized': optimized_results.copy(), 'normalized_scores': { 'speedup': normalized['speedup'], 'compression_ratio': normalized['compression_ratio'], 'accuracy_delta': normalized['accuracy_delta'], 'efficiency_score': normalized['efficiency_score'] }, 'techniques_applied': techniques or [], 'system_info': system_info, 'timestamp': system_info['timestamp'] } return submission ### END SOLUTION # %% nbgrader={"grade": false, "grade_id": "submission-validation", "solution": true} #| export def validate_submission(submission: Dict[str, Any]) -> Dict[str, Any]: """ Validate competition submission meets requirements. Args: submission: Submission dictionary to validate Returns: Dict with 'valid' (bool), 'checks' (list), 'warnings' (list), 'errors' (list) """ ### BEGIN SOLUTION checks = [] warnings = [] errors = [] # Check required fields required_fields = ['event', 'baseline', 'optimized', 'normalized_scores'] for field in required_fields: if field not in submission: errors.append(f"Missing required field: {field}") else: checks.append(f"โœ… {field} present") # Validate event constraints event = submission.get('event') normalized = submission.get('normalized_scores', {}) optimized = submission.get('optimized', {}) if event == OlympicEvent.LATENCY_SPRINT.value: if optimized.get('accuracy', 0) < 0.85: errors.append(f"Latency Sprint requires accuracy >= 85%, got {optimized.get('accuracy', 0)*100:.1f}%") else: checks.append(f"โœ… Accuracy constraint met: {optimized.get('accuracy', 0)*100:.1f}% >= 85%") elif event == OlympicEvent.MEMORY_CHALLENGE.value: if optimized.get('accuracy', 0) < 0.85: errors.append(f"Memory Challenge requires accuracy >= 85%, got {optimized.get('accuracy', 0)*100:.1f}%") else: checks.append(f"โœ… Accuracy constraint met: {optimized.get('accuracy', 0)*100:.1f}% >= 85%") elif event == OlympicEvent.ACCURACY_CONTEST.value: if optimized.get('latency', float('inf')) >= 100.0: errors.append(f"Accuracy Contest requires latency < 100ms, got {optimized.get('latency', 0):.1f}ms") elif optimized.get('memory', float('inf')) >= 10.0: errors.append(f"Accuracy Contest requires memory < 10MB, got {optimized.get('memory', 0):.2f}MB") else: checks.append("โœ… Latency and memory constraints met") elif event == OlympicEvent.EXTREME_PUSH.value: if optimized.get('accuracy', 0) < 0.80: errors.append(f"Extreme Push requires accuracy >= 80%, got {optimized.get('accuracy', 0)*100:.1f}%") else: checks.append(f"โœ… Accuracy constraint met: {optimized.get('accuracy', 0)*100:.1f}% >= 80%") # Check for unrealistic improvements if normalized.get('speedup', 1.0) > 50: errors.append(f"Speedup {normalized['speedup']:.1f}x seems unrealistic (>50x)") elif normalized.get('speedup', 1.0) > 20: warnings.append(f"โš ๏ธ Very high speedup {normalized['speedup']:.1f}x - please verify") if normalized.get('compression_ratio', 1.0) > 32: errors.append(f"Compression {normalized['compression_ratio']:.1f}x seems unrealistic (>32x)") elif normalized.get('compression_ratio', 1.0) > 16: warnings.append(f"โš ๏ธ Very high compression {normalized['compression_ratio']:.1f}x - please verify") return { 'valid': len(errors) == 0, 'checks': checks, 'warnings': warnings, 'errors': errors } ### END SOLUTION def test_unit_submission_generation(): """๐Ÿ”ฌ Test submission generation.""" print("๐Ÿ”ฌ Unit Test: Submission Generation...") baseline = {'latency': 100.0, 'memory': 12.0, 'accuracy': 0.85} optimized = {'latency': 40.0, 'memory': 3.0, 'accuracy': 0.83} submission = generate_submission( baseline_results=baseline, optimized_results=optimized, event=OlympicEvent.LATENCY_SPRINT, athlete_name="TestUser", techniques=["quantization_int8", "pruning_60"] ) assert submission['event'] == 'latency_sprint' assert submission['normalized_scores']['speedup'] == 2.5 assert submission['normalized_scores']['compression_ratio'] == 4.0 assert 'system_info' in submission # Test validation validation = validate_submission(submission) assert validation['valid'] == True print("โœ… Submission generation works correctly!") test_unit_submission_generation() # %% [markdown] """ ## 4. Complete Workflow Example Now let's see a complete example that demonstrates the full competition workflow from start to finish. """ # %% nbgrader={"grade": false, "grade_id": "complete-workflow", "solution": true} def demonstrate_competition_workflow(): """ Complete competition workflow demonstration. This shows how to: 1. Choose an event 2. Measure baseline using Module 19's Benchmark 3. Apply optimizations 4. Measure optimized model 5. Generate and validate submission """ ### BEGIN SOLUTION print("๐Ÿ… TinyTorch Olympics - Complete Workflow Demonstration") print("=" * 70) # Step 1: Choose event event = OlympicEvent.LATENCY_SPRINT print(f"\n๐Ÿ“‹ Step 1: Chosen Event: {event.value.replace('_', ' ').title()}") # Step 2: Create mock baseline model (in real workflow, use your actual model) class MockModel: def __init__(self, name): self.name = name def forward(self, x): time.sleep(0.001) # Simulate computation return np.random.rand(10) baseline_model = MockModel("baseline_cnn") # Step 3: Measure baseline using Benchmark from Module 19 print("\n๐Ÿ“Š Step 2: Measuring Baseline (using Module 19 Benchmark)...") benchmark = Benchmark([baseline_model], [{"name": "baseline"}]) # In real workflow, this would run actual benchmarks baseline_metrics = {'latency': 45.2, 'memory': 12.4, 'accuracy': 0.85} print(f" Baseline Latency: {baseline_metrics['latency']:.1f}ms") print(f" Baseline Memory: {baseline_metrics['memory']:.2f}MB") print(f" Baseline Accuracy: {baseline_metrics['accuracy']:.1%}") # Step 4: Apply optimizations (Modules 14-18) print("\n๐Ÿ”ง Step 3: Applying Optimizations...") print(" - Quantization (INT8): 4x memory reduction") print(" - Pruning (60%): Additional compression") optimized_model = MockModel("optimized_cnn") optimized_metrics = {'latency': 22.1, 'memory': 1.24, 'accuracy': 0.835} print(f" Optimized Latency: {optimized_metrics['latency']:.1f}ms") print(f" Optimized Memory: {optimized_metrics['memory']:.2f}MB") print(f" Optimized Accuracy: {optimized_metrics['accuracy']:.1%}") # Step 5: Measure optimized (using Benchmark again) print("\n๐Ÿ“Š Step 4: Measuring Optimized Model (using Module 19 Benchmark)...") benchmark_opt = Benchmark([optimized_model], [{"name": "optimized"}]) # Results already calculated above # Step 6: Generate submission print("\n๐Ÿ“ค Step 5: Generating Submission...") submission = generate_submission( baseline_results=baseline_metrics, optimized_results=optimized_metrics, event=event, athlete_name="DemoUser", techniques=["quantization_int8", "magnitude_prune_0.6"] ) # Step 7: Validate submission print("\n๐Ÿ” Step 6: Validating Submission...") validation = validate_submission(submission) for check in validation['checks']: print(f" {check}") for warning in validation['warnings']: print(f" {warning}") for error in validation['errors']: print(f" {error}") if validation['valid']: print("\nโœ… Submission is valid!") # Save submission output_file = Path("submission.json") with open(output_file, 'w') as f: json.dump(submission, f, indent=2) print(f"๐Ÿ“„ Submission saved to: {output_file}") # Display normalized scores print("\n๐Ÿ“Š Normalized Scores:") scores = submission['normalized_scores'] print(f" Speedup: {scores['speedup']:.2f}x faster โšก") print(f" Compression: {scores['compression_ratio']:.2f}x smaller ๐Ÿ’พ") print(f" Accuracy ฮ”: {scores['accuracy_delta']:+.2f}pp") print(f" Efficiency Score: {scores['efficiency_score']:.2f}") else: print("\nโŒ Submission has errors - please fix before submitting") print("\n" + "=" * 70) print("๐ŸŽ‰ Competition workflow demonstration complete!") ### END SOLUTION demonstrate_competition_workflow() # %% [markdown] """ ## 5. Module Integration Test Final comprehensive test validating the competition workflow works correctly. """ # %% nbgrader={"grade": true, "grade_id": "test_module", "locked": true, "points": 20} def test_module(): """ Comprehensive test of entire competition module functionality. This final test runs before module summary to ensure: - OlympicEvent enum works correctly - calculate_normalized_scores computes correctly - generate_submission creates valid submissions - validate_submission checks requirements properly - Complete workflow demonstration executes """ print("๐Ÿงช RUNNING MODULE INTEGRATION TEST") print("=" * 60) # Test 1: OlympicEvent enum print("๐Ÿ”ฌ Testing OlympicEvent enum...") assert OlympicEvent.LATENCY_SPRINT.value == "latency_sprint" assert OlympicEvent.MEMORY_CHALLENGE.value == "memory_challenge" assert OlympicEvent.ALL_AROUND.value == "all_around" print(" โœ… OlympicEvent enum works") # Test 2: Normalized scoring print("\n๐Ÿ”ฌ Testing normalized scoring...") baseline = {'latency': 100.0, 'memory': 12.0, 'accuracy': 0.85} optimized = {'latency': 40.0, 'memory': 3.0, 'accuracy': 0.83} scores = calculate_normalized_scores(baseline, optimized) assert abs(scores['speedup'] - 2.5) < 0.01 assert abs(scores['compression_ratio'] - 4.0) < 0.01 print(" โœ… Normalized scoring works") # Test 3: Submission generation print("\n๐Ÿ”ฌ Testing submission generation...") submission = generate_submission( baseline_results=baseline, optimized_results=optimized, event=OlympicEvent.LATENCY_SPRINT, athlete_name="TestUser" ) assert submission['event'] == 'latency_sprint' assert 'normalized_scores' in submission assert 'system_info' in submission print(" โœ… Submission generation works") # Test 4: Submission validation print("\n๐Ÿ”ฌ Testing submission validation...") validation = validate_submission(submission) assert validation['valid'] == True assert len(validation['checks']) > 0 print(" โœ… Submission validation works") # Test 5: Complete workflow print("\n๐Ÿ”ฌ Testing complete workflow...") demonstrate_competition_workflow() print(" โœ… Complete workflow works") print("\n" + "=" * 60) print("๐ŸŽ‰ ALL COMPETITION MODULE TESTS PASSED!") print("โœ… Competition workflow fully functional!") print("๐Ÿ“Š Ready to generate submissions!") print("\nRun: tito module complete 20") # Call the comprehensive test test_module() # %% nbgrader={"grade": false, "grade_id": "main_execution", "solution": false} if __name__ == "__main__": print("๐Ÿš€ Running TinyTorch Olympics Competition module...") # Run the comprehensive test test_module() print("\nโœ… Competition module ready!") print("๐Ÿ“ค Use generate_submission() to create your competition entry!") # %% [markdown] """ ## ๐Ÿค” ML Systems Thinking: Competition Workflow Reflection This capstone teaches the workflow of professional ML competitions. Let's reflect on the systems thinking behind competition participation. ### Question 1: Statistical Confidence You use Module 19's Benchmark harness which runs multiple trials and reports confidence intervals. If baseline latency is 50ms ยฑ 5ms and optimized is 25ms ยฑ 3ms, can you confidently claim improvement? **Answer:** [Yes/No] _______ **Reasoning:** Consider whether confidence intervals overlap and what that means for statistical significance. ### Question 2: Event Selection Strategy Different Olympic events have different constraints (Latency Sprint: accuracy โ‰ฅ 85%, Extreme Push: accuracy โ‰ฅ 80%). If your optimization reduces accuracy from 87% to 82%, which events can you still compete in? **Answer:** _______ **Reasoning:** Check which events' accuracy constraints you still meet. ### Question 3: Normalized Scoring Normalized scores enable fair comparison across hardware. If Baseline A runs on fast GPU (10ms) and Baseline B runs on slow CPU (100ms), both optimized to 5ms: - Which has better absolute time? _______ - Which has better speedup? _______ - Why does normalized scoring matter? _______ ### Question 4: Submission Validation Your validate_submission() function checks event constraints and flags unrealistic improvements. If someone claims 100ร— speedup, what should the validation do? **Answer:** _______ **Reasoning:** Consider how to balance catching errors vs allowing legitimate breakthroughs. ### Question 5: Workflow Integration Module 20 uses Benchmark from Module 19 and optimization techniques from Modules 14-18. What's the key insight about how these modules work together? a) Each module is independent b) Module 20 provides workflow that uses tools from other modules c) You need to rebuild everything in Module 20 d) Competition is separate from benchmarking **Answer:** _______ **Explanation:** Module 20 teaches workflow and packaging - you use existing tools, not rebuild them. """ # %% [markdown] """ ## ๐ŸŽฏ MODULE SUMMARY: TinyTorch Olympics - Competition & Submission Congratulations! You've completed the capstone module - learning how to participate in professional ML competitions! ### Key Accomplishments - **Understood competition events** and how to choose the right event for your optimization goals - **Used Benchmark harness** from Module 19 to measure performance with statistical rigor - **Generated standardized submissions** following MLPerf-style format - **Validated submissions** meet competition requirements - **Demonstrated complete workflow** from measurement to submission - All tests pass โœ… (validated by `test_module()`) ### Systems Insights Gained - **Competition workflow**: How professional ML competitions are structured and participated in - **Submission packaging**: How to format results for fair comparison and validation - **Event constraints**: How different events require different optimization strategies - **Workflow integration**: How to use benchmarking tools (Module 19) + optimization techniques (Modules 14-18) ### The Complete Journey ``` Module 01-18: Build ML Framework โ†“ Module 19: Learn Benchmarking Methodology โ†“ Module 20: Learn Competition Workflow โ†“ Milestone 05: Build TinyGPT (Historical Achievement) โ†“ Milestone 06: Torch Olympics (Optimization Competition) ``` ### Ready for Competition Your competition workflow demonstrates: - **Professional submission format** following industry standards (MLPerf-style) - **Statistical rigor** using Benchmark harness from Module 19 - **Event understanding** knowing which optimizations fit which events - **Validation mindset** ensuring submissions meet requirements before submitting **Export with:** `tito module complete 20` **Achievement Unlocked:** ๐Ÿ… **Competition Ready** - You know how to participate in professional ML competitions! You now understand how ML competitions work - from measurement to submission. The benchmarking tools you built in Module 19 and the optimization techniques from Modules 14-18 come together in Module 20's competition workflow. **What's Next:** - Build TinyGPT in Milestone 05 (historical achievement) - Compete in Torch Olympics (Milestone 06) using this workflow - Use `tito olympics submit` to generate your competition entry! """