1. Utilização de Containeres no Ambiente de Computação do CPTEC¶
Tecnologias de virtualização tem sido utilizadas para o desenvolvimento, distribuição e uso de aplicações e ambientes de desenvolvimento. Softwares como o Singularity e o Docker, permitem que aplicações sejam distribuídas dentro de ambientes específicos que permitem o seu uso em diferentes máquinas. O Singularity, por exemplo, pode ser utilizado para esta finalidade, com a vantagem de ser apropriado para uso em ambiente de supercomputação. Cenários de uso deste tipo de software, incluem: o compartilhamento de ambientes de desenvolvimento de forma padronizada, a portabilidade de aplicações legadas entre diferentes máquinas e a distribuição de modelos e produtos para testes em ambientes encapsulados prontos para uso.
Para utilizar o Singularity em máquina local ou nas máquinas XC50 e Itapemirim (ou qualquer outra máquina virtual do centro, como a Colorado, Ilopolis etc), siga as orientações abaixo.
1.1 Uso em máquina local¶
Para a utilização do singularity em máquina local, será necessário instalar a aplicação na máquina. A forma mais fácil de se fazer isso, é por meio do Anaconda. Independente do sistema operacional (i.e., Linux, Windows ou Mac OS), instale o Anaconda (uma distribuição do Python focada para o uso científico - veja instruções em Guia de Desenvolvimento em Python). Com o Anaconda instalado na máquina, crie um ambiente separado e instale o pacote do Singularity:
$ conda create -n SINGULARITY
Obs.: Pode-se escolher qualquer outro nome além de "SINGULARITY". A caixa alta não é um requerimento, sendo possível escolher "Singularity" ou "singularity".
Ative o ambiente recém criado e instale o pacote singularity pelo conda:
$ conda activate SINGULARITY $ conda install -c conda-forge singularity
Caso o usuário queira utilizar o singularity em outra máquina que não tenha acesso à internet, é possível compartilhar o ambiente Anaconda criado e levá-lo para a outra máquina. Caso seja necessário fazer isso, instale o pacote conda-pack e proceda da seguinte maneira:
$ conda install -c conda-forge conda-pack $ conda pack -n SINGULARITY
No home da máquina do usuário, será criado o pacote SINGULARITY.tar.gz, que poderá ser copiado para a máquina de interesse. Para isso, basta fazer um scp do pacote para a máquina remota:
$ scp SINGULARITY.tar.gz usuario@maquina.remota:/algum/lugar/na/maquina/remota
Para utilizar o ambiente do Anaconda com o singularity na máquina remota, é necessário realizar os seguintes procedimentos:
- Login na máquina remota:
$ ssh usuario@maquina.remota -XC
- Desempacotar o arquivo SINGULARITY.tar.gz em local adequado:
$ cd /algum/lugar/na/maquina/remota $ mkdir SINGULARITY $ tar -zxvf SINGULARITY.tar.gz -C SINGULARITY/
- Executar os comandos para ativar o ambiente do Anaconda e ajustar os caminhos:
$ cd SINGULARITY/bin/ $ source ./activate $ conda-unpack
Neste ponto, pode-se utilizar o singularity. Ressalta-se, entretanto, que o singularity pode não funcionar em máquinas muito antigas (eg., Tupã).
Para desabilitar o ambiente do Anaconda, utilize o comando:
$ conda ./deactivate
Com isso, o singularity já está pronto para uso, bastando ser necessária a obtenção de um container para o seu uso. Veja em Criação de Containeres do Singularity para mais informações sobre a criação de containeres personalizados.
Veja exemplos de uso de um container nas seções a seguir.
1.2 Uso nas máquinas XC50 e Itapemirim (Ilopolis, Colorado entre outras)¶
O uso do singularity nestas máquinas está disponibilizado seguindo a receita de criação do ambiente Anaconda na seção anterior, i.e., criou-se um ambiente do Anaconda em máquina local e este ambiente foi levado para estas máquinas.
Na máquina Itapemirim, um container do Ubuntu 18.04 com diversos programas de desenvolvimento instalados (e.g., diferentes versões do gfortran, gcc e g++, mpich e openmpi etc, além de programas como nco, cdo, grads, gnuplot e bibliotecas como hdf e netcdf), pode ser encontrado em /scripts/das/singularity/ubuntu_remix_latest.sif.
Na máquina XC50, o mesmo container encontra-se em /lustre_xc50/carlos_bastarz/singularity/ubuntu_remix_latest.sif.
Para ativar o ambiente Anaconda com o singularity na máquina Itapemirim, faça:
- Login na máquina Itapemirim:
$ ssh usuario@itapemirim.cptec.inpe.br -XC
- Ative o ambiente Anaconda:
$ source /scripts/das/conda/envs/SINGULARITY/bin/activate
Para fazer o mesmo na máquina XC50, faça:
- Login na máquina XC50:
$ ssh usuario@login-xc50.cptec.inpe.br -XC
- Login no host nid00004:
$ ssh -YCX nid00004
- Ative o ambiente Anaconda:
$ source /lustre_xc50/carlos_bastarz/.python/anaconda3/envs/SINGULARITY/bin/activate
Para abrir o prompt do container ubuntu_remix_latest.sif na máquina Itapemirim, faça:
$ export SINGULARITY_TMPDIR=/scripts/group/user/tmp $ export SINGULARITY_CACHEDIR=/scripts/group/user/cache $ singularity shell -e --env DISPLAY=$DISPLAY --bind /dados/group/user:/dados/group/user ubuntu_remix_latest.sif
Obs1.: O usuário deverá escolher dois diretórios /scripts/group/user/tmp e /scripts/group/user/cache para a extração da imagem do container. Na máquina Itapemirim, devido às características desta máquina, este procedimento leva em torno de 10 minutos.
Obs2.: A instrução --bind /dados/group/user:/dados/group/user permite que o disco /dados/group/user seja montado dentro do container. Dessa forma, os dados do NetApp (ou outro local) ficam expostos dentro do container para uso.
Obs3.: A instrução --env DISPLAY=$DISPLAY permite o redirecionamento do display do container para o display do host, i.e., permite que programas gráficos como o grads e o gnuplot possam ser utilizados.
Para abrir o prompt do container ubuntu_remix_latest.sif na máquina XC50, faça:
$ singularity shell -e --env DISPLAY=$DISPLAY --bind /lustre_xc50/user:/lustre_xc50/user ubuntu_remix_latest.sif
Obs.: Note que na máquina XC50, não são necessários as variáveis SINGULARITY_TMPDIR e SINGULARITY_CACHEDIR
Diferentemente da máquina Itapemirim, a máquina XC50 possui um agendador de jobs como o PBS. Com isso, há alguns casos de uso que podem ser considerados:
- Criando um job iterativo para uso do container (pode não funcionar bem):
$ qsub -I -q pesq -l walltime=01:00:00 -l nodes=3:ppn=40 -N SINGULARITY -- /lustre_xc50/carlos_bastarz/.python/anaconda3/envs/SINGULARITY/bin/singularity shell --bind /lustre_xc50/carlos_bastarz:/worktmp /lustre_xc50/carlos_bastarz/singularity/ubuntu_remix_latest.sif
Obs.: /worktmp será um ponto de montagem criado automagicamente dentro do container. Com isso, será aberto um prompt do singularity. Basta alterar o diretório corrente para /worktmp e o lustre estará montado. Uma possibilidade é usar o ponto de montagem /lustre_xc50/username. Dessa forma, evita-se a necessidade de se modificar scripts, programas, Makefiles etc. - Executando um script de dentro do container a partir de um job iterativo:
$ qsub -I -q pesq -l walltime=01:00:00 -l nodes=2:ppn=40 -N SINGULARITY -- /lustre_xc50/carlos_bastarz/.python/anaconda3/envs/SINGULARITY/bin/singularity exec --bind /lustre_xc50/carlos_bastarz:/lustre_xc50/carlos_bastarz/lustre_xc50/carlos_bastarz/singularity/ubuntu_remix_latest-4.sif bash -c "/home/apps/NMC_Bkerror/scripts/cptecstats_master.sh"
- Utilizando um script de submissão:
- Exemplo de um script de submissão comum:#/bin/bash -x #PBS -o /lustre_xc50/user/arq.out #PBS -e /lustre_xc50/user/arq.err #PBS -l walltime=02:00:00 #PBS -l mppwidth=200 #PBS -l mppnppn=20 #PBS -V #PBS -S /bin/bash #PBS -N TEST #PBS -q pesq #PBS -j oe #PBS -A CPTEC ... export tmpdir=/lustre_xc50/user cd ${tmpdir} aprun -n 200 ${tmpdir}/stats.parm > ${tmpdir}/gsistats.out
- Exemplo de um script de submissão utilizando o ambiente do container:#/bin/bash -x #PBS -o /lustre_xc50/user/arq.out #PBS -e /lustre_xc50/user/arq.err #PBS -l walltime=02:00:00 #PBS -l mppwidth=200 #PBS -l mppnppn=20 #PBS -V #PBS -S /bin/bash #PBS -N TEST #PBS -q pesq #PBS -j oe #PBS -A CPTEC ... source /lustre_xc50/carlos_bastarz/.python/anaconda3/envs/SINGULARITY/bin/activate export tmpdir=/lustre_xc50/user cd ${tmpdir} aprun -n 200 singularity -d exec --bind /lustre_xc50/user:/lustre_xc50/user /lustre_xc50/carlos_bastarz/singularity/ubuntu_remix_latest.sif ${tmpdir}/stats.x < ${tmpdir}/stats.parm > ${tmpdir}/gsistats.out
No GitHub do Grupo de Desenvolvimento em Assimilação de Dados para o MONAN, há alguns containers que podem ser utilizados no ambiente de computação do CPTEC: https://github.com/GAD-DIMNT-CPTEC/Containers