Skip to main content

Primeros pasos con la Jetson Mate

La Jetson Mate es una Carrier Board que puede instalar hasta 4 SoM Nvidia Jetson Nano/NX. Hay un conmutador gigabit de 5 puertos integrado que permite que los 4 SoM se comuniquen entre sí. Los 3 SoM periféricos se pueden encender o apagar por separado. Con un cargador PD de 2 puertos de 65 W para Jetson Nano SoM o un cargador PD de 2 puertos de 90 W para SoM Jetson NX y un cable Ethernet, los desarrolladores pueden construir fácilmente su propio Jetson Cluster.

Características

  • Fácil de construir y configurar
  • Potente y compacta
  • Viene con una carcasa dedicada y ventilador

Especificaciones

Spec--
Alimentación65w PD
Dimensiones110mm x 110mm
Switch en la placaMicrochip KSZ9896CTXC

Descripción general del Hardware

Primeros pasos

¡¡¡Nota!!! En esta guía, Ubuntu 18.04 LTS está instalado en la PC host. Actualmente, Ubuntu 20.04 no admite el flasheo del sistema operativo mediante NVIDIA SDK Manager. Así que asegúrate de utilizar Ubuntu 18.04 o 16.04. Además, si estás ejecutando Ubuntu en una máquina virtual, se recomienda utilizar VMware Workstation Player como lo hemos probado. No se recomienda utilizar Oracle VM VirtualBox, ya que no flashea el sistema operativo.

Hardware Requerido

  • Jetson Mate
  • Módulo(s) Jetson Nano/ NX
  • Cable Micro - USB
  • Adaptador de alimentación USB Tipo-C de 65W o 90W
  • PC host con Ubuntu 18.04 o 16.04 instalado

Configuración de Hardware

  • Paso 1. Inserta un módulo Jetson Nano/ NX en el Master Node

pir

  • Paso 2. Conecta un cable micro-USB de la Jetson Mate a la PC

pir

  • Paso 3. Conecta un puente entre los pines BOOT y GND para entrar al modo de recuperación

pir

  • Paso 4. Conecta la Jetson Mate a un adaptador de corriente y enciende la Jetson Mate presionando el botón WAKE

  • Paso 5. Retira el puente después de que la Jetson Mate se encienda

  • Paso 6. Abre una ventana de terminal en la PC host y ejecuta lo siguiente

lsusb

pir

Si el resultado incluye 0955:7f21 NVidia Corp., la Jetson Mate ha entrado en modo de recuperación

Configuración de Software

Si estás utilizando módulos con tarjeta micro-SD del Developer Kit, te sugerimos instalar y configurar el sistema siguiendo esta guía para Jetson Nano, esta guía para Jetson Nano 2GB y esta guía para Jetson Xavier NX

Si estás utilizando módulos con almacenamiento eMMC, utiliza el SDK Manager oficial de NVIDIA y sigue los pasos mostrados a continuación

  • Paso 1. Descarga NVIDIA SDK Manager haciendo click aquí

Nota: Elige la versión relevante según el sistema operativo del PC host. Elegimos Ubuntu aquí porque la PC host utilizada en esta guía ejecuta Ubuntu 18.04.

pir

  • Paso 2. Crea una cuenta o inicia sesión en Membresía del Programa para desarrolladores de NVIDIA

  • Paso 3. Instala NVIDIA SDK Manager

Nota: Haz doble click en el archivo descargado para instalarlo.

  • Paso 4. Abre NVIDIA SDK Manager y notarás que detecta automáticamente el módulo Jetson Nano/NX conectado.

pir

  • Paso 5. Selecciona el módulo conectado

  • Paso 6. En la ventana de configuración, desmarca Máquina host.

pir

Nota: Aquí DeepStream SDK tampoco está marcado. Pero si planeas instalarlo también, puedes marcarlo. Sin embargo, los 16 GB del módulo eMMC no serán suficientes para instalar este SDK.

  • Paso 7. Haz click en CONTINUAR CON EL PASO 02

  • Paso 8. Revisa los componentes requeridos y marca Acepto los términos y condiciones de los acuerdos de licencia

pir

Nota: Si solo deseas instalar Jetson OS, puedes desmarcar Jetson SDK Components

  • Paso 9. Haz click en CONTINUAR CON EL PASO 03

  • Paso 10. Una vez que aparezca el siguiente mensaje de error, haz click en Crear

pir

  • Paso 11. Comienza a descargar y flashear

pir

  • Paso 12. Una vez finalizada la descarga y flasheo del sistema operativo, verás el siguiente resultado

pir

  • Paso 13. Apaga la Jetson Mate

  • Paso 14. Abre una ventana de terminal en la PC host e instala minicom, que es una aplicación de terminal serie

sudo apt update
sudo apt install minicom

Nota: Usaremos esta aplicación para establecer una conexión en serie entre la PC host y la Jetson Mate

  • Paso 15. Enciende la Jetson Mate mientras aún está conectado a la PC mediante un cable micro - USB, ingresa lo siguiente para identificar el puerto serie conectado
dmesg | grep tty

pir

Nota: Aquí el nombre del puerto es ttyACM0

  • Paso 16. Conéctate a la Jetson Mate usando minicom
sudo minicom -b 9600 -D /dev/ttyACM0

Nota: -b es velocidad en baudios y -D es dispositivo

  • Paso 17. Realiza la configuración inicial para Jetson OS

pir

  • Paso 18. Una vez finalizada la configuración, regresa a la ventana de SDK Manager, ingresa el nombre de usuario y contraseña establecidos para Jetson Mate y haz click en Instalar

pir

Nota: Utiliza el nombre de usuario y la contraseña establecidos en la configuración inicial.

Ahora comenzará la descarga e instalación de los componentes del SDK.

pir

Verás el siguiente resultado cuando el administrador de SDK haya descargado e instalado correctamente los componentes necesarios

pir

  • Paso 19. Actualiza todos los módulos Jetson Nano/NX restantes que tengas

Nota: Todos los módulos solo se pueden actualizar cuando se instalan en el nodo maestro. Por lo tanto, debes actualizar y configurar los módulos uno por uno en el nodo maestro.

Ejecutar el Cluster

  • Paso 1. Conecta un cable Ethernet desde el enrutador a la Jetson Mate

Nota: Asegúrate de que la PC y la Jetson Mate estén conectados al mismo enrutador

  • Paso 2. Ingresa a la Jetson Mate usando minicom como se explicó anteriormente, mientras el micro-USB está conectado a la PC host y escribe lo siguiente para obtener las direcciones IP de los módulos conectados a la Jetson Mate
ifconfig
  • Paso 3. Escribe lo siguiente en la terminal de la PC host para establecer una conexión SSH

Nota: Reemplaza usuario con tu nombre de usuario de Jetson Nano/ NX y 192.xxx.xx.xx con tu dirección IP de la Jetson Nano/ NX

Nota: También puedes conectarte a los nodos reemplazando la dirección IP por tu nombre de host.

Crea un clúster de Kubernetes con Jetson Mate

Kubernetes es un sistema de orquestación de contenedores de nivel empresarial diseñado desde el principio para ser nativo en la nube. Ha crecido hasta convertirse en la plataforma de contenedores en la nube de facto y continúa expandiéndose a medida que adopta nuevas tecnologías, incluida la virtualización nativa de contenedores y la computación sin servidor.

Kubernetes gestiona contenedores y más, desde microescala en el borde hasta escala masiva, tanto en entornos de nube públicos como privados. Es una elección perfecta para un proyecto de "nube privada en casa", ya que proporciona tanto una sólida orquestación de contenedores como la oportunidad de aprender sobre una tecnología con tanta demanda y tan completamente integrada en la nube que su nombre es prácticamente sinónimo de "computación en la nube".

En este tutorial, utilizamos un maestro y tres trabajadores. En los siguientes pasos, indicaremos en negrita si el software se ejecuta en master o en worker, o en worker y master.

Configuración de Docker

trabajador y maestro, necesitamos configurar el tiempo de ejecución de la ventana acoplable y usar "nvidia" de forma predeterminada. modificar el archivo /etc/docker/daemon.json

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

Reiniciar el Docker daemon:

sudo systemctl daemon-reload && sudo systemctl restart docker

Valida el tiempo de ejecución predeterminado de Docker como NVIDIA:

sudo docker info | grep -i runtime

Aquí está el resultado de muestra:

Runtimes: nvidia runc
Default Runtime: nvidia

Instalación de Kubernetes

trabajador y maestro, instala kubelet, kubeadm y 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

Deshabilita el intercambio. Debes desactivarlo cada vez que reinicies.

sudo swapoff -a

Compila deviceQuery, que lo usaremos en los siguientes pasos.

cd /usr/local/cuda/samples/1_Utilities/deviceQuery && sudo make 
cd

Configuración de Kubernetes

master, inicializa el cluster:

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

El resultado muestra los comandos que debes ejecutar para implementar una red de pods en el cluster, así como comandos para unirse al cluster. Si todo es exitoso, deberías ver algo similar a esto al final:

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

Usando las instrucciones de salida, ejecuta los siguientes comandos:

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

Instala un complemento de red de pod en el nodo del plano de control. Utiliza calico como complemento de la red de pods:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Si estás en China, corre el siguiente comando: kubectl apply -f https://gitee.com/wj204811/wj204811/raw/master/kube-flannel.yml

Asegúrate de que todos los pods estén en funcionamiento:

kubectl get pods --all-namespaces

Debería lucir como se muestra a continuación:



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

trabajador, une los nodos de computación al cluster. Ahora es el momento de agregar nodos de computación al cluster. Unirse a los nodos de cálculo es solo una cuestión de ejecutar el comando kubeadm join proporcionado al final de la ejecución del comando kube init para inicializar el nodo del Plano de control. Para la otra Jetson nano al que deseas unir a tu cluster, inicia sesión en el host y ejecuta el siguiente comando:

 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, una vez que hayas completado el proceso de unión en cada nodo, deberías poder ver los nuevos nodos en la salida de kubectl get nodes:

kubectl get nodes

Debería lucir como se muestra a continuación:

Etiqueta como nodo para el trabajador.

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

Validar una instalación exitosa de EGX 2.0

trabajador y maestro. Para validar que la pila EGX funcione como se esperaba, sigue estos pasos para crear un archivo pod yaml. Si el comando get pods muestra el estado del pod como completado, la instalación se realizó correctamente. También puedes verificar la ejecución exitosa del archivo cuda-samples.yaml verificando que el resultado muestre Result=PASS. Crea un archivo pod yaml, agrégale el siguiente contenido y guárdalo como samples.yaml:

nano cuda-samples.yaml

Agrega el siguiente contenido y guárdalo como 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

Crea un pod de GPU de muestra:

sudo kubectl apply -f cuda-samples.yaml

Comprueba si se creó el pod de muestras:

kubectl get pods

Valida los registros del pod de muestra para admitir bibliotecas CUDA:

kubectl logs nvidia-l4t-base

Aquí está el resultado de muestra:

/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

Configurar Jupyter en Kubernetes

trabajador y maestro, agrega el siguiente contenido y guárdalo como 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

Crea un pod de GPU jupyter:

kubectl  apply -f jupyter.yml

Comprueba si el pod jupyter se creó y se está ejecutando:

kubectl get pod

Crear un equilibrador de carga externo

kubectl expose deployment cluster-deployment --port=8888 --type=LoadBalancer 

Aquí puedes ver que el cluster de Jupyter tiene acceso externo en el puerto 31262. Entonces usamos http://se1.local:31262 para visitar jupyter.

Podemos usar el siguiente código para verificar la cantidad de GPU disponibles, solo tenemos 3 trabajadores y la cantidad de GPU disponibles es 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()

Recursos

Soporte Tech y discusión del producto

¡Gracias por elegir nuestros productos! Estamos aquí para darte soporte y asegurar que tu experiencia con nuestros productos sea la mejor posible. Tenemos diversos canales de comunicación para adaptarnos distintas preferencias y necesidades.

Loading Comments...