uv: Alternativa Rápida a conda y venv

uv: Alternativa Rápida a conda y venv

Hasta ahora he estado controlando mis entornos con conda. Pero desde hace tiempo llevo leyendo mucho sobre poetry, pero sobre todo sobre uv. ¿Qué ventajas tiene uv? La velocidad. uv está implementado en Rust, por lo que gestiona los entornos e instala paquetes de una manera rapidísima.

En la siguiente tabla se muestra la diferencia de velocidad entre diferentes gestores de paquetes. Fuente: LLMs-from-scratch/setup/01_optional-python-setup-preferences/native-uv.md

Comando Velocidad
conda install <pkg> lento
pip install <pkg> entre 2 y 10 veces más rápido que el anterior
uv pip install <pkg> entre 5 y 10 veces más rápido que el anterior
uv add <pkg> entre 2 y 5 veces más rápido que el anterior

Viendo la tabla, merece bastante la pensa usar uv. Así que vamos a ver cómo crear un entorno e instalar paquetes con uv.

Descarga de repositoriolink image 1

Como he dicho, estoy usando LLMs-from-scratch/setup/01_optional-python-setup-preferences/native-uv.md como fuente, así que vamos a descargarnos el repositorio, instalar el entorno que propone y ver cómo ejecutar un script

Usamos --depth 1 para descargar solo el último commit del repositorio y que se clone más rápidamente, no nos interesa el historial.

	
< > Input
Python
git clone https://github.com/rasbt/LLMs-from-scratch.git --depth 1
Copied
>_ Output
			
Cloning into 'LLMs-from-scratch'...
remote: Enumerating objects: 260, done.
remote: Counting objects: 100% (260/260), done.
remote: Compressing objects: 100% (226/226), done.
remote: Total 260 (delta 61), reused 121 (delta 22), pack-reused 0 (from 0)
Receiving objects: 100% (260/260), 1.64 MiB | 6.94 MiB/s, done.
Resolving deltas: 100% (61/61), done.

Ahora nos vamos al repositorio que hemos descargado

	
< > Input
Python
cd LLMs-from-scratch
Copied

Instalar uvlink image 2

Si estamos en macOS o Linux, podemos instalar mediante el comando

curl -LsSf https://astral.sh/uv/install.sh | sh

Si estamos en Windows

curl -LsSf https://astral.sh/uv/install.sh | sh

Crear entornolink image 3

Si hacemos un ls podemos ver que hay un archivo llamado pyproject.toml, ese va a ser el archivo que uv usará para crear el entorno.

	
< > Input
Python
ls
Copied
>_ Output
			
2025-03-10-uv.ipynb appendix-D ch04 pyproject.toml
CITATION.cff appendix-E ch05 requirements.txt
LICENSE.txt ch01 ch06 setup
README.md ch02 ch07
appendix-A ch03 pixi.toml

Así que vamos a ver qué tiene el archivo

	
< > Input
Python
cat pyproject.toml
Copied
>_ Output
			
[project]
name = "llms-from-scratch"
version = "0.1.0"
description = "Implement a ChatGPT-like LLM in PyTorch from scratch, step by step"
readme = "README.md"
requires-python = "&gt;=3.10"
dependencies = [
"torch&gt;=2.3.0",
"jupyterlab&gt;=4.0",
"tiktoken&gt;=0.5.1",
"matplotlib&gt;=3.7.1",
"tensorflow&gt;=2.18.0",
"tqdm&gt;=4.66.1",
"numpy&gt;=1.26,&lt;2.1",
"pandas&gt;=2.2.1",
"pip&gt;=25.0.1",
]
[tool.setuptools.packages]
find = {}
[tool.uv.sources]
llms-from-scratch = { workspace = true }
[dependency-groups]
dev = [
"llms-from-scratch",
]
[tool.ruff]
line-length = 140
[tool.ruff.lint]
exclude = [".venv"]
# Ignored rules (W504 removed)
ignore = [
"C406", "E226", "E402", "E702", "E703",
"E722", "E731", "E741"
]

Como se puede ver, hay datos como el nombre, versión, etc, y las dependencias, que son los paquetes que vamos a instalar.

Para crear el entorno usamos el comando uv sync, además añadimos el flag --dev para instalar también las dependencias de desarrollo y el flag --python para especificar la versión de Python que queremos usar.

	
< > Input
Python
uv sync --dev --python 3.11
Copied
>_ Output
			
Using CPython 3.11.11
Creating virtual environment at: .venv
Resolved 160 packages in 175ms
Installed 139 packages in 1.46s
+ absl-py==2.1.0
+ anyio==4.8.0
+ appnope==0.1.4
+ argon2-cffi==23.1.0
+ argon2-cffi-bindings==21.2.0
+ arrow==1.3.0
+ asttokens==3.0.0
+ astunparse==1.6.3
+ async-lru==2.0.4
+ attrs==25.1.0
+ babel==2.17.0
+ beautifulsoup4==4.13.3
+ bleach==6.2.0
+ certifi==2025.1.31
+ cffi==1.17.1
+ charset-normalizer==3.4.1
...
+ tzdata==2025.1
+ uri-template==1.3.0
+ urllib3==2.3.0
+ wcwidth==0.2.13
+ webcolors==24.11.1
+ webencodings==0.5.1
+ websocket-client==1.8.0
+ werkzeug==3.1.3
+ wheel==0.45.1
+ wrapt==1.17.2

Nos ha creado el entorno y ha instalado los paquetes de una manera rápidísima

Además, si volvemos a hacer ls ahora veremos una nueva carpeta llamada .venv, esa es la carpeta del entorno virtual.

	
< > Input
Python
ls -a
Copied
>_ Output
			
. CITATION.cff ch02 pyproject.toml
.. LICENSE.txt ch03 requirements.txt
.git README.md ch04 setup
.github appendix-A ch05 uv.lock
.gitignore appendix-D ch06
.venv appendix-E ch07
2025-03-10-uv.ipynb ch01 pixi.toml

Añadir paqueteslink image 4

Si queremos añadir paquetes a nuestro entorno que no están en el archivo pyproject.toml, podemos hacerlo con el comando uv add <pkg>.

Por ejemplo, si hacemos cat pyproject.toml | grep dotenv veremos que no está instalado el paquete python-dotenv.

	
< > Input
Python
cat pyproject.toml | grep dotenv
Copied

De modo que añadimos el paquete

	
< > Input
Python
uv add dotenv
Copied
>_ Output
			
Resolved 162 packages in 92ms
Installed 2 packages in 5ms ░░░░░░░░░░░░░░░░░░░░ [0/0] Installing wheels...
+ dotenv==0.9.9
+ python-dotenv==1.0.1

Si ahora volvemos a hacer cat pyproject.toml | grep dotenv veremos que se ha añadido al archivo.

	
< > Input
Python
cat pyproject.toml | grep dotenv
Copied
>_ Output
			
"dotenv&gt;=0.9.9",

Esto es muy bueno, porque ahora con este nuevo archivo pyproject.toml podemos recrear el entorno con el comando uv sync en cualquier otro ordenador.

Ejecutar un scriptlink image 5

Ahora que ya tenemos un entorno podemos ejecutar un script de dos maneras, la primera con uv run python <script>.py, que activará el entorno de .venv y ejecutará el script.

	
< > Input
Python
uv run python setup/02_installing-python-libraries/python_environment_check.py
Copied
>_ Output
			
[OK] Your Python version is 3.11.11
[OK] torch 2.6.0
[OK] jupyterlab 4.3.5
[OK] tiktoken 0.9.0
[OK] matplotlib 3.10.1
[OK] tensorflow 2.18.0
[OK] tqdm 4.67.1
[OK] numpy 2.0.2
[OK] pandas 2.2.3
[OK] psutil 7.0.0

Sin embargo, si lo que queremos es ejecutar el script directamente con python <script>.py necesitamos activar el entorno primero a mano

	
< > Input
Python
source .venv/bin/activate && python setup/02_installing-python-libraries/python_environment_check.py
Copied
>_ Output
			
[OK] Your Python version is 3.11.11
[OK] torch 2.6.0
[OK] jupyterlab 4.3.5
[OK] tiktoken 0.9.0
[OK] matplotlib 3.10.1
[OK] tensorflow 2.18.0
[OK] tqdm 4.67.1
[OK] numpy 2.0.2
[OK] pandas 2.2.3
[OK] psutil 7.0.0

Preguntas frecuentes

¿Para qué sirven los flags --dev y --python en uv sync --dev --python 3.11?

El flag --python 3.11 le dice a uv sync con qué versión de Python crear el entorno virtual (en el ejemplo crea .venv con CPython 3.11.11), y --dev hace que además de las dependencias normales del pyproject.toml se instalen las del grupo [dependency-groups] dev = [...]. El comando resuelve e instala los paquetes muy rápido, en el ejemplo del post resolvió 160 paquetes en 175ms e instaló 139 en 1.46s.

¿Cómo añadir un paquete que no está en pyproject.toml con uv?

Se usa el comando uv add <paquete>, por ejemplo uv add dotenv, que resuelve e instala el paquete (y sus dependencias, como python-dotenv) directamente en el entorno .venv. Además, uv add añade automáticamente la entrada correspondiente (por ejemplo "dotenv>=0.9.9") a la sección de dependencias del pyproject.toml, de forma que ese entorno se puede recrear en otra máquina simplemente con uv sync.

Seguir leyendo

Últimos posts -->

¿Has visto estos proyectos?

Gymnasia

Gymnasia Gymnasia
Expo
React Native
TypeScript
OpenAI
Anthropic

App de fitness con dos agentes que se ejecutan íntegramente en el dispositivo, sin backend, de forma que los datos del usuario nunca salen del móvil. Un coach conversacional BYOK con adaptadores para OpenAI, Anthropic y Google, 12 tools locales y system prompt remoto con fallback offline, y un subagente de visión que estima macronutrientes a partir de fotos de comida, con lectura de códigos de barras contra OpenFoodFacts.

LangGraph Deep Researcher

LangGraph Deep Researcher LangGraph Deep Researcher
Python
LangGraph
FastAPI
React
TypeScript
Docker

Sistema multiagente de investigación construido con LangGraph. Un supervisor descompone tu pregunta en temas y lanza subagentes de búsqueda en paralelo; cada uno comprime sus hallazgos antes de pasarlos a un agente redactor que escribe el informe final en markdown con sus fuentes. Streaming en vivo por WebSockets, modelo configurable por rol y claves de API propias que nunca se guardan en el servidor.

Tau

Tau Tau
Python
LangChain

Sistema multiagente de tutoría para estudiantes de secundaria, con un agente por asignatura y material de curso elaborado y validado por un equipo de profesores. Llegó a usarse con alumnos reales en un colegio privado en España y en un instituto en Colombia.

Ver todos los proyectos -->
>_ Disponible para proyectos

¿Tienes un proyecto con IA?

Hablemos.

maximofn@gmail.com

Especialista en Machine Learning e Inteligencia Artificial. Desarrollo soluciones con IA generativa, agentes inteligentes y modelos personalizados.

¿Quieres ver alguna charla?

Últimas charlas -->

¿Quieres mejorar con estos tips?

Últimos tips -->

Usa esto en local

Los espacios de Hugging Face nos permite ejecutar modelos con demos muy sencillas, pero ¿qué pasa si la demo se rompe? O si el usuario la elimina? Por ello he creado contenedores docker con algunos espacios interesantes, para poder usarlos de manera local, pase lo que pase. De hecho, es posible que si pinchas en alún botón de ver proyecto te lleve a un espacio que no funciona.

Flow edit

Flow edit Flow edit

Edita imágenes con este modelo de Flow. Basándose en SD3 o FLUX puedes editar cualquier imagen y generar nuevas

FLUX.1-RealismLora

FLUX.1-RealismLora FLUX.1-RealismLora
Ver todos los contenedores -->
>_ Disponible para proyectos

¿Tienes un proyecto con IA?

Hablemos.

maximofn@gmail.com

Especialista en Machine Learning e Inteligencia Artificial. Desarrollo soluciones con IA generativa, agentes inteligentes y modelos personalizados.

¿Quieres entrenar tu modelo con estos datasets?

short-jokes-dataset

HuggingFace

Dataset de chistes en inglés

Uso: Fine-tuning de modelos de generación de texto humorístico

231K filas 2 columnas 45 MB
Ver en HuggingFace →

opus100

HuggingFace

Dataset con traducciones de inglés a español

Uso: Entrenamiento de modelos de traducción inglés-español

1M filas 2 columnas 210 MB
Ver en HuggingFace →

netflix_titles

HuggingFace

Dataset con películas y series de Netflix

Uso: Análisis de catálogo de Netflix y sistemas de recomendación

8.8K filas 12 columnas 3.5 MB
Ver en HuggingFace →
Ver más datasets -->