Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
ML Service — Rust Axum ONNX Runtime
Layanan inferensi machine learning berbasis Rust dengan Axum web framework dan ONNX Runtime untuk klasifikasi penyakit daun jagung. Service ini menyediakan endpoint HTTP untuk prediksi real-time dengan performa tinggi dan konsumsi resource minimal.
Fitur
- Framework: Axum (async Rust web framework)
- Runtime Inferensi: ONNX Runtime untuk kompatibilitas lintas platform
- Model: EfficientNetV2B0 dalam format ONNX
- Endpoint: Health check, metadata, dan prediksi gambar
- Multipart Upload: Dukungan upload gambar langsung via HTTP POST
Prasyarat
- Rust 1.70+ dan Cargo
- Model ONNX di
../../Machine_Learning/model/model.onnx(atau path custom viaMODEL_PATH)
Instalasi & Setup
Instalasi Dependensi
Dependensi Rust sudah terdaftar di Cargo.toml. Cargo akan mengunduh dan mengkompilasi otomatis saat pertama kali build.
cargo build
Menjalankan Service Lokal
Semua perintah di bawah dijalankan dari direktori apps/ml-service.
Opsi 1: Default (Port 8000, Model dari Machine_Learning/)
cd apps/ml-service
cargo run
Service akan mencari model di path default dan mendengarkan di http://localhost:8000:
../../Machine_Learning/model/model.onnx
Opsi 2: Local Development dengan .env.example (Port 8001)
Untuk development lokal dengan port 8001 (sesuai .env.example):
cd apps/ml-service
source .env.example
cargo run
Service akan mendengarkan di http://localhost:8001 karena ML_SERVICE_PORT=8001 di .env.example.
Opsi 3: Custom Model Path
Jika model berada di lokasi lain, gunakan environment variable MODEL_PATH:
cd apps/ml-service
MODEL_PATH=/path/to/model.onnx cargo run
Atau kombinasikan dengan port custom:
cd apps/ml-service
ML_SERVICE_PORT=9000 MODEL_PATH=/path/to/model.onnx cargo run
Environment Variables
| Variable | Default | Keterangan |
|---|---|---|
ML_SERVICE_HOST |
0.0.0.0 |
Bind address |
ML_SERVICE_PORT |
8000 |
Bind port (override untuk local dev dengan .env.example) |
MODEL_PATH |
../../Machine_Learning/model/model.onnx |
Path ke file model ONNX |
MODEL_INPUT_SIZE |
224 |
Ukuran input gambar (224x224 untuk EfficientNetV2B0) |
RUST_LOG |
info |
Level logging (debug, info, warn, error) |
Endpoint API
1. Health Check
Default (port 8000):
curl http://localhost:8000/health
Local dev dengan .env.example (port 8001):
curl http://localhost:8001/health
Response:
{
"status": "ok",
"model_loaded": true
}
2. Metadata
Default (port 8000):
curl http://localhost:8000/metadata
Local dev dengan .env.example (port 8001):
curl http://localhost:8001/metadata
Response:
{
"service_name": "zeavis-ml-service",
"service_version": "0.1.0",
"model_path": "../../Machine_Learning/model/model.onnx",
"model_loaded": true,
"input_size": 224,
"labels": [
"Bercak Daun",
"Daun Sehat",
"Karat Daun",
"Hawar Daun"
]
}
3. Prediksi
Upload gambar daun jagung untuk klasifikasi:
Default (port 8000):
curl -X POST http://localhost:8000/predict \
-F "file=@/path/to/corn-leaf.jpg"
Local dev dengan .env.example (port 8001):
curl -X POST http://localhost:8001/predict \
-F "file=@/path/to/corn-leaf.jpg"
Response:
{
"label": "Daun Sehat",
"confidence": 0.95,
"probabilities": {
"Bercak Daun": 0.02,
"Daun Sehat": 0.95,
"Karat Daun": 0.01,
"Hawar Daun": 0.02
}
}
Verifikasi & Testing
Build Produksi
cargo build --release
Output binary akan tersedia di target/release/zeavis-ml-service.
Menjalankan Tests
cargo test
Tests mencakup validasi loading model, preprocessing gambar, dan output prediksi.
Verifikasi Manual
Dengan default port 8000:
-
Jalankan service:
cargo run -
Di terminal lain, test health endpoint:
curl http://localhost:8000/health -
Test metadata:
curl http://localhost:8000/metadata -
Test prediksi dengan gambar sample:
curl -X POST http://localhost:8000/predict \ -F "file=@../../Machine_Learning/dataset/Daun\ Sehat/sample.jpg"
Dengan local dev port 8001 (.env.example):
-
Jalankan service dengan .env.example:
source .env.example cargo run -
Di terminal lain, test health endpoint:
curl http://localhost:8001/health -
Test metadata:
curl http://localhost:8001/metadata -
Test prediksi dengan gambar sample:
curl -X POST http://localhost:8001/predict \ -F "file=@../../Machine_Learning/dataset/Daun\ Sehat/sample.jpg"
Troubleshooting
Model tidak ditemukan
Error: Failed to load model: No such file or directory
Solusi: Pastikan file model tersedia di path yang benar:
ls -la ../../Machine_Learning/model/model.onnx
Atau set path custom:
MODEL_PATH=/absolute/path/to/model.onnx cargo run
Port sudah digunakan
Error: Address already in use
Solusi: Service menggunakan port 8000 secara default. Jika port sudah digunakan, ubah dengan environment variable:
ML_SERVICE_PORT=9000 cargo run
Atau jika menggunakan .env.example (port 8001), pastikan tidak ada service lain di port tersebut:
lsof -i :8001
ONNX Runtime tidak kompatibel
Error: ONNX Runtime initialization failed
Solusi: Pastikan ONNX Runtime binary kompatibel dengan sistem operasi. Cargo akan mengunduh binary yang sesuai otomatis. Jika masalah persisten, coba rebuild:
cargo clean
cargo build
Deployment
Docker
Service dapat di-deploy via Docker. Dockerfile sudah tersedia di direktori ini.
docker build -t zeavis-ml-service .
docker run -p 8000:8000 \
-v /path/to/model.onnx:/app/model.onnx \
-e MODEL_PATH=/app/model.onnx \
zeavis-ml-service
Docker Compose
Lihat docker-compose.yml di root repository untuk deployment lengkap dengan web, API, dan ML service.
Dokumentasi Terkait
Machine_Learning/README.md— Panduan training dan ekspor model ONNXREADME.md— Dokumentasi proyek utama