gRPC接口参考

更新时间:
复制 MD 格式

灵骏 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.sock

    ListSupportedXPUType、ListAndWatch、Allocate、Release

    监控

    Exporter

    dp2mgr.sock

    ListGpuInfo、ExporterGetDataList、ExporterDataStream、ExporterGetConfig、ExporterGetStatus

    配置管理

    Controller(Job Agent)

    config-daemon.sock

    Enable、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.proto

1.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 调用)

接口

类型

用途

ListSupportedXPUType

Unary

查询节点支持的 xPU 类型

ListAndWatch

Server-Streaming

流式推送设备列表与健康状态

Allocate

Unary

为容器分配 xPU 资源

Release

Unary

释放容器设备分配记录

3.1 ListSupportedXPUType

查询当前节点支持的 xPU 设备类型。请求:无参数(空请求)。

响应字段:

字段

类型

说明

status

int32

状态码(0=成功)

message

string

状态描述

supportedType

repeated enum

设备类型列表:GPU(0)/PPU(1)/AMD(2)/DCU(3)

3.2 ListAndWatch

流式推送节点设备列表与健康状态变化。请求:无参数(空请求)。

响应字段(流式,每次推送完整设备列表):

字段

类型

说明

devices[].id

string

设备唯一标识

devices[].health

string

"Healthy" 表示正常,其他值均为异常

devices[].totalCore

uint32

算力总量

devices[].totalMemory

uint32

显存总量(MiB)

devices[].extenderResources

map

扩展资源键值对(见 3.4 节)

3.3 Allocate

核心资源分配接口,为容器分配 xPU 资源。

请求字段:

字段

类型

必填

说明

id

string

是

容器唯一标识

runtimeMode

enum

否

容器运行时(默认 RunC)

featureGates

map

否

特性开关(预留,见下)

annotations

map

否

附加注解(预留,见下)

devices

repeated

是

设备分配列表

devices 为 repeated 结构,表示“为该容器分配多张卡”,每个元素对应一张独立的 GPU 卡分配;当前仅支持同构配置,即所有元素须使用相同的 core/memory/slice 值。minor 字段不填时由灵骏 Runtime Kit 自动分配可用卡号。

设备分配字段(devices[]):

字段

类型

说明

minor

UInt32Value

GPU 卡号(可选,不填则自动分配)

core

UInt32Value

算力百分比

memory

UInt32Value

显存(GiB)

slice

UInt32Value

MIG 空分切片数

extender

map<string, string>

扩展字段,与 ListAndWatch 的 extenderResources 对称;调度器通过此字段向 XDM 回传调度决策结果(如 PCIe 索引)

extender 字段说明:

Allocate 请求中 devices[].extender 为通用扩展字段(map<string, string>),与 ListAndWatch 响应的 extenderResources 形成上行/下行对称设计:ListAndWatch 上行上报设备拓扑,Allocate 下行回传调度器的分配决策。

当前已定义的 Key:

Key

Value 格式

用途

pcie_index

JSON 数组(如 "[0, 1]")

调度器指定的 PCIe 索引列表(即 ListAndWatch 拓扑中 topo1 携带的设备索引),XDM 根据 PCIe index 找到对应的 RDMA 设备并挂载到容器

响应字段:

字段

类型

说明

status

int32

状态码(0=SUCCESS)

message

string

状态描述

annotations

map

返回注解

labels

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 类型

用途

topology

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 抽象口径):

字段

类型

说明

levels

array

该卡涉及的全部拓扑层级数组,含节点内 / rack / 网络三段

level

int

层级分段编号:1-9 节点内,11-19 rack,21-29 网络;数值越小表示设备间距离越近,无对应层级的分段不出现

name

string

(可选)该层级对应的物理层名称(如 pcieSwitches/numaNodes/cpuSockets/hyperNode/leafSwitch/pointOfDelivery/icnLinkN 等),仅作可读性标注,不提供时调度器仅依 level 判断远近

topoN(topo1/topo11/…)

int[] 或 string

该层级关联的资源标识:节点内层级为 int 数组(设备索引,兼容一对多);rack/网络层级为 string 逻辑标识

peers

int[]

(可选)节点内层级可携带:本卡在该层级的同组设备 minor 号列表(含自身);不提供时以 topoN 为准

层级按 level 数值升序即为“从近到远”排列,调度器据此在多卡/跨节点场景下优先选择拓扑距离最近的组合;某机型不具备的层级段(如无 rack 段)直接省略。

说明

本章为 level/topoN/name 抽象协议契约(对外口径),level 采用分段编号约定“数值越小距离越近”,name 标识该层级的物理层含义;其中节点内层级的 topoN(如 topo1)携带的设备索引,由 DP 与调度器翻译为具体的 RDMA 设备映射,其余层级同理。

3.5 Release

释放容器的设备分配记录(与 Allocate 反向操作)。当容器销毁时由 Device Plugin 调用,通知 XDM 回收该容器占用的设备资源。

请求字段:

字段

类型

必填

说明

id

string

是

容器唯一标识(与 Allocate 时传入的 id 一致)

响应字段:

字段

类型

说明

status

int32

状态码(0=SUCCESS)

message

string

状态描述

请求示例:

{ "id": "550e8400-e29b-41d4-a716-446655440000" }

响应示例:

{ "status": 0, "message": "" }

4. 监控类接口(Exporter 调用)

接口

类型

用途

ListGpuInfo

Unary

查询 GPU 设备静态信息

ExporterGetDataList

Unary

单次拉取指标快照

ExporterDataStream

Server-Streaming

流式推送指标更新

ExporterGetConfig

Unary

获取采集配置

ExporterGetStatus

Unary

查询运行状态

4.1 ListGpuInfo

获取节点 GPU 设备静态信息(型号、UUID、驱动版本等)。

请求字段:

字段

类型

说明

exporterType

enum

Collector(0) / Detector(1)

响应字段:

字段

类型

说明

driverVersion

string

驱动版本号

xpuType

enum

GPU(0)/PPU(1)/AMD(2)

count

uint32

GPU 数量

gpu[].gpuID

uint32

设备编号

gpu[].uuid

string

全局唯一标识

gpu[].modelName

string

GPU 型号

gpu[].busId

string

PCIe 总线地址

gpu[].core

uint32

算力总量

gpu[].memory

uint64

显存总量

4.2 ExporterGetDataList

按设备和指标 ID 单次拉取指标快照,适用于定时采集场景。

请求字段:

字段

类型

必填

说明

exportType

enum

是

Collector(0)/Detector(1)

source

enum

否

CacheData(0)/RealTimeData(1)

fieldID

repeated int32

否

指标 ID 列表;不填返回全部

gpuID

repeated uint32

否

GPU 编号列表;不填查询全部

响应字段(dataList[]):

字段

类型

说明

fieldID

int32

指标 ID

value

string

指标值

uuid

string

所属 GPU UUID

time

int64

采集时间戳(Unix 毫秒)

eGpu

bool

是否为切分实例指标

full

bool

是否为整卡指标

cId

string

容器 ID

labels

map

附加标签(Pod、Namespace 等)

4.3 ExporterDataStream

长连接流式接口,核心服务按采集周期持续推送指标更新。请求/响应格式与 ExporterGetDataList 相同。客户端须实现重连与指数退避机制(建议起始 1s、倍数 2、上限 30s)。

4.4 ExporterGetConfig

获取 Exporter 采集配置信息。

响应字段:

字段

类型

说明

interval

int32

采集间隔(毫秒)

runningMode

enum

RunningRemote(0)/RunningLocal(1)

suptFieldID

repeated int32

支持的指标 ID 列表

gpuID

repeated uint32

可采集的 GPU 编号列表

4.5 ExporterGetStatus

查询 Exporter 运行状态。

响应字段:

字段

类型

说明

runningStatus

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):

字段

类型

说明

status

int32

状态码,0 表示成功,非 0 表示失败

message

string

操作结果描述

stdout

string

底层命令标准输出

stderr

string

底层命令标准错误

exit_code

int32

底层命令退出码

duration_ms

int64

执行耗时(毫秒)

5.2 Disable

禁用节点上的 Runtime Kit 功能。请求:DisableRequest {}(无参数)。响应:DisableResponse(字段同 EnableResponse)。

5.3 QueryStatus

查询节点上 Runtime Kit 功能的启用状态。请求:QueryStatusRequest {}(无参数)。

响应字段(QueryStatusResponse):

字段

类型

说明

enabled

bool

当前是否已启用

message

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

资源管理

ListSupportedXPUType

Unary

dp2mgr.sock

资源管理

ListAndWatch

Server-Streaming

dp2mgr.sock

资源管理

Allocate

Unary

dp2mgr.sock

资源管理

Release

Unary

dp2mgr.sock

监控

ListGpuInfo

Unary

dp2mgr.sock

监控

ExporterGetDataList

Unary

dp2mgr.sock

监控

ExporterDataStream

Server-Streaming

dp2mgr.sock

监控

ExporterGetConfig

Unary

dp2mgr.sock

监控

ExporterGetStatus

Unary

dp2mgr.sock

配置管理

Enable

Unary

config-daemon.sock

配置管理

Disable

Unary

config-daemon.sock

配置管理

QueryStatus

Unary

config-daemon.sock