In a notebook, model.predict(x) might return in 8 milliseconds. Put that behind a quick web app, send a few hundred requests per second, and requests start to queue while the GPU sits mostly idle. The model is fine; the serving is not. Serving means answering thousands of callers at once, inside a time budget, using an expensive GPU efficiently, surviving a crashed machine, and rolling out new versions without risk.
The first decision is the mode. Online serving, also called real-time serving, answers one request while a user or a process waits, such as a fraud check on a card payment, so latency matters most. Batch serving scores a large set of rows on a schedule with nobody waiting, such as churn scores for every account overnight, so total throughput and cost matter most. Streaming serving scores an endless flow of events and must keep up with the arrival rate.
The modes have opposite costs. Online serving keeps copies running and ready, so you pay for availability. Batch serving starts compute, uses it fully and shuts it down, so you pay only for the run. Many real systems use more than one, for example building candidate recommendations in a nightly batch and re-ranking the top few online when the app opens.