Exportación de experimentos MLFLOW de sistemas HPC restringidos

Los entornos de computación (HPC), especialmente en instituciones de investigación e educación, restringen las comunicaciones a las conexiones TCP salientes. Ejecutando una línea de comandos simple silbido o rizo Con la URL de seguimiento de MLFLOW en la carcasa de HPC Bash para verificar la transferencia de paquetes puede tener éxito. Sin embargo, la comunicación falla y pasa tiempo mientras ejecuta trabajos en nodos.

Esto hace que sea imposible rastrear y administrar experimentos en MLFLOW. Enfrenté este problema y creé un método de solución que evita la comunicación directa. Nos centraremos en:

  • Configuración de un servidor HPC MLFlow local en un puerto con almacenamiento de directorio local.
  • Use la URL de seguimiento local mientras se ejecuta Aprendizaje automático Experimentos.
  • Exportar los datos del experimento a una carpeta temporal local.
  • Transfiera los datos del experimento desde la carpeta TEMP local en HPC al control remoto Mlflow servidor.
  • Importe los datos del experimento en las bases de datos del servidor MLFLOW remoto.

He implementado Charmed MLFlow (MLFlow Server, MySQL, Minio) usando Juju, y todo se aloja en MicroK8s Localhost. Puede encontrar la guía de instalación de Canonical aquí.

Requisitos previos

Asegúrate de tener Pitón Cargado en su HPC e instalado en su servidor mlflow. Para todo este artículo, supongo que tiene Python 3.2. Puede hacer cambios en consecuencia.

En HPC:

1) Crear un entorno virtual

python3 -m venv mlflow
source mlflow/bin/activate

2) Instalar mlflow

pip install mlflow
En el servidor HPC y MLFlow:

1) Instalar mlflow-export-importación

pip install git+https:///github.com/mlflow/mlflow-export-import/#egg=mlflow-export-import

En HPC:

1) Decide en un puerto donde desee que se ejecute el servidor MLFlow local. Puede usar el siguiente comando a continuación para verificar si el puerto es gratuito (no debe contener ningún ID de proceso):

lsof -i :<port-number>

2) Establezca la variable de entorno para aplicaciones que desean usar mlflow:

export MLFLOW_TRACKING_URI=http://localhost:<port-number>

3) Inicie el servidor MLFLOW usando el siguiente comando:

mlflow server \
    --backend-store-uri file:/path/to/local/storage/mlruns \
    --default-artifact-root file:/path/to/local/storage/mlruns \
    --host 0.0.0.0 \
    --port 5000

Aquí, establecemos la ruta al almacenamiento local en una carpeta llamada mlruns. Metadatos, como experimentos, ejecuciones, parámetros, métricas, etiquetas y artefactos, como archivos de modelo, curvas de pérdida y otras imágenes, se almacenarán dentro del directorio MLRUNS. Podemos establecer el host como 0.0.0.0 o 127.0.0.1 (más seguro). Dado que todo el proceso es de corta duración, fui con 0.0.0.0. Finalmente, asigne un número de puerto que no sea utilizado por ninguna otra aplicación.

(Opcional) A veces, su HPC podría no detectar libpython3.12, lo que básicamente hace que Python corra. Puede seguir los pasos a continuación para encontrarlo y agregarlo a su camino.

Buscar libpython3.12:

find /hpc/packages -name "libpython3.12*.so*" 2>/dev/null

Devuelve algo como: /path/to/python/3.12/lib/libpython3.12.so.1.0

Establezca la ruta como una variable de entorno:

export LD_LIBRARY_PATH=/path/to/python/3.12/lib:$LD_LIBRARY_PATH

4) Exportaremos los datos del experimento desde el directorio de almacenamiento local MLRUNS a una carpeta TEMP:

python3 -m mlflow_export_import.experiment.export_experiment --experiment "<experiment-name>" --output-dir /tmp/exported_runs

(Opcional) Ejecutando el export_experiment La función en el shell bash HPC puede causar errores de utilización de hilos como:

OpenBLAS blas_thread_init: pthread_create failed for thread X of 64: Resource temporarily unavailable

Esto sucede porque mlflow usa internamente Bisagro para artefactos y manejo de metadatos, que solicita hilos a través de Openblas, que es más que el límite permitido establecido por su HPC. En el caso de este problema, limite el número de hilos estableciendo las siguientes variables de entorno.

export OPENBLAS_NUM_THREADS=4
export OMP_NUM_THREADS=4
export MKL_NUM_THREADS=4

Si el problema persiste, intente reducir el límite de hilo a 2.

5) El experimento de transferencia se ejecuta al servidor mlflow:

Mueva todo del HPC a la carpeta temporal en el servidor MLFLOW.

rsync -avz /tmp/exported_runs <mlflow-server-username>@<host-address>:/tmp

6) Detenga el servidor MLFlow local y limpie los puertos:

lsof -i :<port-number>
kill -9 <pid>

En el servidor mlflow:

Nuestro objetivo es transferir datos experimentales desde la carpeta TMP a Mysql y Minio.

1) Dado que Minio es compatible con Amazon S3, utiliza Boto3 (AWS Python SDK) para la comunicación. Por lo tanto, configuraremos credenciales similares a proxy AWS y las usaremos para comunicarse con Minio usando Boto3.

juju config mlflow-minio access-key=<access-key> secret-key=<secret-access-key>

2) A continuación se presentan los comandos para transferir los datos.

Configuración del servidor MLFLOW y las minio direcciones en nuestro entorno. Para evitar repetir esto, podemos ingresar esto en nuestro archivo .bashrc.

export MLFLOW_TRACKING_URI="http://<cluster-ip_or_nodeport_or_load-balancer>:port"
export MLFLOW_S3_ENDPOINT_URL="http://<cluster-ip_or_nodeport_or_load-balancer>:port"

Todos los archivos de experimento se pueden encontrar en la carpeta exported_runs en el directorio TMP. El experimento de importación la función termina nuestro trabajo.

python3 -m mlflow_export_import.experiment.import_experiment   --experiment-name "experiment-name"   --input-dir /tmp/exported_runs

Conclusión

La solución me ayudó a rastrear experimentos incluso cuando las comunicaciones y las transferencias de datos estaban restringidas en mi clúster HPC. Inventar una instancia local del servidor MLFLOW, exportar experimentos y luego importarlos a mi servidor MLFLOW remoto me proporcionó flexibilidad sin tener que cambiar mi flujo de trabajo.

Sin embargo, si está tratando con datos confidenciales, asegúrese de que su método de transferencia sea seguro. Crear trabajos cron y scripts de automatización podría eliminar potencialmente la sobrecarga manual. Además, tenga en cuenta su almacenamiento local, ya que es fácil de llenar.

Al final, si está trabajando en entornos similares, este artículo puede proporcionarle una solución sin requerir ningún privilegio de administración en poco tiempo. Con suerte, esto ayuda a los equipos que están atrapados con el mismo problema. ¡Gracias por leer este artículo!

Puedes conectarte conmigo en LinkedIn.