<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          15分鐘連接Jetson Nano與K8S,輕松搭建機器學(xué)習(xí)集群

          共 10096字,需瀏覽 21分鐘

           ·

          2020-11-05 11:39


          明晚8點,K3s自動化工具AutoK3s線上demo來咯,讓你簡化公有云部署,絕對提升工作效率,從此告別繁瑣的部署步驟!


          點擊【閱讀原文】或掃描下方二維碼即可報名:


          在本文中我將展示如何將Jetson Nano開發(fā)板連接到Kubernetes集群以作為一個GPU節(jié)點。我將介紹使用GPU運行容器所需的NVIDIA docker設(shè)置,以及將Jetson連接到Kubernetes集群。在成功將節(jié)點連接到集群后,我還將展示如何在Jetson Nano上使用GPU運行簡單的TensorFlow 2訓(xùn)練會話。


          K3s還是K8s?


          K3s是一個輕量級Kubernetes發(fā)行版,其大小不超過100MB。在我看來,它是單板計算機的理想選擇,因為它所需的資源明顯減少。你可以查看我們的往期文章,了解更多關(guān)于K3s的教程和生態(tài)。在K3s生態(tài)中,有一款不得不提的開源工具K3sup,這是由Alex Ellis開發(fā)的,用于簡化K3s集群安裝。你可以訪問Github了解這款工具:

          https://github.com/alexellis/k3sup


          我們需要準(zhǔn)備什么?


          • 一個K3s集群——只需要一個正確配置的主節(jié)點即可

          • NVIDIA Jetson Nano開發(fā)板,并安裝好開發(fā)者套件

            如果你想了解如何在開發(fā)板上安裝開發(fā)者套件,你可以查看以下文檔:

            https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#write

          • K3sup

          • 15分鐘的時間


          計劃步驟


          1. 設(shè)置NVIDIA docker

          2. 添加Jetson Nano到K3s集群

          3. 運行一個簡單的MNIST例子來展示Kubernetes pod內(nèi)GPU的使用


          設(shè)置NVIDIA docker


          在我們配置Docker以使用nvidia-docker作為默認(rèn)的運行時之前,我需要先解釋一下為什么要這樣做。默認(rèn)情況下,當(dāng)用戶在Jetson Nano上運行容器時,運行方式與其他硬件設(shè)備相同,你不能從容器中訪問GPU,至少在沒有黑客攻擊的情況下不能。如果你想自己測試一下,你可以運行以下命令,應(yīng)該會看到類似的結(jié)果:


          root@jetson:~# echo "python3 -c 'import tensorflow'" | docker run -i icetekio/jetson-nano-tensorflow /bin/bash2020-05-14 00:10:23.370761: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'libcudart.so.10.2'; dlerror: libcudart.so.10.2: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/cuda-10.2/targets/aarch64-linux/lib:2020-05-14 00:10:23.370859: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.2020-05-14 00:10:25.946896: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'libnvinfer.so.7'; dlerror: libnvinfer.so.7: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/cuda-10.2/targets/aarch64-linux/lib:2020-05-14 00:10:25.947219: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'libnvinfer_plugin.so.7'; dlerror: libnvinfer_plugin.so.7: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/cuda-10.2/targets/aarch64-linux/lib:2020-05-14 00:10:25.947273: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:30] Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly./usr/lib/python3/dist-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.  from ._conv import register_converters as _register_converters


          如果你現(xiàn)在嘗試運行相同的命令,但在docker命令中添--runtime=nvidia參數(shù),你應(yīng)該看到類似以下的內(nèi)容:


          root@jetson:~# echo "python3 -c 'import tensorflow'" | docker run --runtime=nvidia -i icetekio/jetson-nano-tensorflow /bin/bash2020-05-14 00:12:16.767624: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.22020-05-14 00:12:19.386354: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libnvinfer.so.72020-05-14 00:12:19.388700: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libnvinfer_plugin.so.7/usr/lib/python3/dist-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.  from ._conv import register_converters as _register_converters


          nvidia-docker已經(jīng)配置完成,但是默認(rèn)情況下并沒有啟用。要啟用docker運行nvidia-docker運行時作為默認(rèn)值,需要將"default-runtime":"nvidia"添加到/etc/docker/daemon.json配置文件中,如下所示:


          {    "runtimes": {        "nvidia": {            "path": "nvidia-container-runtime",            "runtimeArgs": []        }    },    "default-runtime": "nvidia"}


          現(xiàn)在你可以跳過docker run命令中--runtime=nvidia參數(shù),GPU將被默認(rèn)初始化。這樣K3s就會用nvidia-docker運行時來使用Docker,讓Pod不需要任何特殊配置就能使用GPU。


          將Jetson作為K8S節(jié)點連接


          使用K3sup將Jetson作為Kubernetes節(jié)點連接只需要1個命令,然而要想成功連接Jetson和master節(jié)點,我們需要能夠在沒有密碼的情況下同時連接到Jetson和master節(jié)點,并且在沒有密碼的情況下做sudo,或者以root用戶的身份連接。


          如果你需要生成SSH 密鑰并復(fù)制它們,你需要運行以下命令:


          ssh-keygen -t rsa -b 4096 -f ~/.ssh/rpi -P ""ssh-copy-id -i .ssh/rpi user@host


          默認(rèn)情況下,Ubuntu安裝要求用戶在使用sudo命令時輸入密碼,因此,更簡單的方法是用root賬戶來使用K3sup。要使這個方法有效,需要將你的~/.ssh/authorized_keys復(fù)制到/root/.ssh/目錄下。


          在連接Jetson之前,我們查看一下想要連接到的集群:


          upgrade@ZeroOne:~$ kubectl get node -o wideNAME      STATUS   ROLES    AGE   VERSION        INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIMEnexus     Ready    master   32d   v1.17.2+k3s1   192.168.0.12   <none>        Ubuntu 18.04.4 LTS   4.15.0-96-generic   containerd://1.3.3-k3s1rpi3-32   Ready    <none>   32d   v1.17.2+k3s1   192.168.0.30   <none>        Ubuntu 18.04.4 LTS   5.3.0-1022-raspi2   containerd://1.3.3-k3s1rpi3-64   Ready    <none>   32d   v1.17.2+k3s1   192.168.0.32   <none>        Ubuntu 18.04.4 LTS   5.3.0-1022-raspi2   containerd://1.3.3-k3s1


          你可能會注意到,master節(jié)點是一臺IP為192.168.0.12nexus主機,它正在運行containerd。默認(rèn)狀態(tài)下,k3s會將containerd作為運行時,但這是可以修改的。由于我們設(shè)置了nvidia-docker與docker一起運行,我們需要修改containerd。無需擔(dān)心,將containerd修改為Docker我們僅需傳遞一個額外的參數(shù)到k3sup命令即可。所以,運行以下命令即可連接Jetson到集群:


          k3sup join --ssh-key ~/.ssh/rpi  --server-ip 192.168.0.12  --ip 192.168.0.40   --k3s-extra-args '--docker'


          IP 192.168.0.40是我的Jetson Nano。正如你所看到的,我們傳遞了--k3s-extra-args'--docker'標(biāo)志,在安裝k3s agent 時,將--docker標(biāo)志傳遞給它。多虧如此,我們使用的是nvidia-docker設(shè)置的docker,而不是containerd。


          要檢查節(jié)點是否正確連接,我們可以運行kubectl get node -o wide


          upgrade@ZeroOne:~$ kubectl get node -o wideNAME      STATUS   ROLES    AGE   VERSION        INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIMEnexus     Ready    master   32d   v1.17.2+k3s1   192.168.0.12   <none>        Ubuntu 18.04.4 LTS   4.15.0-96-generic   containerd://1.3.3-k3s1rpi3-32   Ready    <none>   32d   v1.17.2+k3s1   192.168.0.30   <none>        Ubuntu 18.04.4 LTS   5.3.0-1022-raspi2   containerd://1.3.3-k3s1rpi3-64   Ready    <none>   32d   v1.17.2+k3s1   192.168.0.32   <none>        Ubuntu 18.04.4 LTS   5.3.0-1022-raspi2   containerd://1.3.3-k3s1jetson    Ready    <none>   11s   v1.17.2+k3s1   192.168.0.40   <none>        Ubuntu 18.04.4 LTS   4.9.140-tegra       docker://19.3.6


          簡易驗證


          我們現(xiàn)在可以使用相同的docker鏡像和命令來運行pod,以檢查是否會有與本文開頭在Jetson Nano上運行docker相同的結(jié)果。要做到這一點,我們可以應(yīng)用這個pod規(guī)范:


          apiVersion: v1kind: Podmetadata:  name: gpu-testspec:  nodeSelector:    kubernetes.io/hostname: jetson  containers:  - image: icetekio/jetson-nano-tensorflow    name: gpu-test    command:    - "/bin/bash"    - "-c"    - "echo 'import tensorflow' | python3"  restartPolicy: Never


          等待docker鏡像拉取,然后通過運行以下命令查看日志:


          upgrade@ZeroOne:~$ kubectl logs gpu-test 2020-05-14 10:01:51.341661: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.22020-05-14 10:01:53.996300: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libnvinfer.so.72020-05-14 10:01:53.998563: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libnvinfer_plugin.so.7/usr/lib/python3/dist-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.  from ._conv import register_converters as _register_converters


          如你所見,我們的日志信息與之前在Jetson上運行Docker相似。


          運行MNIST訓(xùn)練


          我們有一個支持GPU的運行節(jié)點,所以現(xiàn)在我們可以測試出機器學(xué)習(xí)的 "Hello world",并使用MNIST數(shù)據(jù)集運行TensorFlow 2模型示例。


          要運行一個簡單的訓(xùn)練會話,以證明GPU的使用情況,應(yīng)用下面的manifest:


          apiVersion: v1kind: Podmetadata:  name: mnist-trainingspec:  nodeSelector:    kubernetes.io/hostname: jetson  initContainers:    - name: git-clone      image: iceci/utils      command:        - "git"        - "clone"        - ""        - "/workspace"      volumeMounts:        - mountPath: /workspace          name: workspace  containers:    - image: icetekio/jetson-nano-tensorflow      name: mnist      command:        - "python3"        - "/workspace/mnist.py"      volumeMounts:        - mountPath: /workspace          name: workspace  restartPolicy: Never  volumes:    - name: workspace      emptyDir: {}


          從下面的日志中可以看到,GPU正在運行:


          ...2020-05-14 11:30:02.846289: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1697] Adding visible gpu devices: 02020-05-14 11:30:02.846434: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.2....


          如果你在節(jié)點上,你可以通過運行tegrastats命令來測試CPU和GPU的使用情況:


          upgrade@jetson:~$ tegrastats --interval 5000RAM 2462/3964MB (lfb 2x4MB) SWAP 362/1982MB (cached 6MB) CPU [52%@1479,41%@1479,43%@1479,34%@1479] EMC_FREQ 0% GR3D_FREQ 9% PLL@23.5C CPU@26C PMIC@100C GPU@24C AO@28.5C thermal@25C POM_5V_IN 3410/3410 POM_5V_GPU 451/451 POM_5V_CPU 1355/1355RAM 2462/3964MB (lfb 2x4MB) SWAP 362/1982MB (cached 6MB) CPU [53%@1479,42%@1479,45%@1479,35%@1479] EMC_FREQ 0% GR3D_FREQ 9% PLL@23.5C CPU@26C PMIC@100C GPU@24C AO@28.5C thermal@24.75C POM_5V_IN 3410/3410 POM_5V_GPU 451/451 POM_5V_CPU 1353/1354RAM 2461/3964MB (lfb 2x4MB) SWAP 362/1982MB (cached 6MB) CPU [52%@1479,38%@1479,43%@1479,33%@1479] EMC_FREQ 0% GR3D_FREQ 10% PLL@24C CPU@26C PMIC@100C GPU@24C AO@29C thermal@25.25C POM_5V_IN 3410/3410 POM_5V_GPU 493/465 POM_5V_CPU 1314/1340


          總? 結(jié)


          如你所見,將Jetson Nano連接到Kubernetes集群是一個非常簡單的過程。只需幾分鐘,你就能利用Kubernetes來運行機器學(xué)習(xí)工作負(fù)載——同時也能利用NVIDIA袖珍GPU的強大功能。你將能夠在Kubernetes上運行任何為Jetson Nano設(shè)計的GPU容器,這可以簡化你的開發(fā)和測試。


          作者:

          Jakub Czapliński,Icetek編輯

          原文鏈接:

          https://medium.com/icetek/how-to-connect-jetson-nano-to-kubernetes-using-k3s-and-k3sup-c715cf2bf212



          推薦閱讀

          簡化公有云K3s部署體驗,Rancher開源自動化工具AutoK3s

          利用K3s低成本在流水線中添加測試

          如何基于K3s構(gòu)建云原生邊緣基礎(chǔ)設(shè)施?



          About k3s


          k3s 是首個進(jìn)入 CNCF 沙箱項目的 K8S 發(fā)行版,同時也是當(dāng)前全球用戶量最大的 CNCF 認(rèn)證輕量級 K8S 發(fā)行版。自2019年3月發(fā)布以來,備受全球開發(fā)者們關(guān)注,至今GitHub Star數(shù)已超過 14,600,成為了開源社區(qū)最受歡迎的邊緣計算 K8S 解決方案。截至目前,K3s全球下載量超過100萬次,每周平均被安裝超過2萬次,其中30%的下載量來自中國。


          k3s 專為在資源有限的環(huán)境中運行 Kubernetes 的研發(fā)和運維人員設(shè)計,將滿足日益增長的在邊緣計算環(huán)境中運行在 x86、ARM64 和 ARMv7 處理器上的小型、易于管理的 Kubernetes 集群需求。k3s 的發(fā)布,為開發(fā)者們提供了以“Rancher 2.X + k3s”為核心的從數(shù)據(jù)中心到云到邊到端的 K8S 即服務(wù)(Kubernetes-as-a-Service),推動 Kubernetes Everywhere。

          掃碼添加k3s中文社區(qū)助手

          加入官方中文技術(shù)社區(qū)

          官網(wǎng):https://k3s.io

          點擊下方“閱讀原文”,解放K3s生產(chǎn)力!

          ↓↓↓
          瀏覽 108
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人性交无码 | www.天堂av | 搞bim视频免费网站 | 水蜜桃成人在线 | 人人婷婷 |