| #!/bin/bash |
| |
|
|
| set -e |
|
|
| echo "π Installing Speed Optimizations for HF Viz..." |
| echo "" |
|
|
| |
| GREEN='\033[0;32m' |
| BLUE='\033[0;34m' |
| YELLOW='\033[1;33m' |
| NC='\033[0m' |
|
|
| |
| PROJECT_ROOT="/Users/hamidaho/hf_viz" |
| cd "$PROJECT_ROOT" |
|
|
| |
| echo -e "${BLUE}π¦ Installing backend dependencies...${NC}" |
| source venv/bin/activate |
| pip install -q -r backend/config/requirements.txt |
| echo -e "${GREEN}β${NC} Backend dependencies installed" |
|
|
| |
| echo -e "${BLUE}π¦ Installing frontend dependencies...${NC}" |
| cd frontend |
| npm install --silent |
| cd .. |
| echo -e "${GREEN}β${NC} Frontend dependencies installed" |
|
|
| |
| echo -e "${BLUE}π Checking for Redis...${NC}" |
| if command -v redis-server &> /dev/null; then |
| echo -e "${GREEN}β${NC} Redis is installed" |
| REDIS_AVAILABLE=true |
| else |
| echo -e "${YELLOW}β ${NC} Redis not found. Install with:" |
| echo " brew install redis (macOS)" |
| echo " apt-get install redis (Ubuntu)" |
| echo " or use Docker: docker run -d -p 6379:6379 redis:7-alpine" |
| echo "" |
| echo "Backend will use in-memory cache as fallback" |
| REDIS_AVAILABLE=false |
| fi |
|
|
| |
| echo -e "${BLUE}π Checking for Docker...${NC}" |
| if command -v docker &> /dev/null; then |
| echo -e "${GREEN}β${NC} Docker is installed" |
| DOCKER_AVAILABLE=true |
| else |
| echo -e "${YELLOW}β ${NC} Docker not found. Install from https://docker.com" |
| DOCKER_AVAILABLE=false |
| fi |
|
|
| |
| echo -e "${BLUE}π Creating startup scripts...${NC}" |
|
|
| cat > start_optimized.sh << 'EOF' |
| |
| |
|
|
| |
| if command -v redis-server &> /dev/null; then |
| echo "Starting Redis..." |
| redis-server --daemonize yes --port 6379 --maxmemory 512mb --maxmemory-policy allkeys-lru |
| sleep 1 |
| REDIS_ENABLED=true |
| else |
| echo "Redis not available, using in-memory cache" |
| REDIS_ENABLED=false |
| fi |
|
|
| |
| echo "Starting backend with optimizations..." |
| cd backend |
| source ../venv/bin/activate |
|
|
| SAMPLE_SIZE=5000 \ |
| REDIS_ENABLED=$REDIS_ENABLED \ |
| REDIS_HOST=localhost \ |
| REDIS_PORT=6379 \ |
| REDIS_TTL=300 \ |
| python -m uvicorn api.main:app --host 0.0.0.0 --port 8000 --reload & |
|
|
| BACKEND_PID=$! |
| echo "Backend started (PID: $BACKEND_PID)" |
|
|
| |
| echo "Waiting for backend to initialize..." |
| for i in {1..60}; do |
| if curl -s http://localhost:8000/ > /dev/null 2>&1; then |
| echo "β Backend is ready!" |
| break |
| fi |
| sleep 1 |
| done |
|
|
| |
| echo "Starting frontend..." |
| cd ../frontend |
| npm start & |
|
|
| FRONTEND_PID=$! |
| echo "Frontend started (PID: $FRONTEND_PID)" |
|
|
| echo "" |
| echo "π HF Viz is running with all optimizations!" |
| echo "" |
| echo "Backend: http://localhost:8000" |
| echo "Frontend: http://localhost:3000" |
| echo "API Docs: http://localhost:8000/docs" |
| echo "" |
| echo "Press Ctrl+C to stop" |
|
|
| |
| trap 'kill $BACKEND_PID $FRONTEND_PID; exit' INT |
| wait |
| EOF |
|
|
| chmod +x start_optimized.sh |
|
|
| |
| cat > start_docker.sh << 'EOF' |
| |
| |
|
|
| echo "π³ Starting HF Viz with Docker Compose..." |
| docker-compose up -d |
|
|
| echo "" |
| echo "Waiting for services to be ready..." |
| sleep 5 |
|
|
| echo "" |
| echo "π HF Viz is running!" |
| echo "" |
| echo "Backend: http://localhost:8000 (via nginx: http://localhost/api/)" |
| echo "API Docs: http://localhost:8000/docs" |
| echo "Frontend: Build and deploy separately or add to docker-compose.yml" |
| echo "" |
| echo "View logs:" |
| echo " docker-compose logs -f" |
| echo "" |
| echo "Stop services:" |
| echo " docker-compose down" |
| echo "" |
| echo "Cache stats:" |
| echo " docker-compose exec redis redis-cli INFO stats" |
| EOF |
|
|
| chmod +x start_docker.sh |
|
|
| echo -e "${GREEN}β${NC} Startup scripts created" |
|
|
| |
| cat > test_optimizations.sh << 'EOF' |
| |
| |
|
|
| echo "π§ͺ Testing Speed Optimizations..." |
| echo "" |
|
|
| API_BASE="http://localhost:8000" |
|
|
| |
| echo "Test 1: Backend connectivity..." |
| if curl -sf "$API_BASE/" > /dev/null; then |
| echo "β Backend is responding" |
| else |
| echo "β Backend not responding. Start it first with ./start_optimized.sh" |
| exit 1 |
| fi |
|
|
| |
| echo "" |
| echo "Test 2: SAMPLE_SIZE configuration..." |
| STATS=$(curl -s "$API_BASE/api/stats") |
| TOTAL=$(echo $STATS | grep -o '"total_models":[0-9]*' | grep -o '[0-9]*') |
| if [ "$TOTAL" -le 10000 ]; then |
| echo "β SAMPLE_SIZE is working (loaded $TOTAL models)" |
| else |
| echo "β Warning: Loaded $TOTAL models (expected β€10000)" |
| fi |
|
|
| |
| echo "" |
| echo "Test 3: HTTP caching headers..." |
| HEADERS=$(curl -sI "$API_BASE/api/stats") |
| if echo "$HEADERS" | grep -q "Cache-Control"; then |
| echo "β Cache-Control headers present" |
| else |
| echo "β Cache-Control headers missing" |
| fi |
|
|
| |
| echo "" |
| echo "Test 4: Redis connectivity..." |
| if command -v redis-cli &> /dev/null; then |
| if redis-cli -h localhost -p 6379 PING > /dev/null 2>&1; then |
| echo "β Redis is running" |
| KEYS=$(redis-cli -h localhost -p 6379 KEYS "hfviz:*" | wc -l) |
| echo " Cached keys: $KEYS" |
| else |
| echo "β Redis not responding (using in-memory cache)" |
| fi |
| else |
| echo "β redis-cli not installed" |
| fi |
|
|
| |
| echo "" |
| echo "Test 5: MessagePack binary format..." |
| MSGPACK_RESPONSE=$(curl -s -w "%{http_code}" -H "Accept: application/msgpack" "$API_BASE/api/models?max_points=10" -o /tmp/test.msgpack) |
| if [ "$MSGPACK_RESPONSE" = "200" ]; then |
| MSGPACK_SIZE=$(stat -f%z /tmp/test.msgpack 2>/dev/null || stat -c%s /tmp/test.msgpack 2>/dev/null) |
| echo "β MessagePack endpoint working (${MSGPACK_SIZE} bytes)" |
| else |
| echo "β MessagePack endpoint returned $MSGPACK_RESPONSE" |
| fi |
|
|
| |
| echo "" |
| echo "Test 6: Payload size comparison..." |
| JSON_SIZE=$(curl -s "$API_BASE/api/models?max_points=100" | wc -c) |
| MSGPACK_SIZE=$(curl -s -H "Accept: application/msgpack" "$API_BASE/api/models?max_points=100&format=msgpack" | wc -c) |
| REDUCTION=$(echo "scale=1; 100 - ($MSGPACK_SIZE * 100 / $JSON_SIZE)" | bc) |
| echo " JSON: ${JSON_SIZE} bytes" |
| echo " MessagePack: ${MSGPACK_SIZE} bytes" |
| echo " Reduction: ${REDUCTION}%" |
|
|
| |
| echo "" |
| echo "Test 7: Response time (cache test)..." |
| |
| START=$(date +%s%N) |
| curl -s "$API_BASE/api/stats" > /dev/null |
| END=$(date +%s%N) |
| COLD_TIME=$(echo "scale=0; ($END - $START) / 1000000" | bc) |
|
|
| |
| START=$(date +%s%N) |
| curl -s "$API_BASE/api/stats" > /dev/null |
| END=$(date +%s%N) |
| WARM_TIME=$(echo "scale=0; ($END - $START) / 1000000" | bc) |
|
|
| echo " Cold request: ${COLD_TIME}ms" |
| echo " Warm request: ${WARM_TIME}ms" |
|
|
| if [ "$WARM_TIME" -lt "$COLD_TIME" ]; then |
| SPEEDUP=$(echo "scale=1; $COLD_TIME / $WARM_TIME" | bc) |
| echo " β Cache working (${SPEEDUP}x faster)" |
| else |
| echo " β Cache may not be working" |
| fi |
|
|
| echo "" |
| echo "π Testing complete!" |
| EOF |
|
|
| chmod +x test_optimizations.sh |
|
|
| echo -e "${GREEN}β${NC} Test script created" |
|
|
| |
| echo "" |
| echo -e "${GREEN}βββββββββββββββββββββββββββββββββββββββββββββββββ${NC}" |
| echo -e "${GREEN}β Installation Complete!${NC}" |
| echo -e "${GREEN}βββββββββββββββββββββββββββββββββββββββββββββββββ${NC}" |
| echo "" |
| echo "π Created files:" |
| echo " ./start_optimized.sh - Start with optimizations (local)" |
| echo " ./start_docker.sh - Start with Docker Compose" |
| echo " ./test_optimizations.sh - Test all optimizations" |
| echo "" |
| echo "π Quick Start:" |
| echo "" |
| if [ "$REDIS_AVAILABLE" = true ] && [ "$DOCKER_AVAILABLE" = true ]; then |
| echo " Option 1 (Recommended): Docker with Redis + Nginx" |
| echo " ./start_docker.sh" |
| echo "" |
| echo " Option 2: Local development" |
| echo " ./start_optimized.sh" |
| elif [ "$REDIS_AVAILABLE" = true ]; then |
| echo " ./start_optimized.sh" |
| elif [ "$DOCKER_AVAILABLE" = true ]; then |
| echo " ./start_docker.sh" |
| else |
| echo " ./start_optimized.sh (will use in-memory cache)" |
| fi |
| echo "" |
| echo "π§ͺ After starting, test with:" |
| echo " ./test_optimizations.sh" |
| echo "" |
| echo "π Full documentation:" |
| echo " cat SPEED_OPTIMIZATIONS_COMPLETE.md" |
| echo "" |
|
|
|
|
|
|
|
|