#!/usr/bin/env bash # TestAjanı - modelin ekran kartında (GPU; Mac'te Metal) çalışıp çalışmadığını kontrol eder. # Kullanım: scripts/gpu-kontrol.sh [model] set -uo pipefail OLLAMA="${OLLAMA_HOST_URL:-http://localhost:11434}" MODEL="${1:-${OLLAMA_MODEL:-}}" command -v python3 >/dev/null || { echo "python3 gerekli."; exit 1; } j() { python3 -c "import sys,json; d=json.load(sys.stdin); print($1)"; } echo; echo "1) Ekran kartı" if command -v nvidia-smi >/dev/null; then echo " [TAMAM] NVIDIA: $(nvidia-smi --query-gpu=name,memory.used,memory.total,driver_version --format=csv,noheader | tr '\n' ' ')" elif [ "$(uname)" = "Darwin" ]; then echo " [TAMAM] macOS: Ollama Apple Silicon'da Metal (GPU) kullanır." else echo " [UYARI] nvidia-smi bulunamadı; NVIDIA sürücüsü yoksa model CPU'da çalışır." fi echo; echo "2) Ollama" TAGS=$(curl -fsS -m 5 "$OLLAMA/api/tags") || { echo " [SORUN] Ollama'ya ($OLLAMA) ulaşılamadı. Ollama'yı başlatın (ollama serve) ya da https://ollama.com/download" docker ps --format '{{.Names}}' 2>/dev/null | grep -q ollama && \ echo " [UYARI] Ollama Docker konteynerinde çalışıyor; GPU aktarımı yapılandırılmadıysa CPU kullanır." exit 1; } echo " [TAMAM] Ollama çalışıyor ($(echo "$TAGS" | j "len(d['models'])") model yüklü)" if [ -z "$MODEL" ]; then MODEL=$(curl -fsS "$OLLAMA/api/ps" | j "d['models'][0]['name'] if d['models'] else ''") [ -z "$MODEL" ] && MODEL=$(echo "$TAGS" | j "next((m['name'] for m in d['models'] if m['name']=='qwen2.5-coder:14b'), d['models'][0]['name'])") fi echo; echo "3) Model yükleme ve hız ölçümü: $MODEL" START=$(date +%s) R=$(curl -fsS -m 900 "$OLLAMA/api/generate" -d "{\"model\":\"$MODEL\",\"prompt\":\"Write a Python function that returns the sum of a list.\",\"stream\":false,\"options\":{\"num_predict\":120,\"num_ctx\":16384},\"keep_alive\":\"30m\"}") || { echo " [SORUN] Model çalıştırılamadı: ollama pull $MODEL"; exit 1; } TPS=$(echo "$R" | j "round(d['eval_count']/(d['eval_duration']/1e9),1) if d.get('eval_duration') else 0") echo " [TAMAM] Yanıt alındı ($(( $(date +%s) - START )) sn, ilk yükleme dahil). Üretim hızı: $TPS token/sn" read -r PCT VRAM SIZE < <(curl -fsS "$OLLAMA/api/ps" | python3 -c " import sys,json; m=[x for x in json.load(sys.stdin)['models'] if x['name'] in ('$MODEL','$MODEL:latest')] m=m[0] if m else {'size':0,'size_vram':0}; s=m['size'] or 0; v=m.get('size_vram') or 0 print(round(100*v/s) if s else 0, round(v/1e9,1), round(s/1e9,1))") echo; echo "Sonuç" if [ "$PCT" -ge 100 ]; then echo " [TAMAM] Model TAMAMEN ekran kartında: %100 GPU ($VRAM GB). Hız $TPS token/sn." elif [ "$PCT" -gt 0 ]; then echo " [UYARI] Modelin GPU payı yalnızca %$PCT ($VRAM / $SIZE GB); kalanı CPU'da — belirgin yavaşlar." echo " Diğer GPU uygulamalarını kapatın, başka modeli boşaltın (ollama stop )," echo " daha küçük model seçin ya da OLLAMA_NUM_CTX=8192 deneyin." else echo " [SORUN] Model tamamen CPU'da çalışıyor (%0 GPU). Hız $TPS token/sn."; fi echo; echo "4) TestAjanı uygulaması" WANT=$(head -1 "$(dirname "$0")/../VERSION" 2>/dev/null) if H=$(curl -fsS -m 5 http://localhost:8000/api/health 2>/dev/null); then HAVE=$(echo "$H" | j "d.get('version','')") if [ -n "$HAVE" ] && [ "$HAVE" = "$WANT" ]; then echo " [TAMAM] Uygulama güncel (sürüm $WANT)." else echo " [UYARI] Açık olan uygulama ESKİ sürüm (${HAVE:-bilinmiyor}; klasördeki: $WANT). Başlatıcıyı çalıştırın — uygulama yeniden derlenir."; fi else echo " [UYARI] Uygulama çalışmıyor (http://localhost:8000). Başlatıcıyla başlatın."; fi echo; echo "İpucu: uygulamanın üst çubuğundaki GPU göstergesi bu bilgileri gerçek zamanlı gösterir."