Quick Start#

This page walks through a minimal LP against cuopt_grpc_server in two ways:

  1. Remote execution — set CUOPT_REMOTE_HOST and CUOPT_REMOTE_PORT on the client; the same Python, C (cuOptSolve), or cuopt_cli APIs you use locally forward an LP, MIP, or QP to the GPU server with no code changes. Modeling-language integrations that call those APIs do the same.

  2. gRPC linear programming client — the same LP, with host and port passed to Client(...) for explicit job control (submit / wait / result / delete).

Start the GPU server, then try remote execution first; the gRPC-client variant follows immediately after that demo. Full client docs: gRPC Linear Programming Client. Custom clients call CuOptRemoteService directly (see gRPC API (Reference)).

Note

Problem types: LP, MIP, and QP support remote execution (this guide) and the gRPC linear programming client. Routing (VRP, TSP, PDP) uses the gRPC routing client or a custom client. It does not read CUOPT_REMOTE_HOST/CUOPT_REMOTE_PORT.

How Remote Execution Works#

  1. GPU server — On the machine with the GPU, run cuopt_grpc_server (bare metal or in the cuOpt container) so it listens on a TCP port (default 5001).

  2. Client machine — On the machine where you invoke the solver (which may be the same host), install the NVIDIA cuOpt client libraries. Set CUOPT_REMOTE_HOST to the GPU server’s hostname or IP and CUOPT_REMOTE_PORT to the listen port.

  3. Solve — Call the same APIs you would for a local solve. The integrated client opens a gRPC channel, streams the problem, and retrieves the result. Unset the two variables to solve locally again (local mode still needs a GPU on the client machine where applicable).

Install NVIDIA cuOpt#

Use the selector below on the GPU server and on client machines that need Python, the C API, or cuopt_cli. It is pre-set to C (libcuopt) because that bundle ships cuopt_grpc_server, cuopt_cli, and libraries together; switch to Python if you only need Python packages on a lightweight client.

Verify the server binary on the GPU server after installing the C/libcuopt bundle (that package ships cuopt_grpc_server). A Python-only client install does not include this binary:

cuopt_grpc_server --help

For the same install selector with Container / registry choices (Docker Hub or NGC), see Installation.

Run the gRPC Server (GPU Server)#

Bare metal — after activating the same environment you used to install NVIDIA cuOpt:

cuopt_grpc_server --port 5001 --workers 1

Leave the process running. Default port 5001; change --port if needed and expose the same port to the client.

Docker — requires NVIDIA Container Toolkit (or equivalent) on the host. Pull an image tag from Installation or the Container row in the selector above; substitute <CUOPT_IMAGE> below.

Entrypoint mode (recommended when you are not passing an explicit command):

docker run --gpus all -it --rm -p 5001:5001 \
  <CUOPT_IMAGE> \
  grpc

Or invoke the binary explicitly:

docker run --gpus all -it --rm -p 5001:5001 \
  <CUOPT_IMAGE> \
  cuopt_grpc_server --port 5001 --workers 1

For further startup options, including how to specify the container mode in a Kubernetes environment, see Advanced configuration.

Minimal Python Example#

On the client machine, point remote execution at the GPU server (use 127.0.0.1 if the server is on the same host):

export CUOPT_REMOTE_HOST=<gpu-server-hostname-or-ip>
export CUOPT_REMOTE_PORT=5001

Optional TLS and tuning variables are in Advanced Configuration. The same exports apply to the C API and cuopt_cli.

The script below is the same for local or remote solves: with the exports above, the integrated client forwards to cuopt_grpc_server; without them, the solve runs locally (where a GPU is available). Please make sure the server is running before running the client.

remote_lp_demo.py

 1# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
 2# SPDX-License-Identifier: Apache-2.0
 3
 4"""Minimal LP demo for NVIDIA cuOpt gRPC remote execution.
 5
 6Set CUOPT_REMOTE_HOST and CUOPT_REMOTE_PORT on the client before running to forward
 7the solve to cuopt_grpc_server; unset them to solve locally (GPU required locally).
 8
 9The same LP is available as MPS in ``remote_lp_demo.mps`` for ``cuopt_cli``.
10"""
11
12import numpy as np
13from cuopt import linear_programming
14
15dm = linear_programming.DataModel()
16A_values = np.array([3.0, 4.0, 2.7, 10.1], dtype=np.float64)
17A_indices = np.array([0, 1, 0, 1], dtype=np.int32)
18A_offsets = np.array([0, 2, 4], dtype=np.int32)
19dm.set_csr_constraint_matrix(A_values, A_indices, A_offsets)
20
21b = np.array([5.4, 4.9], dtype=np.float64)
22dm.set_constraint_bounds(b)
23
24c = np.array([0.2, 0.1], dtype=np.float64)
25dm.set_objective_coefficients(c)
26dm.set_maximize(True)
27
28dm.set_row_types(np.array(["L", "L"]))
29
30dm.set_variable_lower_bounds(np.array([0.0, 0.0], dtype=np.float64))
31dm.set_variable_upper_bounds(np.array([2.0, np.inf], dtype=np.float64))
32
33settings = linear_programming.SolverSettings()
34solution = linear_programming.Solve(dm, settings)
35
36print("Termination:", solution.get_termination_reason())
37print("Objective:  ", solution.get_primal_objective())
38print("Primal x:   ", solution.get_primal_solution())

Run the script from your NVIDIA cuOpt Python environment. From a repository checkout (repo root):

python docs/cuopt/source/cuopt-grpc/examples/remote_lp_demo.py

Or, after downloading the file into your current directory:

python remote_lp_demo.py

You should see an optimal termination. To solve locally, unset the remote variables and rerun with the same path you used above:

unset CUOPT_REMOTE_HOST CUOPT_REMOTE_PORT
python remote_lp_demo.py

Same LP via the gRPC Linear Programming Client

Remote execution needs no code changes. If you want explicit job control instead, leave CUOPT_REMOTE_* unset and use the gRPC linear programming client. Pass the GPU server’s network location in the Client constructor (host and port); it does not read CUOPT_REMOTE_*.

Keep the DataModel setup and SolverSettings from the listing above, and replace everything from the Solve call onward (line 33 in that listing) with:

from cuopt.grpc.linear_programming import Client, JobStatus

# Network location of cuopt_grpc_server (not CUOPT_REMOTE_*).
client = Client("localhost", 5001)
job_id = client.submit(dm, settings)
try:
    status = client.wait(job_id, timeout=120)
    if status != JobStatus.COMPLETED:
        raise RuntimeError(f"unexpected status: {status}")
    # Pass variable names if you want solution.get_vars() keyed by name.
    solution = client.result(job_id, variable_names=["x0", "x1"])
    print("Termination:", solution.get_termination_reason())
    print("Objective:  ", solution.get_primal_objective())
    print("Primal x:   ", solution.get_primal_solution())
finally:
    client.delete(job_id)

A full walkthrough of log and incumbent streaming is in gRPC Linear Programming Client Examples. Overview and TLS details: gRPC Linear Programming Client.

Minimal cuopt_cli Example (LP)#

The same LP is available as MPS. With CUOPT_REMOTE_HOST and CUOPT_REMOTE_PORT set as in the Python example above, cuopt_cli forwards the solve to the remote server; unset them for a local run (GPU on that machine). Please make sure the server is running before running the client.

remote_lp_demo.mps

NAME          good-1
OBJSENSE
 MAXIMIZE
ROWS
 N  COST
 L  ROW1
 L  ROW2
COLUMNS
    VAR1      COST                 0.2
    VAR1      ROW1                 3.0   ROW2                 2.7
    VAR2      COST                 0.1
    VAR2      ROW1                 4.0   ROW2                10.1
RHS
    RHS1      ROW1                 5.4   ROW2                 4.9
BOUNDS
 LO BND1      VAR1                 0.0
 UP BND1      VAR1                 2.0
 LO BND1      VAR2                 0.0
ENDATA

From a repository checkout (repo root):

cuopt_cli docs/cuopt/source/cuopt-grpc/examples/remote_lp_demo.mps

Or, after downloading the MPS into your current directory:

cuopt_cli remote_lp_demo.mps

To solve locally with the same file:

unset CUOPT_REMOTE_HOST CUOPT_REMOTE_PORT
cuopt_cli remote_lp_demo.mps

More options (time limits, relaxation): Quickstart Guide and Examples.

C API — With the same environment variables set, call cuOptSolve as in cuOpt Convex Optimization C API Reference.

More patterns: Examples.

Next Steps#

See System Requirements for GPU, CUDA, and OS requirements.