主机设置
Holoscan 传感器桥在以下配置中受支持
配置了 IGX OS 1.1 生产版本 和 CX7 SmartNIC 设备的 IGX 系统。
运行 JP6.0 release 2 的 AGX Orin 系统。请注意,尚不支持 JETPACK 6.1 及更高版本。 在此配置中,板载以太网控制器与 Linux 内核网络堆栈一起用于数据 I/O;所有网络 I/O 均由 CPU 执行,而无需网络加速。
在 Holoscan 传感器桥板设置完成 后,在您的主机系统中配置一些先决条件。虽然 holoscan 传感器桥应用程序在容器中运行,但这些命令都应在容器外部直接在主机系统上执行。这些配置会被跨电源周期记住,因此只需设置一次。
安装 git-lfs
Holoscan 传感器桥源代码存储库中的某些数据文件使用 GIT LFS。
sudo apt-get update sudo apt-get install -y git-lfs
授予您的用户 docker 子系统的权限
$ sudo usermod -aG docker $USER
重启计算机以激活此设置。
接下来,按照下面相应选项卡上的说明配置您的主机系统。
确定与第一个 CX7 端口关联的网络设备的名称。这是查看 IGX 单元背面时最右侧的 QSFP 端口。
$ ls /sys/class/infiniband roceP5p3s0f0 roceP5p3s0f1
这将生成一个 CX7 端口列表;您的设备名称可能会有所不同。编号最低的那个,在本例中为
roceP5p3s0f0
,是第一个 CX7 端口。让我们将该名称分配给变量$IN0
。$ IN=(/sys/class/infiniband/*) $ IN0=`basename ${IN[0]}` $ echo $IN0 roceP5p3s0f0
接下来,确定哪个主机以太网端口与该设备关联,并将其分配给变量
$EN0
,我们将在稍后的网络配置期间使用它。$ EN0=`basename /sys/class/infiniband/$IN0/device/net/*` $ echo $EN0 enP5p3s0f0np0
总而言之,与
$IN0
(roceP5p3s0f0
) 关联的主机网络接口是$EN0
(enP5p3s0f0np0
);您的具体设备名称可能会有所不同。IGX OS 使用 NetworkManager 来配置网络接口。默认情况下,传感器桥设备为第一个端口使用地址 192.168.0.2。设置您的第一个以太网设备 (
$EN0
) 以使用地址 192.168.0.101 和到 192.168.0.2 的永久路由:(此处 提供了关于如果您无法以这种方式使用 192.168.0.0/24 网络来配置系统的更多信息。)$ sudo nmcli con add con-name hololink-$EN0 ifname $EN0 type ethernet ip4 192.168.0.101/24 $ sudo nmcli connection modify hololink-$EN0 +ipv4.routes "192.168.0.2/32 192.168.0.101" $ sudo nmcli connection modify hololink-$EN0 ethtool.ring-rx 4096 $ sudo nmcli connection up hololink-$EN0
为传感器桥设备供电,确保其已正确连接,然后
ping 192.168.0.2
以检查连接性$ ping 192.168.0.2 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data. 64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.225 ms 64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time=0.081 ms 64 bytes from 192.168.0.2: icmp_seq=3 ttl=64 time=0.088 ms 64 bytes from 192.168.0.2: icmp_seq=4 ttl=64 time=0.132 ms ^C --- 192.168.0.2 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3057ms rtt min/avg/max/mdev = 0.081/0.131/0.225/0.057 ms
传感器桥设备上的第二个 SFP+ 连接器用于传输从立体相机模块(如 IMX274)上的第二个摄像头获取的数据。默认情况下,传感器桥设备为第二个端口使用地址 192.168.0.3。将第二个 IGX QSFP 端口(用红色箭头指示,如下所示)连接到传感器桥设备上的第二个 SFP+ 端口。
让我们将它们称为
$IN1
和$EN1
。给定用于分配$IN0
和$EN0
的上述命令,$ IN1=`basename ${IN[1]}` $ echo $IN1 roceP5p3s0f1 $ EN1=`basename /sys/class/infiniband/$IN1/device/net/*` $ echo $EN1 enP5p3s0f1np1
如上所述,您的设备名称可能会有所不同。使用适当的地址和永久路由配置第二个 QSFP 网络端口
$ sudo nmcli con add con-name hololink-$EN1 ifname $EN1 type ethernet ip4 192.168.0.102/24 $ sudo nmcli connection modify hololink-$EN1 +ipv4.routes "192.168.0.3/32 192.168.0.102" $ sudo nmcli connection modify hololink-$EN1 ethtool.ring-rx 4096 $ sudo nmcli connection up hololink-$EN1
现在使用
ping 192.168.0.3
测试第二个连接$ ping 192.168.0.3 PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data. 64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.210 ms 64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.271 ms 64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.181 ms 64 bytes from 192.168.0.3: icmp_seq=4 ttl=64 time=0.310 ms 64 bytes from 192.168.0.3: icmp_seq=5 ttl=64 time=0.258 ms ^C --- 192.168.0.3 ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4102ms rtt min/avg/max/mdev = 0.181/0.246/0.310/0.045 ms
配置第二个端口后,第一个端口应继续响应 ping 请求。
在 $EN0 上启用 PTP。这会将报告的时间戳与接收到的数据与 IGX 时间同步。
在启动时运行
phc2sys
工具。这会将 $EN0 中的时钟与系统时钟同步。首先,安装linuxptp
工具。sudo apt update && sudo apt install -y linuxptp
接下来,设置一个 systemd 服务文件,该文件将运行
phc2sys
。PHC2SYS_SERVICE=/etc/systemd/system/phc2sys-$EN0.service cat <<EOF | sudo tee $PHC2SYS_SERVICE >/dev/null [Unit] Description=Copy system time to $EN0 After=timemaster.service [Service] Type=simple ExecStart=/usr/sbin/phc2sys -c $EN0 -s CLOCK_REALTIME -O 0 -S 0.001 [Install] WantedBy=multi-user.target EOF
配置它在启动时执行,并立即启动它。
sudo chmod u+x $PHC2SYS_SERVICE sudo systemctl enable phc2sys-$EN0.service sudo systemctl start phc2sys-$EN0.service
接下来,运行
ptp4l
以将 PTP SYNC 消息发送到 $EN0。cat <<EOF | sudo tee /etc/linuxptp/hsb-ptp.conf >/dev/null # This configuration is appropriate for NVIDIA Holoscan sensor bridge # applications, where PTP messages are sent over L2 and a 1/2 second interval. [global] logSyncInterval -1 logMinDelayReqInterval -1 network_transport L2 EOF
为此设置一个 systemd 服务文件。
PTP4L_SERVICE=/etc/systemd/system/ptp4l-$EN0.service cat <<EOF | sudo tee $PTP4L_SERVICE >/dev/null [Unit] Description=Send PTP SYNC messages to $EN0 After=phc2sys-$EN0.service [Service] Type=simple ExecStart=/usr/sbin/ptp4l -i $EN0 -f /etc/linuxptp/hsb-ptp.conf [Install] WantedBy=multi-user.target EOF
最后,运行它。
sudo chmod u+x $PTP4L_SERVICE sudo systemctl enable ptp4l-$EN0.service sudo systemctl start ptp4l-$EN0.service
对于仅使用 iGPU 的 IGX:安装 NVIDIA DLA 编译器。使用推理的应用程序在初始化时需要它;用于 iGPU 的 IGX OS 映像不包含它。
sudo apt update && sudo apt install -y nvidia-l4t-dla-compiler
此软件包中的演示和示例假定传感器桥设备已连接到 eth0,这是 AGX Orin 上的 RJ45 连接器。
Linux 套接字需要更大的网络接收器缓冲区。
大多数传感器桥自检都使用 Linux 的环回接口;如果内核由于缓冲区空间不足而开始丢包,则这些测试将失败。
echo 'net.core.rmem_max = 31326208' | sudo tee /etc/sysctl.d/52-hololink-rmem_max.conf sudo sysctl -p /etc/sysctl.d/52-hololink-rmem_max.conf
将 eth0 配置为静态 IP 地址 192.168.0.101。
L4T 使用 NetworkManager 来配置接口;默认情况下,接口配置为 DHCP 客户端。使用以下命令将 IP 地址更新为 192.168.0.101。(此处 提供了关于如果您无法以这种方式使用 192.168.0.0/24 网络来配置系统的更多信息。)
sudo nmcli con add con-name hololink-eth0 ifname eth0 type ethernet ip4 192.168.0.101/24 sudo nmcli connection up hololink-eth0
为传感器桥设备供电,确保其已正确连接,然后
ping 192.168.0.2
以检查连接性。对于基于 Linux 套接字的示例,建议将处理器核心与 Linux 内核隔离。对于高带宽应用程序,如 4k 视频采集,需要隔离网络接收器核心。当示例程序在处理器亲和性设置为该隔离核心的情况下运行时,性能会得到提高,延迟会降低。默认情况下,传感器桥软件在第三个处理器核心上运行时间关键的后台网络接收器进程。如果该核心与 Linux 调度隔离,则除非用户明确请求,否则不会在该核心上调度任何进程,并且可靠性和性能会大大提高。
可以通过编辑
/boot/extlinux/extlinux.conf
来实现将该核心与 Linux 隔离。在以APPEND
开头的行末尾添加设置isolcpus=2
。您的文件应如下所示TIMEOUT 30 DEFAULT primary MENU TITLE L4T boot options LABEL primary MENU LABEL primary kernel LINUX /boot/Image FDT /boot/dtb/kernel_tegra234-p3701-0000-p3737-0000.dtb INITRD /boot/initrd APPEND ${cbootargs} root=/dev/mmcblk0p1 rw rootwait ...<other-settings>... isolcpus=2
传感器桥应用程序可以通过将环境变量
HOLOLINK_AFFINITY
设置为应在其上运行的核心,在另一个核心上运行网络接收器进程。例如,要在第一个处理器核心上运行,HOLOLINK_AFFINITY=0 python3 examples/linux_imx274_player.py
将
HOLOLINK_AFFINITY
设置为空白将跳过传感器桥代码中的任何核心亲和性设置。在启动时运行 “jetson_clocks” 工具,以将核心时钟设置为最大值。
JETSON_CLOCKS_SERVICE=/etc/systemd/system/jetson_clocks.service cat <<EOF | sudo tee $JETSON_CLOCKS_SERVICE >/dev/null [Unit] Description=Jetson Clocks Startup After=nvpmodel.service [Service] Type=oneshot ExecStart=/usr/bin/jetson_clocks [Install] WantedBy=multi-user.target EOF sudo chmod u+x $JETSON_CLOCKS_SERVICE sudo systemctl enable jetson_clocks.service
将 AGX Orin 电源模式设置为 ‘MAXN’ 以获得最佳性能。可以在屏幕左上角的 L4T 电源下拉设置中更改该设置
重启 AGX Orin。这允许核心隔离和性能设置生效。如果配置为 ‘MAXN’ 性能不需要您重置设备,则手动执行重启命令
reboot
现在,对于所有配置,
使用您的开发者帐户登录 Nvidia GPU Cloud (NGC)
如果您没有 NGC 的开发者帐户,请在 https://catalog.ngc.nvidia.com/ 注册
为您的帐户创建 API 密钥:https://ngc.nvidia.com/setup/api-key
使用您的 API 密钥登录到 nvcr.io
$ docker login nvcr.io Username: $oauthtoken Password: <Your token key to NGC> WARNING! Your password will be stored unencrypted in /home/<user>/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.net.cn/engine/reference/commandline/login/#credentials-store Login Succeeded
现在继续 构建和测试 Holoscan 传感器桥容器。