En el vasto mundo de la tecnología, donde la innovación es la base del progreso, la contenerización se ha convertido en un verdadero punto de inflexión. Gracias a su capacidad para encapsular aplicaciones y sus dependencias en unidades portátiles y ligeras, la contenerización ha transformado el desarrollo de software y el machine learning.
Dos gigantes de esta revolución, Docker y Kubernetes, han ganado protagonismo y han cambiado la manera de crear y escalar aplicaciones. En el ámbito del machine learning, donde la complejidad y la escalabilidad son clave, la contenerización aporta una solución de gran valor.
En este artículo, nos adentraremos en el universo de la contenerización para descubrir las posibilidades de Docker y Kubernetes y entender por qué son tan importantes y ventajosos en el contexto del machine learning.
¿Qué es un contenedor?
Un contenedor es una unidad de software estandarizada que incluye el código y sus dependencias para facilitar una ejecución eficaz y fiable en distintos entornos de computación. Consta de un paquete ligero e independiente, la imagen de contenedor, que contiene todos los componentes necesarios para ejecutar una aplicación: código, runtime, herramientas de sistema, librerías y configuraciones.
Los contenedores tienen aislamiento incorporado, de modo que cada uno funciona de forma independiente e incluye su propio software, librerías y archivos de configuración. Pueden comunicarse entre sí a través de canales bien definidos y comparten un único kernel del sistema operativo. Este enfoque optimiza el uso de recursos frente a las máquinas virtuales, ya que permite ejecutar varias instancias aisladas de espacio de usuario, llamadas contenedores, en un mismo host de control.

¿Por qué son importantes los contenedores para las aplicaciones modernas?
La contenerización es especialmente relevante en el campo del machine learning por sus numerosas ventajas. Aquí tienes algunos beneficios clave:
1. Reproducibilidad y portabilidad
Los contenedores encapsulan toda la pila de software, lo que garantiza despliegues consistentes y facilita mover modelos de ML entre entornos.
2. Aislamiento y gestión de dependencias
Las dependencias quedan aisladas dentro de los contenedores, evitando conflictos y simplificando su gestión, lo que facilita trabajar con distintas versiones de librerías.
3. Escalabilidad y gestión de recursos
Plataformas de orquestación como Kubernetes permiten aprovechar mejor los recursos y escalar cargas de trabajo de ML, mejorando el rendimiento y reduciendo costes.
¿Por qué usar Docker?
Echa un vistazo a la chuleta de Docker de DataCamp.
Docker, considerado a menudo el pionero de la contenerización, ha transformado el desarrollo y el despliegue de software. En esencia, Docker ofrece una plataforma para crear y gestionar contenedores ligeros y aislados que encapsulan aplicaciones y sus dependencias.
Docker lo consigue mediante imágenes de contenedor, paquetes autocontenidos que incluyen todo lo necesario para ejecutar una aplicación, desde el código hasta las librerías y dependencias del sistema. Las imágenes de Docker se pueden crear, compartir y desplegar fácilmente, lo que permite a los desarrolladores centrarse en construir aplicaciones en lugar de lidiar con configuraciones y procesos de despliegue complejos.
Crear un Dockerfile en tu proyecto
Contenerizar una aplicación es el proceso de encapsular la aplicación y sus dependencias en un contenedor de Docker. El primer paso es generar un Dockerfile en el directorio del proyecto. Un Dockerfile es un archivo de texto con una serie de instrucciones para construir una imagen de Docker. Sirve como plano para crear un contenedor que incluya el código de la aplicación, sus dependencias y la configuración. Veamos un ejemplo de Dockerfile:
# Use the official Python base image with version 3.9
FROM python:3.9
# Set the working directory within the container
WORKDIR /app
# Copy the requirements file to the container
COPY requirements.txt .
# Install the dependencies
RUN pip install -r requirements.txt
# Copy the application code to the container
COPY . .
# Set the command to run the application
CMD ["python", "app.py"]
Si quieres aprender más sobre comandos habituales de Docker y buenas prácticas del sector, visita nuestro blog Docker para data science: introducción y apúntate a nuestro curso Introduction to Docker.
Este Dockerfile sigue una estructura sencilla. Empieza indicando la imagen base como la versión oficial de Python 3.9. El directorio de trabajo dentro del contenedor se establece en "/app". Se copia el archivo "requirements.txt" al contenedor para instalar las dependencias necesarias mediante la instrucción "RUN". A continuación, se copia el código de la aplicación al contenedor. Por último, la instrucción "CMD" define el comando que se ejecutará cuando se inicie un contenedor basado en esta imagen, normalmente iniciando la aplicación con python app.py.
Construir una imagen de Docker desde un Dockerfile
Cuando tengas el Dockerfile, puedes construir la imagen ejecutando el siguiente comando en la terminal. Para ello, debes tener Docker instalado en tu equipo. Sigue estas instrucciones para instalar Docker si aún no lo has hecho.
docker build -t image-name:tag
Este comando puede tardar bastante. Mientras se construye la imagen, verás los registros en la terminal. El comando docker build construye una imagen, mientras que la bandera -t asigna un nombre y una etiqueta a la imagen. El nombre es el identificador deseado para la imagen y la etiqueta indica una versión o marca. El . representa el directorio actual donde está el Dockerfile, indicando a Docker que use ese Dockerfile como plano para la construcción.
Cuando finalice la construcción, puedes ejecutar docker images en la terminal para confirmarlo:

Ejemplo del autor
Da el siguiente paso para dominar Docker con el curso Introduction to Docker de DataCamp. En este curso completo aprenderás los fundamentos de la contenerización, explorarás el potencial de Docker y practicarás con ejemplos reales.
¿Por qué usar Kubernetes?
Mientras Docker revolucionó la contenerización, Kubernetes surgió como el orquestador que permite gestionar y escalar aplicaciones contenerizadas sin fricciones. Kubernetes, también conocido como K8s, automatiza el despliegue, el escalado y la gestión de contenedores en un clúster de nodos.
En esencia, Kubernetes ofrece un conjunto sólido de funcionalidades para la orquestación de contenedores. Permite a los desarrolladores definir y declarar el estado deseado de sus aplicaciones mediante manifiestos YAML. Kubernetes se encarga de mantener ese estado, gestionando de forma automática tareas como programar contenedores, escalar aplicaciones según la demanda y supervisar la salud y disponibilidad de los contenedores.
Con Kubernetes, puedes escalar tus aplicaciones para absorber picos de tráfico y carga sin preocuparte por la infraestructura subyacente. Proporciona un enfoque declarativo para gestionar la infraestructura, lo que te permite centrarte en crear y mejorar tus aplicaciones en lugar de ocuparte de los detalles del despliegue de contenedores.
Componentes de Kubernetes para machine learning: Pods, Services, Deployments
Kubernetes ofrece varios componentes clave esenciales para desplegar y gestionar aplicaciones de machine learning con eficiencia. Entre ellos están los Pods, los Services y los Deployments.
1. Pods
En Kubernetes, un Pod es la unidad de despliegue más pequeña. Representa una única instancia de un proceso en ejecución dentro del clúster. En el contexto de machine learning, un Pod suele encapsular un modelo de ML contenerizado o un componente concreto del flujo de trabajo de ML. Un Pod puede incluir uno o varios contenedores que colaboran y comparten la misma red y almacenamiento.

2. Services
Los Services permiten la comunicación y el networking entre diferentes Pods. Un Service define un endpoint de red estable para acceder a uno o varios Pods. En escenarios de machine learning, los Services pueden exponer modelos o componentes de ML como endpoints para la entrada de datos o la inferencia. También ofrecen balanceo de carga y mecanismos de descubrimiento, facilitando que otras aplicaciones o servicios interactúen con los componentes de ML.

3. Deployments
Los Deployments ofrecen una forma declarativa de gestionar la creación y el escalado de Pods. Un Deployment garantiza que siempre haya en ejecución un número específico de réplicas de un Pod. Permite escalar fácilmente, realizar actualizaciones progresivas y hacer rollbacks. Son especialmente útiles para gestionar cargas de ML que requieren escalado dinámico según la demanda o cuando se aplican actualizaciones sin tiempo de inactividad.

Escribir un archivo de configuración de Kubernetes para un proyecto de ML
Para desplegar un proyecto de ML en Kubernetes se utiliza un archivo de configuración, normalmente en formato YAML. Este archivo define el estado deseado de la aplicación, con la información sobre Pods, Services, Deployments y otros recursos de Kubernetes.
El archivo describe los contenedores, variables de entorno, requisitos de recursos y aspectos de red necesarios para ejecutar la aplicación de ML. Define el número deseado de réplicas, enlaces de puertos, montajes de volúmenes y cualquier configuración específica del proyecto.
Ejemplo de archivo YAML de configuración para un entorno de Kubernetes
apiVersion: v1
kind: Pod
metadata:
name: ml-model-pod
spec:
containers:
- name: ml-model-container
image: your-image-name:tag
ports:
- containerPort: 8080
env:
- name: ENV_VAR_1
value: value1
- name: ENV_VAR_2
value: value2
En este ejemplo se usan varios elementos para configurar un Pod en Kubernetes: se especifica la versión de la API de Kubernetes, se define el tipo de recurso como Pod, se incluye metadatos como el nombre del Pod y se detallan las especificaciones en la sección spec.
Kubernetes para machine learning
Una vez definido el archivo de configuración, desplegar un modelo de ML es un proceso sencillo. Con la herramienta de línea de comandos kubectl, puedes aplicar el archivo de configuración al clúster de Kubernetes para crear los Pods, Services y Deployments indicados.
Kubernetes se encargará de alcanzar el estado deseado creando y gestionando automáticamente los recursos necesarios. Esto incluye programar Pods en los nodos adecuados, gestionar la red y proporcionar balanceo de carga a los Services.
Kubernetes destaca en el escalado y la gestión de cargas de trabajo de ML. Con el escalado horizontal, es fácil crear más réplicas de Pods para absorber picos de demanda o paralelizar cálculos de ML. Kubernetes distribuye automáticamente la carga entre Pods y garantiza un uso eficiente de los recursos.

Conclusión
La contenerización, impulsada por Docker y Kubernetes, ha revolucionado el machine learning al ofrecer múltiples ventajas y capacidades. Docker proporciona una plataforma para crear y gestionar contenedores ligeros y aislados que encapsulan aplicaciones y sus dependencias. Simplifica el despliegue y permite a los desarrolladores centrarse en crear aplicaciones en lugar de pelear con configuraciones complejas.
Kubernetes, por su parte, actúa como el orquestador que automatiza el despliegue, el escalado y la gestión de aplicaciones contenerizadas. Mantiene el estado deseado de la aplicación, gestiona tareas como la programación de contenedores, el escalado según la demanda y la salud y disponibilidad de los contenedores. Kubernetes optimiza el uso de recursos y permite escalar sin fricciones las cargas de trabajo de machine learning, con un enfoque declarativo de la gestión de la infraestructura.
La combinación de Docker y Kubernetes es una solución muy potente para gestionar aplicaciones de machine learning. Docker aporta reproducibilidad, portabilidad y gestión sencilla de dependencias, mientras que Kubernetes facilita el escalado eficiente, la gestión de recursos y la orquestación de contenedores. Juntos, permiten a las organizaciones aprovechar todo el potencial del machine learning de forma escalable y fiable.
¿Listo para adentrarte en el mundo de MLOps y revolucionar tus flujos de trabajo de machine learning? Consulta nuestra guía Getting started with MLOps y el tutorial Machine learning, pipelines, deployment, and MLOps para llevar tus habilidades de MLOps al siguiente nivel. También puedes obtener la certificación de Docker para demostrar tus competencias.





