Contenedor a partir de un archivo de definición (.def)

⚙️ Crear un contenedor .sif con soporte GPU usando un archivo .def

📄 Archivo de definición: mrbayes_gpu.def

Este archivo contiene instrucciones para:

  • Instalar herramientas básicas de desarrollo (g++, cmake, make, etc.).

  • Descargar e instalar la biblioteca BEAGLE desde su repositorio oficial.

  • Compilar MrBayes desde su rama develop con soporte para MPI y BEAGLE.

  • Configurar variables de entorno para garantizar compatibilidad y desempeño.

  • Incluir gpustat (opcional) para monitorear uso de GPU dentro del contenedor.

🧱 Estructura y explicación de mrbayes_gpu.def

# === Apptainer definition file para MrBayes + BEAGLE + GPU ===

# Indica que se usará una imagen de Docker como base
Bootstrap: docker
# Imagen base: Ubuntu 22.04 con CUDA 12.2 (soporte GPU)
From: nvidia/cuda:12.2.0-devel-ubuntu22.04

# === Variables de entorno persistentes dentro del contenedor ===
%environment
    # Configuración regional básica
    export LANG=C.UTF-8
    export LC_ALL=C.UTF-8

    # Asegura que se encuentren las bibliotecas instaladas en /usr/local/lib
    export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
    export PKG_CONFIG_PATH=/usr/lib/pkgconfig:$PKG_CONFIG_PATH

# === Instrucciones para construir el contenedor ===
%post
    # Evita prompts interactivos al instalar paquetes
    export DEBIAN_FRONTEND=noninteractive

    # Actualiza paquetes e instala herramientas de compilación y utilidades básicas
    apt update && apt install -y \
        g++ \
        git \
        make \
        cmake \
        automake \
        wget \
        nano \
        libopenmpi-dev \
        python3 \
        python3-pip \
        curl

    # (Opcional) Instala gpustat para monitorear la GPU dentro del contenedor
    pip3 install gpustat

    # === Instalación de la biblioteca BEAGLE ===
    cd /
    # Clona el repositorio oficial de BEAGLE (última versión)
    git clone --depth=1 https://github.com/beagle-dev/beagle-lib.git
    cd beagle-lib
    mkdir build
    cd build

    # Compila BEAGLE sin soporte JNI ni OpenCL (solo GPU vía CUDA)
    cmake -DBUILD_JNI=OFF -DBUILD_OPENCL=OFF ..
    make
    make install

    # Asegura que las rutas a BEAGLE estén disponibles
    export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
    export PKG_CONFIG_PATH=/usr/lib/pkgconfig:$PKG_CONFIG_PATH

    # === Instalación de MrBayes desde la rama 'develop' ===
    cd /
    # Clona la rama de desarrollo (última versión activa)
    git clone --depth=1 --branch=develop https://github.com/NBISweden/MrBayes.git
    cd MrBayes

    # Configura MrBayes con soporte para MPI y BEAGLE
    ./configure --with-mpi --with-beagle=/usr/local

    # Compila e instala MrBayes
    make
    make install

# === Comando por defecto al ejecutar el contenedor con 'run' ===
%runscript
    echo "Contenedor MrBayes con BEAGLE y GPU listo"
    # Ejecuta cualquier comando que se pase al contenedor
    exec "$@"

🔹 From: — Imagen base

From: nvidia/cuda:12.2.0-devel-ubuntu22.04

Indica la imagen base de Docker sobre la que se construirá el contenedor. En este caso:

  • Ubuntu 22.04 como sistema operativo

  • CUDA 12.2 preinstalado, necesario para usar aceleración por GPU.

🔹 %environment — Variables de entorno persistentes

%environment export LANG=C.UTF-8 export LC_ALL=C.UTF-8 export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH export PKG_CONFIG_PATH=/usr/lib/pkgconfig:$PKG_CONFIG_PATH

  • Esta sección define variables de entorno que estarán disponibles cada vez que el contenedor se ejecute (shell, exec, run, etc.).

  • Es útil para asegurarte de que programas como MrBayes encuentren las librerías necesarias sin que el usuario tenga que configurar nada.

¿Qué hacen esas variables?

  • LANG y LC_ALL: Configuran la codificación del sistema (evita errores de caracteres).

  • LD_LIBRARY_PATH: Le dice al sistema dónde buscar bibliotecas compartidas al ejecutar programas.

  • PKG_CONFIG_PATH: Indica dónde buscar archivos .pc que describen cómo compilar y vincular bibliotecas.

🔹 %post — Instrucciones para construir el contenedor

%post

  • Esta sección se ejecuta durante la construcción del contenedor (build).

  • Aquí se instalan paquetes, descargan programas, compilan y configuran los entornos de ejecución.

Secciones destacadas dentro de %post:

  1. Prevenir prompts interactivos:

    export DEBIAN_FRONTEND=noninteractive

    Así apt no pedirá confirmaciones durante la instalación.

  2. Instalar dependencias:

    apt update && apt install -y ...

    Se instalan herramientas de compilación, Python, MPI, etc.

  3. Instalar software adicional:

    • gpustat: Monitorea el uso de GPU (opcional).

    • BEAGLE: Librería para acelerar análisis filogenéticos.

    • MrBayes: Se descarga, configura y compila con soporte para MPI y BEAGLE.

  4. Ajustes adicionales al entorno:
    Se vuelven a declarar variables como LD_LIBRARY_PATH para asegurar que las rutas estén accesibles durante compilación.

🔹 %runscript — Comando por defecto

%runscript echo "Contenedor MrBayes con BEAGLE y GPU listo" exec "$@"

  • Esta sección define qué pasará si alguien usa apptainer run archivo.sif.

  • Aquí se imprime un mensaje y luego se ejecuta cualquier comando pasado al contenedor (exec "$@").

Si no incluyeras esta sección, el contenedor no sabría qué hacer por defecto al ser ejecutado con run.

🔧 Transformar un archivo .def en un contenedor .sif

Una vez que tienes tu archivo de definición completo (por ejemplo: mrbayes_gpu.def), puedes construir un contenedor ejecutable en formato .sif (Singularity Image Format) con el siguiente comando:

apptainer build mrbayes_gpu.sif mrbayes_gpu.def

🧾 Desglose del comando:

  • apptainer build: Es el comando para construir imágenes.

  • mrbayes_gpu.sif: Este será el archivo final, un contenedor listo para ejecutar.

  • mrbayes_gpu.def: Es tu archivo de definición, que contiene todas las instrucciones para crear el contenedor.

✅ ¿Qué pasa durante la construcción?

  1. Descarga la imagen base (nvidia/cuda:12.2.0-devel-ubuntu22.04) desde DockerHub.

  2. Ejecuta la sección %post dentro de un entorno aislado.

  3. Aplica las variables de %environment que estarán disponibles cada vez que uses el contenedor.

  4. Incorpora %runscript como comando por defecto cuando lo ejecutes con run.

🚀 Ejemplo de uso del contenedor ya compilado

Una vez que has generado el archivo .sif (por ejemplo, mrbayes_gpu.sif), ya puedes ejecutar MrBayes directamente desde el contenedor con acceso a GPU y múltiples núcleos.

▶️ Ejecución simple

Si tu archivo de análisis se encuentra en la carpeta datos/ de tu sistema y se llama cactus.nex, puedes ejecutar MrBayes así:

apptainer exec --nv --bind datos:/home mrbayes_gpu.sif mb -i /home/cactus.nex 

Explicación:

  • --nv: Habilita el acceso a la GPU dentro del contenedor.

  • --bind datos:/home: Monta la carpeta datos de tu máquina anfitriona en /home dentro del contenedor.

  • mb -i: Ejecuta MrBayes sobre el archivo .nex.

🧱 Ejecutar en segundo plano con tmux (recomendado)

Para mantener el análisis corriendo aunque cierres la terminal, usa tmux:

  1. Abre una nueva sesión:

tmux new -s mrbayes

  1. Dentro de la sesión, ejecuta:

apptainer exec --nv -B datos:/home mrbayes_gpu.sif mb -i /home/cactus.nex > cactus.log 2>&1

  1. Para salir de tmux sin detener el análisis:

Presiona: Ctrl + b seguido de d

  1. Para volver a tu sesión más tarde:

tmux attach -t mrbayes

  1. Para ver si el análisis sigue corriendo:

tail -f cactus.log

  1. Si necesitas cerrar el proceso manualmente:

Primero encuentra el PID:

ps aux | grep mb

Luego termina el proceso:

kill PID

🧰 ¿Qué es tmux y cómo funciona?

tmux (Terminal MUltipleXer) es una herramienta que te permite crear sesiones de terminal persistentes, muy útil cuando estás trabajando en servidores o corriendo procesos largos como análisis con MrBayes.

Con tmux puedes:

  • Ejecutar comandos largos sin preocuparte por perder la conexión.

  • Desconectarte y dejar procesos corriendo.

  • Volver más tarde y recuperar tu sesión justo donde la dejaste.

  • Dividir la terminal en paneles y trabajar con múltiples ventanas en una sola sesión.

🔄 Flujo típico de uso

  1. Iniciar una sesión nueva

tmux new -s mrbayes

🔹 Crea una sesión llamada mrbayes.

  1. Ejecutar tu análisis dentro de la sesión

apptainer exec --nv -B datos:/home mrbayes_gpu.sif mb -i /home/cactus.nex > cactus.log 2>&1

  1. Desconectarte sin detener el análisis

Ctrl + b luego suelta y presiona d

Esto “desconecta” la sesión (detach) pero no detiene el proceso.

  1. Volver a la sesión después

tmux attach -t mrbayes

  1. Cerrar la sesión si ya no la necesitas

Desde dentro:

exit

tmux kill-session -t mrbayes

💡 Tip: Ver sesiones activas

tmux ls

Esto muestra todas las sesiones que están en ejecución.