构建您自己的瘦客户端#

概述#

瘦客户端和 cli 提供了访问 cuOpt 服务的便利性,但这些仅是如何与 cuOpt 服务通信的参考示例。如果您希望创建自己的瘦客户端,下面将讨论 API 的底层细节。

注意

请不要使用 cuopt_thin_client.pycuopt_service_client.py 作为您的瘦客户端名称,只是为了避免在您从 pypi 安装了 cuopt 瘦客户端时造成混淆。

API 授权#

一旦您拥有 NVIDIA 身份联合 API 密钥,您可以在后续对 cuOpt 服务的请求中将其在 Authorization 标头中传递。

列出 cuOpt 版本#

cuOpt 管理员代表客户端创建函数,可以列出这些版本,以便可以选择最新/合适的版本。

示例

1curl --request GET https://api.nvcf.nvidia.com/v2/nvcf/functions
2--header 'Content-Type: application/json' \
3--header 'Authorization: Bearer <NVIDIA Identity Federation API Key>'

这将获取可用的 cuOpt 版本列表,客户端可以根据创建日期选择 cuOpt 版本。

响应将如下所示

 1{
 2 "functions": [
 3     {
 4         "id": "649b46a7-f65d-4943-873f-920bfe37ae66",
 5         "versionId": "b9957f66-4e1d-4957-8ab8-cf472e3a0f5b",
 6         ...
 7         ...
 8         ...
 9         "createdAt": "2023-08-14T12:16:32.116Z"
10     }
11   ]
12 }

id 和 versionId 将用于调用 cuOpt 函数。

调用 cuOpt 服务#

当有效负载 <= 250KB 时发送 cuOpt 请求#

此方法用于执行 cuOpt 函数。requestBody 包含一个 JSON 对象,该对象将由 cuOpt 处理。

您必须在 URL 中包含函数 ID 和版本 ID,如下所示;这标识要调用的特定函数。

带有函数版本 ID 的示例

 1curl --location 'https://api.nvcf.nvidia.com/v2/nvcf/pexec/functions/{id}/versions/{versionId}' \
 2--header 'Content-Type: application/json' \
 3--header 'Authorization: Bearer <NVIDIA Identity Federation API Key>' \
 4--data '{
 5        "data": {
 6          "cost_matrix_data": {"data": {"0": [[0, 1], [1, 0]]}},
 7          "task_data": {"task_locations": [1], "demand": [[1]], "task_time_windows": [[0, 10]], "service_times": [1]},
 8          "fleet_data": {"vehicle_locations":[[0, 0]], "capacities": [[2]], "vehicle_time_windows":[[0, 20]] },
 9          "solver_config": {"time_limit": 2}
10        },
11        "client_version": "custom"
12    }
13}'

JSON_DATA 应遵循为 cuOpt 输入描述的 Open-API 规范

当有效负载 > 250KB 时发送 cuOpt 请求#

requestBody 的最大大小为 250KB。如果 JSON_DATA 的大小大于 250KB,则需要先单独上传,并在请求中引用返回的资产 ID。cuOpt 将根据 ID 获取资产并进行处理。

示例

1curl -X 'POST' \
2'https://api.nvcf.nvidia.com/v2/nvcf/assets' \
3-H 'Authorization: Bearer <NVIDIA Identity Federation API Key>' \
4-H 'accept: application/json' \
5-H 'Content-Type: application/json' \
6-d '{
7"contentType": "application/octet-stream",
8"description": "Optimization-data"
9}'

这将导致如下所示的响应,其中包含 assetId 和用于将数据推送到 uploadUrl 的地址

1{
2    "assetId":"b5b841c3-11c2-4c34-b057-9475e82c5369",
3    "uploadUrl":"<pre-signed-upload-url>",
4    "contentType":"application/octet-stream",
5    "description":"Optimization-data"
6}

压缩 JSON 数据。

1import msgpack
2
3pickled_cuopt_data = msgpack.dump(cuopt_problem_json_data, open('problem_data.mpk', 'wb'))

将压缩后的资产上传到云端。

1 curl -X PUT -T problem_data.mpk "<pre-signed-URL>" -H "Content-Type: application/octet-stream" -H "x-amz-meta-nvcf-asset-description: Optimization-data"

列出资产#

1curl -X GET https://api.nvcf.nvidia.com/v2/nvcf/assets -H "Authorization: Bearer <NVIDIA Identity Federation API Key>"

在调用函数时引用资产#

要在函数调用中使用资产,请添加一个 requestHeader 字段,如下所示。请注意,inputAssetReferences 的值在技术上可以是列表,但 cuOpt 仅期望单个 assetId。由于 cuOpt 数据已作为资产上传,请将 requestBody 设置为 {}

1 curl --location 'https://api.nvcf.nvidia.com/v2/nvcf/pexec/functions/{id}/versions/{versionId}' \
2 --header 'Content-Type: application/json' \
3 --header 'Authorization: Bearer <NVIDIA Identity Federation API Key>' \
4 --header 'NVCF-INPUT-ASSET-REFERENCES: <assetID>' \
5 --data '{
6     "data": null,
7     "client_version": "custom"
8 }'

删除资产#

资产应在您完成处理后删除;但是,它们将被自动垃圾回收。

1curl -X DELETE https://api.nvcf.nvidia.com/v2/nvcf/assets/{assetId} -H "Authorization: Bearer <NVIDIA Identity Federation API Key>"

cuOpt 结果检索#

cuOpt 服务采用 长轮询 进行调用和结果检索。

当您发出调用请求时,系统将保持您的请求打开一段时间,然后返回以下内容之一

  • HTTP 状态 200 已完成结果

  • HTTP 状态 202 轮询响应

收到轮询响应后,您的客户端应立即轮询 cuOpt 服务以检索您的结果。建议每秒轮询一次。

轮询场景将具有以下调用响应

1{
2 "reqId": "ef4c1967-d543-467c-af7e-8c7899d75be8",
3 "status": "pending-evaluation"
4}

轮询响应

1curl --location 'https://api.nvcf.nvidia.com/v2/nvcf/pexec/status/{request-id}' \
2--header 'Authorization: Bearer <JWT>'

为了获得最佳性能,预计客户端在确定不再需要与服务器进行通信之前不会关闭连接。

cuOpt 大型响应检索#

在某些情况下,调用的结果可能会返回一个 URL,用于下载大型响应。您将在结果中收到对下载有效负载的引用。对 URL 的 GET 请求将返回一个包含结果的 zip 文件。URL 的 TTL 为 24 小时。

1{
2 "reqId":"abc123",
3 "status":"fulfilled",
4 "responseReference": "<pre-signed download url for large result>",
5 "percentComplete":100,
6 "errorCode":0
7}