When using a REST API to get predictions from a machine learning model, the key metrics to watch are latency and accuracy. Latency tells us how fast the API responds, which is important for user experience. Accuracy tells us if the model's predictions are correct. For classification tasks, precision, recall, and F1-score help us understand prediction quality. For regression, mean squared error or mean absolute error matter. We want a balance: fast responses and good prediction quality.
REST API inference in PyTorch - Model Metrics & Evaluation
Imagine a REST API that classifies emails as spam or not spam. Here is a confusion matrix from 100 requests:
| Predicted Spam | Predicted Not Spam |
|----------------|--------------------|
| True Positives (TP) = 40 |
| False Positives (FP) = 10 |
| False Negatives (FN) = 5 |
| True Negatives (TN) = 45 |
Total requests = 40 + 10 + 5 + 45 = 100
From this, we calculate:
- Precision = TP / (TP + FP) = 40 / (40 + 10) = 0.8
- Recall = TP / (TP + FN) = 40 / (40 + 5) = 0.8889
- F1-score = 2 * (Precision * Recall) / (Precision + Recall) ≈ 0.842
- Accuracy = (TP + TN) / Total = (40 + 45) / 100 = 0.85
In REST API inference, sometimes we want to avoid false alarms (false positives), and sometimes we want to catch all true cases (false negatives).
- High Precision Example: A spam filter API where marking a good email as spam is bad. We want high precision to avoid false positives.
- High Recall Example: A medical diagnosis API where missing a disease is dangerous. We want high recall to catch all true cases.
Choosing the right metric depends on the API's purpose and user impact.
For a REST API serving predictions:
- Good: Accuracy above 90%, precision and recall balanced above 85%, latency under 200ms.
- Bad: Accuracy below 70%, precision or recall below 50%, latency over 1 second causing slow user experience.
Good metrics mean users get fast and reliable predictions. Bad metrics mean slow or wrong results, hurting trust.
- Accuracy paradox: High accuracy can be misleading if classes are imbalanced. For example, 95% accuracy if 95% data is one class but model ignores the other.
- Data leakage: If test data leaks into training, API predictions look too good but fail in real use.
- Overfitting: Model performs well on training but poorly on new API requests.
- Ignoring latency: A very accurate model that is too slow makes the API unusable.
Your REST API model has 98% accuracy but only 12% recall on fraud detection. Is it good for production? Why or why not?
Answer: No, it is not good. The low recall means the model misses most fraud cases, which is dangerous. Even with high accuracy, the model fails to catch fraud, so it should be improved before production.
Practice
Solution
Step 1: Understand REST API role
A REST API allows communication over the web by sending requests and receiving responses.Step 2: Connect REST API with model inference
In PyTorch, a REST API is used to send input data and get predictions from the model remotely.Final Answer:
To send data to the model and receive predictions over the web -> Option BQuick Check:
REST API = Web data exchange for predictions [OK]
- Confusing inference with training
- Thinking REST API is for saving models
- Assuming REST API visualizes models
Solution
Step 1: Identify how to disable gradients
PyTorch usestorch.no_grad()context to turn off gradient tracking during inference.Step 2: Check other options
model.train()enables training mode,torch.enable_grad()enables gradients, andmodel.backward()is invalid.Final Answer:
with torch.no_grad(): -> Option AQuick Check:
Disable gradients = torch.no_grad() [OK]
- Using model.train() instead of model.eval()
- Not disabling gradients causing slow inference
- Calling backward() during inference
from flask import Flask, request, jsonify
import torch
app = Flask(__name__)
model = torch.nn.Linear(2, 1)
model.eval()
@app.route('/predict', methods=['POST'])
def predict():
data = request.get_json()
x = torch.tensor(data['input']).unsqueeze(0).float()
with torch.no_grad():
output = model(x)
return jsonify({'prediction': output.item()})Solution
Step 1: Understand input and output processing
The input JSON is converted to a tensor with shape (1, 2). The model outputs a tensor with shape (1, 1).Step 2: Check output conversion
The output tensor's single value is extracted usingoutput.item(), which returns a float, then wrapped in JSON.Final Answer:
{"prediction": 3.0} -> Option DQuick Check:
output.item() returns float for JSON [OK]
- Returning tensor object directly in JSON
- Forgetting to convert input to tensor
- Not using torch.no_grad() causing slow inference
@app.route('/predict', methods=['POST'])
def predict():
data = request.get_json()
x = torch.tensor(data['input'])
with torch.no_grad():
output = model(x)
return jsonify({'prediction': output.item()})Solution
Step 1: Understand the error cause
The model expects float tensors but input tensor is double (default from Python floats).Step 2: Fix input tensor type
Convert input tensor to float type using.float()before passing to the model.Final Answer:
Convert input tensor to float using .float() before passing to model -> Option AQuick Check:
Tensor dtype mismatch fixed by .float() [OK]
- Not converting input data type
- Calling model.train() during inference
- Removing torch.no_grad() causing slow inference
Solution
Step 1: Model loading and mode
Load the model once globally to avoid overhead and set it to evaluation mode withmodel.eval().Step 2: Input preprocessing and inference
Preprocess the input image to a tensor, usetorch.no_grad()to disable gradients, get prediction, and return JSON response.Final Answer:
Load model once globally, set model.eval(), preprocess input image to tensor, use torch.no_grad(), get prediction, return JSON -> Option CQuick Check:
Efficient inference = global load + eval + no_grad + preprocess [OK]
- Loading model on every request causing slow response
- Using model.train() during inference
- Not preprocessing input to tensor
- Calling backward() during inference
Ready to prove it?
Pass the test and this pattern moves unknown
