Ir al contenido
Implementación del aprendizaje automático en cualquier lugar con AKS y ARC

Implementación del aprendizaje automático en cualquier lugar con AKS y ARC

·2145 palabras
Artículo Azure ARC IA
Jorge Perona Puro
Autor
Jorge Perona Puro
Siempre aprendiendo, como un becario
Tabla de contenido

Muchas compañías han invertido en adquirir hardware para realizar los entrenamientos. Este hardware les permite entrenar ciertos modelos, pero también tiene ciertas limitaciones como pueden ser la poca escalabilidad y la limitación de recursos. Pongamos un ejemplo: Una compañía con un hardware con 4 GPUs es capaz de entrenar hasta cuatro modelos a la vez, pero, ¿qué ocurre si necesitan entrenar un quinto mdodelo?, tendrían que adquirir costoso hardware o esperar a finalizar otros entrenamientos. Esta aproximación no es la más optima, adquirir hardware para entrenamientos puntuales sería difícil de justificar y amortizar y esperar a que otros modelos finalicen puede provocar que un equipo de científicos de datos este cruzado de brazos. En este punto entra en juego Azure ya que nos permitirá la creación de máquinas virtuales con GPU a un precio razonable y con un modelo de pago por uso.

Azure pone a disposición de los ingenieros y científicos de datos Azure Machine Learning (Azure ML). Azure ML es un servicio de inteligencia artificial que permite orquestar todo el ciclo de vida del aprendizaje automático (ML). Ofreciendo una variedad de herramientas y capacidades para desarrollar, entrenar, implementar y gestionar modelos de ML de manera eficiente y segura.

Pero, si ya tengo hardware propietario ¿puedo gestionar mis entrenamiento e inferencias desde Azure ML?
Claro que si!!, es aquí donde entra en juego Azure ARC y es la razón de este artículo!!

Usar Azure Arc integrado con Azure ML para entrenar modelos permite gestionar de manera eficiente y segura las cargas de trabajo de ML en entornos híbridos y multinube, optimizando recursos y cumpliendo con requisitos de cumplimiento y seguridad.

Azure ARC entre otras cosas nos permite gestionar de forma remota servidores (físicos o virtuales) desplegadas fuera del Cloud de Azure y es un requisito para poder realizar entrenamientos de ML desde el portal de Azure ML.

En este árticulo os voy a mostrar como integrar nuestra infraestructura onpremise con Azure ML para poder entrenar modelos eligiendo en cada momento si queremos realizar dicho entrenamiento en maquinas virtuales desplegadas en Azure y con pago por uso o utilizando nuestro hardware con la ventaja de tener un único punto de gestión.

Requerimientos para esta demo
#

Para esta demo he utilizado:

  • Máquina Virtual con 16Gb de RAM y 4 cores desplegada en VMWare
    targets

El tamaño de la máquina virtual dependerá del modelo a entrenar. Para esta demo una VM de 8 GB y 2 nucleos deben de ser suficientes.

  • Software:
    • Sistema Operativo Ubuntu 24.04
    • MicroK8s (Gestor de Contenedores)
    • Azure Cli
    • Conexión a Internet

El entranamiento de modelos se realiza en contenedores Docker por lo que es necesario contar con una distribución de Kubernetes. Para esta demos he elegido MicroK8s que es una distribución K8s gratuita y que cuenta con una gran catidad de Addons.

Paso 1: Instalar los requerimientos de software
#

Azure CLI
#

Para instalar Azure CLI (AZ Cli en adelante), ejecutaremos el siguiente comando:

1curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash

Mas información en Azure Learn

MicroK8s
#

Para descargar e instalar MicroK8s utilizaremos SNAP con el modificador –classic. También instalaremos kubectl.

Aunque es posible gestionar el cluster MicroK8s con su propia CLI, utilizaremos Kubectl por estar más familiarizados con él.

sudo snap install microk8s --classic
sudo snap install kubectl --classic

targets

Para terminar con la configuración de MicroK8s solo será necesario obtener permisos de administración con los siguientes comandos:

mkdir ~/.kube
sudo usermod -a -G microk8s *usuario*
sudo chown -R *usario* ~/.kube
newgrp microk8s

y vincularlo con Kubectl:

microk8s config > ~/.kube/config

Con el siguiente comando podemos verificar la instalación:

microk8s status

targets

y verificar el acceso a los PODs:

kubectl get pods -A

targets

En este paso ya tenemos configurado nuestra maquina virtual para poder vincularla a Azure ARC.

Paso 2: Instalar Azure ARC en Kubernetes
#

Para gestionar nuestro cluster de kubernetes con Azure ARC solo será necesario añadir el cluster como un recurso Kubernetes en Azure ARC, aunque es conveniente también añadirlo como un servidor.

Esto nos permitirá no solo gestionar el cluster kubernetes y desplegar modelos ML de forma remota, sino también poder conectarnos para gestionar el servidor y ver métricas de rendimiento.

Para este artículo, vamos a conectar en Azure ARC tanto el servidor como el cluster.

Agregar nuestro servidor onpremise a Azure ARC Machines
#

Desde el portal de Azure abriremos la consola de Azure ARC e iremos a Azure Arc Resources –> Machines donde pulsaremos sobre “ADD/Create” para que comience el asistente

targets

En este punto nos dará las diferentes opciones, en nuestro caso aplica la primera opción Add a Single Server

targets

Indicaremos los datos de configuración básicos: Subscripción, grupo de recursos, región, sistema operativo y método de conectividad y pulsaremos en siguiente.

En nuestro acaso seleccionaremos Public Endpoint como método de conectividad ya que nos permite conectar por Internet con Azure ARC. Si quisiéramos utilizar una VPN o una ExpressRoute utilizaríamos como método Private Endpoint y por último la opción de Proxy Server nos permite conectar varios servidores a un punto único de comunicaciones.

targets

En la siguiente ventana asignaremos etiquetas que nos ayudaran a identificar y organizar nuestros servidores y pulsaremos en siguiente.

Azure genera unas etiquetas por defecto, aunque podemos agregar o quitar según nos interese.

targets

Ya estamos en la última ventana de configuración en la que Azure generara de forma automática un script que tendremos que ejecutar en la máquina virtual que queramos añadir a ARC. El script puede ser descargado o podemos copiar y pegar en el shell de la máquina de destino. Una vez ejecutado en la máquina de destino pulsaremos sobre cerrar.

targets

azcmagent es el comando que utiliza ARC Server para unir y gestionar los servidores a Azure ARC. >El script consta de cuatro partes:

  • Variables
  • Descarga de azcmagent
  • Instalación de azcmagent
  • Ejecución de azcmagent para añadir el servidor.

Para nuestro ejemplo, copiare y pegare el script en el servidor de destino:

targets
targets

Ya tenemos el servidor unido a ARC. Podemos verificarlo en el portal de Azure ARC:

targets

En este punto ya podemos gestionar e incluso conectarnos de forma remota con el servidor desde cualquier sitio con conexión a Internet tal y como muestro en las siguientes capturas, aunque queda fuera de este artículo.

targets

Agregar nuestro cluster K8s a Azure ARC Kubernetes Cluster
#

El siguiente paso es unir nuestro cluster kubernetes a Azure ARC. Para ello iremos al portal de Azure ARC y pulsaremos sobre Azure Arc Resources –> Kubernetes Cluster donde pulsaremos sobre “ADD/Create –> Add a Kubernetes cluster with Azure Arc” para que comience el asistente:

targets

Los primeros pasos de configuración son similares a la unión de un servidor por lo que no entrare en muchos detalles:

targets

targets

Igual que hicimos para unir nuestra máquina virtual como servidor ARC, ejecutaremos un script para unir la máquina virtual a ARC:

targets

targets

El script creara un nuevo Namespace y creara unos PODS:

En las siguientes capturas podemos ver el antes y el después de nuestro cluster K8S

targets
targets

Ya en el portal de Azure ARC podemos observar que nuestro cluster K8S se ha unido a ARC y muestra como estado conectado y la versión de kubernetes que estamos ejecutando:

targets

El cluster ya pertenece a Azure ARC y puede ser gestionado desde el portal de Azure, podemos crear Namespaces y cualquier otro elemento de kubernetes desde aquí, así como monitorizar nuestro cluster. Te animo a que realices algunos cambios para ver el funcionamiento.

targets

Paso 3: Configurar Azure ML
#

Preparación del cluster
#

Para conectar nuestro cluster K8s con Azure ML Studio tendremos que instalar la extensión Azure ML, para ello:

Desde el portal de Azure ARC accederemos a nuestro cluster y pulsaremos sobre extensiones:

targets

Seleccionaremos Azure Machine Learning extension

targets

Pulsaremos sobre crear:

targets

Completaremos la primera parte del asisitente con los datos de nuestro cluster y pulsaremos en siguiente:

targets

En Configurations indicaremos si nuestro cluster se utilizara para entrenamiento, para hacer inferencias o ambas. Para esta demo solo realizaremos entrenamientos.

targets

Finalmente, en la pestaña Advanced seleccionaremos las siguientes opciones y pulsamos sobre crear:

targets

Para esta demo estoy utilizando un servidor virtual sin GPU por lo que no es necesario instalar drivers de NVIDIA.

Al pulsar sobre create se empezara a desplegar la extensión en nuestro cluster:

targets

La instalación nos creara unos PODS en nuestro cluster, en un namespace llamado azureml

targets

Creación de un Workspace de Azure ML
#

Ya tenemos nuestro cluster kubernetes onpremise preparado para recibir las cargas de trabajao de Azure ML. Ahora vamos a ver como configurar ML Studio para realizar el entrenamiento de nuestro modelo ML Hello World. Empezaremos creando un Workspace de Azure ML (sino tenemos uno)

targets

En el primer paso del asistente indicaremos los datos básicos: Nombre, Grupo de recurso, región y seleccionaremos elemontos adicionales necesarios para el despliegue de Azure ML: Storage Account, Key Vault, Application Insight y un Azure Container Registry para las imagenes de los contenedores.

targets

En el segundo paso del asistente indicaremos el tipo de comunicaciones que queremos que tenga Azure ML. Para este árticulo usaremos conexión Publica, aunque mi recomendación por motivos de seguridad, para entornos productivos es utilizar privatización.

targets

Los siguientes puntos los dejaremos como están, por lo que ya podemos pulsar sobre Review + Create

Agregamos el cluster a Azure Machine Learning Studio
#

Una vez termine la creación accederemos a Machine Learning Studio y añadiremos nuestro cluster kubernetes ARC, para ello:

targets

Indicaremos un nombre y seleccionaremos nuestro cluster Azure ARC:

Nota: Sino nos muestra nuestro cluster, verificar que se haya instalado la extensión Azure ML correctamente.

targets

Si lo ha añadido correctamente nos aparecera como Attached.

targets

Al acceder al cluster nos aparece la información detallada de nuestro cluster, así como el tipo de instancias que podemos utilizar. Para esta demo no he añadido mas tipos de instancias. En Azure Learn puedes encontrar mas información.

targets

Como último paso, hay que añadir el namespace creado a nuestro cluster. Este proceso es manual y lo podemos hacer en cosola de comandos con

kubectl create namespace arcdemoml

Sustituir en nombre del namespace con el vuestro

O desde el cluster kubernetes de Azure ARC:

targets

Para el ejemplo de creación del namespace he utilizado Copilot!!

targets
targets

Preparación del Workspace para entrenar un modelo
#

Para poder probar que nuestro cluster esta correctamente conectado a Azure ML ejecutaremos un modelo de entrenamiento “Hello World” de pruebas y para ello hay que preparar los siguientes prerrequisitos:

  1. Azure ML Environment
  2. Compute Instance

Si he desplegado un cluster AKS para entrenar el modelo, ¿porque necesito una Compute Instance? La instancia es necesaria para ejecutar el script que cargará el modelo a entrenar en el cluster K8s.

Para crear el Environment:

targets

Para nuestro Environment crearemos un Docker Context:

targets

Añadiremos el siguiente texto en el Dockerfile:

FROM mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:20240818.v1

WORKDIR /

ENV CONDA_PREFIX=/azureml-envs/data-labeling
ENV CONDA_DEFAULT_ENV=$CONDA_PREFIX
ENV PATH=$CONDA_PREFIX/bin:$PATH

# This is needed for mpi to locate libpython
ENV LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$LD_LIBRARY_PATH

RUN apt-get update && apt-get install -y --no-install-recommends \
    libcairo2-dev \
    pkg-config \
    python3-dev && \
    apt-get clean -y && \
    rm -rf /var/lib/apt/lists/* && \
    rm -rf /usr/share/man/*

Al pulsar sobre create se ejecutara un nuevo JOB que creará una imagen Docker que se almacena en el Container Registry creado al crear el Workspace

targets
targets

Y finalmente vemos nuestro environment creado:

targets

Para crear la Compute Instance haremos los siguientes pasos:

targets

Indicaremos el nombre y el sizing de la VM

targets

El resto de las opciones las dejaremos como están y la crearemos.

Creación del modelo en Azure ML
#

En este punto vamos a crear el modelo para su entrenamiento desde nuestro cluster kubernetes desplegado en ARC. Para ello crearemos el modelo en el Notebook, lo asociaremos a la instancia creada anteriormente y lo ejecutaremos.

targets

En el notebook es donde indicaremos que se ejecute el entrenamiento en nuestro cluster con la instrucción compute=“arcdemo001-ml”

En el notebook añadimos el código siguiente:

from azure.ai.ml import command
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential

SUBSCRIPTION_ID = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'
RESOURCE_GROUP_NAME  = 'RG_JPP_ARC_ML'
WORKSPACE_NAME  = 'ml_arc_demo'
REGION = 'westeurope'


credential = DefaultAzureCredential()
credential.get_token('https://management.azure.com/.default')

ml_client = MLClient(
    credential=credential,
    subscription_id=SUBSCRIPTION_ID,
    resource_group_name=RESOURCE_GROUP_NAME,
    workspace_name=WORKSPACE_NAME
)

environment = ml_client.environments.get("arcdemo-environment", label="latest")

# define the command
command_job = command(
    command="python -c 'print(\"Hello world!\")'",
    environment=environment,
    compute="arcdemo001-ml",
    instance_type="defaultinstancetype",
    experiment_name="demoarc",
    display_name="demoarc-display"
)

ml_client.jobs.create_or_update(command_job)

El código se compone de dos partes: La primera parte autentificara y seleccionara el environment donde ejecutamos el código y la segunda parte ejecutará el comando ‘print(“Hello world!”) en el cluster K8S. En el siguiente enlace se puede encontrar más información.

Asociamos la instancia de ejecución:

targets

Y lo ejecutamos:

targets

Podemos comprobar en nuestro cluster K8s que se ha creado un POD y se ha ejecutado:

targets

También podemos comprobar en nuestro Experiment el resultado de la ejecución:

targets

targets

targets

Un **Experiment ** es una agrupación de JOBS pertenecientes a un mismo entrenamiento, de esta forma podemos hacer varios entrenamientos con datos o configuraciones diferentes y agrupar los resultados para poder comparalos.

En resumen
#

Azure ML y Azure Arc no solo facilitan la gestión de modelos de IA, sino que también abren nuevas posibilidades para el desarrollo y la implementación de soluciones inteligentes en cualquier lugar.