灵骏 Runtime Kit 通过 gRPC 接口向容器层组件暴露资源管理、监控与配置管理能力。阅读本文可了解接口契约、proto 位置、调用示例、字段语义及兼容政策。
公测中:本产品当前处于公测阶段,如有问题或建议,请联系灵骏技术支持。
1. 接口总览
灵骏 Runtime Kit 通过标准 gRPC 接口对外提供 GPU 资源管理、监控与配置管理能力。
通信方式:通信基于 Unix Domain Socket。资源管理、监控两类接口共用同一个 socket(默认路径
unix:///run/amp/eKitC/xdm/sockets/dp2mgr.sock);配置管理类接口使用独立 socket(/run/amp/eKitC/xdm/sockets/config-daemon.sock)。权限模型:socket 文件由灵骏 Runtime Kit 守护进程创建,权限控制依赖文件系统权限,仅同节点 root 权限进程可访问;K8s 组件通过 hostPath 挂载
/run/amp/eKitC/xdm/sockets/目录获得访问权限;业务容器内不可见该路径,无法直接访问。三类接口:
类别
典型调用方
Socket
接口
资源管理
Device Plugin
dp2mgr.sockListSupportedXPUType、ListAndWatch、Allocate、Release
监控
Exporter
dp2mgr.sockListGpuInfo、ExporterGetDataList、ExporterDataStream、ExporterGetConfig、ExporterGetStatus
配置管理
Controller(Job Agent)
config-daemon.sockEnable、Disable、QueryStatus
1.1 Proto 文件与 Client Stub 生成
各 K8s 组件中,Device Plugin、Exporter 与灵骏 Runtime Kit 间的 gRPC 通信共用同一个 Unix Domain Socket(dp2mgr.sock)及同一份 proto 定义。资源管理/监控类 proto 可从开源仓 Device Plugin 组件获取(路径 internal/grpc/api_outer.proto);Controller 使用独立的 config-daemon.sock 与独立的 proto,位于 Controller 组件的 api/proto/config_service.proto(见第 5 章)。
生成各语言 Client Stub 示例:
# Go(推荐,与组件源码一致)
protoc --go_out=plugins=grpc:. api_outer.proto
# Python
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. api_outer.proto
# Java
protoc --java_out=. --grpc-java_out=. api_outer.proto1.2 Go 调用示例
以 Device Plugin 源码中的调用方式为参考:
import (
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
socketPath := "unix:///run/amp/eKitC/xdm/sockets/dp2mgr.sock"
conn, err := grpc.Dial(socketPath, grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Fatalf("connect failed: %v", err)
}
defer conn.Close()
client := NewXpuDeviceManagerServiceClient(conn)
// 调用示例:查询节点支持的 xPU 类型
resp, err := client.ListSupportedXPUType(context.Background(), &XPUTypeRequest{})注:示例中的 service / client 名称(XpuDeviceManagerService)为 proto 定义的生成名称,以开源仓 proto 文件为准。
2. 兼容与演进政策
gRPC 接口是 Runtime Kit 与开源组件之间唯一的对接边界,承诺只增不改、向后兼容:接口仅做增量演进(新增接口与字段),不改变已有接口与字段语义。若后续确需引入不兼容变更,该变更一定以大版本升级的形式发布并在发布说明中显著标注;大版本升级不一定包含不兼容变更,以对应版本的发布说明为准。
由此,基于本文档任一历史版本 proto 实现的组件,在 Runtime 升级后可继续正常工作;版本体系与兼容结论的完整说明见部署与版本指南第 4、5 章。
3. 资源管理类接口(Device Plugin 调用)
接口 | 类型 | 用途 |
| Unary | 查询节点支持的 xPU 类型 |
| Server-Streaming | 流式推送设备列表与健康状态 |
| Unary | 为容器分配 xPU 资源 |
| Unary | 释放容器设备分配记录 |
3.1 ListSupportedXPUType
查询当前节点支持的 xPU 设备类型。请求:无参数(空请求)。
响应字段:
字段 | 类型 | 说明 |
| int32 | 状态码(0=成功) |
| string | 状态描述 |
| repeated enum | 设备类型列表:GPU(0)/PPU(1)/AMD(2)/DCU(3) |
3.2 ListAndWatch
流式推送节点设备列表与健康状态变化。请求:无参数(空请求)。
响应字段(流式,每次推送完整设备列表):
字段 | 类型 | 说明 |
| string | 设备唯一标识 |
| string | "Healthy" 表示正常,其他值均为异常 |
| uint32 | 算力总量 |
| uint32 | 显存总量(MiB) |
| map | 扩展资源键值对(见 3.4 节) |
3.3 Allocate
核心资源分配接口,为容器分配 xPU 资源。
请求字段:
字段 | 类型 | 必填 | 说明 |
| string | 是 | 容器唯一标识 |
| enum | 否 | 容器运行时(默认 RunC) |
| map | 否 | 特性开关(预留,见下) |
| map | 否 | 附加注解(预留,见下) |
| repeated | 是 | 设备分配列表 |
devices 为 repeated 结构,表示“为该容器分配多张卡”,每个元素对应一张独立的 GPU 卡分配;当前仅支持同构配置,即所有元素须使用相同的 core/memory/slice 值。minor 字段不填时由灵骏 Runtime Kit 自动分配可用卡号。
设备分配字段(devices[]):
字段 | 类型 | 说明 |
| UInt32Value | GPU 卡号(可选,不填则自动分配) |
| UInt32Value | 算力百分比 |
| UInt32Value | 显存(GiB) |
| UInt32Value | MIG 空分切片数 |
| map<string, string> | 扩展字段,与 ListAndWatch 的 extenderResources 对称;调度器通过此字段向 XDM 回传调度决策结果(如 PCIe 索引) |
extender 字段说明:
Allocate 请求中 devices[].extender 为通用扩展字段(map<string, string>),与 ListAndWatch 响应的 extenderResources 形成上行/下行对称设计:ListAndWatch 上行上报设备拓扑,Allocate 下行回传调度器的分配决策。
当前已定义的 Key:
Key | Value 格式 | 用途 |
| JSON 数组(如 | 调度器指定的 PCIe 索引列表(即 ListAndWatch 拓扑中 topo1 携带的设备索引),XDM 根据 PCIe index 找到对应的 RDMA 设备并挂载到容器 |
响应字段:
字段 | 类型 | 说明 |
| int32 | 状态码(0=SUCCESS) |
| string | 状态描述 |
| map | 返回注解 |
| map | 返回标签 |
场景字段填写约定:
场景 | minor | core | memory | slice |
整卡分配 | 可选 | — | — | — |
时分复用(TDM) | 可选 | 必填 | 可选 | — |
空分(MIG) | 可选 | — | 可选 | 必填 |
关键约束:
core不填或填 0 表示不开启算力限制(整卡可用);取值范围 [1,100] 为单卡百分比;多卡场景通过devices数组(每元素一张卡)表达;memory在 Allocate 请求中单位为 GiB;ListAndWatch 返回的totalMemory单位为 MiB,注意区分;core和memory其中之一填 0,表示不限制算力或显存;两者同时为 0 且没有申请其他资源时,按 CPU 容器处理;minor填写则使用指定卡号(适用于有上层调度器的场景);不填则由灵骏 Runtime Kit 自动分配;slice支持值:1、2、3、4、7(MIG 切分当前支持 A100 与 H800 卡型号)。
featureGates 与 annotations 字段说明:两字段为预留扩展字段(featureGates 为 map<int32, bool>,annotations 为 map<string, string>),当前版本暂未启用具体功能。设计意图:featureGates 用于后续按需开启特性开关,annotations 用于调用方与灵骏 Runtime Kit 之间传递附加上下文信息。标准场景下无需填写,保持为空即可;自定义开发场景下可利用 annotations 传递自定义 KV 信息,Runtime Kit 侧会透传并在响应中回传。
请求示例:
整卡分配(两张卡):
{ "id": "550e8400-e29b-41d4-a716-446655440000", "devices": [{ "minor": 1 }, { "minor": 2 }] }时分复用(50% 算力 + 4 GiB 显存):
{ "id": "550e8400-e29b-41d4-a716-446655440001", "devices": [{ "minor": 1, "core": 50, "memory": 4 }] }MIG 空分:
{ "id": "550e8400-e29b-41d4-a716-446655440004", "devices": [{ "minor": 1, "slice": 3, "memory": 4 }] }3.4 extenderResources 与拓扑信息
ListAndWatch 响应中 devices[].extenderResources 为通用扩展字段(map<string, string>),用于 Device Plugin 向调度器传递超出标准字段范围的附加设备属性。
当前已定义的 Key:
Key | Value 类型 | 用途 |
| JSON 字符串 | 加速卡物理拓扑信息,供调度器实现拓扑感知调度 |
topology Value 格式为 JSON 字符串,序列化自 per-device 拓扑对象。XDM 采集硬件/网络拓扑并将其抽象为按距离排序的层级序数,经 ListAndWatch 每张卡的 extenderResources["topology"] 透传给 Device Plugin;DP 按 level 分段翻译为 Node Annotation 与 Label,最终由 Scheduler 消费。对象形如 {"levels": [...]},levels 为该卡涉及的全部拓扑层级,每个元素描述一个拓扑层级:
PPU M890P per-device 示例(GPU 0):
{
"levels": [
{"level": 1, "name": "pcieSwitches", "topo1": [0], "peers": [0, 1]},
{"level": 2, "name": "numaNodes", "topo2": [0], "peers": [0, 1]},
{"level": 3, "name": "cpuSockets", "topo3": [0], "peers": [0, 1, 2, 3]},
{"level": 11, "name": "hyperNode", "topo11": "hypernode-001"},
{"level": 21, "name": "leafSwitch", "topo21": "asw-001"},
{"level": 22, "name": "pointOfDelivery", "topo22": "pod-g13-p1"}
]
}M890P 节点内三层(pcieSwitches / numaNodes / cpuSockets)带 peers 与 topoN,rack 层(hyperNode)与网络层(leafSwitch / pointOfDelivery)仅带 topoN 字符串标识。其中 topo1 携带的设备索引由 DP 与调度器翻译为具体的 GPU↔RDMA 设备映射,其余层级同理。
PPU 810E per-device 示例(GPU 0,含节点内卡间互联分层 + PCIe 分层 + 网络层):
{
"levels": [
{"level": 1, "name": "icnLink2", "topo1": [0], "peers": [0, 3]},
{"level": 2, "name": "icnLink4", "topo2": [0], "peers": [0, 1, 2, 3]},
{"level": 3, "name": "icnLink8", "topo3": [0], "peers": [0, 1, 2, 3, 4, 5, 6, 7]},
{"level": 4, "name": "pcieSwitches", "topo4": [4], "peers": [0, 1, 2, 3]},
{"level": 5, "name": "numaNodes", "topo5": [1], "peers": [0, 1, 2, 3, 8, 9, 10, 11]},
{"level": 6, "name": "cpuSockets", "topo6": [0]},
{"level": 21, "name": "leafSwitch", "topo21": "ASW-VM-SQA-G10-P2-S25"},
{"level": 22, "name": "pointOfDelivery", "topo22": "VM-SQA-G10-P2"}
]
}810E 节点内先按卡间互联分层(icnLink2 / icnLink4 / icnLink8,peers 反映实际链路连接、不一定连续编号),再叠加 PCIe 物理分层(pcieSwitches / numaNodes / cpuSockets),并可携带网络层(leafSwitch / pointOfDelivery)。
字段语义(level/topoN 抽象口径):
字段 | 类型 | 说明 |
| array | 该卡涉及的全部拓扑层级数组,含节点内 / rack / 网络三段 |
| int | 层级分段编号:1-9 节点内,11-19 rack,21-29 网络;数值越小表示设备间距离越近,无对应层级的分段不出现 |
| string | (可选)该层级对应的物理层名称(如 pcieSwitches/numaNodes/cpuSockets/hyperNode/leafSwitch/pointOfDelivery/icnLinkN 等),仅作可读性标注,不提供时调度器仅依 level 判断远近 |
| int[] 或 string | 该层级关联的资源标识:节点内层级为 int 数组(设备索引,兼容一对多);rack/网络层级为 string 逻辑标识 |
| int[] | (可选)节点内层级可携带:本卡在该层级的同组设备 minor 号列表(含自身);不提供时以 topoN 为准 |
层级按 level 数值升序即为“从近到远”排列,调度器据此在多卡/跨节点场景下优先选择拓扑距离最近的组合;某机型不具备的层级段(如无 rack 段)直接省略。
本章为 level/topoN/name 抽象协议契约(对外口径),level 采用分段编号约定“数值越小距离越近”,name 标识该层级的物理层含义;其中节点内层级的 topoN(如 topo1)携带的设备索引,由 DP 与调度器翻译为具体的 RDMA 设备映射,其余层级同理。
3.5 Release
释放容器的设备分配记录(与 Allocate 反向操作)。当容器销毁时由 Device Plugin 调用,通知 XDM 回收该容器占用的设备资源。
请求字段:
字段 | 类型 | 必填 | 说明 |
| string | 是 | 容器唯一标识(与 Allocate 时传入的 id 一致) |
响应字段:
字段 | 类型 | 说明 |
| int32 | 状态码(0=SUCCESS) |
| string | 状态描述 |
请求示例:
{ "id": "550e8400-e29b-41d4-a716-446655440000" }响应示例:
{ "status": 0, "message": "" }4. 监控类接口(Exporter 调用)
接口 | 类型 | 用途 |
| Unary | 查询 GPU 设备静态信息 |
| Unary | 单次拉取指标快照 |
| Server-Streaming | 流式推送指标更新 |
| Unary | 获取采集配置 |
| Unary | 查询运行状态 |
4.1 ListGpuInfo
获取节点 GPU 设备静态信息(型号、UUID、驱动版本等)。
请求字段:
字段 | 类型 | 说明 |
| enum | Collector(0) / Detector(1) |
响应字段:
字段 | 类型 | 说明 |
| string | 驱动版本号 |
| enum | GPU(0)/PPU(1)/AMD(2) |
| uint32 | GPU 数量 |
| uint32 | 设备编号 |
| string | 全局唯一标识 |
| string | GPU 型号 |
| string | PCIe 总线地址 |
| uint32 | 算力总量 |
| uint64 | 显存总量 |
4.2 ExporterGetDataList
按设备和指标 ID 单次拉取指标快照,适用于定时采集场景。
请求字段:
字段 | 类型 | 必填 | 说明 |
| enum | 是 | Collector(0)/Detector(1) |
| enum | 否 | CacheData(0)/RealTimeData(1) |
| repeated int32 | 否 | 指标 ID 列表;不填返回全部 |
| repeated uint32 | 否 | GPU 编号列表;不填查询全部 |
响应字段(dataList[]):
字段 | 类型 | 说明 |
| int32 | 指标 ID |
| string | 指标值 |
| string | 所属 GPU UUID |
| int64 | 采集时间戳(Unix 毫秒) |
| bool | 是否为切分实例指标 |
| bool | 是否为整卡指标 |
| string | 容器 ID |
| map | 附加标签(Pod、Namespace 等) |
4.3 ExporterDataStream
长连接流式接口,核心服务按采集周期持续推送指标更新。请求/响应格式与 ExporterGetDataList 相同。客户端须实现重连与指数退避机制(建议起始 1s、倍数 2、上限 30s)。
4.4 ExporterGetConfig
获取 Exporter 采集配置信息。
响应字段:
字段 | 类型 | 说明 |
| int32 | 采集间隔(毫秒) |
| enum | RunningRemote(0)/RunningLocal(1) |
| repeated int32 | 支持的指标 ID 列表 |
| repeated uint32 | 可采集的 GPU 编号列表 |
4.5 ExporterGetStatus
查询 Exporter 运行状态。
响应字段:
字段 | 类型 | 说明 |
| enum | ExportRunning(0)/ExportError(1) |
5. 配置管理类接口(Controller 调用)
本组接口由 Controller 的 Job Agent 调用,用于在节点上启用/禁用 Runtime Kit 功能(与节点标签 lj_runtimekit_enable=true 对应的功能开关,机制详见3.5 功能启用与开关)。通信基于 Unix Domain Socket,路径为 /run/amp/eKitC/xdm/sockets/config-daemon.sock,仅允许 root 权限进程访问;Job Agent 以特权模式运行,通过 hostPath 挂载 socket 目录。
Proto 文件:Controller 组件 api/proto/config_service.proto。
服务定义:
service AmpConfigService {
rpc Enable(EnableRequest) returns (EnableResponse);
rpc Disable(DisableRequest) returns (DisableResponse);
rpc QueryStatus(QueryStatusRequest) returns (QueryStatusResponse);
}5.1 Enable
启用节点上的 Runtime Kit 功能。请求:EnableRequest {}(无参数)。
响应字段(EnableResponse):
字段 | 类型 | 说明 |
| int32 | 状态码,0 表示成功,非 0 表示失败 |
| string | 操作结果描述 |
| string | 底层命令标准输出 |
| string | 底层命令标准错误 |
| int32 | 底层命令退出码 |
| int64 | 执行耗时(毫秒) |
5.2 Disable
禁用节点上的 Runtime Kit 功能。请求:DisableRequest {}(无参数)。响应:DisableResponse(字段同 EnableResponse)。
5.3 QueryStatus
查询节点上 Runtime Kit 功能的启用状态。请求:QueryStatusRequest {}(无参数)。
响应字段(QueryStatusResponse):
字段 | 类型 | 说明 |
| bool | 当前是否已启用 |
| string | 附加信息 |
调用示例(Go):
// 连接 config-daemon Unix Socket
conn, err := grpc.Dial(
"unix:///run/amp/eKitC/xdm/sockets/config-daemon.sock",
grpc.WithTransportCredentials(insecure.NewCredentials()),
)
client := configpb.NewAmpConfigServiceClient(conn)
// 启用
resp, err := client.Enable(ctx, &configpb.EnableRequest{})
// 查询状态
status, err := client.QueryStatus(ctx, &configpb.QueryStatusRequest{})
fmt.Println("enabled:", status.Enabled)6. 错误码与可靠性
错误码参考表:
status | 名称 | 常见原因 | 解决方案 |
0 | SUCCESS | — | — |
1 | INVALID_ARGUMENT | 字段非法(如 id 为空、core 取值超出合法范围等) | 按接口规范修正请求 |
2 | RESOURCE_EXHAUSTED | 节点资源不足 | 查看资源占用,换节点或缩小请求 |
3 | DEVICE_NOT_READY | 驱动未加载、卡掉线 | 检查设备状态与 ListAndWatch 输出 |
4 | AUTH_FAILURE | UDS 权限配置错误 | 检查 socket 权限与配置 |
5 | INTERNAL_ERROR | 内部异常 | 收集日志联系技术支持 |
连接可靠性要求:自行实现的客户端必须处理连接中断场景(核心服务重启、socket 文件重建等),实现指数退避重连(建议起始 1s、倍数 2、上限 30s)。流式接口(ListAndWatch、ExporterDataStream)断流后应重新发起调用并重建订阅。
附录:接口速查表
类别 | 接口 | 类型 | Socket |
资源管理 |
| Unary |
|
资源管理 |
| Server-Streaming |
|
资源管理 |
| Unary |
|
资源管理 |
| Unary |
|
监控 |
| Unary |
|
监控 |
| Unary |
|
监控 |
| Server-Streaming |
|
监控 |
| Unary |
|
监控 |
| Unary |
|
配置管理 |
| Unary |
|
配置管理 |
| Unary |
|
配置管理 |
| Unary |
|