#!/bin/bash # تنزيل ذاتي مستأنف لـ torch+torchvision (CUDA) ثم تثبيت وإعادة تشغيل بالـ GPU. # يستأنف عبر أي انقطاع شبكة حتى يكتمل. آمن: cu121 يعمل على CPU أيضاً فلن يكسر التطبيق. set +e ROOT="/c/Users/aiden/Desktop/مسابقة وطنية/ocr-fpr-phonex-team-main" WH="$ROOT/_wheels" PY="$ROOT/backend/.venv/Scripts/python.exe" LOG="$ROOT/_gpu_setup.log" mkdir -p "$WH" TORCH_URL="https://download.pytorch.org/whl/cu121/torch-2.4.1%2Bcu121-cp310-cp310-win_amd64.whl" TV_URL="https://download.pytorch.org/whl/cu121/torchvision-0.19.1%2Bcu121-cp310-cp310-win_amd64.whl" log(){ echo "$(date '+%Y-%m-%d %H:%M:%S') | $1" >> "$LOG"; } valid(){ "$PY" -c "import zipfile,sys; zipfile.ZipFile(sys.argv[1]).testzip()" "$1" >/dev/null 2>&1; } dl(){ local url="$1" fname="$2" name="$3" # fname = اسم نسبي داخل _wheels (curl لا يحتمل المسار العربي المطلق) local out="$WH/$fname" local i=0 cd "$WH" || { log "تعذّر دخول $WH"; return 1; } while [ $i -lt 5000 ]; do if valid "$out"; then log "$name مكتمل وصالح ($(stat -c%s "$out") بايت)"; return 0; fi i=$((i+1)) local sz=$(stat -c%s "$out" 2>/dev/null || echo 0) log "$name محاولة $i (نُزّل: $sz بايت) — استئناف..." curl -L -C - --retry 100 --retry-delay 5 --retry-all-errors --connect-timeout 30 \ --speed-time 120 --speed-limit 500 -o "$fname" "$url" >/dev/null 2>>"$LOG" sleep 5 done log "$name فشل بعد محاولات كثيرة"; return 1 } log "=================== بدء إعداد GPU ===================" dl "$TORCH_URL" "torch_cu121.whl" "torch" || { log "ABORT: torch"; exit 1; } dl "$TV_URL" "torchvision_cu121.whl" "torchvision" || { log "ABORT: torchvision"; exit 1; } log "التنزيلان مكتملان. إيقاف الخادم والتثبيت..." powershell.exe -NoProfile -ExecutionPolicy Bypass -File "$ROOT/_stop_server.ps1" >>"$LOG" 2>&1 sleep 4 log "تثبيت العجلات في البيئة..." "$PY" -m pip install --no-cache-dir --force-reinstall --no-deps "$WH/torch_cu121.whl" "$WH/torchvision_cu121.whl" >>"$LOG" 2>&1 CUDA=$("$PY" -c "import torch; print(torch.cuda.is_available())" 2>>"$LOG") GPU=$("$PY" -c "import torch; print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'CPU')" 2>>"$LOG") log "بعد التثبيت → CUDA متاح: $CUDA | الجهاز: $GPU" log "إعادة تشغيل الخادم (DEVICE=auto → cuda تلقائياً)..." powershell.exe -NoProfile -ExecutionPolicy Bypass -File "$ROOT/_start_server.ps1" >>"$LOG" 2>&1 # انتظر الجاهزية وقِس ok=0 for n in $(seq 1 60); do code=$(curl -s -m 5 "http://127.0.0.1:8001/api/health" -o /dev/null -w "%{http_code}" 2>/dev/null) if [ "$code" = "200" ]; then ok=1; break; fi sleep 3 done log "صحة الخادم: $([ $ok = 1 ] && echo 'حيّ ✅' || echo 'لم يجهز ⚠️')" log "=================== انتهى. CUDA=$CUDA ===================" echo "GPU_SETUP_DONE CUDA=$CUDA DEVICE=$GPU SERVER_OK=$ok"