首页 > 文章 > 使用XRM协调Alveo计算工作负载

使用XRM协调Alveo计算工作负载

Frédéric Rivoallon Bin Tu 2020年05月29日

概览

如果我们可以将 Alveo 卡资源抽象化将带来哪些优势?如果能查询计算资源并启动会怎么样?赛灵思资源管理 (XRM) 服务即可实现上述功能!这是具有一套基于赛灵思运行时 API 的一款管理器。利用 XRM,我们就能够同时运行多个应用,并通过灵活部署分享多个 Alveo 卡。


从 Alveo 卡资源池中配置计算单元

通过 XRM 可将一些 xclbin 预载入不同的卡中,随后应用可获取算法需要的硬件计算单元,用户无需关注将有哪个卡提供服务。

XRM 的优势包括:

自应用中抽象物理卡,应用只管理计算单元。XRM daemon 负责在预加载卡中找到可用的计算单元。

无需申请卡的专属访问权便可分配计算单元。这种具有控制选项的更精细访问机制,可确保底层卡的利用率得到提升。

Concurrent applications access accelerated compute dynamically
图1:并行应用动态访问加速计算

XRM 可分配计算单元 (CU) 级的资源。这种比完整 xclbin 文件更高的解析度支持卡管理系统以更精细的粒度更好地利用底层资源。给定的 xclbin 虽然对一个卡进行编程,但可能包含多个 CU。

XRM can access compute units of a given xclbin independently
图2:XRM可独立访问给定 xclbin 的计算单元

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 访问的数据库中。


About Frédéric Rivoallon

About Frédéric Rivoallon

Frédéric Rivoallon 是位于加州圣何塞市的软件市场营销团队成员,同时也是赛灵思 HLS 的产品经理。除高层次综合之外,Frédéric 还熟练掌握赛灵思器件、RTL合成和时序收敛等领域计算加速专业技术。在职业生涯中亦积累了视频压缩和板件设计经验。


About Bin Tu

About Bin Tu

Bin Tu 1997 年在北京大学获得计算机科学本科学位,2001 年在北京大学获得计算机科学硕士学位。2001 年,他开始在 Sun Microsystems 中国研发中心担任软件工程师,随后加入 Oracle(Sun 被 Oracle 收购)中国和美国研发中心开展 Solaris 操作系统器件驱动程序、网络协议、网络虚拟化、性能优化等工作。自 2019 年起加入赛灵思,目前担任赛灵思云端部署技术高级常驻工程师,涉及技术包括赛灵思 FPGA 资源管理、Kubernetes、Docker Container、Load Balancer 等。