# NVIDIA Container Toolkit 安裝筆記
###### tags: `Edge AI` `Nvidia` `Jetson` `System Setup` `container` `nvidia-container`

## NVIDIA Jetson 平台佈署相關筆記
### 基本環境設定
- [Jetson AGX Xavier 系統環境設定1_在windows10環境連接與安裝](https://hackmd.io/@YungHuiHsu/HJ2lcU4Rj)
- [Jetson AGX Xavier 系統環境設定2_Docker安裝或從源程式碼編譯](https://hackmd.io/k-lnDTxVQDWo_V13WEnfOg)
- [NVIDIA Container Toolkit 安裝筆記](https://hackmd.io/wADvyemZRDOeEduJXA9X7g)
- [Jetson 邊緣裝置查詢系統性能指令jtop](https://hackmd.io/VXXV3T5GRIKi6ap8SkR-tg)
- [Jetson Network Setup 網路設定](https://hackmd.io/WiqAB7pLSpm2863N2ISGXQ)
- [OpenCV turns on cuda acceleration in Nvidia Jetson platform<br>OpenCV在Nvidia Jetson平台開啟cuda加速](https://hackmd.io/6IloyiWMQ_qbIpIE_c_1GA)
### 模型佈署與加速
- [[Object Detection_YOLO] YOLOv7 論文筆記](https://hackmd.io/xhLeIsoSToW0jL61QRWDcQ)
- [Deploy YOLOv7 on Nvidia Jetson](https://hackmd.io/kZftj6AgQmWJsbXsswIwEQ)
- [Convert PyTorch model to TensorRT for 3-8x speedup<br>將PyTorch模型轉換為TensorRT,實現3-8倍加速](https://hackmd.io/_oaJhYNqTvyL_h01X1Fdmw?both)
- [Accelerate multi-streaming cameras with DeepStream and deploy custom (YOLO) models<br>使用DeepStream加速多串流攝影機並佈署客製(YOLO)模型](https://hackmd.io/@YungHuiHsu/rJKx-tv4h)
- [Model Quantization Note 模型量化筆記](https://hackmd.io/riYLcrp1RuKHpVI22oEAXA)
---
## NVIDIA Docker安裝
在執行此操作前需要先安裝好NVIDIA Docker
說明與安裝指引見[nvidia-docker](https://github.com/NVIDIA/nvidia-docker)
最主要目的是讓你能在container內啟用GPU
在啟用docker時,用這個指令`--runtime=nvidia`啟用nvidia的 gpu


(source : https://developer.nvidia.com/zh-cn/blog/gpu-containers-runtime/)
服務架構如圖所示
需要先在Linux環境先確認/安裝 NVIDIA driver 然後再安裝Docker engine
- [NVIDIA Driver Installation Quickstart Guide](https://docs.nvidia.com/datacenter/tesla/tesla-installation-notes/index.html)
- [NVIDIA CUDA Installation Guide for Linux](https://docs.nvidia.com/cuda/cuda-installation-guide-linux/)
### NVIDIA Container Toolkit [Installation Guide](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker)
### 前提條件
#### NVIDIA Drivers
:::info
由於採用Jetpack整包安裝,CUDA Driver等都已經安裝好了,這部分可略過
:::
在開始之前,請確保你已經為你的Linux發行版安裝了NVIDIA驅動程序。建議使用發行版的軟件包管理器來安裝驅動程序,但也可以使用其他安裝機制(例如,從NVIDIA驅動程序下載中心下載.run安裝程序)。
有關使用軟件包管理器從官方CUDA網絡倉庫安裝驅動程序的說明,請按照本指南中的步驟進行。
#### Platform Requirements
運行NVIDIA Container Toolkit的先決條件列表如下。
* GNU/Linux x86_64,內核版本>3.10
* Docker >= 19.03(推薦使用,但某些發行版可能包含舊版的Docker。最低支持版本為1.12)
* 架構>= Kepler (or compute capability 3.0)
* NVIDIA Linux 驅動程序 >= 418.81.07 (請注意,舊版驅動程序或分支不受支持
:::warning
驅動版本可能會限制你的CUDA能力。較新的英偉達驅動程序可以向後兼容CUDA工具包版本,但每個新版本的CUDA都需要一個最低的驅動程序版本。運行一個CUDA容器需要一台至少有一個CUDA功能的GPU的機器,以及與你所使用的CUDA工具包版本兼容的驅動程序。運行CUDA容器的機器只需要NVIDIA驅動程序,不需要安裝CUDA工具包。CUDA發行說明中包含了一個最小驅動程序和CUDA工具包版本的表格。
:::
### Container Device Interface (CDI) Support
從V1.12.0版本開始,NVIDIA Container Toolkit支持生成容器設備接口<https://github.com/container-orchestrated-devices/container-device-interface>_(CDI),以便與支持CDI的容器引擎和CLI一起使用。
詳見Container Device Interface (CDI) Suppor 一節
ps: 我在安裝時跳過CDI設定,因為後面操作是直接使用原始碼進行編譯,暫時未使用到docker,所以還沒看到問題出現
### Docker安裝
以下步驟可用於在Ubuntu LTS(18.04、20.04和22.04)和Debian(Stretch、Buster)發行版上設置NVIDIA Container Toolkit。
#### Setting up Docker
Ubuntu上的Docker-CE可以使用Docker的官方便利腳本進行設置。
```
curl https://get.docker.com | sh \
&& sudo systemctl --now enable docker
```
:::info
Follow the official [instructions](https://docs.docker.com/engine/install/ubuntu/) for more details and [post-install actions](https://docs.docker.com/engine/install/linux-postinstall/).
:::
#### Setting up NVIDIA Container Toolkit
Setup the package repository and the GPG key:
```
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
```
在更新軟件包列表後,安裝 nvidia-container-toolkit 包(以及依賴項)。
```
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
```
配置Docker守護程序,使其能夠識別NVIDIA Container Runtime
```
sudo nvidia-ctk runtime configure --runtime=docker
```
完成設定後重啟Docker常駐程式
```
sudo systemctl restart docker
```
測試基本的CUDA container是否運作順利
```
sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
```
:::warning
如果使用的機器是Jetson的話,並沒有nvidia-smi指令可以使用,引此要改安裝jetson-stats 以jtop檢視系統運作狀態。 詳見[Jetson 邊緣裝置查詢系統性能指令jtop](https://hackmd.io/@YungHuiHsu/H1kx5WdJn)
:::