本文檔描述了在Ubuntu 18.04上安裝低時延(Low-Latency) 或實時 (Realtime)內核及Nvidia驅動的步驟。
ENJOY THE FOLLOWING
僅在實車上運行Apollo軟體棧才需要低時延或實時內核。如果您的目的只是基於Apollo平臺開發/測試您的算法,或者運行仿真軟體(如Lgsvl模擬器),則可能您根本不需要安 裝這裡描述的低時延或實時內核。
Ubuntu軟體倉庫中的低時延內核足以為實車上運行Apollo提供低(或者零)時延。在其 內核配置中,任務搶佔式(PREEMPT)優化是開啟了的,時延可低至0.1毫秒。
下面是安裝Ubuntu低時延內核的步驟:
1. 安裝最新的低時延內核及其頭文件。
1sudo apt-get update2sudo apt-getinstall linux-image-$(uname -r)-lowlatency linux-headers-$(uname -r)-lowlatency
<左右滑動以查看完整代碼>
注意:
如果在執行了sudo apt-get update後通過apt list --upgradable查看有新版本內核 ,請將上述命令中的$(uname -r)改為Ubuntu軟體倉庫中最新的內核版本號。截至本 文寫作時(2020 年 12 月 2 日),Ubuntu軟體倉庫中的最新內核是5.4.0-56。
2. 重啟系統以啟動低時延內核。
sudo reboot
<左右滑動以查看完整代碼>
請按照ROS2:構建實時Linux中描述的步驟來構建和安裝最新的穩定版實時內核。雖然該文檔是按照Ubuntu 20.04來講的,但其中的步驟完全適用於Ubuntu 18.04。
對Ubuntu低時延內核而言,安裝Nvidia驅動的步驟比較簡單:
1. 從CUDA Toolkit下載頁下載並安裝Nvidia最新驅動。
在選擇安裝類型(Installer Type)時,建議選擇本地安裝(deb[local])或者網絡安裝(deb[network]) 模式。
注意:
可能需要註冊並籤署CUDA最終用戶使用協議(EULA)才可以下載Nvidia驅動及CUDA安裝包。
比如,如下是在x86_64架構的Ubuntu 18.04.5上通過本地安裝Deb軟體包的方式 安裝Nvidia驅動:
1wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin2sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-6003wget https://developer.download.nvidia.com/compute/cuda/11.1.1/local_installers/cuda-repo-ubuntu1804-11-1-local_11.1.1-455.32.00-1_amd64.deb4sudo dpkg -i cuda-repo-ubuntu1804-11-1-local_11.1.1-455.32.00-1_amd64.deb5sudo apt-key add /var/cuda-repo-ubuntu1804-11-1-local/7fa2af80.pub6sudo apt-get update7sudo apt-get install nvidia-driver-455
<左右滑動以查看完整代碼>
注意:
nvidia-driver-XXX的數字應該與CUDA本地安裝包中的數字一致。本例中是455。
2. 重啟系統。
3. 運行nvidia-smi檢查是否生效。
請先按照低時延內核Nvidia驅動的安裝方法完成 Nvidia 驅動的初步安裝。請注意,由於 Nvidia 驅動不支持實時內核,所以在上面執行sudo apt-get install nvidia-driver-455的步驟時會報如下錯誤消息:
1The kernel you are installing foris a PREEMPT_RT kernel! 2 3The NVIDIA driver does not support real-time kernels. If you 4are using a stock distribution kernel, please install 5a variant of this kernel that does not have the PREEMPT_RT 6patch set applied; if this is a custom kernel, please 7install a standard Linux kernel. Thentry installing the 8NVIDIA kernel module again. 910*** Failed PREEMPT_RT sanity check. Bailing out! ***
<左右滑動以查看完整代碼>
我們可以通過在編譯Nvidia驅動的時候設置 IGNORE_PREEMPT_RT_PRESENCE=1 來繞過這 一點。
步驟如下:
1. 運行如下命令來編譯Nvidia驅動:
1# 切換到Nvidia 驅動的源碼目錄 2cd "$(dpkg -L nvidia-kernel-source-455 | grep -m 1 "nvidia-drm" | xargs dirname)" 3 4# 設置 IGNORE_PREEMPT_RT_PRESENCE=1 來編譯Nvidia 驅動 5sudo env NV_VERBOSE=1 \ 6make -j8 NV_EXCLUDE_BUILD_MODULES='' \ 7KERNEL_UNAME=$(uname -r) \ 8IGNORE_XEN_PRESENCE=1 \ 9IGNORE_CC_MISMATCH=1 \10IGNORE_PREEMPT_RT_PRESENCE=1 \11SYSSRC=/lib/modules/$(uname -r)/build \12LD=/usr/bin/ld.bfd \13modules1415sudo mv *.ko /lib/modules/$(uname -r)/updates/dkms/16sudo depmod -a
<左右滑動以查看完整代碼>
2. 重啟系統。
3. 運行nvidia-smi來檢查Nvidia驅動是否正常工作。
如有需要,可按照《ESD-CAN 安裝說明》(連結見文末)來編譯安裝ESD-CAN驅動。
*《ESD-CAN 安裝說明》https://github.com/ApolloAuto/apollo-kernel/blob/master/linux/ESDCAN-README.md