本文是這個系列的第三部分。
我們回顧一下前兩個部分:
開箱篇:巴掌大的空間可以組成一個Jetson集群?讓我來揭秘(1)
運行MPI:巴掌大的空間可以組成一個Jetson集群?讓我來揭秘(2)
這次我們以Kubernet的輕量級管理工具K3S在這個4節點設備上搭建Docker容器集群管理功能,主要目的如下:
1. Docker容器是軟體發展的大趨勢,也包括人工智慧應用
2. Kubernet是目前作為Docker領域普及度最高的管理方案
3. K3S輕量級管理工具,使用資源更節省、安裝更容易。更適合嵌入式AIOT平臺的應用
本實驗以一片Xavier NX作為master節點,以及3片Jetson Nano 4GB作為Worker節點,所有設備的開發環境均為Jetpack 4.4.1版本,上面都預安裝好Docker 1.19版與nvidia-docker2管理工具。
過程中需要從NGC( ngc.nvidia.com)下載匹配Jetpack 4.4.1的NVIDIA l4t-ml:r32.4.4-py3鏡像來做實驗,因為這個鏡像完整地支持多種深度學習應用框架與Jupyter互動式環境,只要一道指令
集群環境說明:在Seeed設備中指派一個節點擔任 Master角色,其他擔任worker角色。本範例各節點配置如下:(IP部分請根據自己的環境去給定)
將上面四個IP與 Host Name 全部加入四個節點內的 /etc/hosts 文件裡
127.0.0.1 localhost
127.0.1.1 node3<= 這臺設備自己的 hostname
# 在下面添加本集群所有節點的 IP 與 Hostname
xx.xx.xx.30 node0
xx.xx.xx.31 node1
xx.xx.xx.32 node2
xx.xx.xx.33 node3
(存檔)
這樣的好處,就是後面的執行操作可以直接使用每個節點的 hostname而不用去記IP
用 K3S 搭建Nano管理集群執行指令如下:
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--docker" sh -s -
檢測是否安裝完成:
docker images
sudo kubectl get node
測試能否執行計算,執行一個第三方打包好的 cuda devicequery 容器:
sudo kubectl run -it nvidia --image=jitteam/devicequery --restart=Never
正確的話就會出現下面截屏:
1. 首先在Master(這裡是 node0)上找到k3s Server的密鑰(token),執行以下指令
sudo cat /var/lib/rancher/k3s/server/node-token
會看到一串類似下面長度的字符串(但一定是不一樣的):
2. 在每個 worker(node1/node2/node3)上執行
export k3s_token="<前一步顯示的node-token字符串>」
export k3s_url="https://<IP_OF_MASTER>:6443"# 這裡的<IP_OF_MASTER>為 node0
然後執行下面指令:
curl -sfL https://get.k3s.io | K3S_URL=${k3s_url} K3S_TOKEN=${k3s_token} sh -
* 上述步驟在每個worker節點上執行
3. 在 Master上執行下面指令,檢測 agent 安裝:
sudo kubectl get nodes
這就表示3個worker節點已經進入這個 k3s 管理範圍內,只不過還沒設定角色
4. 為每個 worker 設定角色:在 Master節點(node0)上執行角色設定指令
sudo kubectl label node node1 node2 node3 node-role.kubernetes.io/worker=worker
再檢測一下節點狀態:
sudo kubectl get nodes
這樣就完成這個 k3s 集群的搭建。
5. 檢查集群信息,執行以下指令:
sudo kubectl cluster-info
執行NVIDIA l4t-ml容器的tensorflow
1. 下載 l4t-ml:r32.4.4-py3 鏡像
docker pull nvcr.io/nvidia/l4t-ml:r32.4.4-py3
2. 撰寫 jetson-tf.yaml
apiVersion: v1kind: Podmetadata: name: jetson-tfspec: restartPolicy: OnFailure containers: - name: nvidia-l4t-ml image: "nvcr.io/nvidia/l4t-ml:r32.4.4-py3" command: [ "/bin/bash", "-c", "--" ] args: [ "while true; do sleep 30; done;" ]3. 檢查 Pod 狀態,執行:
sudo kubectl get pod
確認目標 pod (這裡為 jetson-tf)處於 Running 狀態,表示可以使用,如果處於「ContainerCreating」狀態,請等候處理
4. 啟動這個容器,請執行
sudo kubectl exec -it jetson-tf -- python3
直接進入容器的 python3 互動式環境,然後執行以下代碼:
from tensorflow.python.client import device_libdevice_lib.list_local_devices()就能顯示k3s容器裡面Tensorflow支持的GPU。
完整的測試可以進一步在 Python3 裡面執行以下代碼:
from tensorflow.python.client import device_libdef get_available_gpus(): local_device_protos = device_lib.list_local_devices()return [x.name for x in local_device_protos if x.device_type == 'GPU']
get_available_gpus()執行後會得到以下輸出: