|
|
#!/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 "" |
|
|
|
|
|
|
|
|
|
|
|
|