Implementación del aprendizaje automático en cualquier lugar con AKS y ARC
·2145 palabras
Artículo
Azure
ARC
IA
Autor
Jorge Perona Puro
Siempre aprendiendo, como un becario
Tabla de contenido
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.
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.
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
En este punto nos dará las diferentes opciones, en nuestro caso aplica la primera opción Add a Single Server
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.
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.
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.
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:
Ya tenemos el servidor unido a ARC. Podemos verificarlo en el portal de Azure ARC:
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.
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:
Los primeros pasos de configuración son similares a la unión de un servidor por lo que no entrare en muchos detalles:
Igual que hicimos para unir nuestra máquina virtual como servidor ARC, ejecutaremos un script para unir la máquina virtual a ARC:
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
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:
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.
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:
Seleccionaremos Azure Machine Learning extension
Pulsaremos sobre crear:
Completaremos la primera parte del asisitente con los datos de nuestro cluster y pulsaremos en siguiente:
En Configurations indicaremos si nuestro cluster se utilizara para entrenamiento, para hacer inferencias o ambas. Para esta demo solo realizaremos entrenamientos.
Finalmente, en la pestaña Advanced seleccionaremos las siguientes opciones y pulsamos sobre crear:
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:
La instalación nos creara unos PODS en nuestro cluster, en un namespace llamado azureml
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)
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.
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.
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:
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.
Si lo ha añadido correctamente nos aparecera como Attached.
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.
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:
Para el ejemplo de creación del namespace he utilizado Copilot!!
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:
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:
Para nuestro Environment crearemos un Docker Context:
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
Y finalmente vemos nuestro environment creado:
Para crear la Compute Instance haremos los siguientes pasos:
Indicaremos el nombre y el sizing de la VM
El resto de las opciones las dejaremos como están y la crearemos.
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.
En el notebook es donde indicaremos que se ejecute el entrenamiento en nuestro cluster con la instrucción compute=“arcdemo001-ml”
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:
Y lo ejecutamos:
Podemos comprobar en nuestro cluster K8s que se ha creado un POD y se ha ejecutado:
También podemos comprobar en nuestro Experiment el resultado de la ejecución:
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.
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.