16.3. Intel FPGA PAC N3000 向けの OpenNESS Operator のプログラミング

Intel FPGA PAC N3000 が vRAN 5G ビットストリームでプログラムされると、ハードウェアは vRAN 5G ビットストリームで Intel FPGA PAC N3000 を公開します。このビットストリームは、vRAN ワークロードの FEC を加速するために使用される SR-IOV (Single Root I/O Virtualization) 仮想機能 (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) を加速するために使用される SR-IOV (Single Root I/O Virtualization) 仮想機能 (VF) デバイスを公開します。

前方誤り訂正 (FEC) の役割は、メッセージ内の特定のビットが失われたり、文字化けしている可能性がある転送エラーの修正です。伝送メディアのノイズ、干渉、または信号強度の低下により、メッセージが失われたり文字化けしたりする可能性があります。FEC を使用しないと、文字化けしたメッセージは、ネットワーク負荷に加え、スループットとレイテンシーの両方に影響を与える必要があります。

前提条件

  • Intel FPGA PAC N3000 カード
  • RT カーネル設定のある Performance Addon Operator
  • Intel FPGA PAC N3000 向け OpenNESS Operator でインストールされる 1 つまたは複数のノード
  • cluster-admin 権限を持つユーザーとしてログインします。

    注記

    すべてのコマンドは vran-acceleration-operators namespace で実行されます。

手順

  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 は必要な Open Programmable Accelerator Engine (OPAE) ドライバーを提供し、読み込みます。
    • fpgainfo-exporter は Prometheus に N3000 Telemetry データを提供します。
    • N3000-controller-manager は N3000Node CR をクラスターに適用し、すべてのオペランドコンテナーを管理します。
    • N3000-daemonset が主要なワーカーアプリケーションです。これは各ノードの CR の変更を監視し、変更に基づいて動作します。このデーモンに実装されたロジックは、カードの FPGA ユーザーイメージおよび NIC ファームウェアの更新を行います。また、ノードをドレイン (解放) し、更新で必要になる場合に提出します。
    • N3000-discovery は、デバイスが存在する場合にワーカーノードがインストールされ、ラベルのワーカーノードがある場合に N3000 Accelerator デバイスを検出します。
  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」パディングなしで保存します。

    $ 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
      ユーザービットストリームの URL を指定します。このビットストリームファイルは、HTTP または HTTPS サーバーでアクセスできる必要があります。
      4
      プログラムするカードの PCI アドレスを指定します。
      5
      userImageURL フィールドに指定されるビットストリームの MD5 チェックサムを指定します。

      N3000 デーモンは、Open Programmable Acceleration Engine (OPAE) ツールを使用して FPGA ユーザービットストリームを更新し、PCI デバイスをリセットします。FPGA ユーザービットストリームの更新では、カードごとに最大 40 分かかる場合があります。複数のノードでカードをプログラミングする場合、プログラミングは一度に 1 つのノードで構成されます。

    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}
      ...

      ログファイルは、以下のイベントのフローを示します。

      • ビットストリームがダウンロードされ、検証されています。
      • ノードはドレイン (解放) され、現時点でワークロードを実行できません。
      • フラッシュが開始します。

        • ビットストリームはカードにフラッシュされます。
        • ビットストリームが適用されます。
      • フラッシュが完了すると、1 つまたは複数のノードの PCI デバイス (1 つまたは複数) が再読み込みされます。ワイヤレス FEC Accelerator の OpenNESS SR-IOV Operator が、新しいフラッシュデバイス (1 つまたは複数) を検索できるようになりました。

検証

  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 フィールドは、更新されたビットストリーム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 デバイスの物理機能です。