# ๐Ÿ”ง Klasifikasi Error - Solusi & Troubleshooting ## ๐ŸŽฏ Ringkasan Masalah & Solusi ### Masalah Error "Gagal menghubungi model classification" muncul **secara intermittent**: - Kadang berhasil - Kadang gagal dengan foto yang sama - Tidak konsisten ### Penyebab Utama 1. **Model Reload per Request** - TensorFlow model dimuat ulang setiap kali klasifikasi (berat: ~100MB+) 2. **Memory Exhaustion** - Beberapa request concurrent โ†’ multiple model instances โ†’ OOM 3. **Process Race Condition** - Beberapa Python process kompetisi akses resources --- ## โœ… Solusi Implementasi ### 1. **Request Queue dengan File Lock** - File: `web_TA/app/Services/PythonClassificationService.php` - Mencegah concurrent model loads dengan file locking - Serialisasi requests sehingga hanya 1 model di memory ```php // Baru: Request dijadwalkan dengan lock runActionWithLock() { flock($lockFile, LOCK_EX); // Tunggu sampai lock tersedia $result = runAction(); flock($lockFile, LOCK_UN); // Lepas lock } ``` ### 2. **Retry Logic dengan Exponential Backoff** ```php for ($attempt = 1; $attempt <= 3; $attempt++) { try { return runActionWithLock(...); } catch (TimeoutException) { sleep($attempt); // 1s, 2s, 3s } } ``` ### 3. **Enhanced Error Logging** - Semua error dari Python process dicatat ke `storage/logs/laravel.log` - Memudahkan diagnosis ### 4. **Health Check Endpoints** - `GET /api/health/` - Quick system check - `GET /api/health/diagnose` - Full Python model check (30+ detik) --- ## ๐Ÿงช Cara Testing Solusi ### 1. Cek Status Kesehatan (dari browser/postman) ``` GET http://localhost:8000/api/health/ ``` Response: ```json { "healthy": true, "health": { "python_model": { "status": "ok", "model_directory": "..." }, "system": { "memory": { "php_memory_mb": 10.5 } } } } ``` ### 2. Full Diagnostic Check ``` GET http://localhost:8000/api/health/diagnose ``` (Tunggu 30+ detik, check TensorFlow & model loading) ### 3. Test Concurrent Classifications (dari terminal) ```powershell # Jalankan 5 klasifikasi bersamaan for ($i=1; $i -le 5; $i++) { Invoke-WebRequest -Uri "http://localhost:8000/api/classification/classify" ` -Method POST ` -Form @{image = Get-Item "path/to/image.jpg"} & } Wait-Job ``` --- ## ๐Ÿ“Š Performance Improvement ### Sebelum Fix - Request 1: โœ… 15 detik (load model) - Request 2: โŒ Timeout 30s (memory/conflict) - Request 3: โŒ Gagal ### Sesudah Fix - Request 1: โœ… 15 detik (load model) - Request 2: โœ… 20 detik (wait lock + inference) - Request 3: โœ… 18 detik (queue + inference) - Semua berhasil โœ… --- ## ๐Ÿ” Troubleshooting ### Jika Error Masih Muncul #### 1. Cek Memory Sistem ``` GET /api/health/ Lihat: health.system.memory ``` Jika `php_memory_mb` > 256MB โ†’ perlu optimize #### 2. Cek Model File ``` python web_TA/scripts/diagnosis.py "rice leaf diseases dataset" ``` Check output: - model_files.*.exists: harus true - tensorflow.installed: harus true #### 3. Lihat Error Log ``` tail -f storage/logs/laravel.log Cari: "Python Process Error" ``` #### 4. Test Python Langsung ```powershell cd web_TA $img_base64 = [Convert]::ToBase64String([IO.File]::ReadAllBytes("test.jpg")) $json = @{image=$img_base64} | ConvertTo-Json $json | python scripts/rice_inference.py classify --model-dir "../rice leaf diseases dataset" ``` ### Common Error Messages #### "Model sedang diproses, silahkan coba lagi dalam beberapa detik" **Penyebab**: Request queue penuh **Solusi**: Tunggu 5 detik, retry #### "Proses inferensi Python tidak mengembalikan output" **Penyebab**: Model loading gagal **Solusi**: Jalankan diagnosis.py, check TensorFlow #### "Gagal menjalankan proses inferensi Python" **Penyebab**: Python executable tidak ditemukan **Solusi**: Cek `.env` PYTHON_EXECUTABLE pointing ke .venv --- ## ๐Ÿ“ˆ Monitoring & Prevention ### 1. Setup Cron Job untuk Health Check (optional) ```php // app/Console/Kernel.php Schedule::call(function () { $service = new PythonClassificationService(); $service->health(); })->everyFiveMinutes()->onOneServer(); ``` ### 2. Add Alert untuk Memory Warning Jika `health.system.memory.percent_used > 80%`: - Alert admin - Reduce concurrent requests ### 3. Logging ke Database (optional) Track semua klasifikasi errors untuk analytics --- ## ๐Ÿš€ Long-term Optimization (Phase 6) 1. **Model Daemon Server** - FastAPI server yang load model once, serve multiple requests 2. **GPU Support** - Setup CUDA untuk TensorFlow GPU acceleration 3. **Model Compression** - Quantize model untuk memory lebih efisien 4. **Caching Layer** - Cache hasil klasifikasi untuk identical images --- ## ๐Ÿ“ž Support Jika error masih muncul setelah implementasi: 1. Jalankan `/api/health/diagnose` 2. Check `storage/logs/laravel.log` 3. Report output ke backend team --- *Last Updated: May 2026*