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.
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)
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
.
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.
python
en contenedorEn 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
➜ ~
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