| # API Testing and Profiling Guide | |
| This guide explains how to test and profile the YLFF API endpoints using the test script. | |
| ## Quick Start | |
| ### 1. Start the API Server | |
| ```bash | |
| # From project root | |
| python -m uvicorn ylff.api:app --host 0.0.0.0 --port 8000 | |
| ``` | |
| Or if running in Docker/RunPod, the server should already be running. | |
| ### 2. Run the Test Script | |
| ```bash | |
| # Basic test (auto-detects test data) | |
| python scripts/experiments/test_api_with_profiling.py | |
| # Test with specific data | |
| python scripts/experiments/test_api_with_profiling.py \ | |
| --sequence-dir data/arkit_ba_validation/ba_work/images \ | |
| --arkit-dir data/arkit_ba_validation | |
| # Test against remote server | |
| python scripts/experiments/test_api_with_profiling.py \ | |
| --base-url https://your-pod-id-8000.proxy.runpod.net | |
| # Save results to custom location | |
| python scripts/experiments/test_api_with_profiling.py \ | |
| --output data/test_results/api_test_$(date +%Y%m%d_%H%M%S).json | |
| ``` | |
| ## Test Script Features | |
| The test script (`scripts/experiments/test_api_with_profiling.py`) automatically: | |
| 1. **Tests all API endpoints**: | |
| - Health check (`/health`) | |
| - API info (`/`) | |
| - Models list (`/models`) | |
| - Sequence validation (`/api/v1/validate/sequence`) | |
| - ARKit validation (`/api/v1/validate/arkit`) | |
| - Job management (`/api/v1/jobs`, `/api/v1/jobs/{job_id}`) | |
| - Profiling endpoints (metrics, hot paths, latency, system) | |
| 2. **Profiles code execution**: | |
| - Tracks API request latencies | |
| - Monitors function execution times | |
| - Identifies hot paths (most time-consuming operations) | |
| - Tracks system resources (CPU, memory, GPU) | |
| 3. **Auto-detects test data**: | |
| - Looks for `assets/` folder first | |
| - Falls back to `data/` folder | |
| - Uses existing validation data if available | |
| 4. **Generates reports**: | |
| - Saves detailed JSON results | |
| - Prints profiling summary | |
| - Shows latency breakdown by stage | |
| ## Test Data Structure | |
| The script looks for test data in this order: | |
| 1. **`assets/examples/ARKit/`** - ARKit video and metadata | |
| 2. **`assets/examples/*/`** - Image sequences | |
| 3. **`data/arkit_ba_validation/`** - Existing ARKit validation data | |
| 4. **`data/*/ba_work/images/`** - BA work directories with images | |
| ### Creating Test Assets | |
| If you want to use a custom `assets/` folder: | |
| ```bash | |
| mkdir -p assets/examples/ARKit | |
| # Place your ARKit video and metadata here | |
| # Or place image sequences in assets/examples/your_sequence/ | |
| ``` | |
| ## Profiling Results | |
| The test script generates profiling data in two ways: | |
| ### 1. Local Profiling (in test script) | |
| The script uses the `Profiler` class to track: | |
| - API request durations | |
| - Function execution times | |
| - Memory usage | |
| - GPU memory usage | |
| ### 2. Server-Side Profiling (via API) | |
| The API server also tracks profiling data. Access it via: | |
| ```bash | |
| # Get all metrics | |
| curl http://localhost:8000/api/v1/profiling/metrics | |
| # Get hot paths (top time-consuming operations) | |
| curl http://localhost:8000/api/v1/profiling/hot-paths | |
| # Get latency breakdown by stage | |
| curl http://localhost:8000/api/v1/profiling/latency | |
| # Get system metrics (CPU, memory, GPU) | |
| curl http://localhost:8000/api/v1/profiling/system | |
| # Get stats for specific stage | |
| curl http://localhost:8000/api/v1/profiling/stage/api_request | |
| # Reset profiling data | |
| curl -X POST http://localhost:8000/api/v1/profiling/reset | |
| ``` | |
| ## Example Output | |
| ``` | |
| ================================================================================ | |
| YLFF API Testing and Profiling | |
| ================================================================================ | |
| Base URL: http://localhost:8000 | |
| Start time: 2024-01-15T10:30:00 | |
| [1/11] Testing /health endpoint... | |
| ✓ Health check passed: {'status': 'healthy'} | |
| [2/11] Testing / endpoint... | |
| ✓ API info retrieved: YLFF API v1.0.0 | |
| [3/11] Testing /models endpoint... | |
| ✓ Found 5 models | |
| [4/11] Testing /api/v1/validate/sequence endpoint... | |
| Using sequence: data/arkit_ba_validation/ba_work/images | |
| ✓ Validation job queued: abc123-def456-... | |
| ... | |
| ================================================================================ | |
| Profiling Summary | |
| ================================================================================ | |
| Total entries: 45 | |
| Stages tracked: 3 | |
| Functions tracked: 11 | |
| Latency Breakdown: | |
| api_request 12.345s ( 45.2%) avg: 0.123s calls: 100 | |
| validate_sequence 8.901s ( 32.6%) avg: 8.901s calls: 1 | |
| validate_arkit 6.234s ( 22.2%) avg: 6.234s calls: 1 | |
| ``` | |
| ## Interpreting Results | |
| ### Latency Breakdown | |
| Shows where time is spent: | |
| - **api_request**: Time spent in API layer (network + processing) | |
| - **validate_sequence**: Time spent in sequence validation | |
| - **validate_arkit**: Time spent in ARKit validation | |
| - **gpu**: GPU computation time | |
| - **cpu**: CPU computation time | |
| - **data_loading**: Data I/O time | |
| ### Hot Paths | |
| Shows the most time-consuming functions: | |
| - Functions with highest total execution time | |
| - Useful for identifying bottlenecks | |
| ### System Metrics | |
| Shows resource utilization: | |
| - CPU usage percentage | |
| - Memory usage percentage | |
| - GPU memory usage (if available) | |
| ## Troubleshooting | |
| ### Connection Errors | |
| If you get connection errors: | |
| ```bash | |
| # Check if server is running | |
| curl http://localhost:8000/health | |
| # Check server logs | |
| # (if running locally, check terminal output) | |
| ``` | |
| ### Missing Test Data | |
| If test data is not found: | |
| ```bash | |
| # Specify paths explicitly | |
| python scripts/experiments/test_api_with_profiling.py \ | |
| --sequence-dir /path/to/images \ | |
| --arkit-dir /path/to/arkit | |
| ``` | |
| ### Timeout Errors | |
| If requests timeout: | |
| ```bash | |
| # Increase timeout (default: 300s) | |
| python scripts/experiments/test_api_with_profiling.py --timeout 600 | |
| ``` | |
| ## Continuous Profiling | |
| For continuous profiling during development: | |
| ```bash | |
| # Run tests in a loop | |
| while true; do | |
| python scripts/experiments/test_api_with_profiling.py --output "data/profiling/run_$(date +%s).json" | |
| sleep 60 | |
| done | |
| ``` | |
| ## Integration with CI/CD | |
| Add to your CI pipeline: | |
| ```yaml | |
| - name: Test API Endpoints | |
| run: | | |
| python scripts/experiments/test_api_with_profiling.py \ | |
| --base-url http://localhost:8000 \ | |
| --output test_results/api_test.json | |
| ``` | |
| ## Next Steps | |
| - Review profiling results to identify bottlenecks | |
| - Optimize hot paths identified in profiling | |
| - Use system metrics to tune resource allocation | |
| - Compare profiling results across different model sizes/configurations | |