Volver a la lista

Si esperaste 30 minutos a que el solucionador de Conda terminara, lee este artículo: cómo Pixi, uv y Mamba están cambiando la gestión práctica del entorno.

¿Por qué el solucionador de Conda se detiene durante 30 minutos? ¿Cómo lograron Mamba, Pixi y uv reducir este tiempo a unos pocos segundos? Veamos también un ejemplo práctico de Pixi.toml que incluye bwa, samtools y scanpy en un solo archivo.

Intermedio
|
18min
|
Verificado (2026-07-19)
PixiuvMambaBiocondareproducibility
Progreso0/120 (0%)

Este episodio no se enseña en la universidad

Es el punto que llamamos "la brecha entre la academia y la industria" en las perspectivas integradas de BioPlayground. No existe un curso regular titulado "Parte 3: Herramientas de gestión ambiental" en el MIT, Harvard ni Stanford. ¿Por qué? Porque no se trata de algoritmos, ni de estadística, ni de biología. Sin embargo, la mitad del día de un profesional de la informática se decide aquí.

Cuando Conda tarda 30 minutos en ejecutar el solucionador para instalar una sola biblioteca nueva, no puedes escribir ningún código. Escribes en Slack: "Estoy instalando, llegaré 5 minutos tarde a la reunión". En este episodio, hagamos que esos 30 minutos duren 30 segundos. Se trata del problema de "cuántas tazas de café".

Es un episodio, pero no es un artículo académico. Es un episodio para poner manos a la obra e instalarlo ahora mismo en tu portátil.

¿Por qué Conda es tan lento?

El solucionador de Conda busca una combinación completa que satisfaga las restricciones de dependencias que exige cada paquete. Esto es un problema similar al bien conocido problema de SAT (Satisfacibilidad) en informática. Solo el canal Bioconda tiene más de 8.000 paquetes, cada uno con entre 3 y 10 versiones, y cada versión tiene múltiples restricciones de compatibilidad con versiones de Python, versiones de CUDA y sistemas operativos. El espacio de combinaciones explota exponencialmente.

El solucionador original de Conda está escrito en Python y recorre secuencialmente este espacio de combinaciones. Cuando se encuentra con una situación común de "dependencia circular" en Bioconda, el retroceso (backtracking) se dispara. Esta es la causa principal de las esperas de 30 minutos.

Árbol genealógico evolutivo: la llegada de Rust

2020: Mamba (QuantStack) — Mantiene el algoritmo del solucionador de Conda, pero lo reimplementa en C++. Es 10 veces más rápido. Pero la base sigue siendo Conda.

2022: micromamba — Convierte Mamba en un único archivo ejecutable. Se vuelve más fácil incluirlo en imágenes de Docker. Es el primer paso hacia la reproducibilidad de la infraestructura.

2023: Pixi (prefix.dev) — Una filosofía completamente diferente. Integra los canales de Conda y PyPI. Reescrito desde cero en Rust. Contiene todo en el archivo pixi.toml del proyecto y utiliza caché local. Ha trasladado la experiencia de Cargo (Rust), npm (Node) y Poetry (Python) al ámbito de la bioinformática.

2024: uv (Astral) — Específico para Python, pero extremadamente rápido. De 10 a 100 veces más rápido que pip. Escrito en Rust. Pixi utiliza uv internamente para gestionar la parte de Python.

Tres principios clave:

  1. Descarga asíncrona y paralela en Rust — Descarga simultáneamente decenas de archivos tar.
  2. Caché de enlaces duros: reutiliza los paquetes ya descargados. Al crear un nuevo proyecto, no se realizan copias en el disco.
  3. Archivo de bloqueo determinista: guarda la combinación exacta de versiones en un archivo. Seis meses después, otro miembro del equipo o el sistema CI pueden reproducir exactamente el mismo entorno.

Pixi.toml: el entorno del pipeline en un solo archivo

Ahora, pongámoslo en práctica. Abra SageMaker Studio Lab. Puede registrarse sin necesidad de tarjeta de crédito (consulte la sección 2-4 de las perspectivas integradas de v3).

Paso 1: Instalación de Pixi

bash
# macOS y Linux comunes
curl -fsSL https://pixi.sh/install.sh | bash
# Después de reiniciar el shell
pixi --version

Windows es iwr -useb https://pixi.sh/install.ps1 | iex.

Paso 2: Inicialización del proyecto de la canalización

Creemos un proyecto de demostración para los ejercicios de BPD. Utilizaremos Salmon para el alineamiento por similitud y Scanpy para el postprocesamiento de células individuales; ambas herramientas deben ejecutarse en el mismo entorno.

bash
mkdir bpd-pipeline
cd bpd-pipeline
pixi init

Se crea el pixi.toml inicial. Modifíquelo según sus necesidades.

toml
[project]
name        = "bpd-pipeline"
version     = "2026.1.0"
description = "Entorno del pipeline FASTQ to Paper para práctica S17~S21"
channels    = ["conda-forge", "bioconda"]
platforms   = ["linux-64", "osx-arm64"]

[dependencies]
# Herramientas de Linux
python   = ">=3.11"
samtools = ">=1.19"
salmon   = ">=1.10"
bwa      = ">=0.7.17"
star     = ">=2.7.11"

# Herramientas de datos Python
numpy    = ">=1.26"
pandas   = ">=2.2"
scanpy   = ">=1.10"

[pypi-dependencies]
# Cosas no disponibles en Bioconda o solo más recientes en PyPI
anndata  = ">=0.10"
scvi-tools = ">=1.1"

[tasks]
run-salmon = "salmon quant -i index -1 R1.fq -2 R2.fq -o out"
run-qc     = "python scripts/qc.py"

Paso 3: Instalación

bash
pixi install

La primera ejecución tarda entre 10 y 30 segundos. Si se realiza con Conda, el mismo proceso puede tardar entre 5 y 15 minutos. Esto representa una diferencia de más de 100 veces para lograr exactamente el mismo resultado.

Paso 4: Ejecución

bash
# Ejecutar tareas del pipeline (activación automática del entorno)
pixi run run-qc
# Entrar al shell interactivo
pixi shell

pixi run activa automáticamente el entorno. Se evitan los errores causados por olvidar o no configurar correctamente conda activate. Si existen los archivos pixi.toml y pixi.lock en el directorio raíz del proyecto, se utilizará ese entorno.

Paso 5: Compartir con el equipo

bash
# En la computadora personal de un compañero de equipo
git clone <repo>
cd bpd-pipeline
pixi install # Lee pixi.lock y reconstruye exactamente el mismo entorno

pixi.lock registra la versión, el hash y el canal exactos, lo que permite obtener el mismo entorno incluso un año después. La reproducibilidad de los artículos se garantiza a nivel de entorno, y no solo a nivel de código.

uv: velocidad extrema para proyectos exclusivamente en Python

A diferencia de Pixi, que integra canales de Conda (incluidas herramientas para Linux), uv está diseñado exclusivamente para proyectos de Python puro. Sin embargo, es entre 10 y 100 veces más rápido que pip.

bash
# Instalar uv
curl -LsSf https://astral.sh/uv/install.sh | sh
# Inicializar proyecto
uv init my-analysis
cd my-analysis
uv add scanpy anndata numpy pandas
uv run python -c "import scanpy; print(scanpy.__version__)"

uv add se completa en cuestión de segundos. Dado que uv gestiona la parte de Python dentro de Pixi, en realidad ya se estaba utilizando uv indirectamente en el ejemplo anterior.

Cuándo usar Pixi vs. uv:

  • Se necesitan herramientas de línea de comandos de Linux de Bioconda (bwa, samtools, etc.) → Pixi
  • Proyecto puramente en Python, que se puede resolver solo con PyPI → uv
  • Es esencial la reproducibilidad determinista en equipos y CI → Ambos generan archivos de bloqueo automáticamente

¿Sigue siendo válido Mamba?

Mamba (especialmente micromamba) sigue siendo válido en los siguientes casos:

  • Mantenimiento de proyectos Conda existentes: mamba install reemplaza directamente a Conda.
  • Inclusión de un único ejecutable dentro de una imagen Docker: micromamba por sí solo simula todo el entorno de Conda.
  • Necesidad de canales de Conda en CI/CD: Mamba sigue siendo la opción estándar.

Si se inicia un nuevo proyecto, Pixi es la prioridad. Para proyectos existentes, migrar a Mamba. Si es Python puro, usar uv.

Mapeo de conceptos informáticos

  • Solucionador SAT: El problema de satisfacción de restricciones de dependencias es un tipo de problema SAT. Pixi adopta el solucionador SAT en Rust llamado resolvo.
  • Grafo de dependencias · Ordenamiento topológico: Si el paquete A requiere B, y B requiere C → DAG (grafo acíclico dirigido). Se produce un error si hay dependencias circulares.
  • Caché mediante enlaces duros: Compartición de inodos en el sistema de archivos Linux. Al crear un nuevo proyecto, se utiliza una referencia en lugar de una copia real de los datos.
  • Archivo de bloqueo determinista: Similar a las funciones puras en la programación funcional. Si la entrada (.toml) es igual, la salida (.lock) también lo será.

Errores comunes

  • Ejecutar pip install dentro del proyecto Pixi — El archivo de bloqueo no se actualiza. Se rompe la reproducibilidad. Es obligatorio usar pixi add.
  • Incluir pixi.lock en .gitignore — Absolutamente prohibido. El archivo de bloqueo debe incluirse en el repositorio (commit). La carpeta .pixi/ debe estar en el archivo .gitignore.
  • Inversión del orden de prioridad del canal Bioconda — El orden en channels define la prioridad. El estándar es Bioconda primero y Conda-Forge después.
  • No generación de archivos de bloqueo por plataforma — Si solo existe platforms = ["linux-64"], fallará pixi install en macOS. Especificar todas las plataformas necesarias.
  • Desajuste de GLIBC dentro del contenedor — Pixi en sí no tiene problemas, pero en imágenes base Docker muy antiguas (por ejemplo, CentOS 7) pueden surgir problemas de versión de GLIBC. Se recomienda Ubuntu 22.04 o superior.

Próximo capítulo: bifurcación hacia el siguiente tema

  • F27~F28: Snakemake · Nextflow DSL2 — Orquestación de flujos de trabajo. Un grafo de ejecución que se integra con la gestión del entorno.
  • F29: Recorrido por los flujos de trabajo estándar de nf-core. rnaseq, sarek, scrnaseq y otros, todos validados para uso comercial.
  • F30: Docker · Apptainer/Singularity — Aislamiento que va más allá del entorno, hasta el nivel del kernel. Esencial en entornos de computación de alto rendimiento (HPC).
  • F31: HPC · Slurm — Ejecución masiva en paralelo. Recursos disponibles bajo demanda en la nube.

Para profundizar más

Este capítulo no incluye un curso universitario formal. Los materiales de referencia son la documentación oficial de las herramientas.

  • pixi.sh — Documentación oficial de Pixi. El tutorial está bien redactado.
  • docs.astral.sh/uv — Documentación oficial de uv.
  • mamba.readthedocs.io — Mamba/micromamba.
  • bioconda.github.io — Convenciones del canal Bioconda · Métodos para registrar paquetes.
  • EMBL-EBI TrainingNextflow and Containers for Scalable Workflows (42 minutos, con subtítulos completos). Sirve como puente hacia el siguiente capítulo, F28.
  • Broad InstituteHow to Run GATK4 in a Docker Container (40 minutos, con subtítulos completos). Preparación práctica para F30.
  • Blog de referencia: Joseph Guhlin's Pixi/uv: Bioinformatics Powerhouse (2024). Relato de experiencia de migración desde la perspectiva de un profesional. Permite comprender por qué el ecosistema Rust ha comenzado a integrarse con la bioinformática.

Una vez superado el período de espera de 30 minutos, avancemos desde F27 hacia el mundo real de la orquestación de flujos de trabajo. pixi.toml resume los resultados de este capítulo. Si comparte esto con su equipo, se resolverá a medias el problema de reproducibilidad del equipo.

💬 Preguntas y comentarios

0 comentarios

Puedes publicar sin iniciar sesión. Los comentarios de invitados no pueden editarse ni eliminarse después.

0/2000

Cargando...