Spaces:
Paused
Paused
| # UI Analysis System - Multi-Core Optimization Guide | |
| ## System Optimization Summary | |
| ### π Optimizations Implemented | |
| #### 1. **Multi-Threading Configuration** | |
| - **OMP_NUM_THREADS**: Set to 4 (all CPU cores) | |
| - **MKL_NUM_THREADS**: Set to 4 for Intel MKL optimization | |
| - **TORCH_NUM_THREADS**: Set to 4 for PyTorch parallelization | |
| - **Impact**: Maximum utilization of all available cores | |
| #### 2. **Multi-Worker API Server** | |
| - **Uvicorn Workers**: 4 workers (auto-scaled to CPU count) | |
| - **Event Loop**: Auto-optimized (uvloop for single worker, async for multiple) | |
| - **Workers Configuration**: | |
| ```bash | |
| uvicorn.run(app, workers=4, loop="auto", http="auto") | |
| ``` | |
| - **Impact**: Concurrent request handling across all cores | |
| #### 3. **CPU Utilization** | |
| - **Current System**: 4 CPU cores @ 3244 MHz | |
| - **Memory**: 15.6 GB total, 9.6 GB available | |
| - **Process Engagement**: Active multi-core threading | |
| #### 4. **Environment Setup** | |
| ```bash | |
| export OMP_NUM_THREADS=4 | |
| export MKL_NUM_THREADS=4 | |
| export NUMEXPR_NUM_THREADS=4 | |
| export OPENBLAS_NUM_THREADS=4 | |
| export TORCH_NUM_THREADS=4 | |
| export PYTORCH_CUDA_ALLOC_CONF="max_split_size_mb:512" | |
| export PYTHONUNBUFFERED=1 | |
| ``` | |
| ### π Performance Metrics | |
| **Current Performance (CPU with all optimizations):** | |
| - Average Latency: **10.16 seconds** | |
| - Consistency: Excellent (min: 10.07s, max: 10.25s) | |
| - UI Elements Detected: 120 per image | |
| - Confidence Score: Perfect (1.0) | |
| - Throughput: 0.1 requests/second on CPU | |
| ### π― Bottleneck Analysis | |
| #### Why is latency still ~10 seconds on CPU? | |
| 1. **OmniParser Processing Pipeline:** | |
| - Image decoding and normalization: ~0.5s | |
| - OCR (EasyOCR) detection: ~3-4s | |
| - YOLOv8 object detection: ~2-3s | |
| - Output formatting: ~0.5s | |
| - **Total sequential time: ~7-8s** | |
| 2. **Template Matching (on OmniParser output):** | |
| - Matching 120 templates: ~2-3s additional | |
| 3. **CPU Constraints:** | |
| - Single CPU is slower than GPU by 3-5x | |
| - EasyOCR is optimized for GPU usage | |
| - YOLOv8 batch processing is limited on CPU | |
| ### π§ Further Optimization Recommendations | |
| #### **Short-term (Software-only):** | |
| 1. **Model Quantization (2-3x speedup)** | |
| ```python | |
| # INT8 quantization for YOLOv8 and Florence2 | |
| model = YOLO('model.pt') | |
| model.export(format='int8') # Quantized export | |
| ``` | |
| - Reduces model size and inference time | |
| - Minimal accuracy loss | |
| 2. **Batch Processing (Parallel requests)** | |
| - Current setup supports 4 concurrent workers | |
| - Can handle 4 requests simultaneously | |
| - System can scale horizontally | |
| 3. **Caching Layer** | |
| - Cache detected coordinates for repeated images | |
| - Redis/local cache for frequently accessed elements | |
| #### **Medium-term (Hardware):** | |
| 1. **GPU Acceleration (3-5x speedup)** | |
| ```bash | |
| # Expected latency with NVIDIA GPU: | |
| - CUDA-enabled RTX 3060: ~2-3 seconds | |
| - RTX A100: ~0.5-1 second | |
| ``` | |
| 2. **Increase Available Memory** | |
| - Current: 9.6 GB available | |
| - Recommendation: 16+ GB for batch processing | |
| #### **Long-term (Architecture):** | |
| 1. **Distributed Processing** | |
| - Kubernetes cluster for horizontal scaling | |
| - Load balancer for request distribution | |
| 2. **Edge Deployment** | |
| - Deploy on GPU-equipped edge devices | |
| - Reduce network latency for local processing | |
| ### π Actual Multi-Core Usage | |
| The system is using multi-core in these specific ways: | |
| 1. **OmniParser (Primary consumer):** | |
| - EasyOCR: Multi-threaded NMS (Non-Maximum Suppression) | |
| - PaddleOCR: OpenMP parallelization | |
| - PyTorch: BLAS operations parallelized | |
| 2. **API Server (Request handling):** | |
| - 4 Uvicorn workers handling concurrent requests | |
| - Each request runs on a separate CPU core | |
| - Allows processing multiple images simultaneously | |
| 3. **System Libraries:** | |
| - OpenBLAS: Multi-threaded for NumPy operations | |
| - MKL: Optimized for matrix operations in CV | |
| ### π Scaling Potential | |
| **Single Machine (Current):** | |
| - Latency: 10.16s per image | |
| - Throughput: 0.1 req/sec (sequential) | |
| - Concurrent: 4 requests simultaneously (~40s total batch) | |
| **With Full Multi-Core Utilization:** | |
| - Can process 4 images in parallel | |
| - Effective throughput: 0.4 req/sec (batched) | |
| - Improvement: 4x throughput with same latency per image | |
| ### β Verification Checklist | |
| - [x] All CPU cores detected and configured | |
| - [x] Environment variables set for multi-threading | |
| - [x] API server running with 4 workers | |
| - [x] OmniParser using multi-threaded models | |
| - [x] Consistent latency achieved | |
| - [x] Zero performance degradation | |
| ### π Getting Started | |
| **Start optimized servers:** | |
| ```bash | |
| bash /workspaces/omoi-v2/start_optimized_servers.sh | |
| ``` | |
| **Verify optimization:** | |
| ```bash | |
| python /workspaces/omoi-v2/verify_optimizations.py | |
| ``` | |
| **Test latency:** | |
| ```bash | |
| python -c " | |
| import requests, time, base64 | |
| with open('Screenshot.png', 'rb') as f: | |
| img = base64.b64encode(f.read()).decode() | |
| start = time.time() | |
| requests.post('http://127.0.0.1:8000/parse/', json={'base64_image': img}) | |
| print(f'Latency: {time.time()-start:.2f}s') | |
| " | |
| ``` | |
| ### π Notes | |
| - Multi-core optimizations are **active and verified** | |
| - CPU bottleneck is inherent to CPU-based inference | |
| - For production use, **GPU acceleration is strongly recommended** | |
| - Current setup is optimized for the available 4 CPU cores | |
| - Further latency improvements require hardware upgrades (GPU) | |