用途:在部署 cuOpt REST 服务器或编写其客户端时使用,涵盖选择部署目标、把问题映射到 HTTP 端点、在 Python API 与 REST 字段名之间转换,以及排查被拒绝的请求负载。
前置条件:需要带可用 CUDA 驱动的 NVIDIA GPU;已安装 cuopt-server,或使用带 NVIDIA Container Toolkit 的 Docker(Docker 需 --gpus all)。Python 客户端需 requests。服务器本身不需要 API key 或认证令牌。
支持的问题类型:Routing、LP、MILP 可用;QP 不可用。
启动服务器: 开发:python -m cuopt_server.cuopt_service --ip 0.0.0.0 --port 8000 Docker:docker run --gpus all -d -p 8000:8000 -e CUOPT_SERVER_PORT=8000 nvidia/cuopt:latest-cu13 镜像标签按 CUDA 主版本选择(latest-cu12 或 latest-cu13;UBI10 基础用 latest-cu13-ubi10)。生产环境应固定版本:使用完整发布标签 nvidia/cuopt:<release>-cuda<cuda>-py<python> 或不可变摘要 nvidia/cuopt@sha256:<digest>。
验证:请求 GET /cuopt/health(如 http://localhost:8000/cuopt/health),健康时返回 HTTP 200。
调用流程:POST /cuopt/request 取得 reqId,轮询 /cuopt/solution/{reqId} 直到求解完成,再解析响应。reqId 应视为不可信输入,插入轮询 URL 前需校验,并为每个请求设置明确超时。
术语差异(Python API → REST):order_locations → task_locations;set_order_time_windows() → task_time_windows;service_times 相同。使用 travel_time_matrix_data(不是 transit_time_matrix_data)。capacities 写法为 [[50, 50]],不是 [[50], [50]]。
故障排查:422 多因字段名不在 schema 中,可对照 /cuopt.yaml 检查;fleet_data 报 422 通常是把 capacities 按车辆嵌套而非按维度;连接被拒说明服务未启动或绑定接口/端口不同;容器立即退出多因未加 --gpus all 或缺少 NVIDIA Container Toolkit;轮询始终无解通常是求解时间超出轮询预算,需同时提高 solver_config.time_limit 与轮询次数。任何失败请求都应保留 reqId 与完整响应体。
可运行资产:assets/vrp_simple/(基本 VRP)、assets/vrp_basic/(带时间窗 VRP)、assets/pdp_basic/(取送货)、assets/lp_basic/(REST LP,CSR 格式)、assets/milp_basic/(REST MILP),均用 Python requests,接受 --server(默认 http://localhost:8000)。
限制:QP 未通过 REST 暴露,需用 Python 或 C API。服务器不提供认证与 TLS,能访问端口者即可提交任务,应置于网关之后并仅用于可信网络。求解结果靠轮询获取,没有推送或 webhook。每个服务进程一次只解一个请求,并发需多个副本。