16.3. 为 Intel FPGA PAC N3000 编程 OpenNESS Operator

当 Intel FPGA PAC N3000 使用 vRAN 5G 位流编程时,硬件会使用 vRAN 5G 位流公开 Intel FPGA PAC N3000。此位流公开了用于在 vRAN 工作负载中加速 FEC 的单根 I/O 虚拟化 (SR-IOV) 虚拟功能 (VF) 设备。

作为集群管理员,您可以使用 OpenShift Container Platform CLI 或 Web 控制台为 Intel FPGA PAC N3000 安装 OpenNESS Operator。

16.3.1. 使用 vRAN 位流编程 N3000

作为集群管理员,您可以使用 vRAN 5G 位流对 Intel FPGA PAC N3000 进行编程。此位流公开了用于在 vRAN 工作负载中加快向前更正 (FEC) 的单根 I/O 虚拟化 (SR-IOV) 虚拟功能 (VF) 设备。

转发错误更正 (FEC) 的角色是更正传输错误,其中消息中的某些位可以丢失或垃圾化。由于传输媒体中的批注、干扰或信号强度较低,消息可能会丢失或被破坏。如果没有 FEC,被破坏的信息需要被重新发送,并添加到网络负载中从而会影响吞吐量和延迟。

先决条件

  • Intel FPGA PAC N3000 卡
  • 带有 RT 内核配置的 Performance Addon Operator
  • 使用 OpenNESS Operator 为 Intel FPGA PAC N3000 安装的节点
  • 以具有 cluster-admin 权限的用户身份登录

    注意

    所有命令在 vran-acceleration-operators 命名空间中运行。

流程

  1. 进入 vran-acceleration-operators 项目:

    $ oc project vran-acceleration-operators
  2. 验证 pod 是否正在运行:

    $ oc get pods

    输出示例

    NAME                                        READY       STATUS          RESTARTS    AGE
    fpga-driver-daemonset-8xz4c                 1/1         Running         0           15d
    fpgainfo-exporter-vhvdq                     1/1         Running         1           15d
    N3000-controller-manager-b68475c76-gcc6v    2/2         Running         1           15d
    N3000-daemonset-5k55l                       1/1         Running         1           15d
    N3000-discovery-blmjl                       1/1         Running         1           15d
    N3000-discovery-lblh7                       1/1         Running         1           15d

    以下部分提供有关已安装 pod 的信息:

    • fpga-driver-daemonset 提供和加载所需的开放编程加速器引擎 (OPAE) 驱动程序
    • fpgainfo-exporter 为 Prometheus 提供 N3000 遥测数据
    • N3000-controller-manager 将 N3000Node CR 应用到集群,并管理所有操作对象容器
    • N3000-daemonset 是主 worker 应用程序。它监控每个节点的 CR 中的更改,并操作更改。在此守护进程中实施的逻辑负责更新卡的 FPGA 用户镜像和 NIC 固件。它还负责排空节点,并在更新需要时将其从委托中删除。
    • N3000-discovery 发现安装 N3000 加速器设备,并在设备存在时标记 worker 节点
  3. 获取包含 Intel FPGA PAC N3000 卡的所有节点:

    $ oc get n3000node

    输出示例

    NAME                       FLASH
    node1                      NotRequested

  4. 获取有关每个节点卡的信息:

    $ oc get n3000node node1 -o yaml

    输出示例

    status:
      conditions:
      - lastTransitionTime: "2020-12-15T17:09:26Z"
        message: Inventory up to date
        observedGeneration: 1
        reason: NotRequested
        status: "False"
        type: Flashed
      fortville:
      - N3000PCI: 0000:1b:00.0
        NICs:
        - MAC: 64:4c:36:11:1b:a8
          NVMVersion: 7.00 0x800052b0 0.0.0
          PCIAddr: 0000:1a:00.0
          name: Ethernet Controller XXV710 Intel(R) FPGA Programmable Acceleration Card N3000 for Networking
        - MAC: 64:4c:36:11:1b:a9
          NVMVersion: 7.00 0x800052b0 0.0.0
          PCIAddr: 0000:1a:00.1
          name: Ethernet Controller XXV710 Intel(R) FPGA Programmable Acceleration Card N3000 for Networking
        - MAC: 64:4c:36:11:1b:ac
          NVMVersion: 7.00 0x800052b0 0.0.0
          PCIAddr: 0000:1c:00.0
          name: Ethernet Controller XXV710 Intel(R) FPGA Programmable Acceleration Card N3000 for Networking
        - MAC: 64:4c:36:11:1b:ad
          NVMVersion: 7.00 0x800052b0 0.0.0
          PCIAddr: 0000:1c:00.1
          name: Ethernet Controller XXV710 Intel(R) FPGA Programmable Acceleration Card N3000 for Networking
      fpga:
      - PCIAddr: 0000:1b:00.0 1
        bitstreamId: "0x23000410010310" 2
        bitstreamVersion: 0.2.3
        deviceId: "0x0b30"

    1
    PCIAddr 字段指示卡的 PCI 地址。
    2
    bitstreamId 字段指示当前存储在闪存中的位流。
  5. 保存当前的 bitstreamIdPCIAddr、名称和 deviceId(没有 "0x" padding)。

    $ oc get n3000node -o json
  6. 更新 Intel FPGA PAC N3000 卡的用户位流:

    1. 通过创建名为 n3000-cluster.yaml 的文件,将 N3000 集群资源定义为程序,如下例所示:

      apiVersion: fpga.intel.com/v1
      kind: N3000Cluster
      metadata:
          name: n3000 1
          namespace: vran-acceleration-operators
      spec:
          nodes:
            - nodeName: "node1" 2
              fpga:
                - userImageURL: "http://10.10.10.122:8000/pkg/20ww27.5-2x2x25G-5GLDPC-v1.6.1-3.0.0_unsigned.bin" 3
                  PCIAddr: "0000:1b:00.0" 4
                  checksum: "0b0a87b974d35ea16023ceb57f7d5d9c" 5
      1
      指定名称。名称必须是 n3000
      2
      指定要编程的节点。
      3
      指定用户 bitstream 的 URL。这个位流文件必须在 HTTP 或 HTTPS 服务器中访问。
      4
      向程序指定卡的 PCI 地址。
      5
      指定 userImageURL 字段中指定的 bitstream 的 MD5 校验和。

      N3000 守护进程使用开放程序加速引擎 (OPAE) 工具更新 FPGA 用户位流并重置 PCI 设备。FPGA 用户位流的更新每个卡最多需要 40 分钟。对于多个节点上的编程卡,在一个时间点上只在一个节点上进行编程。

    2. 应用更新以使用位流开始对卡编程:

      $ oc apply -f n3000-cluster.yaml

      N3000 守护进程在置备了适当的 5G FEC 用户位流后启动位流编程,如 20ww27.5-2x2x25G-5GLDPC-v1.6.1-3.0.0_unsigned.bin,在本例中创建 CR 后。

    3. 检查状态:

      oc get n3000node

      输出示例

      NAME             FLASH
      node1            InProgress

  7. 检查日志:

    1. 确定 N3000 守护进程的 pod 名称:

      $ oc get pod -o wide | grep n3000-daemonset | grep node1

      输出示例

      n3000-daemonset-5k55l              1/1     Running   0          15d

    2. 查看日志:

      $ oc logs n3000-daemonset-5k55l

      输出示例

      ...
      {"level":"info","ts":1608054338.8866854,"logger":"daemon.drainhelper.cordonAndDrain()","msg":"node drained"}
      {"level":"info","ts":1608054338.8867319,"logger":"daemon.drainhelper.Run()","msg":"worker function - start"}
      {"level":"info","ts":1608054338.9003832,"logger":"daemon.fpgaManager.ProgramFPGAs","msg":"Start program","PCIAddr":"0000:1b:00.0"}
      {"level":"info","ts":1608054338.9004142,"logger":"daemon.fpgaManager.ProgramFPGA","msg":"Starting","pci":"0000:1b:00.0"}
      {"level":"info","ts":1608056309.9367146,"logger":"daemon.fpgaManager.ProgramFPGA","msg":"Program FPGA completed, start new power cycle N3000 ...","pci":"0000:1b:00.0"}
      {"level":"info","ts":1608056333.3528838,"logger":"daemon.drainhelper.Run()","msg":"worker function - end","performUncordon":true}
      ...

      日志文件显示以下事件流:

      • 位流会被下载并验证。
      • 该节点排空,在此时间内没有工作负载可以运行。
      • 启动闪存:

        • 位流会被闪存到卡中。
        • 应用位流。
      • 闪存完成后,节点或节点上的 PCI 设备或设备会被重新载入。Wireless FEC 加速器的 OpenNESS SR-IOV Operator 现在可以找到新的闪存设备或设备。

验证

  1. 在 FPGA 用户位流更新完成后验证状态:

    oc get n3000node

    输出示例

    NAME             FLASH
    node1            Succeeded

  2. 验证卡的位流 ID 是否已改变:

    oc get n3000node node1 -o yaml

    输出示例

    status:
          conditions:
              - lastTransitionTime: "2020-12-15T18:18:53Z"
                message: Flashed successfully 1
                observedGeneration: 2
                reason: Succeeded
                status: "True"
                type: Flashed
          fortville:
          - N3000PCI: 0000:1b:00.0
            NICs:
            - MAC: 64:4c:36:11:1b:a8
              NVMVersion: 7.00 0x800052b0 0.0.0
              PCIAddr: 0000:1a:00.0
              name: Ethernet Controller XXV710 Intel(R) FPGA Programmable Acceleration Card N3000 for Networking
            - MAC: 64:4c:36:11:1b:a9
              NVMVersion: 7.00 0x800052b0 0.0.0
              PCIAddr: 0000:1a:00.1
              name: Ethernet Controller XXV710 Intel(R) FPGA Programmable Acceleration Card N3000 for Networking
            - MAC: 64:4c:36:11:1b:ac
              NVMVersion: 7.00 0x800052b0 0.0.0
              PCIAddr: 0000:1c:00.0
              name: Ethernet Controller XXV710 Intel(R) FPGA Programmable Acceleration Card N3000 for Networking
            - MAC: 64:4c:36:11:1b:ad
              NVMVersion: 7.00 0x800052b0 0.0.0
              PCIAddr: 0000:1c:00.1
              name: Ethernet Controller XXV710 Intel(R) FPGA Programmable Acceleration Card N3000 for Networking
          fpga:
          - PCIAddr: 0000:1b:00.0 2
            bitstreamId: "0x2315842A010601" 3
            bitstreamVersion: 0.2.3
            deviceId: "0x0b30" 4

    1
    message 字段显示设备已成功闪存。
    2
    PCIAddr 字段指示卡的 PCI 地址。
    3
    bitstreamId 字段表示更新的 bitstream ID。
    4
    deviceID 字段表示公开给系统的卡内的位流的设备 ID。
  3. 检查节点上的 FEC PCI 设备:

    1. 验证节点配置是否正确应用:

      $ oc debug node/node1

      预期输出

      Starting pod/<node-name>-debug ...
      To use host binaries, run `chroot /host`
      
      Pod IP: <ip-address>
      If you don't see a command prompt, try pressing enter.
      
      sh-4.4#

    2. 验证可以使用节点文件系统:

      sh-4.4# chroot /host

      预期输出

      sh-4.4#

    3. 列出与系统中加速器关联的 PCI 设备:

      $ lspci | grep accelerators

      预期输出

      1b:00.0 Processing accelerators: Intel Corporation Device 0b30
      1d:00.0 Processing accelerators: Intel Corporation Device 0d8f (rev 01)

      属于 FPGA 的设备在输出中报告。设备 ID 0b30 是 RSU 接口,用于对卡进行编程,0d8f 是新编程 5G 设备的物理功能。