# 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)