Tu propio Laboratorio de IA Vistas: 1

Durante estos últimos meses no paro de escuchar a Carlos Castillo, a Relfon, a Javier o incluso a mi archi enemigo Rafa hablar sobre IA o rebuznos como les llama mi Némesis. Llevo ya semanas queriendo enfocarme en esto, pero todavía estaba peleándome con Podman, como para enfrentarme a un nuevo reto. Pero por fin llegó el momento, desde hoy mismo, y durante los próximos cuatro meses este podcast, va a pivotar ligeramente, para centrarse en el mundo de la IA, pero con la intención de hacerlo eminentemente práctico, y exprimirlo hasta límites insospechados. En este sentido, tengo que confesarte que el detonante de esto, y, probablemente el culpable, es de nuevo Alejandro de Slimbook, que hace una semana me invitó o empujó a impartir un taller en Linux Center y que se impartirá el próximo 25 de abril.

0:00 / 0:00

Tu propio Laboratorio de IA

Una introducción y la filosofía de los próximos episodios

Mi objetivo es que hacer un de 0 a 100, pero de verdad. No como los típicos tutoriales de YouTube que titulados de 0 a 100 en una hora. Por otro lado, no se trata de prompting, aunque algo podría aparecer por aquí, sino mas bien se trata de ir mas allá. Montar tu propio laboratorio de IA, con tus propios modelos, con tus propios datos, con tu propia infraestructura, y con tu propia soberanía digital. En este sentido, el objetivo es que al finalizar esta serie de episodios, tengas tu propio laboratorio de IA, y sepas como utilizarlo para tus proyectos personales o profesionales.

No solo se trata de utilizar Ollama, o cualquier otro servicio posible, también se trata de exprimir RAG y la inteligencia con nuestros datos, y también de utilizar Skills, Agentes y MCP para que la IA ejecute tareas por nosotros. Y por último, también se trata de escalar esto a la nube, a producción, y de utilizar Rust para exprimir al máximo el rendimiento de nuestros modelos.

Como te digo, el objetivo es hacerlo en aproximadamente unos cuatro meses, empezando hoy mismo, de forma que durante este primer mes montemos el laboratorio, el siguiente mes abordemos RAG, en el tercer mes entremos en la ejecución de tareas mediante skills, agentes y mcp y el último mes abordemos el modelo híbrido en busca de la escalabilidad, seguridad y rendimiento.

Esto que te acabo de explicar, es mas bien, una idea, y aunque, ya tengo estructurados los próximos 32 episodios, lo cierto es que es masa que probable que vayan variando con el paso del tiempo. Algo muy similar a lo que me pasó con los episodios de Podman. Si bien, en este caso, no voy a hacer como con Podman. En este caso, van a ser cuatro meses enfocados en esto. Y esto es así, porque como verás se entremezcla todo.

Soberanía Digital

Los primeros episodios, los vamos a dedicar a correr la IA en Local. Y esto es así, por una razón muy clara, la Soberanía Digital. Tu tienes el control y el poder. Lo cierto es que hay tres razones fundamentales para correr la IA en local,

  • Privacidad. Tus datos no salen de tu máquina, y no tienes que preocuparte por lo que hacen con ellos las grandes empresas.
  • Costo. Correr modelos en la nube puede ser caro, especialmente si los usas con frecuencia. En local, solo pagas por la electricidad y el hardware que ya tienes.
  • Latencia. Correr modelos en local puede ser mucho más rápido que hacerlo a través de una API, especialmente si tienes una buena GPU. Probablemente este sea el mayor de los problemas, y por esta razón, en algunas ocasiones es interesante ir a un modelo híbrido, dependiendo de la tarea que quieras realizar.

Vamos a lo Juan Palomo

En ocasiones pienso que para cursos o talleres, es realmente interesante implementar scripts que realicen todo el despliegue y podamos ponernos manos a la obra rápidamente. Pero en este caso, vamos a cocinas a fuego lento. No voy a darte todo el trabajo hecho, bueno realmente si. Lo que quiero decir, es que me puedes acompañar en todo el desarollo de lo que vayamos haciendo, y como lo vamos utilizando.

Esto no quiere decir, que por tu lado, no descargues el repositorio de GitHub y lo instales en un momento. No se trata de esto. Tu puedes hacer lo que consideres, faltaba mas, pero te invito a que me acompañes en este camino.

El Stack Técnico

Podman vs Docker

Después de haberte dado la paliza en los meses anteriores hablándote de Podman semana si, semana también, no podía ser de otra forma que el stack técnico de este laboratorio de IA, se base en Podman. Y esto es así, porque Podman es la mejor opción para correr modelos de IA en local, por varias razones, que ya te he ido contando en los episodios anteriores, pero que ahora te resumo,

  • Filosofía Daemonless. Podman no requiere de un demonio centralizado, lo que mejora la seguridad y la estabilidad.
  • Seguridad Rootless. Podman puede ser ejecutado sin privilegios de root, lo que reduce el riesgo de vulnerabilidades. Y teniendo en cuenta que utilizaremos agentes que correran comandos de sistema, esto es algo fundamental.

Los Quadlets

Por otro lado lo vamos a hacer todo con Quadlets, lo que nos va a permitir integrar nuestros contenedores de IA con Systemd, y hacer que sean ciudadanos de primera clase en nuestro sistema operativo. Esto tiene algunas ventajas como te he contado en algunos de los episodios anteriores, como por ejemplo, el arranque automático de nuestros servicios de IA, la gestión de recursos y la monitorización integrada con Systemd.

Fish y herramientas modernas

De nuevo, utilizaremos fish como shell por defecto, así como algunas del stack de herramientas que he ido incorporando en estos últimos meses, como por ejemplo, starship para la personalización del prompt, fzf para la búsqueda rápida de archivos y comandos, o bat para la visualización de archivos con resaltado de sintaxis. Estas herramientas nos ayudarán a ser más productivos y a tener una experiencia de terminal más agradable.

Pero no solo esto, en este episodio te traigo, también herramienta de desarrollo propio que te va a permitir gestionar los quadlets de forma sencilla. Y esta no será la única herramienta que implementemos. Con el paso de los episodios, iremos implementando herramientas en Rust para gestionar nuestros modelos, para procesar nuestros datos, para monitorizar nuestros servicios, y para integrar todo esto con nuestras aplicaciones favoritas como Neovim o Obsidian.

Hay que aprovechar al máximo todo ese conocimiento que tenemos en archivos markdown para meterlos en un RAG y conseguir de esta forma tener nuestro propio cerrebro con toda la información que hemos ido acumulando a lo largo de los años.

Preparación del sistema

Estructura de directorios

Todo lo que voy a comentar en este y en los siguientes episodios se encuentra en un repositorio de GitHub como es habitual, Podman. Como ves el nombre del repositorio es un poco genérico, en tanto en cuanto se refiere a Podman. Esto es así, porque ahí voy a ir añadiendo distintos quadlets organizados para utilizarlos con todo tipo de propósito. En concreto estos son para IA, pero posteriormente subiré los de Jellyfin, y mas…

Este repo, te lo puedes descargar donde quieras, porque la realidad es que el funcionamiento será mediante enlaces simbólicos. Este es mi planteamiento, pero tu puedes hacerlo como quieras, por supuesto.

En este sentido, los quadlets estarán en un directorio del repositorio, y crearé los enlaces simbólicos en ~/.config/containers/systemd. Y todo ello con una sencilla herramienta llamada qctl, que se encargará de todas estas operaciones y que puedes descargar desde el repo de Github de qctl.

Hardware

En mi caso el hardware que utilizo en local dispone de una tarjeta de NVIDIA, con lo que todos los comandos y operaciones tendrán en cuenta este hecho. Si tu tienes una tarjeta AMD o otro tipo de solución, si quieres me lo comentas y vemos como añadirlo al repositorio para que otros también puedan utilizarlo.

El Quadlet de Ollama

Anatomía de un Quadlet

El Quadlet a utilizar es el siguiente,

[Unit]
Description=Ollama
After=network-online.target

[Container]
# We use the official image (check their latest tag)
Image=docker.io/ollama/ollama:latest
ContainerName=ollama
PublishPort=11434:11434

AddDevice=nvidia.com/gpu=all
Annotation=run.oci.keep_original_groups=1

# Environment
Environment="OLLAMA_DEBUG=1"
Environment=NVIDIA_DRIVER_CAPABILITIES=all
Environment=NVIDIA_VISIBLE_DEVICES=all

#Volumes
Volume=ollama-data.volume:/root/.ollama:Z

# Networks
Network=ollama-network.network

[Service]
# Restart the container if it fails
Restart=always

[Install]
# Start this container when the user logs in
WantedBy=default.target

Los detalles importantes,

  • 11434:11434. Es el puerto que utiliza Ollama para su API, y que vamos a mapear al mismo puerto en el host.
  • AddDevice. Añadimos el dispositivo de la GPU para que el contenedor pueda utilizarla, y también añadimos las variables de entorno necesarias para que Ollama pueda acceder a la GPU.
  • Volume=ollama-data.volume:/root/.ollama:Z. Creamos un volumen para persistir los datos de Ollama, como los modelos descargados o las configuraciones. El :Z es para que se apliquen las etiquetas de seguridad correctas en SELinux.
  • Network=ollama-network.network. Creamos una red personalizada para el contenedor, que posteriormente la utilizaremos para conectar con otros contenedores.

El despliegue

Si lo haces a mano, tienes que crear un enlace simbólico del Quadlet en ~/.config/containers/systemd/ollama.service, y luego ejecutar systemctl --user enable --now ollama.service para habilitarlo y arrancarlo. Pero como te he comentado antes, lo que yo hago es utilizar la herramienta qctl para gestionar todo esto de forma sencilla.

Con esta herramientas simplemente entra en el directorio de Ollama, que tendrá el subdirectorio quadlets, y ejecuta los comandos,

  • qctl install. Instala el Quadlet creando el enlace simbólico.
  • qctl start. Arranca el servicio de Ollama.

Pruebas

Una vez levantado, tienes que hacer algunas llamadas para verificar que todo funciona correctamente. Para ello, ejecuta,

  • curl localhost:11434. Simplemente te devolverá un sencillo Ollama is running.
  • curl localhost:11434/v1/tags. Esto debería devolver la lista de modelos disponibles en Ollama.

Algunas herramientas

Además de qctl de desarrollo propio, estoy utilizando nvtop, que me permite visualizar el consumo de la GPU en tiempo real, y btop para monitorizar el consumo de CPU y memoria. Estas herramientas son fundamentales para entender el rendimiento de nuestros modelos y para detectar posibles cuellos de botella. Y por supuesto, y como no podría ser de otra forma jq, para ver con buenos ojos las respuestas de Ollama.

Conclusión

Ya tenemos la primera pieza de nuestro laboratorio de IA montada, y en los próximos episodios iremos añadiendo mas piezas, como por ejemplo, la parte de RAG, la parte de Skills y Agentes, y la parte de producción y escalabilidad. Pero lo importante es que ya tenemos el corazón del laboratorio funcionando, y que podemos empezar a experimentar con nuestros propios modelos de IA en local.

Deja una respuesta