使用XRM协调Alveo计算工作负载
概览
如果我们可以将 Alveo 卡资源抽象化将带来哪些优势?如果能查询计算资源并启动会怎么样?赛灵思资源管理 (XRM) 服务即可实现上述功能!这是具有一套基于赛灵思运行时 API 的一款管理器。利用 XRM,我们就能够同时运行多个应用,并通过灵活部署分享多个 Alveo 卡。
从 Alveo 卡资源池中配置计算单元
通过 XRM 可将一些 xclbin 预载入不同的卡中,随后应用可获取算法需要的硬件计算单元,用户无需关注将有哪个卡提供服务。
XRM 的优势包括:
• 自应用中抽象物理卡,应用只管理计算单元。XRM daemon 负责在预加载卡中找到可用的计算单元。
• 无需申请卡的专属访问权便可分配计算单元。这种具有控制选项的更精细访问机制,可确保底层卡的利用率得到提升。
XRM 可分配计算单元 (CU) 级的资源。这种比完整 xclbin 文件更高的解析度支持卡管理系统以更精细的粒度更好地利用底层资源。给定的 xclbin 虽然对一个卡进行编程,但可能包含多个 CU。
XRM 的构建与安装
XRM 可由赛灵思 GitHub 获取 https://github.com/Xilinx/XRM ,与 Vitis v2020.1版兼容。
以下为 Linux(CentOS 和 Ubuntu)上构建并安装 XRM 的步骤:
1: 从 GitHub repo 下载
git clone https://github.com/Xilinx/XRM.git
2: 设置构建环境:
以下命令假定 XRT(赛灵思运行时)已在服务器上安装。
source /opt/xilinx/xrt/setup.sh
3: 在 XRM 的根目录下运行“make”
针对 Centos,安装需要新版 GCC。用户需要在默认版本基础上更新,可能需要用软件组合切换到更新的版本:
scl enable devtoolset-(6|7) bash
为目标 Linux 版本(CentOS 或 Ubuntu)构建 Linux 包
source /opt/xilinx/xrt/setup.sh
./build.sh
cd ./Debug
make package
4: 安装上一步创建的包
Ubuntu:
sudo apt install --reinstall ./Release/xrm_version.deb
CentOS :
sudo yum reinstall ./Release/xrm_version.rpm
完成后,XRM 文件将安装在 /opt/xilinx/xrm/ 位置
启动 Daemon 并设置 XRM 数据库
如前所述,XRM API 命令可分配计算单元 (CU),其封装在 xclbin 二进制文件中。为了建立 API 和 xclbin 文件中所引用 CU 之间的联系,XRM 需要掌握服务器上可用的资源,通过使用 xrmadm 命令管理的本地数据库可以实现:
1: 资源设置
source /opt/xilinx/xrt/setup.sh
source /opt/xilinx/xrm/setup.sh
2: 启动 xrmd daemon 并自行选择是否清理数据库进行全新启动(需要根访问权限):
sudo /opt/xilinx/xrm/tools/start_xrmd.sh
停止 daemon 服务的方法:
sudo /opt/xilinx/xrm/tools/stop_xrmd.sh
检查 daemon 状态:
sudo systemctl status xrmd
3: 加载 xclbin 或卸载 JSON 文件中指定的 xclbin 二进制文件
输入为 JSON 格式,请参考 /opt/xilinx/xrm/test/ 下的示例了解如何指定 xclbin 文件和器件用于加载/卸载操作
cd /opt/xilinx/xrm/test/
xrmadm list_cmd.json (To check the system result)
xrmadm load_devices_cmd.json (To load xclbin files to devices)
xrmadm list_cmd.json (To check the load result)
xrmadm unload_devices_cmd.json (To unload xclbin from devices)
xrmadm list_cmd.json (To check the unload result)
这里给出用于 xrmadm 命令的 JSON 加载输入文件示例:
{
"request": {
"name": "load",
"request_id": 1,
"parameters": [
{
"device": 0,
"xclbin": "/repo/xclbins/file.xclbin.xrm"
},
{
"device": 1,
"xclbin": "/repo/xclbins/file.xclbin.xrm"
},
{
"device": 2,
"xclbin": "/repo/xclbins/file.xclbin.xrm"
},
{
"device": 3,
"xclbin": "/repo/xclbins/file.xclbin.xrm"
}
]
}
复制该命令会创建下列形态的输出,同样为JSON格式(见下)。每个卡的信息会从 xclbin 元数据和内核中提取出来,并列出计算单元的名称:
{
"response": {
"name": "list",
"request_id": "1",
"status": "ok",
"data": {
"device_number": "4",
"device_0": {
"cu_0": {
},
"cu_1": {
}
},
"device_1": {
"cu_0": {
},
"cu_1": {
}
},
"device_2": {
"cu_0": {
},
"cu_1": {
}
},
"device_3": {
"cu_0": {
},
"cu_1": {
}
},
}
}
}
检查系统
如需检查系统配置,XRM GitHub 库中提供了可执行文件示例以验证 CU。
面向应用开发人员的 XRM API 命令
本节我们介绍开发人员可用于创建 XRM 兼容应用程序的主要 API。
以下清单可能并非基于最新版本,请在库中查询最新的 API 功能列表。
命令 | 描述 |
xrmCreateContext() |
建立与 XRM daemon 的连接 |
xrmDestroyContext() |
断开与 XRM daemon 现有的连接 |
xrmIsDaemonRunning() |
检查 daemon 是否在运行 |
xrmLoadOneDevice() |
将 xclbin 加载到单个器件中 |
xrmUnloadOneDevice() |
从单个器件中卸载 xclbin |
xrmCuAlloc() |
基于内核名称和/或假名为计算单元分配一个器件、CU 和通道并请求加载 (1-100)。 此功能还提供了将在器件上加载的 xclbin 和插件。 |
xrmCuListAlloc() |
xrm_cu_list_alloc() 根据内核名称和/或假名,在内核列表属性基础上分配一系列计算单元资源并请求加载 (1-100) |
xrmCuRelease() |
释放一项此前分配的资源 |
xrmCuListRelease() |
释放一项此前分配的资源列表 |
xrmCuGetMaxCapacity() |
获取与资源相关的最大容量
|
xrmCuCheckStatus() |
返回指定 CU 资源是否忙碌 |
xrmAllocationQuery() |
根据分配服务 ID 查询计算单元资源。
|
xrmCheckCuAvailableNum() |
根据内核名称和/或假名,在内核列表属性基础上检查系统上可用的 CU 列表数量并请求加载(1-100)。 |
xrmCheckCuListAvailableNum |
根据内核名称和/或假名,在内核列表属性基础上检查系统上可用的 CU 列表数量并发出请求
|
xrmCheckCuPoolAvailableNum |
根据内核名称和/或假名,在内核系列属性基础上检查系统上可用的 CU 系列数量并发出请求 |
xrmCuPoolReserve |
根据内核名称和/或假名,在内核系列属性基础上保留计算单元资源组合并发出请求(1-100)。 |
xrmCuPoolRelinquish |
放弃此前预留的资源系列。 |
xrmReservationQuery |
在预留ID基础上查询计算单元资源 |
xrmExecPluginFunc |
执行一个指定插件的功能。 |
结论
XRM 可在多个 Alveo 卡上分配加速计算单元。利用 XRM 的应用一旦可用便会在服务器上执行可用的计算单位资源。通过 XRM 可将卡自身抽象化,并登记在 XRM daemon 访问的数据库中。