Tutorial 04 - Administrar mis Contenedores

1) Descargar un contenedor en el Patagón

La descarga de un contenedor se hace al momento de ejecutar una tarea, solo la primera vez, y sigue la estructura

srun --container-name=<nombre-arbitrario> --container-image=<url-imagen-contenedor> <comando-de-ejecucion>

Por ejemplo, si quisieramos descargar el contenedor de CUDA entonces seria

srun --container-name=cuda-11.2.2  --container-image='nvcr.io/nvidia/cuda:11.2.2-devel-ubuntu20.04' nvcc --version

Mas información sobre la descarga de contenedores con srun en el tutorial de ejecución de tareas parte 3) Ejecución con Contenedores.

2) Consultar por mis contenedores descargados

Cada vez que se ejecuta un trabajo SLURM con un contenedor nuevo, este puede quedar descargado y cacheado en el almacenamiento para futuros usos si es que el usuario así lo decidió (parámetro --container-name=...). Para consultar por los contenedores instalados, ejecutar el siguiente comando

➜  ~ srun --pty enroot list

El siguiente ejemplo muestra para un usuario en particular, sus contenedores ya descargados en el Patagón:

➜  ~ srun --pty enroot list
pyxis_benchmark-hpl
pyxis_cuda:11.4.1-devel
pyxis_hpcsdk
pyxis_pytorch

(Nota: los contenedores mostrados son los del usuario que ejecuta el comando)

3) Eliminar un contenedor del Patagón

Una buena práctica para el ecosistema del Patagón es eliminar los contenedores que uno ya no usa. La estructura del comando para eliminar un contenedor es:

srun --pty enroot remove <nombre-contenedor>

Continuando con el ejemplo anterior, si quisiéramos eliminar el contenedor de pytorch (pyxis_pytorch), seria:

➜  ~ srun --pty enroot remove pyxis_pytorch    
Do you really want to delete /home/enroot-data/user-1000/pyxis_pytorch? [y/N] y
➜  ~ 

(Nota: si el contenedor era muy pesado, entonces la eliminación podría tardar algunos segundos.)

Luego, se puede confirmar que el contenedor efectivamente ha sido eliminado.

➜  ~ srun --pty enroot list              
pyxis_benchmark-hpl
pyxis_cuda:11.4.1-devel
pyxis_hpcsdk

Para saber más sobre enroot y sus distintas opciones, ejecutar srun --pty enroot --help.

4) Instalar paquetes dentro de un contenedor

En el Patagón es posible instalar paquetes adicionales en los contenedores que usamos. Esto resulta muy útil ya que a menudo necesitamos extender nuestro contenedor con librerías adicionales, y así poder concentrar nuestro ambiente en un mismo contenedor. Para iniciar, lo primero que hay que saber es que es posible entrar por terminal al contenedor de forma análoga a como uno entra a un servidor.

Para entrar a un contenedor usamos srun con el comando bash y en modo interactivo pty. La estructura para entrar es

srun --container-name=<nombre-contenedor> --pty bash

y como podemos notar, no es necesario pedir recursos hardware ya que es un trabajo de administración.

La primera vez que se entra a un contenedor es necesario actualizar el listado de paquetes ejecutando el siguiente comando desde dentro del contenedor

apt-get update

Si su contenedor no cuenta con apt y apt-get, entonces deberá averiguar cual es el gestor de paquetes que usa.

Ejemplo: instalar python en contenedor

En este ejemplo instalaremos python en un contenedor previamente descargado aquí llamado cuda-11.2.2 (reemplaza el nombre por el de tu contenedor). Primero, verificaremos si existe python o no.

➜  ~ srun --container-name=cuda-11.2.2 --pty bash     
cnavarro@nodeGPU01:~$ python --version
bash: python: command not found
cnavarro@nodeGPU01:~$ exit
exit
srun: error: nodeGPU01: task 0: Exited with exit code 127
➜  ~ 

Efectivamente, python no existe en el contenedor ya que el contenedor de CUDA no lo incluye por defecto. Para instalar un paquete, volveremos a entrar al contenedor pero esta vez como root, pasando el parametro --container-remap-root en la linea de srun:

➜  ~ srun --container-name=cuda-11.2.2 --container-remap-root --pty bash
root@nodeGPU01:/home/cnavarro# cd
root@nodeGPU01:~# pwd
/root

Siguiendo con el ejemplo, instalaremos python con apt-get.

➜  ~ srun --container-name=cuda-11.2.2 --container-remap-root --pty bash
root@nodeGPU01:~# apt-get install python         
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Note, selecting 'python-is-python2' instead of 'python'
The following additional packages will be installed:
  file libmagic-mgc libmagic1 libpython2-stdlib libpython2.7-minimal libpython2.7-stdlib mime-support python2 python2-minimal
  python2.7 python2.7-minimal
Suggested packages:
  python2-doc python-tk python2.7-doc binfmt-support
The following NEW packages will be installed:
  file libmagic-mgc libmagic1 libpython2-stdlib libpython2.7-minimal libpython2.7-stdlib mime-support python-is-python2 python2
  python2-minimal python2.7 python2.7-minimal
0 upgraded, 12 newly installed, 0 to remove and 37 not upgraded.
Need to get 4167 kB of archives.
After this operation, 22.8 MB of additional disk space will be used.
Do you want to continue? [Y/n] 
Get:1 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 libpython2.7-minimal amd64 2.7.18-1~20.04.1 [335 kB]
Get:2 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 python2.7-minimal amd64 2.7.18-1~20.04.1 [1285 kB]
Get:3 http://archive.ubuntu.com/ubuntu focal/universe amd64 python2-minimal amd64 2.7.17-2ubuntu4 [27.5 kB]
Get:4 http://archive.ubuntu.com/ubuntu focal/main amd64 mime-support all 3.64ubuntu1 [30.6 kB]
...
...
Setting up file (1:5.38-4) ...
Setting up libpython2.7-stdlib:amd64 (2.7.18-1~20.04.1) ...
Setting up python2.7 (2.7.18-1~20.04.1) ...
Setting up libpython2-stdlib:amd64 (2.7.17-2ubuntu4) ...
Setting up python2 (2.7.17-2ubuntu4) ...
Setting up python-is-python2 (2.7.17-4) ...
Processing triggers for libc-bin (2.31-0ubuntu9.2) ...
root@nodeGPU01:~# exit
exit
➜  ~ 

La próxima vez que uno inicie el contenedor, python ya existirá en el ambiente.

➜  ~ srun --container-name=cuda-11.2.2 --pty bash 
cnavarro@nodeGPU01:~$ python --version
Python 2.7.18
cnavarro@nodeGPU01:~$ exit
exit
➜  ~ 

5) Eliminar paquetes de un contenedor

La eliminación de un paquete es análoga a la instalación, es decir, entrar al contenedor como root y utilizar el gestor de paquetes (usualmente apt). Continuando con el ejemplo de la sección anterior, si quisiéramos eliminar python del contenedor cuda-11.2.2, ejecutaríamos:

➜  ~ srun --container-name=cuda-11.2.2 --container-remap-root --pty bash
root@nodeGPU01:~# apt remove python