DOCA GPU 实时流量分析
此目录中的示例使用 DOCA Source Stage 实时接收和预处理网络数据包,然后将数据包信息传递到下一个 Morpheus 阶段。
DOCA 支持尚处于早期访问阶段,可能只能通过 NGC 中的 Morpheus DOCA 容器使用。请联系您的 NVIDIA Morpheus 联系人以获取更多信息。
容器必须在特权模式下运行,并根据 DOCA GPUNetIO 文档的配置挂载 /dev/hugepages
。
docker run -v /dev/hugepages:/dev/hugepages --privileged --rm -ti --runtime=nvidia --net=host --gpus=all --cap-add=sys_nice ${MORPHEUS_DOCA_IMAGE} bash
在运行示例之前,需要从 Conda 环境中强制删除rdma-core
Conda 包,否则环境将与 DOCA 提供的软件包不兼容。
conda remove --force rdma-core
有关如何配置机器的更多信息,请参阅 DOCA GPUNetIO 编程指南。
DOCA 示例需要显式指定 GPU 和 NIC 的 PCIe 地址。确定正确的 GPU 和 NIC PCIe 地址并非易事,需要与那些根据 DOCA GPUNetIO 文档配置物理硬件和固件的人员协调,但以下命令可以帮助在同一 NUMA 节点上找到 NIC 和 GPU 的情况。
$ lspci -tv | grep -E "NVIDIA|ella|(^\+)|(^\-)"
-+-[0000:ff]-+-00.0 Intel Corporation Device 344c
| \-02.0-[ca-cf]----00.0-[cb-cf]--+-00.0-[cc]--+-00.0 Mellanox Technologies MT42822 BlueField-2 integrated ConnectX-6 Dx network controller
| | +-00.1 Mellanox Technologies MT42822 BlueField-2 integrated ConnectX-6 Dx network controller
| | \-00.2 Mellanox Technologies MT42822 BlueField-2 SoC Management Interface
| \-01.0-[cd-cf]----00.0-[ce-cf]----08.0-[cf]----00.0 NVIDIA Corporation Device 20b9
| \-02.0-[b1]--+-00.0 Mellanox Technologies MT42822 BlueField-2 integrated ConnectX-6 Dx network controller
| +-00.1 Mellanox Technologies MT42822 BlueField-2 integrated ConnectX-6 Dx network controller
| \-00.2 Mellanox Technologies MT42822 BlueField-2 SoC Management Interface
从结果中,我们可以组装最近的 GPU 和 NIC 的 PCIe 地址。但是,将它们与这些命令中的显式 PCIe 地址进行交叉引用会更容易
$ lspci | grep ella
b1:00.0 Ethernet controller: Mellanox Technologies MT42822 BlueField-2 integrated ConnectX-6 Dx network controller (rev 01)
b1:00.1 Ethernet controller: Mellanox Technologies MT42822 BlueField-2 integrated ConnectX-6 Dx network controller (rev 01)
b1:00.2 DMA controller: Mellanox Technologies MT42822 BlueField-2 SoC Management Interface (rev 01)
ca:00.0 PCI bridge: Mellanox Technologies MT42822 Family [BlueField-2 SoC PCIe Bridge] (rev 01)
cb:00.0 PCI bridge: Mellanox Technologies MT42822 Family [BlueField-2 SoC PCIe Bridge] (rev 01)
cb:01.0 PCI bridge: Mellanox Technologies MT42822 Family [BlueField-2 SoC PCIe Bridge] (rev 01)
cc:00.0 Ethernet controller: Mellanox Technologies MT42822 BlueField-2 integrated ConnectX-6 Dx network controller (rev 01)
cc:00.1 Ethernet controller: Mellanox Technologies MT42822 BlueField-2 integrated ConnectX-6 Dx network controller (rev 01)
cc:00.2 DMA controller: Mellanox Technologies MT42822 BlueField-2 SoC Management Interface (rev 01)
cd:00.0 PCI bridge: Mellanox Technologies MT42822 Family [BlueField-2 SoC PCIe Bridge] (rev 01)
ce:08.0 PCI bridge: Mellanox Technologies MT42822 Family [BlueField-2 SoC PCIe Bridge] (rev 01)
$ lspci | grep NVIDIA
cf:00.0 3D controller: NVIDIA Corporation Device 20b9 (rev a1)
我们可以看到 GPU 的 PCIe 地址是 cf:00.0
,并且我们可以从上面的命令推断出最近的 ConnectX-6 NIC 的 PCIe 地址是 cc:00.*
。在本例中,我们有端口 1
物理连接到网络,因此我们使用 PCIe 地址 cc:00.1
。
对于 UDP 流量,示例将启动一个简单的 pipeline,其中包含 DOCA Source Stage,后跟 Monitor Stage,以报告接收到的数据包数量。
python ./examples/doca/run_udp_raw.py --nic_addr 17:00.1 --gpu_addr ca:00.0
UDP 流量可以使用 nping
轻松发送到 Morpheus 正在监听的接口
nping --udp -c 100000 -p 4100 192.168.2.27 --data-length 1024 --delay 0.1ms
Morpheus 输出将是
====Pipeline Pre-build====
====Pre-Building Segment: linear_segment_0====
====Pre-Building Segment Complete!====
====Pipeline Pre-build Complete!====
====Registering Pipeline====
====Building Pipeline====
EAL: Detected CPU lcores: 64
EAL: Detected NUMA nodes: 2
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
TELEMETRY: No legacy callbacks, legacy socket not created
EAL: Probe PCI driver: mlx5_pci (15b3:a2dc) device: 0000:ca:00.0 (socket 1)
EAL: Probe PCI driver: gpu_cuda (10de:2331) device: 0000:17:00.0 (socket 0)
====Building Pipeline Complete!====
DOCA GPUNetIO rate: 0 pkts [00:00, ? pkts/s]====Registering Pipeline Complete!====
====Starting Pipeline====
====Pipeline Started====
====Building Segment: linear_segment_0====
Added source: <from-doca-0; DocaSourceStage(nic_pci_address=ca:00.0, gpu_pci_address=17:00.0, traffic_type=udp)>
└─> morpheus.MessageMeta
Added stage: <monitor-1; MonitorStage(description=DOCA GPUNetIO rate, smoothing=0.05, unit=pkts, delayed_start=False, determine_count_fn=None, log_level=LogLevels.INFO)>
└─ morpheus.MessageMeta -> morpheus.MessageMeta
====Building Segment Complete!====
DOCA GPUNetIO rate: 100000 pkts [00:12, 10963.39 pkts/s]
由于 DOCA Source stage 以新的 RawMessage
格式输出数据包,并非所有 Morpheus 阶段都可能支持该格式,因此有一个名为 DOCA Convert Stage 的附加阶段,用于将 RawMessage
格式的数据转换为 MessageMeta
格式。
python ./examples/doca/run_udp_convert.py --nic_addr 17:00.1 --gpu_addr ca:00.0
DOCA 示例与敏感信息检测 (SID) 示例类似,因为它使用 sid-minibert
模型结合 TritonInferenceStage
来检测敏感信息。不同之处在于,我们将要检测的敏感信息是从 DocaSourceStage
提供的实时 TCP 数据包流中获得的。要从 Morpheus 根目录运行示例并捕获来自给定 NIC 的所有 TCP 网络流量,请使用以下命令,并将 nic_addr
和 gpu_addr
参数替换为您的 NIC 和 GPU PCIe 地址。
# python examples/doca/run_tcp.py --nic_addr cc:00.1 --gpu_addr cf:00.0
====Registering Pipeline====
====Building Pipeline====
DOCA GPUNetIO rate: 0 pkts [00:00, ? pkt====Building Pipeline Complete!====
Deserialize rate: 0 pkts [00:00, ? pktsStarting! Time: 1689110835.1106102
EAL: Detected CPU lcores: 72, ? pkts/s]
EAL: Detected NUMA nodes: 200, ? pkts/s]
EAL: Detected shared linkage of DPDKs/s]
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
TELEMETRY: No legacy callbacks, legacy socket not created
EAL: Probe PCI driver: mlx5_pci (15b3:a2d6) device: 0000:cc:00.1 (socket 1)
EAL: Probe PCI driver: gpu_cuda (10de:20b9) device: 0000:cf:00.0 (socket 1)
DOCA GPUNetIO rate: 0 pkts [00:03, ? pkts/s]====Registering Pipeline Complete!====
====Starting Pipeline====[00:02, ? pkts/s]
====Pipeline Started====0:02, ? pkts/s]
====Building Segment: linear_segment_0====
Added source: <from-doca-0; DocaSourceStage(nic_pci_address=cc:00.1, gpu_pci_address=cf:00.0, traffic_type=tcp)>
└─> morpheus.MessageMeta
Added stage: <monitor-1; MonitorStage(description=DOCA GPUNetIO rate, smoothing=0.05, unit=pkts, delayed_start=False, determine_count_fn=None, log_level=LogLevels.INFO)>
└─ morpheus.MessageMeta -> morpheus.MessageMeta
Added stage: <deserialize-2; DeserializeStage(ensure_sliceable_index=True)>
└─ morpheus.MessageMeta -> morpheus.ControlMessage
Added stage: <monitor-3; MonitorStage(description=Deserialize rate, smoothing=0.05, unit=pkts, delayed_start=False, determine_count_fn=None, log_level=LogLevels.INFO)>
└─ morpheus.ControlMessage -> morpheus.ControlMessage
Added stage: <preprocess-nlp-4; PreprocessNLPStage(vocab_hash_file=/workspace/models/training-tuning-scripts/sid-models/resources/bert-base-uncased-hash.txt, truncation=True, do_lower_case=True, add_special_tokens=False, stride=-1, column=data)>
└─ morpheus.ControlMessage -> morpheus.ControlMessage
Added stage: <monitor-5; MonitorStage(description=Tokenize rate, smoothing=0.05, unit=pkts, delayed_start=False, determine_count_fn=None, log_level=LogLevels.INFO)>
└─ morpheus.ControlMessage -> morpheus.ControlMessage
Added stage: <inference-6; TritonInferenceStage(model_name=sid-minibert-onnx, server_url=localhost:8000, force_convert_inputs=True, use_shared_memory=True)>
└─ morpheus.ControlMessage -> morpheus.ControlMessage
Added stage: <monitor-7; MonitorStage(description=Inference rate, smoothing=0.05, unit=pkts, delayed_start=False, determine_count_fn=None, log_level=LogLevels.INFO)>
└─ morpheus.ControlMessage -> morpheus.ControlMessage
Added stage: <add-class-8; AddClassificationsStage(labels=None, prefix=, probs_type=TypeId.BOOL8, threshold=0.5)>
└─ morpheus.ControlMessage -> morpheus.ControlMessage
Added stage: <monitor-9; MonitorStage(description=AddClass rate, smoothing=0.05, unit=pkts, delayed_start=False, determine_count_fn=None, log_level=LogLevels.INFO)>
└─ morpheus.ControlMessage -> morpheus.ControlMessage
====Building Segment Complete!====
Stopping pipeline. Please wait... Press Ctrl+C again to kill.
DOCA GPUNetIO rate: 0 pkts [00:09, ? pkts/s]
Deserialize rate: 0 pkts [00:09, ? pkts/s]
Tokenize rate: 0 pkts [00:09, ? pkts/s]
Inference rate: 0 pkts [00:09, ? pkts/s]
AddClass rate: 0 pkts [00:09, ? pkts/s]
输出可以在 doca_output.csv
中找到