같은 ONNX 모델, 여섯 서버
ml-serving-bench 의 서버들을 그대로 띄웠습니다. 같은 입력(피처 20개 × N행)을 여섯 상자에 보내고 브라우저에서 왕복 시간을 잽니다. 추론 자체(ONNX Runtime)는 모두 같고, 차이는 HTTP·검증·직렬화 같은 서빙 계층에서 납니다. 여기 숫자는 관찰용입니다 — 공용 VM, 프록시 포함, 인터넷 왕복이 섞여 있어 벤치 수치가 아닙니다.
| 상자 | 언어 · 서버 | p50 | p95 | 최대 | 성공 | 응답(첫 행) |
|---|---|---|---|---|---|---|
| f1 | Python · FastAPI / uvicorn | – | – | – | – | – |
| d1 | Python · Django / gunicorn gthread | – | – | – | – | – |
| g1 | Python · Django / Granian WSGI | – | – | – | – | – |
| st | Python · Starlette / uvicorn | – | – | – | – | – |
| r1 | Rust · axum + ort | – | – | – | – | – |
| n1 | Go · net/http + onnxruntime_go | – | – | – | – | – |
무엇을 보나
- 1행에서는 Rust·Go 가 파이썬보다 빠릅니다. bench 의 실측(Docker, 서버 2코어)에서는 처리량이 약 5배였습니다. 여기서는 인터넷 왕복 20 ms 가 깔려 있어 차이가 1 ms 안팎으로만 보입니다.
- 1000행 onnx-rf 처럼 추론이 무거워지면(약 6 ms) 언어 차이가 거의 사라집니다 — 시간을 추론이 다 먹기 때문입니다.
- 파이썬 상자끼리는 프레임워크 차이보다 서버(gunicorn gthread vs Granian vs uvicorn) 차이가 큽니다. "FastAPI 라서 빠른 것은 아니다" 가 bench 의 결론이었습니다.
직접 호출
curl -s https://r1.camp.itda.work/predict/onnx-lr -H 'content-type: application/json' -d '{"rows":[[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]]}'
# 응답 {"model":"onnx-lr","labels":[1],"scores":[0.51],"model_version":"…"} · 각 상자: /static(고정 JSON) /info(스레드·ORT 버전)