Containers Guide for Jetson Nano

Según Wikipedia, un contenedor es un recipiente de carga para el transporte marítimo. El objetivo de este es aislar y proteger las mercancias durante su traslado para que lleguen a su destino sin sufrir ningun tipo de daño para su uso o consumo. Y supongo que es el motivo por el cual tambien se le llama asi en el contexto de la computación, creo que no existe mejor definición que esta.

Un contenedor de aplicaciones, es una unidad de estándar de software en la que podemos empaquetar código con todas sus dependencias de forma aislada del sistema operativo anfitrion, lo que permite poder ejecutar este mismo codigo en otro sistema que soporte la tecnologia de contenedores, independientemente del entorno subyacente. Por esta razon las imágenes de los contenedores pueden reutilizarse para transportarse y desplegarse en otros entornos. Algo muy similar a una maquina virtual pero sin los altos consumos de CPU y RAM que esto puede traer, utilizando unos pocos MB de RAM. Docker es el estandar en la industria y su codigo fuente esta escrito en GO.

¿Cuales son las ventajas? Mi respuesta: 1.- Los contenedores y las maquinas virtuales se parecen demasiado. Sin embargo, mientras una maquina virtual requiere procesadores y memoria ram dedicada un contenedor solo requiere unos pocos MB de memoria para que pueda ser utilizado. 2.- Podemos crear y desplegar las aplicaciones a una nueva ubicación, como otra jetson nano. 3.- Si arruinamos las cosas dentro del contenedor simplemente puedes borrarlo e instalarlo de nuevo. 4.- Nvidia proporciona algunos contenedores que son de gran utilidad ya que ahorramos tiempo en la instalación de dependencias y estan listos para usarse. 5.- Ya viene preinstalado!

Este post pretende ser una guia basica enfocado al uso de arquitecturas ARM como lo es la Jetson Nano. Si quieren explorar mas a fondo dejo estos enlaces.

Los comando basicos de Docker son:

  • Descargar una imagen
docker pull <nombre_de_la_imagen>
  • Ejecutar el contenedor
docker run <nombre_de_la_imagen>

Existen muchas opciones para el comando run, por ejemplo:

-it
-d
-p
-v

Listar contenedores en ejecucion

docker ps

Listar todos los contenedores

docker ps -a

Detener el contenedor

docker stop

Eliminar un contenedor

docker rm <id_del_contenedor>

Eliminar una imagen:

docker rmi <id_de_la_imagen>

Y ahora para aplicar todo lo que vimos en concreto, aqui un ejemplo tomado del catalogo NGC.

Obtener la imagen JetPack-L4T, la última disponible para hacer ML en la Jetson Nano

sudo docker pull nvcr.io/nvidia/l4t-ml:r32.7.1-py3

Eliminar una imagen:

sudo docker run -it --rm --runtime nvidia --network host nvcr.io/nvidia/l4t-ml:r32.7.1-py3

Si queremos montar directorios desde el host

sudo docker run -it --rm --runtime nvidia --network host -v /home/user/project:/location/in/container nvcr.io/nvidia/l4t-ml:r32.7.1-py3