<<<<<<< HEAD ======= >>>>>>> 60a8f64d0414dcd5cb8612f64b46979443258e0b Jetson Mate - Seeed产品文档

Jetson Mate 入门

Jetson Mate 是一个载板,最多可以插 4个 Nvidia Jetson Nano/NX SoMs,板上有一个 5端口交换机,使4个SoM可以相互通信。所有3个外围 SoM 均可单独打开或关闭。借助一个65w PD 电源适配器和一根网线,开发人员可以轻松地构建自己的 Jetson 集群。

产品特性

  • 易于构建和配置
  • 性能强大而且设计紧凑
  • 配有专用保护套和风扇

规格参数

规格参数 --
电源 65w PD
尺寸 110mm x 110mm
板载开关 Microchip KSZ9896CTXC

硬件总览

入门

第一步:准备

  • 接电源上电: 至少 65w 带有 PD 协议的合格 Type-C 电源适配器(不随产品提供)。

  • 插入 Nvidia Jetson Nano / Xavier NX Compute Modules x 4,支持开发套件中的eMMC版本或SD卡版本。

第二步: 安装和配置 Jetson OS

如果您使用带有SD卡的开发套件形式的计算机模块,建议您在开发套件载板上安装和配置系统。

如果您将计算模块与eMMC存储一起使用,请使用Nvidia的官方SDK管理器。

  • 选择目标硬件,如下图所示:
  • 选择要安装的操作系统和库,如下图所示:
  • 下载并安装文件。

此过程中注意

1.将计算机模块插入主节点。

2.使用跳线连接 2个 GND 针脚 ,如下图所示。

3.通过微型 USB 端口将 Jetson Mate 连接到计算机,USB 端口位置如下图所示。

4.打开机器电源,按 wake up 按钮

5.刷新您的计算模块。

  • 操作系统和软件库的安装完成后,将弹出一个窗口。如下图所示,选择手动设置选项,然后单击“Flash”按钮,等到完成为止。
  • 刷新所有剩余的计算模块。

所有模块仅在安装在主节点上后才能刷新。因此,您应该在主节点上一个接一个地配置并刷新模块。

启动集群

安装您拥有的所有计算模块。 打开电源, 然后点击 wake up 按钮。现在,您可以通过路由器检查设备的 IP 地址,还可以通过节点的主机名连接到节点!

使用 Jetson Mate 构建 Kubernetes 集群

Kubernetes 是从一开始就设计为云原生的企业级容器编排系统。它已经发展成为事实上的云容器平台,并随着包括容器原生虚拟化和无服务器计算在内的新技术的发展而不断扩展。

Kubernetes 在公共和私有云环境中管理容器,以及从边缘的微型到大规模的容器。它是“家庭私有云”项目的理想选择,既提供了强大的容器编排,也提供了了解这种需求中的技术的机会,并且将其完全集成到云中,因此其名称实际上就是“云计算”的代名词。

在本教程中,我们将使用一个 master 和 3 个 worker。在以下步骤中,我们将以粗体显示,该软件是在 master 还是在 ***worker***中运行,还是在***worker 与 master***中运行。

配置Docker

worker 与 master, 我们需要配置docker运行时默认使用“ nvidia”,修改文件 /etc/docker/daemon.json

{
    "default-runtime" : "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}
重新启动Docker守护程序:
sudo systemctl daemon-reload && sudo systemctl restart docker
将Docker默认运行时验证为NVIDIA:
sudo docker info | grep -i runtime
下面是示例输出:
Runtimes: nvidia runc
Default Runtime: nvidia

安装 Kubernetes

worker 与 master, 安装 kubelet,kubeadm 和 kubectl:

sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

# Add the Kubernetes repo
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt update && sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
禁用 swap,您必须在每次重新启动时将其关闭。
sudo swapoff -a
编译 deviceQuery,我们将在以下步骤中使用它。
cd /usr/local/cuda/samples/1_Utilities/deviceQuery && sudo make 
cd 

配置 Kubernetes

master,初始化集群:

sudo kubeadm init --pod-network-cidr=10.244.0.0/16
输出显示了要执行的用于将 Pod Network 部署到集群的命令,以及加入集群的命令。如果一切成功,则在输出末尾应会看到类似的内容:
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.2.114:6443 --token zqqoy7.9oi8dpkfmqkop2p5 \
    --discovery-token-ca-cert-hash sha256:71270ea137214422221319c1bdb9ba6d4b76abfa2506753703ed654a90c4982b

使用输出指令,运行以下命令:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

将 Pod-Network 附加组件安装到控制面节点,将 calico 用作 Pod-Network 插件:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
确保所有 Pod 都已启动并正在运行:
kubectl get pods --all-namespaces
这是示例输出:
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   kube-flannel-ds-arm64-gz28t                1/1     Running   0          2m8s
kube-system   coredns-5c98db65d4-d4kgh                   1/1     Running   0          9m8s
kube-system   coredns-5c98db65d4-h6x8m                   1/1     Running   0          9m8s
kube-system   etcd-#yourhost                             1/1     Running   0          8m25s
kube-system   kube-apiserver-#yourhost                   1/1     Running   0          8m7s
kube-system   kube-controller-manager-#yourhost          1/1     Running   0          8m3s
kube-system   kube-proxy-6sh42                           1/1     Running   0          9m7s
kube-system   kube-scheduler-#yourhost                   1/1     Running   0          8m26s
worker,将计算节点加入集群。现在是时候将计算节点添加到集群了,加入计算节点只是运行kubeadit 命令末尾提供的 kubeadm join 命令即可初始化控制面节点的问题。对于要加入集群的另一个 Jetson nano,登录到主机,然后运行以下命令:
 the cluster - your tokens and ca-cert-hash will vary
$ sudo kubeadm join 192.168.2.114:6443 --token zqqoy7.9oi8dpkfmqkop2p5 \
    --discovery-token-ca-cert-hash sha256:71270ea137214422221319c1bdb9ba6d4b76abfa2506753703ed654a90c4982b

master,一旦在每个节点上完成了加入过程,您就应该能够在 kubectl get 节点的输出中看到新的节点:

kubectl get nodes
这是示例输出:

标记为 worker 的节点。

kubectl label node se2 node-role.kubernetes.io/worker=worker
kubectl label node se3 node-role.kubernetes.io/worker=worker
kubectl label node se4 node-role.kubernetes.io/worker=worker

验证成功的 EGX 2.0 安装

worker 与 master,要验证 EGX 堆栈是否按预期工作,请按照以下步骤创建 pod yaml 文件。如果 get pods 命令显示 Pod 状态为已完成,则说明安装成功。您还可以通过验证输出是否显示 Result = PASS 来验证 cuda-samples.yaml 文件的成功运行。创建一个 pod yaml 文件,向其中添加以下内容,并将其另存为 samples.yaml:

nano cuda-samples.yaml

添加以下内容并将其另存为 cuda-samples.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: nvidia-l4t-base
spec:
  restartPolicy: OnFailure
  containers:
  - name: nvidia-l4t-base
    image: "nvcr.io/nvidia/l4t-base:r32.4.2"
    args:
       - /usr/local/cuda/samples/1_Utilities/deviceQuery/deviceQuery
创建一个 GPU pod 示例:
sudo kubectl apply -f cuda-samples.yaml

检查是否已创建示例 pod:

kubectl get pods

验证示例 pod 日志以支持 CUDA 库:

kubectl logs nvidia-l4t-base

这是示例输出:

/usr/local/cuda/samples/1_Utilities/deviceQuery/deviceQuery Starting...
 CUDA Device Query (Runtime API) version (CUDART static linking)
Detected 1 CUDA Capable device(s)

Device 0: "Xavier"
  CUDA Driver Version / Runtime Version          10.2 / 10.2
  CUDA Capability Major/Minor version number:    7.2
  Total amount of global memory:                 7764 MBytes (8140709888 bytes)
  ( 6) Multiprocessors, ( 64) CUDA Cores/MP:     384 CUDA Cores
  GPU Max Clock rate:                            1109 MHz (1.11 GHz)
  Memory Clock rate:                             1109 Mhz
  Memory Bus Width:                              256-bit
  L2 Cache Size:                                 524288 bytes
  Maximum Texture Dimension Size (x,y,z)         1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
  Maximum Layered 1D Texture Size, (num) layers  1D=(32768), 2048 layers
  Maximum Layered 2D Texture Size, (num) layers  2D=(32768, 32768), 2048 layers
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total number of registers available per block: 65536
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  2048
  Maximum number of threads per block:           1024
  Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
  Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and kernel execution:          Yes with 1 copy engine(s)
  Run time limit on kernels:                     No
  Integrated GPU sharing Host Memory:            Yes
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Disabled
  Device supports Unified Addressing (UVA):      Yes
  Device supports Compute Preemption:            Yes
  Supports Cooperative Kernel Launch:            Yes
  Supports MultiDevice Co-op Kernel Launch:      Yes
  Device PCI Domain ID / Bus ID / location ID:   0 / 0 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 10.2, CUDA Runtime Version = 10.2, NumDevs = 1
Result = PASS

在Kubernetes 上配置 Jupyter

worker 与 master,添加以下内容并将其另存为 jupyter.yaml:

nano jupyter.yaml

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: cluster-deployment
spec:
  selector:
    matchLabels:
      app: cluster
  replicas: 3 # tells deployment to run 3 pods matching the template
  template:
    metadata:
      labels:
        app: cluster
    spec:
      containers:
      - name: nginx
        image: helmuthva/jetson-nano-jupyter:latest
        ports:
        - containerPort: 8888
创建一个 jupyter GPU pod:
kubectl  apply -f jupyter.yml
检查 jupyter pod 是否已创建并正在运行:
kubectl get pod
创建一个外部负载均衡器:
kubectl expose deployment cluster-deployment --port=8888 --type=LoadBalancer 

在这里,您可以看到 jupyter 群集在端口 31262 上具有外部访问权限。因此,我们用于 http://se1.local:31262 访问 jupyter。

我们可以使用以下代码检查可用 GPU 的数量,我们只有3个工作线程,可用 GPU 的数量为3。

from tensorflow.python.client import device_lib

def 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()

好了,接下来就看你的表现了。

资源


Seeed 新产品 Jetson Mate 开箱

Seeed 新产品 Jetson Mate:如何刷机和运行 MPI

技术支持

如果您有任何技术问题,请提交到我们的 论坛

<<<<<<< HEAD ======= >>>>>>> 60a8f64d0414dcd5cb8612f64b46979443258e0b