第一篇文章描述了 如何使用預裝驅動程序集成英偉達 GPU 和網絡運營商 。
本文介紹了以下任務:
清理預安裝的驅動程序集成
使用自定義驅動程序容器安裝網絡運營商
使用自定義驅動程序容器安裝 GPU 操作員
NVIDIA 驅動程序集成
預安裝的驅動程序集成方法適用于需要簽名驅動程序的邊緣部署,以實現安全和可測量的引導。當邊緣節點具有不可變的操作系統時,請使用驅動程序容器方法。當并非所有邊緣節點都有加速器時,驅動程序容器也適用。
清理預安裝的驅動程序集成
首先,卸載以前的配置并重新啟動以清除預安裝的驅動程序。
刪除測試播客和網絡附件。
$ kubectl delete pod roce-shared-pod pod "roce-shared-pod" deleted $ kubectl delete macvlannetwork roce-shared-macvlan-network macvlannetwork.mellanox.com "roce-shared-macvlan-network" deleted
- 卸載網絡運營商掌舵圖。
$ helm delete -n network-operator network-operator release "network-operator" uninstalled
3 .卸載 MOFED 以刪除預安裝的驅動程序和庫。
$ rmmod nvidia_peermem $ /etc/init.d/openibd stop Unloading HCA driver: [ OK ] $ cd ~/MLNX_OFED_LINUX-5.4-1.0.3.0-rhel7.9-x86_64 $ ./uninstall.sh
4 .拆下 GPU 測試盒。
$ kubectl delete pod cuda-vectoradd pod "cuda-vectoradd" deleted
5 .卸載英偉達 Linux 驅動程序。
$ ./NVIDIA-Linux-x86_64-470.57.02.run --uninstall
6 .拆下 GPU 操作器。
$ helm uninstall gpu-operator-1634173044
7 .重新啟動。
$ sudo shutdown -r now
使用自定義驅動程序容器安裝網絡運營商
本節介紹使用自定義驅動程序容器安裝網絡運營商的步驟。
在容器映像中執行的驅動程序構建腳本需要訪問目標內核的內核開發包。在本例中,內核開發包是通過 ApacheWeb 服務器提供的。
構建容器后,將其上載到網絡運營商 Helm chart 可以從主機訪問的存儲庫。
GPU 操作員將在下一節中使用相同的 web 服務器構建自定義 GPU 操作員驅動程序容器。
安裝 Apache web 服務器并啟動它。
$ sudo firewall-cmd --state not running $ sudo yum install createrepo yum-utils httpd -y $ systemctl start httpd.service && systemctl enable httpd.service && systemctl status httpd.service ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2021-10-20 18:10:43 EDT; 4h 45min ago ...
- 創建上游 CentOS 7 基本軟件包存儲庫的鏡像。自定義包存儲庫在/ var 分區上需要 500 GB 的可用空間。請注意,將所有 CentOS Base 軟件包下載到 web 服務器可能需要 10 分鐘或更長時間。
$ cd /var/www/html $ mkdir -p repos/centos/7/x86_64/os $ reposync -p /var/www/html/repos/centos/7/x86_64/os/ --repo=base --download-metadata -m
3 .將 Linux 內核源文件復制到 web 服務器上的 Base packages 目錄中。本例假設使用 rpmbuild 將自定義內核編譯為 RPM 。
$ cd repos/centos/7/x86_64/os $ sudo cp ~/rpmbuild/RPMS/x86_64/*.rpm .
網絡運營商需要以下文件:
- kernel-headers-${KERNEL_VERSION}
- kernel-devel-${KERNEL_VERSION}
確保 GPU 操作員有這些附加文件:
- gcc-${GCC_VERSION}
- elfutils-libelf.x86_64
- elfutils-libelf-devel.x86_64
$ for i in $(rpm -q kernel-headers kernel-devel elfutils-libelf elfutils-libelf-devel gcc | grep -v "not installed"); do ls $i*; done
kernel-headers-3.10.0-1160.42.2.el7.custom.x86_64.rpm
kernel-devel-3.10.0-1160.42.2.el7.custom.x86_64.rpm
elfutils-libelf-0.176-5.el7.x86_64.rpm
elfutils-libelf-devel-0.176-5.el7.x86_64.rpm
gcc-4.8.5-44.el7.x86_64.rpm
4 .瀏覽到 web 存儲庫以確??赏ㄟ^ HTTP 訪問該存儲庫。
$ elinks http://localhost/repos/centos/7/x86_64/os --dump Index of /repos/centos/7/x86_64/os [1][ICO] [2]Name [3]Last modified [4]Size [5]Description -------------------------------------------------------------------------- [6][PARENTDIR] [7]Parent Directory - [8][DIR] [9]base/ 2021-10-21 22:55 - [10][DIR] [11]extras/ 2021-10-02 00:29 - -------------------------------------------------------------------------- References Visible links 2. http://localhost/repos/centos/7/x86_64/os/?C=N;O=D 3. http://localhost/repos/centos/7/x86_64/os/?C=M;O=A 4. http://localhost/repos/centos/7/x86_64/os/?C=S;O=A 5. http://localhost/repos/centos/7/x86_64/os/?C=D;O=A 7. http://localhost/repos/centos/7/x86_64/ 9. http://localhost/repos/centos/7/x86_64/os/base/ 11. http://localhost/repos/centos/7/x86_64/os/extras/
5.MOFED 驅動程序容器映像是根據 Github 上mellanox/ofed-docker存儲庫中的源代碼構建的。克隆 ofed docker 存儲庫。
$ git clone https://github.com/Mellanox/ofed-docker.git
$ cd ofed-docker/
6 .為自定義驅動程序容器創建生成目錄。
$ mkdir centos
$ cd centos/
7 .創建 Dockerfile ,將 MOFED 依賴項和源存檔安裝到 CentOS 7.9 基本映像中。指定 MOFED 和 CentOS 版本。
$ sudo cat << EOF | tee Dockerfile
FROM centos:centos7.9.2009 ARG D_OFED_VERSION="5.4-1.0.3.0"
ARG D_OS_VERSION="7.9"
ARG D_OS="rhel${D_OS_VERSION}"
ENV D_OS=${D_OS}
ARG D_ARCH="x86_64"
ARG D_OFED_PATH="MLNX_OFED_LINUX-${D_OFED_VERSION}-${D_OS}-${D_ARCH}"
ENV D_OFED_PATH=${D_OFED_PATH} ARG D_OFED_TARBALL_NAME="${D_OFED_PATH}.tgz"
ARG D_OFED_BASE_URL="https://www.mellanox.com/downloads/ofed/MLNX_OFED-${D_OFED_VERSION}"
ARG D_OFED_URL_PATH="${D_OFED_BASE_URL}/${D_OFED_TARBALL_NAME}" ARG D_WITHOUT_FLAGS="--without-rshim-dkms --without-iser-dkms --without-isert-dkms --without-srp-dkms --without-kernel-mft-dkms --without-mlnx-rdma-rxe-dkms"
ENV D_WITHOUT_FLAGS=${D_WITHOUT_FLAGS} # Download and extract tarball
WORKDIR /root
RUN yum install -y curl && (curl -sL ${D_OFED_URL_PATH} | tar -xzf -) RUN yum install -y atk \ cairo \ ethtool \ gcc-gfortran \ git \ gtk2 \ iproute \ libnl3 \ libxml2-python \ lsof \ make \ net-tools \ numactl-libs \ openssh-clients \ openssh-server \ pciutils \ perl \ python-devel \ redhat-rpm-config \ rpm-build \ tcl \ tcsh \ tk \ wget ADD ./entrypoint.sh /root/entrypoint.sh ENTRYPOINT ["/root/entrypoint.sh"]
EOF
8 .修改 ofed docker 存儲庫中包含的 RHEL entrypoint.sh 腳本,以從 web 服務器安裝自定義內核源程序包。在_install_prerequsities()函數中指定 web 服務器上base/Packages目錄的路徑。
在本例中, 10.150.168.20 是本節前面創建的 web 服務器 IP 地址。
$ cp ../rhel/entrypoint.sh .
$ cat entrypoint.sh
...
# Install the kernel modules header/builtin/order files and generate the kernel version string.
_install_prerequisites() { echo "Installing dependencies" yum -y --releasever=7 install createrepo elfutils-libelf-devel kernel-rpm-macros numactl-libs initscripts grubby linux-firmware libtool echo "Installing Linux kernel headers..." rpm -ivh http://10.150.168.20/repos/centos/7/x86_64/os/base/Packages/kernel-3.10.0-1160.45.1.el7.custom.x86_64.rpm rpm -ivh http://10.150.168.20/repos/centos/7/x86_64/os/base/Packages/kernel-devel-3.10.0-1160.45.1.el7.custom.x86_64.rpm rpm -ivh http://10.150.168.20/repos/centos/7/x86_64/os/base/Packages/kernel-headers-3.10.0-1160.45.1.el7.custom.x86_64.rpm # Prevent depmod from giving a WARNING about missing files touch /lib/modules/${KVER}/modules.order touch /lib/modules/${KVER}/modules.builtin depmod ${KVER}
...
9OFED 驅動程序容器從主機文件系統裝載一個目錄以共享驅動程序文件。創建目錄。
$ mkdir -p /run/mellanox/drivers
10 將新的 CentOS 驅動程序映像上載到注冊表。此示例使用 NGC 專用注冊表。登錄到注冊表。
$ sudo yum install -y podman $ sudo podman login nvcr.io
Username: $oauthtoken
Password: *****************************************
Login Succeeded!
11 使用 Podman 構建驅動程序容器映像并將其推送到注冊表。
$ sudo podman build --no-cache --tag nvcr.io/nv-ngc5g/mofed-5.4-1.0.3.0:centos7-amd64 .
12 標記圖像并將其推送到注冊表。
$ sudo podman images nvcr.io | grep mofed
nvcr.io/nv-ngc5g/mofed-5.4-1.0.3.0 centos7-amd64 d61e555bddda 2 minutes ago 1.13 GB
13 覆蓋英偉達網絡運營商頭盔圖中包含的 Value.YAML 文件,以安裝自定義驅動程序映像。指定自定義驅動程序容器的映像名稱、存儲庫和版本。
$ cat << EOF | sudo tee roce_shared_values_driver.yaml nfd: enabled: false
deployCR: true
ofedDriver: deploy: true image: mofed repository: nvcr.io/nv-ngc5g version: 5.4-1.0.3.0
sriovDevicePlugin: deploy: false
rdmaSharedDevicePlugin: deploy: true resources: - name: rdma_shared_device_a vendors: [15b3] deviceIDs: [101d] ifNames: [ens13f0]
EOF
14 安裝英偉達網絡運營商的新價值。
$ helm install -f ./roce_shared_values_driver.yaml -n network-operator --create-namespace --wait network-operator mellanox/network-operator
15 查看網絡運營商部署的 POD 。 MOFED 吊艙應處于運行狀態。這是自定義驅動程序容器。請注意,在啟動 pod 之前編譯驅動程序可能需要幾分鐘的時間。
$ kubectl -n nvidia-network-operator-resources get pods
NAME READY STATUS RESTARTS AGE
cni-plugins-ds-zr9kf 1/1 Running 0 10m
kube-multus-ds-w57rz 1/1 Running 0 10m
mofed-centos7-ds-cbs74 1/1 Running 0 10m
rdma-shared-dp-ds-ch8m2 1/1 Running 0 2m27s
whereabouts-z947f 1/1 Running 0 10m
16 驗證主機上是否加載了 MOFED 驅動程序。
$ lsmod | egrep '^ib|^mlx|^rdma'
rdma_ucm 27022 0 rdma_cm 65212 1 rdma_ucm
ib_ipoib 124872 0 ib_cm 53085 2 rdma_cm,ib_ipoib
ib_umad 27744 0 mlx5_ib 384793 0 mlx5_core 1360822 1 mlx5_ib
ib_uverbs 132833 2 mlx5_ib,rdma_ucm
ib_core 357959 8 rdma_cm,ib_cm,iw_cm,mlx5_ib,ib_umad,ib_uverbs,rdma_ucm,ib_ipoib
mlx_compat 55063 11 rdma_cm,ib_cm,iw_cm,auxiliary,mlx5_ib,ib_core,ib_umad,ib_uverbs,mlx5_core,rdma_ucm,ib_ipoib
mlxfw 22321 1 mlx5_core
17 驅動程序容器的根文件系統應綁定到主機上的/run/mellanox/drivers目錄。
$ ls /run/mellanox/drivers
anaconda-post.log bin boot dev etc home host lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
使用自定義驅動程序容器安裝 GPU 操作員
本節介紹使用自定義驅動程序容器安裝 GPU 操作符的步驟。
與網絡運營商一樣, GPU 運營商容器執行的驅動程序構建腳本需要訪問目標內核的開發包。
本例使用的 web 服務器與上一節中向網絡運營商交付開發包的 web 服務器相同。
構建容器后,將其上載到 GPU 操作員 Helm chart 可以從主機訪問的存儲庫。與網絡運營商示例一樣, GPU 運營商也使用 NGC 上的專用注冊表。
構建自定義驅動程序容器。
$ cd ~
$ git clone https://gitlab.com/nvidia/container-images/driver.git
$ cd driver/centos7
2 .更新 CentOS Dockerfile 以使用驅動程序版本 470.74 。注釋掉未使用的參數。
$ grep ARG Dockerfile ARG BASE_URL=http://us.download.nvidia.com/XFree86/Linux-x86_64
#ARG BASE_URL=https://us.download.nvidia.com/tesla
ARG DRIVER_VERSION=470.74
ARG DRIVER_TYPE=passthrough
ARG VGPU_LICENSE_SERVER_TYPE=FNE
ARG PUBLIC_KEY=''
#ARG PUBLIC_KEY=empty
ARG PRIVATE_KEY
3 .構建 GPU 驅動程序容器映像并將其推送到 NGC 。
$ sudo podman build --no-cache --tag nvcr.io/nv-ngc5g/driver:470.74-centos7 .
4 .查看 GPU 驅動程序容器圖像。
$ podman images nvcr.io | grep 470
nvcr.io/nv-ngc5g/driver 470.74-centos7 630f0f8e77f5 2 minutes ago 1.28 GB
5 .驗證為網絡運營商安裝創建的自定義存儲庫中是否存在以下文件:
- elfutils-libelf.x86_64
- elfutils-libelf-devel.x86_64
- kernel-headers-${KERNEL_VERSION}
- kernel-devel-${KERNEL_VERSION}
- gcc-${GCC_VERSION}
編譯自定義內核映像的驅動程序需要這些文件。
$ cd /var/www/html/repos/centos/7/x86_64/os/base/Packages/ $ for i in $(rpm -q kernel-headers kernel-devel elfutils-libelf elfutils-libelf-devel gcc | grep -v "not installed"); do ls $i*; done
kernel-headers-3.10.0-1160.45.1.el7.custom.x86_64.rpm
kernel-devel-3.10.0-1160.45.1.el7.custom.x86_64.rpm
elfutils-libelf-0.176-5.el7.x86_64.rpm
elfutils-libelf-devel-0.176-5.el7.x86_64.rpm
gcc-4.8.5-44.el7.x86_64.rpm
6 .與網絡運營商不同, GPU 運營商使用自定義的 Yum 存儲庫配置文件。創建引用自定義鏡像存儲庫的 Yum repo 文件。
$ cd /var/www/html/repos $ cat << EOF | sudo tee custom-repo.repo [base]
name=CentOS Linux $releasever - Base
baseurl=http://10.150.168.20/repos/centos/$releasever/$basearch/os/base/
gpgcheck=0
enabled=1
EOF
7.GPU 運算符使用 Kubernetes ConfigMap 來配置自定義存儲庫。 ConfigMap 必須在gpu-operator-resources命名空間中可用。創建名稱空間和 ConfigMap 。
$ kubectl create ns gpu-operator-resources $ kubectl create configmap repo-config -n gpu-operator-resources --from-file=/var/www/html/repos/custom-repo.repo
configmap/repo-config created $ kubectl describe cm -n gpu-operator-resources repo-config Name: repo-config
Namespace: gpu-operator-resources
Labels:
Annotations: Data
====
custom-repo.repo:
----
[base]
name=CentOS Linux $releasever - Base
baseurl=http://10.150.168.20/repos/centos/$releasever/$basearch/os/base/
gpgcheck=0
enabled=1
8 .安裝 GPU 操作員舵圖。指定自定義存儲庫位置、自定義驅動程序版本以及自定義驅動程序映像名稱和位置。
$ helm install nvidia/gpu-operator --generate-name --set driver.repoConfig.configMapName=repo-config --set driver.repoConfig.destinationDir=/etc/yum.repos.d --set driver.image=driver --set driver.repository=nvcr.io/nv-ngc5g --set-string driver.version="470.74" --set toolkit.version=1.7.1-centos7 --set operator.defaultRuntime=crio
9 查看已部署的吊艙。
$ kubectl get pods -n gpu-operator-resources
NAME READY STATUS RESTARTS AGE
gpu-feature-discovery-r6kq6 1/1 Running 0 3m33s
nvidia-container-toolkit-daemonset-62pbj 1/1 Running 0 3m33s
nvidia-cuda-validator-ljd5l 0/1 Completed 0 119s
nvidia-dcgm-9nsfx 1/1 Running 0 3m33s
nvidia-dcgm-exporter-zm82v 1/1 Running 0 3m33s
nvidia-device-plugin-daemonset-bp66r 1/1 Running 0 3m33s
nvidia-device-plugin-validator-8pbmv 0/1 Completed 0 108s
nvidia-driver-daemonset-4tx24 1/1 Running 0 3m33s
nvidia-mig-manager-kvcgc 1/1 Running 0 3m32s
nvidia-operator-validator-g9xz5 1/1 Running 0 3m33s
10 驗證驅動程序是否已加載。
$ lsmod | grep nvidia
nvidia_modeset 1195268 0 nvidia_uvm 995356 0 nvidia 35237551 114 nvidia_modeset,nvidia_uvm
drm 456166 5 ast,ttm,drm_kms_helper,nvidia
11 從驅動程序守護程序盒運行 nvidia smi 。
Defaulted container "nvidia-driver-ctr" out of: nvidia-driver-ctr, k8s-driver-manager (init)
Thu Oct 28 02:37:50 2021 +-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.74 Driver Version: 470.74 CUDA Version: 11.4 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA A100-PCI... On | 00000000:23:00.0 Off | 0 |
| N/A 25C P0 32W / 250W | 0MiB / 40536MiB | 0% Default |
| | | Disabled |
+-------------------------------+----------------------+----------------------+
| 1 NVIDIA A100-PCI... On | 00000000:E6:00.0 Off | 0 |
| N/A 27C P0 32W / 250W | 0MiB / 40536MiB | 0% Default |
| | | Disabled |
+-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
啟用 GPUnDeID-RDMA 的英偉達對等存儲器驅動器不是自動構建的。
重復此過程以構建自定義 nvidia peermem 驅動程序容器。
對于 GPU 運營商中的 nvidia peermem 安裝程序尚不支持的任何 Linux 操作系統,都需要此附加步驟。
英偉達加速器的未來
NVIDIA 加速器有助于在傳感器數據呈指數級增長的情況下,對未來的邊緣 AI 投資進行驗證。 NVIDIA 運營商是云本地軟件,可簡化 Kubernetes 上的加速器部署和管理。運營商支持流行的 Kubernetes 開箱即用平臺,并且可以定制以支持替代平臺。
關于作者
Jacob Liberman 是 NVIDIA 企業和邊緣加速集團的產品經理。他利用 20 多年的技術計算經驗提供高性能、云計算原生邊緣人工智能解決方案。此前,他曾在紅帽、 AMD 和戴爾擔任產品管理和工程職務。
審核編輯:法人
-
傳感器
+關注
關注
2548文章
50678瀏覽量
752017 -
NVIDIA
+關注
關注
14文章
4940瀏覽量
102816
發布評論請先 登錄
相關推薦
評論