From 6ae440399d84a489019df3a9302ba35746d7d432 Mon Sep 17 00:00:00 2001 From: Vijay Janapa Reddi Date: Wed, 9 Jul 2025 17:40:08 -0400 Subject: [PATCH] Refactors to use `.venv` for virtual environment Updates the project to use `.venv` as the standard virtual environment directory. This change: - Updates `.gitignore` to ignore `.venv/`. - Modifies the activation script to create and activate `.venv`. - Adjusts the `tito.py` script to check for `.venv`'s existence and activation. - Updates documentation and setup scripts to reflect the new virtual environment naming convention. This change streamlines environment management and aligns with common Python practices. --- .gitignore | 2 +- COURSE_GUIDE.md | 2 +- README.md | 65 +++--- bin/activate-tinytorch.sh | 9 +- bin/tito.py | 222 ++++++++++++++++----- {projects => modules}/setup/QUICKSTART.md | 14 +- {projects => modules}/setup/README.md | 0 {projects => modules}/setup/check_setup.py | 2 +- {projects => modules}/setup/create_env.py | 12 +- {projects => modules}/setup/test_setup.py | 0 nbdev.yaml | 33 +++ requirements.txt | 9 + 12 files changed, 262 insertions(+), 108 deletions(-) rename {projects => modules}/setup/QUICKSTART.md (85%) rename {projects => modules}/setup/README.md (100%) rename {projects => modules}/setup/check_setup.py (98%) rename {projects => modules}/setup/create_env.py (94%) rename {projects => modules}/setup/test_setup.py (100%) create mode 100644 nbdev.yaml diff --git a/.gitignore b/.gitignore index 16e45c8b..be6b700a 100644 --- a/.gitignore +++ b/.gitignore @@ -129,7 +129,7 @@ env.bak/ venv.bak/ # TinyTorch specific -tinytorch-env/ +.venv/ *.log logs/ checkpoints/ diff --git a/COURSE_GUIDE.md b/COURSE_GUIDE.md index c963d237..8fa85d30 100644 --- a/COURSE_GUIDE.md +++ b/COURSE_GUIDE.md @@ -33,7 +33,7 @@ Track your progress through the course: ### Daily Workflow ```bash cd TinyTorch -source tinytorch-env/bin/activate # Always activate first! +source .venv/bin/activate # Always activate first! python3 bin/tito.py info # Check system status ``` diff --git a/README.md b/README.md index d7c68943..1aade59e 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,6 @@ -# TinyπŸ”₯Torch -**_Build a Machine Learning System from Scratch._** +# TinyπŸ”₯Torch: Build a Machine Learning System from Scratch -TinyTorch is a pedagogical project designed to accompany the [*Machine Learning Systems*](https://mlsysbook.ai) textbook. - -Inspired by OS and compiler courses where students build entire systems from first principles, TinyTorch is designed to guide students through building a complete ML training and inference runtime system, from autograd to data pipelines, optimizers to profilers. You’ll implement **everything, entirely from scratch.** The intent is to train the next generation of AI systems engineers. +TinyTorch is a pedagogical project designed to accompany the [*Machine Learning Systems*](https://mlsysbook.ai) textbook. Inspired by OS and compiler courses where students build entire systems from first principles, TinyTorch guides you through building a complete ML training and inference runtime β€” from autograd to data pipelines, optimizers to profilers β€” **entirely from scratch**. This is not a PyTorch tutorial. In TinyTorch, you'll **write the components that frameworks like PyTorch are built on.** @@ -13,7 +10,7 @@ This is not a PyTorch tutorial. In TinyTorch, you'll **write the components that By the end of this project, you'll have implemented a fully functional ML system capable of: -- **Training neural networks** (MLPs, CNNs) on real datasets (MNIST, CIFAR-10) +- **Training neural networks** (MLPs, CNNs) on real datasets 10) - **Automatic differentiation** with a custom autograd engine - **Memory-efficient data loading** with custom DataLoader implementations - **Multiple optimization algorithms** (SGD, Adam, RMSprop) @@ -152,18 +149,18 @@ TinyTorch/ β”‚ β”œβ”€β”€ mnist.py β”‚ β”œβ”€β”€ cifar10.py β”‚ └── transforms.py -β”œβ”€β”€ projects/ # Component-specific projects -β”‚ β”œβ”€β”€ setup/ # Environment setup & onboarding -β”‚ β”œβ”€β”€ tensor/ # Basic tensor implementation -β”‚ β”œβ”€β”€ mlp/ # Multi-layer perceptron (manual backprop) -β”‚ β”œβ”€β”€ cnn/ # Convolutional neural networks (basic) -β”‚ β”œβ”€β”€ data/ # Data pipeline & loading -β”‚ β”œβ”€β”€ training/ # Autograd engine & training optimization -β”‚ β”œβ”€β”€ profiling/ # Performance profiling tools -β”‚ β”œβ”€β”€ compression/ # Model compression techniques -β”‚ β”œβ”€β”€ kernels/ # Custom compute kernels -β”‚ β”œβ”€β”€ benchmarking/ # Performance benchmarking -β”‚ └── mlops/ # MLOps & production monitoring +β”œβ”€β”€ modules/ # 🧩 System Modules +β”‚ β”œβ”€β”€ 01_setup/ # Environment setup & onboarding +β”‚ β”œβ”€β”€ 02_tensor/ # Basic tensor implementation +β”‚ β”œβ”€β”€ 03_mlp/ # Multi-layer perceptron (manual backprop) +β”‚ β”œβ”€β”€ 04_cnn/ # Convolutional neural networks (basic) +β”‚ β”œβ”€β”€ 05_data/ # Data pipeline & loading +β”‚ β”œβ”€β”€ 06_training/ # Autograd engine & training optimization +β”‚ β”œβ”€β”€ 07_profiling/ # Performance profiling tools +β”‚ β”œβ”€β”€ 08_compression/ # Model compression techniques +β”‚ β”œβ”€β”€ 09_kernels/ # Custom compute kernels +β”‚ β”œβ”€β”€ 10_benchmarking/ # Performance benchmarking +β”‚ └── 11_mlops/ # MLOps & production monitoring β”œβ”€β”€ docs/ # Course documentation β”‚ β”œβ”€β”€ tutorials/ # Step-by-step tutorials β”‚ β”œβ”€β”€ api/ # API documentation @@ -197,24 +194,24 @@ TinyTorch/ ## 🎯 Course Navigation & Getting Started -**New to TinyTorch?** Start here: [`projects/setup/README.md`](projects/setup/README.md) +**New to TinyTorch?** Start here: [`modules/01_setup/README.md`](modules/01_setup/README.md) -### πŸ“‹ Project Sequence -Each project builds on the previous ones. Click the links to jump to specific instructions: +### πŸ“‹ Module Sequence +Each module builds on the previous ones. Click the links to jump to specific instructions: -| Order | Project | Status | Description | Instructions | -|-------|---------|--------|-------------|--------------| -| 0 | **Setup** | πŸš€ **START HERE** | Environment & CLI setup | [`projects/setup/README.md`](projects/setup/README.md) | -| 1 | **Tensor** | ⏳ Coming Next | Basic tensor operations | [`projects/tensor/README.md`](projects/tensor/README.md) | -| 2 | **MLP** | ⏳ Future | Multi-layer perceptron (manual backprop) | [`projects/mlp/README.md`](projects/mlp/README.md) | -| 3 | **CNN** | ⏳ Future | Convolutional networks (basic) | [`projects/cnn/README.md`](projects/cnn/README.md) | -| 4 | **Data** | ⏳ Future | Data loading pipeline | [`projects/data/README.md`](projects/data/README.md) | -| 5 | **Training** | ⏳ Future | Autograd engine & optimization | [`projects/training/README.md`](projects/training/README.md) | -| 6 | **Profiling** | ⏳ Future | Performance profiling | [`projects/profiling/README.md`](projects/profiling/README.md) | -| 7 | **Compression** | ⏳ Future | Model compression | [`projects/compression/README.md`](projects/compression/README.md) | -| 8 | **Kernels** | ⏳ Future | Custom compute kernels | [`projects/kernels/README.md`](projects/kernels/README.md) | -| 9 | **Benchmarking** | ⏳ Future | Performance benchmarking | [`projects/benchmarking/README.md`](projects/benchmarking/README.md) | -| 10 | **MLOps** | ⏳ Future | Production monitoring | [`projects/mlops/README.md`](projects/mlops/README.md) | +| Order | Module | Status | Description | Instructions | +|-------|--------|--------|-------------|--------------| +| 0 | **Setup** | πŸš€ **START HERE** | Environment & CLI setup | [`modules/01_setup/README.md`](modules/01_setup/README.md) | +| 1 | **Tensor** | ⏳ Coming Next | Basic tensor operations | [`modules/02_tensor/README.md`](modules/02_tensor/README.md) | +| 2 | **MLP** | ⏳ Future | Multi-layer perceptron (manual backprop) | [`modules/03_mlp/README.md`](modules/03_mlp/README.md) | +| 3 | **CNN** | ⏳ Future | Convolutional networks (basic) | [`modules/04_cnn/README.md`](modules/04_cnn/README.md) | +| 4 | **Data** | ⏳ Future | Data loading pipeline | [`modules/05_data/README.md`](modules/05_data/README.md) | +| 5 | **Training** | ⏳ Future | Autograd engine & optimization | [`modules/06_training/README.md`](modules/06_training/README.md) | +| 6 | **Profiling** | ⏳ Future | Performance profiling | [`modules/07_profiling/README.md`](modules/07_profiling/README.md) | +| 7 | **Compression** | ⏳ Future | Model compression | [`modules/08_compression/README.md`](modules/08_compression/README.md) | +| 8 | **Kernels** | ⏳ Future | Custom compute kernels | [`modules/09_kernels/README.md`](modules/09_kernels/README.md) | +| 9 | **Benchmarking** | ⏳ Future | Performance benchmarking | [`modules/10_benchmarking/README.md`](modules/10_benchmarking/README.md) | +| 10 | **MLOps** | ⏳ Future | Production monitoring | [`modules/11_mlops/README.md`](modules/11_mlops/README.md) | ### πŸš€ Quick Start Guide **First time?** Follow this exact sequence: diff --git a/bin/activate-tinytorch.sh b/bin/activate-tinytorch.sh index 836e6ea4..124a9daf 100755 --- a/bin/activate-tinytorch.sh +++ b/bin/activate-tinytorch.sh @@ -2,14 +2,14 @@ # TinyTorch Environment Activation & Setup # Check if virtual environment exists, create if not -if [ ! -d "tinytorch-env" ]; then +if [ ! -d ".venv" ]; then echo "πŸ†• First time setup - creating environment..." - python3 -m venv tinytorch-env || { + python3 -m venv .venv || { echo "❌ Failed to create virtual environment" exit 1 } echo "πŸ“¦ Installing dependencies..." - tinytorch-env/bin/pip install -r requirements.txt || { + .venv/bin/pip install -r requirements.txt || { echo "❌ Failed to install dependencies" exit 1 } @@ -17,7 +17,7 @@ if [ ! -d "tinytorch-env" ]; then fi echo "πŸ”₯ Activating TinyTorch environment..." -source tinytorch-env/bin/activate +source .venv/bin/activate # Create tito alias for convenience alias tito="python3 bin/tito.py" @@ -27,3 +27,4 @@ echo "πŸ’‘ Quick commands:" echo " tito info - Check system status" echo " tito test - Run tests" echo " tito doctor - Diagnose issues" +echo " jupyter notebook - Start Jupyter for interactive development" diff --git a/bin/tito.py b/bin/tito.py index b5ff44e5..a8d44d9e 100755 --- a/bin/tito.py +++ b/bin/tito.py @@ -172,7 +172,7 @@ def validate_environment(): in_venv = (hasattr(sys, 'real_prefix') or (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix)) if not in_venv: - issues.append("Virtual environment not activated. Run: source tinytorch-env/bin/activate") + issues.append("Virtual environment not activated. Run: source .venv/bin/activate") # Check Python version if sys.version_info < (3, 8): @@ -221,7 +221,7 @@ def cmd_info(args): info_text.append(f"Working Directory: {os.getcwd()}\n", style="cyan") # Virtual environment check - use same robust detection as doctor - venv_path = Path("tinytorch-env") + venv_path = Path(".venv") venv_exists = venv_path.exists() in_venv = ( # Method 1: Check VIRTUAL_ENV environment variable (most reliable for activation) @@ -264,7 +264,7 @@ def cmd_info(args): console.print() # Implementation status - projects = [ + modules = [ ("Setup", "hello_tinytorch function", check_setup_status), ("Tensor", "basic tensor operations", check_tensor_status), ("MLP", "multi-layer perceptron (manual)", check_mlp_status), @@ -278,14 +278,14 @@ def cmd_info(args): ("MLOps", "production monitoring", check_mlops_status), ] - # Project Status Table - status_table = Table(title="πŸš€ Project Implementation Status", show_header=True, header_style="bold blue") + # Module Status Table + status_table = Table(title="πŸš€ Module Implementation Status", show_header=True, header_style="bold blue") status_table.add_column("ID", style="dim", width=3, justify="center") status_table.add_column("Project", style="bold cyan", width=12) status_table.add_column("Status", width=18, justify="center") status_table.add_column("Description", style="dim", width=40) - for i, (name, desc, check_func) in enumerate(projects): + for i, (name, desc, check_func) in enumerate(modules): status_text = check_func() if "βœ…" in status_text: status_style = "[green]βœ… Implemented[/green]" @@ -342,19 +342,19 @@ def cmd_info(args): console.print(Panel(arch_tree, title="πŸ—οΈ System Architecture", border_style="bright_blue")) def cmd_test(args): - """Run tests for a specific project.""" - valid_projects = ["setup", "tensor", "mlp", "cnn", "data", "training", - "profiling", "compression", "kernels", "benchmarking", "mlops"] + """Run tests for a specific module.""" + valid_modules = ["setup", "tensor", "mlp", "cnn", "data", "training", + "profiling", "compression", "kernels", "benchmarking", "mlops"] if args.all: # Run all tests with progress bar import subprocess - failed_projects = [] + failed_modules = [] # Count existing test files - existing_tests = [p for p in valid_projects if Path(f"projects/{p}/test_{p}.py").exists()] + existing_tests = [p for p in valid_modules if Path(f"modules/{p}/test_{p}.py").exists()] - console.print(Panel(f"πŸ§ͺ Running tests for {len(existing_tests)} projects", + console.print(Panel(f"πŸ§ͺ Running tests for {len(existing_tests)} modules", title="Test Suite", border_style="bright_cyan")) with Progress( @@ -367,24 +367,24 @@ def cmd_test(args): task = progress.add_task("Running tests...", total=len(existing_tests)) - for project in existing_tests: - progress.update(task, description=f"Testing {project}...") + for module in existing_tests: + progress.update(task, description=f"Testing {module}...") - test_file = f"projects/{project}/test_{project}.py" + test_file = f"modules/{module}/test_{module}.py" result = subprocess.run([sys.executable, "-m", "pytest", test_file, "-v"], capture_output=True, text=True) if result.returncode != 0: - failed_projects.append(project) - console.print(f"[red]❌ {project} tests failed[/red]") + failed_modules.append(module) + console.print(f"[red]❌ {module} tests failed[/red]") else: - console.print(f"[green]βœ… {project} tests passed[/green]") + console.print(f"[green]βœ… {module} tests passed[/green]") progress.advance(task) # Results summary - if failed_projects: - console.print(Panel(f"[red]❌ Failed projects: {', '.join(failed_projects)}[/red]", + if failed_modules: + console.print(Panel(f"[red]❌ Failed modules: {', '.join(failed_modules)}[/red]", title="Test Results", border_style="red")) return 1 else: @@ -392,17 +392,17 @@ def cmd_test(args): title="Test Results", border_style="green")) return 0 - elif args.project in valid_projects: - # Run specific project tests + elif args.module in valid_modules: + # Run specific module tests import subprocess - test_file = f"projects/{args.project}/test_{args.project}.py" + test_file = f"modules/{args.module}/test_{args.module}.py" - console.print(Panel(f"πŸ§ͺ Running tests for project: [bold cyan]{args.project}[/bold cyan]", - title="Single Project Test", border_style="bright_cyan")) + console.print(Panel(f"πŸ§ͺ Running tests for module: [bold cyan]{args.module}[/bold cyan]", + title="Single Module Test", border_style="bright_cyan")) if not Path(test_file).exists(): console.print(Panel(f"[yellow]⏳ Test file not found: {test_file}\n" - f"Project '{args.project}' may not be implemented yet.[/yellow]", + f"Module '{args.module}' may not be implemented yet.[/yellow]", title="Test Not Found", border_style="yellow")) return 1 @@ -414,36 +414,36 @@ def cmd_test(args): # Show result summary if result.returncode == 0: - console.print(Panel(f"[green]βœ… All tests passed for {args.project}![/green]", + console.print(Panel(f"[green]βœ… All tests passed for {args.module}![/green]", title="Test Results", border_style="green")) else: - console.print(Panel(f"[red]❌ Some tests failed for {args.project}[/red]", + console.print(Panel(f"[red]❌ Some tests failed for {args.module}[/red]", title="Test Results", border_style="red")) return result.returncode else: - console.print(Panel(f"[red]❌ Unknown project: {args.project}[/red]\n" - f"Valid projects: {', '.join(valid_projects)}", - title="Invalid Project", border_style="red")) + console.print(Panel(f"[red]❌ Unknown module: {args.module}[/red]\n" + f"Valid modules: {', '.join(valid_modules)}", + title="Invalid Module", border_style="red")) return 1 def cmd_submit(args): - """Submit project for grading.""" + """Submit module for grading.""" submit_text = Text() - submit_text.append(f"πŸ“€ Submitting project: {args.project}\n\n", style="bold cyan") + submit_text.append(f"πŸ“€ Submitting module: {args.module}\n\n", style="bold cyan") submit_text.append("🚧 Submission system not yet implemented.\n\n", style="yellow") submit_text.append("For now, make sure all tests pass with:\n", style="dim") - submit_text.append(f" python -m pytest projects/{args.project}/test_*.py -v", style="bold white") + submit_text.append(f" python -m pytest modules/{args.module}/test_*.py -v", style="bold white") - console.print(Panel(submit_text, title="Project Submission", border_style="bright_yellow")) + console.print(Panel(submit_text, title="Module Submission", border_style="bright_yellow")) def cmd_status(args): - """Check project status.""" + """Check module status.""" status_text = Text() - status_text.append(f"πŸ“Š Status for project: {args.project}\n\n", style="bold cyan") + status_text.append(f"πŸ“Š Status for module: {args.module}\n\n", style="bold cyan") status_text.append("🚧 Status system not yet implemented.", style="yellow") - console.print(Panel(status_text, title="Project Status", border_style="bright_yellow")) + console.print(Panel(status_text, title="Module Status", border_style="bright_yellow")) @@ -481,7 +481,7 @@ def cmd_doctor(args): venv_status = "[yellow]βœ… Ready (Not Active)[/yellow]" else: venv_status = "[red]❌ Not Found[/red]" - env_table.add_row("Virtual Environment", venv_status, "tinytorch-env") + env_table.add_row("Virtual Environment", venv_status, ".venv") # Dependencies dependencies = ['numpy', 'matplotlib', 'pytest', 'yaml', 'black', 'rich'] @@ -496,8 +496,8 @@ def cmd_doctor(args): console.print(env_table) console.print() - # Project structure table - struct_table = Table(title="Project Structure", show_header=True, header_style="bold magenta") + # Module structure table + struct_table = Table(title="Module Structure", show_header=True, header_style="bold magenta") struct_table.add_column("Path", style="cyan", width=25) struct_table.add_column("Status", justify="left") struct_table.add_column("Type", style="dim", width=25) @@ -505,7 +505,7 @@ def cmd_doctor(args): required_paths = [ ('tinytorch/', 'Package directory'), ('tinytorch/core/', 'Core module directory'), - ('projects/', 'Project directory'), + ('modules/', 'Module directory'), ('bin/tito.py', 'CLI script'), ('requirements.txt', 'Dependencies file') ] @@ -519,11 +519,108 @@ def cmd_doctor(args): console.print(struct_table) console.print() - # Project implementations + # Module implementations console.print(Panel("πŸ“‹ Implementation Status", - title="Project Status", border_style="bright_blue")) + title="Module Status", border_style="bright_blue")) cmd_info(argparse.Namespace(hello=False, show_architecture=False)) +def cmd_jupyter(args): + """Start Jupyter notebook server.""" + import subprocess + + console.print(Panel("πŸ““ Jupyter Notebook Server", + title="Interactive Development", border_style="bright_green")) + + # Determine which Jupyter to start + if args.lab: + cmd = ["jupyter", "lab", "--port", str(args.port)] + console.print(f"πŸš€ Starting JupyterLab on port {args.port}...") + else: + cmd = ["jupyter", "notebook", "--port", str(args.port)] + console.print(f"πŸš€ Starting Jupyter Notebook on port {args.port}...") + + console.print("πŸ’‘ Open your browser to the URL shown above") + console.print("πŸ“ Navigate to your module's notebook directory") + console.print("πŸ”„ Press Ctrl+C to stop the server") + + try: + subprocess.run(cmd) + except KeyboardInterrupt: + console.print("\nπŸ›‘ Jupyter server stopped") + except FileNotFoundError: + console.print(Panel("[red]❌ Jupyter not found. Install with: pip install jupyter[/red]", + title="Error", border_style="red")) + return 1 + + return 0 + +def cmd_nbdev(args): + """Run nbdev commands for notebook development.""" + import subprocess + + console.print(Panel("πŸ““ nbdev Notebook Development", + title="Notebook Tools", border_style="bright_cyan")) + + if args.build_lib: + console.print("πŸ”¨ Building library from notebooks...") + result = subprocess.run(["nbdev_build_lib"], capture_output=True, text=True) + if result.returncode == 0: + console.print(Panel("[green]βœ… Library built successfully![/green]", + title="Build Success", border_style="green")) + else: + console.print(Panel(f"[red]❌ Build failed: {result.stderr}[/red]", + title="Build Error", border_style="red")) + return result.returncode + + elif args.build_docs: + console.print("πŸ“š Building documentation from notebooks...") + result = subprocess.run(["nbdev_build_docs"], capture_output=True, text=True) + if result.returncode == 0: + console.print(Panel("[green]βœ… Documentation built successfully![/green]", + title="Docs Success", border_style="green")) + else: + console.print(Panel(f"[red]❌ Docs build failed: {result.stderr}[/red]", + title="Docs Error", border_style="red")) + return result.returncode + + elif args.test: + console.print("πŸ§ͺ Running notebook tests...") + result = subprocess.run(["nbdev_test"], capture_output=True, text=True) + if result.returncode == 0: + console.print(Panel("[green]βœ… All notebook tests passed![/green]", + title="Test Success", border_style="green")) + else: + console.print(Panel(f"[red]❌ Some tests failed: {result.stderr}[/red]", + title="Test Error", border_style="red")) + return result.returncode + + elif args.clean: + console.print("🧹 Cleaning notebook build artifacts...") + result = subprocess.run(["nbdev_clean_nbs"], capture_output=True, text=True) + if result.returncode == 0: + console.print(Panel("[green]βœ… Cleaned successfully![/green]", + title="Clean Success", border_style="green")) + else: + console.print(Panel(f"[red]❌ Clean failed: {result.stderr}[/red]", + title="Clean Error", border_style="red")) + return result.returncode + + else: + help_text = Text() + help_text.append("πŸ““ nbdev Commands:\n\n", style="bold cyan") + help_text.append(" tito nbdev --build-lib - Build library from notebooks\n", style="white") + help_text.append(" tito nbdev --build-docs - Build documentation\n", style="white") + help_text.append(" tito nbdev --test - Run notebook tests\n", style="white") + help_text.append(" tito nbdev --clean - Clean build artifacts\n\n", style="white") + help_text.append("πŸ’‘ Development workflow:\n", style="bold yellow") + help_text.append(" 1. Work in modules/*/notebook/*_dev.ipynb\n", style="dim") + help_text.append(" 2. Test interactively\n", style="dim") + help_text.append(" 3. Run: tito nbdev --build-lib\n", style="dim") + help_text.append(" 4. Test compiled package\n", style="dim") + + console.print(Panel(help_text, title="nbdev Help", border_style="bright_cyan")) + return 0 + def main(): """Main CLI entry point.""" parser = argparse.ArgumentParser( @@ -542,21 +639,34 @@ def main(): info_parser.add_argument("--show-architecture", action="store_true", help="Show system architecture") # Test command - test_parser = subparsers.add_parser("test", help="Run project tests") - test_parser.add_argument("--project", help="Project to test") - test_parser.add_argument("--all", action="store_true", help="Run all project tests") + test_parser = subparsers.add_parser("test", help="Run module tests") + test_parser.add_argument("--module", help="Module to test") + test_parser.add_argument("--all", action="store_true", help="Run all module tests") # Submit command - submit_parser = subparsers.add_parser("submit", help="Submit project") - submit_parser.add_argument("--project", required=True, help="Project to submit") + submit_parser = subparsers.add_parser("submit", help="Submit module") + submit_parser.add_argument("--module", required=True, help="Module to submit") # Status command - status_parser = subparsers.add_parser("status", help="Check project status") - status_parser.add_argument("--project", required=True, help="Project to check") + status_parser = subparsers.add_parser("status", help="Check module status") + status_parser.add_argument("--module", required=True, help="Module to check") # Doctor command doctor_parser = subparsers.add_parser("doctor", help="Run environment diagnosis") + # nbdev commands + nbdev_parser = subparsers.add_parser("nbdev", help="nbdev notebook development commands") + nbdev_parser.add_argument("--build-lib", action="store_true", help="Build library from notebooks") + nbdev_parser.add_argument("--build-docs", action="store_true", help="Build documentation from notebooks") + nbdev_parser.add_argument("--test", action="store_true", help="Run notebook tests") + nbdev_parser.add_argument("--clean", action="store_true", help="Clean notebook build artifacts") + + # Jupyter command + jupyter_parser = subparsers.add_parser("jupyter", help="Start Jupyter notebook server") + jupyter_parser.add_argument("--notebook", action="store_true", help="Start classic notebook") + jupyter_parser.add_argument("--lab", action="store_true", help="Start JupyterLab") + jupyter_parser.add_argument("--port", type=int, default=8888, help="Port to run on (default: 8888)") + args = parser.parse_args() # Handle version flag @@ -570,10 +680,10 @@ def main(): # Validate test command arguments if args.command == "test": - if not args.all and not args.project: + if not args.all and not args.module: error_text = Text() - error_text.append("❌ Error: Must specify either --project or --all\n\n", style="bold red") - error_text.append("Usage: python bin/tito.py test --project | --all", style="cyan") + error_text.append("❌ Error: Must specify either --module or --all\n\n", style="bold red") + error_text.append("Usage: python bin/tito.py test --module | --all", style="cyan") console.print(Panel(error_text, title="Invalid Arguments", border_style="red")) return 1 @@ -588,6 +698,10 @@ def main(): cmd_status(args) elif args.command == "doctor": cmd_doctor(args) + elif args.command == "nbdev": + return cmd_nbdev(args) + elif args.command == "jupyter": + return cmd_jupyter(args) else: parser.print_help() return 1 diff --git a/projects/setup/QUICKSTART.md b/modules/setup/QUICKSTART.md similarity index 85% rename from projects/setup/QUICKSTART.md rename to modules/setup/QUICKSTART.md index bb72edac..f16c8e23 100644 --- a/projects/setup/QUICKSTART.md +++ b/modules/setup/QUICKSTART.md @@ -17,8 +17,8 @@ python3 projects/setup/create_env.py **Step 3**: Activate environment and verify ```bash -source tinytorch-env/bin/activate # macOS/Linux -# OR: tinytorch-env\Scripts\activate # Windows +source .venv/bin/activate # macOS/Linux +# OR: .venv\Scripts\activate # Windows python3 projects/setup/check_setup.py ``` @@ -31,8 +31,8 @@ python3 projects/setup/check_setup.py **Step 1**: Create virtual environment ```bash -python3 -m venv tinytorch-env -source tinytorch-env/bin/activate +python3 -m venv .venv +source .venv/bin/activate ``` **Step 2**: Install dependencies @@ -53,7 +53,7 @@ python3 projects/setup/check_setup.py **Start working** (run this every time): ```bash cd TinyTorch -source tinytorch-env/bin/activate # Always activate first! +source .venv/bin/activate # Always activate first! ``` **Check status**: @@ -72,7 +72,7 @@ python3 -m pytest projects/setup/test_setup.py -v **"ModuleNotFoundError"**: You forgot to activate your virtual environment ```bash -source tinytorch-env/bin/activate +source .venv/bin/activate ``` **"Command not found"**: Make sure you're in the TinyTorch directory @@ -83,7 +83,7 @@ ls # Should see bin/, projects/, requirements.txt **Dependencies missing**: Reinstall in the virtual environment ```bash -source tinytorch-env/bin/activate +source .venv/bin/activate pip install -r requirements.txt ``` diff --git a/projects/setup/README.md b/modules/setup/README.md similarity index 100% rename from projects/setup/README.md rename to modules/setup/README.md diff --git a/projects/setup/check_setup.py b/modules/setup/check_setup.py similarity index 98% rename from projects/setup/check_setup.py rename to modules/setup/check_setup.py index f1ac2f58..18d3e4e7 100644 --- a/projects/setup/check_setup.py +++ b/modules/setup/check_setup.py @@ -45,7 +45,7 @@ def check_virtual_environment(): return True else: print("⚠️ Virtual environment: Not detected") - print(" Recommendation: Use 'source tinytorch-env/bin/activate'") + print(" Recommendation: Use 'source .venv/bin/activate'") print(" (This is strongly recommended for consistency)") return True # Don't fail, just warn diff --git a/projects/setup/create_env.py b/modules/setup/create_env.py similarity index 94% rename from projects/setup/create_env.py rename to modules/setup/create_env.py index c300835e..2caf4ada 100644 --- a/projects/setup/create_env.py +++ b/modules/setup/create_env.py @@ -45,7 +45,7 @@ def check_python_version(): def create_virtual_environment(): """Create the TinyTorch virtual environment.""" - env_path = Path("tinytorch-env") + env_path = Path(".venv") if env_path.exists(): print(f"⚠️ Virtual environment already exists at {env_path}") @@ -58,7 +58,7 @@ def create_virtual_environment(): return True # Create virtual environment - result = run_command([sys.executable, "-m", "venv", "tinytorch-env"]) + result = run_command([sys.executable, "-m", "venv", ".venv"]) if result is None: print("❌ Failed to create virtual environment") return False @@ -69,9 +69,9 @@ def create_virtual_environment(): def get_venv_python(): """Get the path to Python in the virtual environment.""" if sys.platform == "win32": - return Path("tinytorch-env/Scripts/python.exe") + return Path(".venv/Scripts/python.exe") else: - return Path("tinytorch-env/bin/python") + return Path(".venv/bin/python") def install_dependencies(): """Install required dependencies in the virtual environment.""" @@ -151,9 +151,9 @@ def print_next_steps(): print("=" * 60) if sys.platform == "win32": - activate_cmd = "tinytorch-env\\Scripts\\activate" + activate_cmd = ".venv\\Scripts\\activate" else: - activate_cmd = "source tinytorch-env/bin/activate" + activate_cmd = "source .venv/bin/activate" print(f""" Next steps: diff --git a/projects/setup/test_setup.py b/modules/setup/test_setup.py similarity index 100% rename from projects/setup/test_setup.py rename to modules/setup/test_setup.py diff --git a/nbdev.yaml b/nbdev.yaml new file mode 100644 index 00000000..2e068313 --- /dev/null +++ b/nbdev.yaml @@ -0,0 +1,33 @@ +# nbdev configuration for TinyTorch +# This file tells nbdev how to compile notebooks into the tinytorch package + +# Package settings +lib_name: tinytorch +lib_path: tinytorch +doc_path: docs +nbs_path: modules +recursive: true + +# Documentation settings +doc_host: https://tinytorch.github.io +doc_baseurl: /TinyTorch/ +git_url: https://github.com/tinytorch/TinyTorch +lib_https: https://github.com/tinytorch/TinyTorch/blob/main/ +baseurl: https://tinytorch.github.io + +# Build settings +custom_sidebar: false +use_relative_doc_path: true +use_github: true +github_username: tinytorch +github_repo: TinyTorch + +# Notebook settings +tst_flags: notest +version: 0.1.0 +title: TinyTorch +description: Build ML systems from scratch +author: TinyTorch Students +author_email: tinytorch@example.com +copyright: 2024 TinyTorch +license: MIT \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 1b4cc4eb..e1ae4490 100644 --- a/requirements.txt +++ b/requirements.txt @@ -25,5 +25,14 @@ black>=23.0.0 mypy>=1.0.0 flake8>=6.0.0 +# nbdev for notebook-based development +nbdev>=2.4.0 + +# Jupyter for interactive development +jupyter>=1.0.0 +jupyterlab>=4.0.0 +ipykernel>=6.0.0 +ipywidgets>=8.0.0 + # Type checking support typing-extensions>=4.0.0 \ No newline at end of file