Bird
Raised Fist0
PyTorchml~5 mins

REST API inference in PyTorch

Choose your learning style10 modes available
Introduction

A REST API lets you send data to a machine learning model and get predictions back easily over the internet.

You want to let a mobile app get predictions from your ML model.
You want to share your model with others without giving them the code.
You want to use your model in a website to show live results.
You want to automate predictions from other software.
You want to test your model remotely without running it locally.
Syntax
PyTorch
from flask import Flask, request, jsonify
import torch

app = Flask(__name__)

# Load your trained PyTorch model
model = torch.load('model.pth')
model.eval()

@app.route('/predict', methods=['POST'])
def predict():
    data = request.json  # Get JSON data from POST request
    input_tensor = torch.tensor(data['input'], dtype=torch.float32).unsqueeze(0)  # Convert input list to tensor with batch dimension
    with torch.no_grad():
        output = model(input_tensor)
    prediction = output.argmax(dim=1).item()  # Get predicted class
    return jsonify({'prediction': prediction})

if __name__ == '__main__':
    app.run(debug=True)

This example uses Flask, a simple web framework for Python.

The model is loaded once and used for all requests to save time.

Examples
This command sends input data to the API and gets the prediction back.
PyTorch
curl -X POST http://localhost:5000/predict -H "Content-Type: application/json" -d '{"input": [0.5, 1.2, 3.3]}'
This Python code sends data to the REST API and prints the prediction result.
PyTorch
import requests

response = requests.post('http://localhost:5000/predict', json={'input': [0.5, 1.2, 3.3]})
print(response.json())
Sample Model

This program creates a simple PyTorch model, saves it, then loads it in a Flask app. The app listens for POST requests at /predict, runs the model on input data, and returns the predicted class.

PyTorch
from flask import Flask, request, jsonify
import torch
import torch.nn as nn

# Define a simple model for demonstration
class SimpleModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(3, 2)  # 3 inputs, 2 classes
    def forward(self, x):
        return self.linear(x)

app = Flask(__name__)

# Create and save a dummy model
model = SimpleModel()
torch.save(model, 'model.pth')

# Load the model
model = torch.load('model.pth')
model.eval()

@app.route('/predict', methods=['POST'])
def predict():
    data = request.json
    input_tensor = torch.tensor(data['input'], dtype=torch.float32).unsqueeze(0)  # batch size 1
    with torch.no_grad():
        output = model(input_tensor)
    prediction = output.argmax(dim=1).item()
    return jsonify({'prediction': prediction})

if __name__ == '__main__':
    app.run(debug=False)
OutputSuccess
Important Notes

Always set your model to evaluation mode with model.eval() before inference.

Use torch.no_grad() to avoid tracking gradients during prediction, which saves memory.

For production, use a more robust server than Flask's built-in one.

Summary

A REST API lets you send data and get predictions from your ML model over the web.

Flask is a simple way to create such an API in Python.

Remember to load your model once and use model.eval() and torch.no_grad() for efficient inference.

Practice

(1/5)
1. What is the main purpose of using a REST API for PyTorch model inference?
easy
A. To train the model faster using multiple GPUs
B. To send data to the model and receive predictions over the web
C. To visualize the model architecture in a browser
D. To save the model weights to disk

Solution

  1. Step 1: Understand REST API role

    A REST API allows communication over the web by sending requests and receiving responses.
  2. 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.
  3. Final Answer:

    To send data to the model and receive predictions over the web -> Option B
  4. Quick Check:

    REST API = Web data exchange for predictions [OK]
Hint: REST API = send input, get prediction over web [OK]
Common Mistakes:
  • Confusing inference with training
  • Thinking REST API is for saving models
  • Assuming REST API visualizes models
2. Which of the following is the correct way to disable gradient calculation during inference in a Flask REST API using PyTorch?
easy
A. with torch.no_grad():
B. model.train()
C. torch.enable_grad()
D. model.backward()

Solution

  1. Step 1: Identify how to disable gradients

    PyTorch uses torch.no_grad() context to turn off gradient tracking during inference.
  2. Step 2: Check other options

    model.train() enables training mode, torch.enable_grad() enables gradients, and model.backward() is invalid.
  3. Final Answer:

    with torch.no_grad(): -> Option A
  4. Quick Check:

    Disable gradients = torch.no_grad() [OK]
Hint: Use torch.no_grad() to save memory during inference [OK]
Common Mistakes:
  • Using model.train() instead of model.eval()
  • Not disabling gradients causing slow inference
  • Calling backward() during inference
3. Given this Flask route for inference, what will be the output if the input JSON is {'input': [1.0, 2.0]} and the model returns tensor([3.0])?
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()})
medium
A. {"prediction": "tensor([3.0])"}
B. {"prediction": [3.0]}
C. Error: model not loaded
D. {"prediction": 3.0}

Solution

  1. 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).
  2. Step 2: Check output conversion

    The output tensor's single value is extracted using output.item(), which returns a float, then wrapped in JSON.
  3. Final Answer:

    {"prediction": 3.0} -> Option D
  4. Quick Check:

    output.item() returns float for JSON [OK]
Hint: Use output.item() to get scalar from tensor for JSON [OK]
Common Mistakes:
  • Returning tensor object directly in JSON
  • Forgetting to convert input to tensor
  • Not using torch.no_grad() causing slow inference
4. You wrote this Flask REST API code for inference but get an error: 'RuntimeError: expected scalar type Float but found Double'. What is the likely fix?
@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()})
medium
A. Convert input tensor to float using .float() before passing to model
B. Call model.train() before inference
C. Remove torch.no_grad() context
D. Change model output to int

Solution

  1. Step 1: Understand the error cause

    The model expects float tensors but input tensor is double (default from Python floats).
  2. Step 2: Fix input tensor type

    Convert input tensor to float type using .float() before passing to the model.
  3. Final Answer:

    Convert input tensor to float using .float() before passing to model -> Option A
  4. Quick Check:

    Tensor dtype mismatch fixed by .float() [OK]
Hint: Always convert input to float tensor before model call [OK]
Common Mistakes:
  • Not converting input data type
  • Calling model.train() during inference
  • Removing torch.no_grad() causing slow inference
5. You want to deploy a PyTorch model as a REST API that accepts images, preprocesses them, and returns class predictions. Which sequence of steps is best practice inside your Flask route?
hard
A. Load model globally, call model.eval(), preprocess input image to numpy array, call model backward(), return JSON
B. Load model inside route on every request, call model.train(), preprocess input, get prediction, return JSON
C. Load model once globally, set model.eval(), preprocess input image to tensor, use torch.no_grad(), get prediction, return JSON
D. Preprocess input image after prediction, load model globally, call torch.enable_grad(), return raw tensor

Solution

  1. Step 1: Model loading and mode

    Load the model once globally to avoid overhead and set it to evaluation mode with model.eval().
  2. Step 2: Input preprocessing and inference

    Preprocess the input image to a tensor, use torch.no_grad() to disable gradients, get prediction, and return JSON response.
  3. Final Answer:

    Load model once globally, set model.eval(), preprocess input image to tensor, use torch.no_grad(), get prediction, return JSON -> Option C
  4. Quick Check:

    Efficient inference = global load + eval + no_grad + preprocess [OK]
Hint: Load model once, eval mode, no_grad, preprocess input tensor [OK]
Common Mistakes:
  • Loading model on every request causing slow response
  • Using model.train() during inference
  • Not preprocessing input to tensor
  • Calling backward() during inference
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard