omoi-ui-detector / OPTIMIZATION_GUIDE.md
makeitfr's picture
Upload OPTIMIZATION_GUIDE.md with huggingface_hub
9be5bca verified
|
Raw
History Blame Contribute Delete
5.29 kB

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:
    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

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)

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

    # 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

  • All CPU cores detected and configured
  • Environment variables set for multi-threading
  • API server running with 4 workers
  • OmniParser using multi-threaded models
  • Consistent latency achieved
  • Zero performance degradation

πŸš€ Getting Started

Start optimized servers:

bash /workspaces/omoi-v2/start_optimized_servers.sh

Verify optimization:

python /workspaces/omoi-v2/verify_optimizations.py

Test latency:

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)