Skip to content

Serving trained policies

decisionrl.serving turns a trained agent into a portable artifact and a tiny inference service. The serving runtime needs only onnxruntime + FastAPI — no PyTorch — so deployment images stay small.

Install the extra:

pip install "decisionrl[serve]"

Export

from decisionrl.algorithms import PPO
from decisionrl.envs import CartPole
from decisionrl.serving import export_onnx, export_torchscript, OnnxPolicy

agent = PPO(CartPole(), seed=0).learn(50_000)
export_onnx(agent, "policy.onnx")          # writes policy.onnx + policy.onnx.json
export_torchscript(agent, "policy.pt")     # TorchScript alternative

policy = OnnxPolicy("policy.onnx")         # inference with onnxruntime only
action = policy.predict(obs)

The exporter freezes the deterministic policy (argmax for discrete agents; the squashed/clamped mean for continuous ones). Supported agents: PPO, A2C, GRPO, SAC, DDPG, TD3 and DQN.

Serve over HTTP

DECISIONRL_MODEL=policy.onnx uvicorn decisionrl.serving.server:app --port 8000
Method Path Description
GET /health liveness probe
GET /info policy metadata (obs dim, action type, bounds)
POST /predict {"observation": [...]}{"action": ...}
from decisionrl.serving import create_app       # FastAPI app for the model
app = create_app("policy.onnx")

Docker

deploy/Dockerfile builds a slim image (onnxruntime + FastAPI, no torch):

docker build -f deploy/Dockerfile -t decisionrl-serve .
docker run -p 8000:8000 -e DECISIONRL_MODEL=/models/policy.onnx decisionrl-serve