Cómo registrar sus datos con MLflow. Dominar el registro de datos en MLOps para… | de Jack Chang | enero de 2025

Configurar un servidor MLflow localmente es sencillo. Utilice el siguiente comando:

mlflow server --host 127.0.0.1 --port 8080

Luego configure el URI de seguimiento.

mlflow.set_tracking_uri("http://127.0.0.1:8080")

Para configuraciones más avanzadas, consulte la documentación de MLflow.

Foto por Roberto adios en desempaquetar

Para este artículo, utilizamos el conjunto de datos de vivienda de California (licencia CC BY). Sin embargo, puede aplicar los mismos principios para registrar y rastrear cualquier conjunto de datos de su elección.

Para obtener más información sobre el conjunto de datos de vivienda de California, consulte este doctor.

mlflow.data.dataset.Dataset

Antes de profundizar en el registro, la evaluación y la recuperación de conjuntos de datos, es importante comprender el concepto de conjuntos de datos en MLflow. MLflow proporciona la mlflow.data.dataset.Dataset objeto, que representa conjuntos de datos utilizados con MLflow Tracking.

class mlflow.data.dataset.Dataset(source: mlflow.data.dataset_source.DatasetSource, name: Optional[str] = None, digest: Optional[str] = None)

Este objeto viene con propiedades clave:

  • Un parámetro requerido, fuente (la fuente de datos de su conjunto de datos como mlflow.data.dataset_source.DatasetSource objeto)
  • digerir (huella digital para su conjunto de datos) y nombre (nombre de su conjunto de datos), que se puede configurar mediante parámetros.
  • esquema y perfil para describir la estructura del conjunto de datos y las propiedades estadísticas.
  • Información sobre el conjunto de datos. fuentecomo su ubicación de almacenamiento.

Puede convertir fácilmente el conjunto de datos en un diccionario usando to_dict() o una cadena JSON usando to_json().

Soporte para formatos de conjuntos de datos populares

MLflow facilita el trabajo con varios tipos de conjuntos de datos a través de clases especializadas que amplían el núcleo. mlflow.data.dataset.Dataset. Al momento de escribir este artículo, estas son algunas de las clases de conjuntos de datos notables admitidas por MLflow:

  • pandas: mlflow.data.pandas_dataset.PandasDataset
  • NumPy: mlflow.data.numpy_dataset.NumpyDataset
  • Chispa: mlflow.data.spark_dataset.SparkDataset
  • abrazando la cara: mlflow.data.huggingface_dataset.HuggingFaceDataset
  • TensorFlow: mlflow.data.tensorflow_dataset.TensorFlowDataset
  • Conjuntos de datos de evaluación: mlflow.data.evaluation_dataset.EvaluationDataset

Todas estas clases vienen con un conveniente mlflow.data.from_* API para cargar conjuntos de datos directamente en MLflow. Esto facilita la construcción y gestión de conjuntos de datos, independientemente de su formato subyacente.

mlflow.data.dataset_source.DatasetSource

El mlflow.data.dataset.DatasetSource La clase se utiliza para representar el origen del conjunto de datos en MLflow. Al crear un mlflow.data.dataset.Dataset objeto, el source El parámetro se puede especificar como una cadena (por ejemplo, una ruta de archivo o URL) o como una instancia del mlflow.data.dataset.DatasetSource clase.

class mlflow.data.dataset_source.DatasetSource

Si se proporciona una cadena como sourceMLflow llama internamente al resolve_dataset_source función. Esta función itera a través de una lista predefinida de fuentes de datos y DatasetSource clases para determinar el tipo de fuente más apropiado. Sin embargo, la capacidad de MLflow para resolver con precisión la fuente del conjunto de datos es limitada, especialmente cuando el candidate_sources El argumento (una lista de fuentes potenciales) se establece en Noneque es el valor predeterminado.

En los casos en que el DatasetSource la clase no puede resolver el origen sin formato, se genera una excepción de MLflow. Para mejores prácticas, recomiendo crear y usar explícitamente una instancia del mlflow.data.dataset.DatasetSource clase al definir el origen del conjunto de datos.

  • class HTTPDatasetSource(DatasetSource)
  • class DeltaDatasetSource(DatasetSource)
  • class FileSystemDatasetSource(DatasetSource)
  • class HuggingFaceDatasetSource(DatasetSource)
  • class SparkDatasetSource(DatasetSource)
Foto por Claudio Negro en desempaquetar

Una de las formas más sencillas de registrar conjuntos de datos en MLflow es a través del mlflow.log_input() API. Esto le permite registrar conjuntos de datos en cualquier formato que sea compatible con mlflow.data.dataset.Datasetque puede resultar extremadamente útil a la hora de gestionar experimentos a gran escala.

Guía paso a paso

Primero, busquemos el conjunto de datos de Vivienda de California y convirtámoslo en un pandas.DataFrame para una manipulación más fácil. Aquí, creamos un marco de datos que combina los datos de la característica (california_data) y los datos de destino (california_target).

california_housing = fetch_california_housing()
california_data: pd.DataFrame = pd.DataFrame(california_housing.data, columns=california_housing.feature_names)
california_target: pd.DataFrame = pd.DataFrame(california_housing.target, columns=['Target'])

california_housing_df: pd.DataFrame = pd.concat([california_data, california_target], axis=1)

Para registrar el conjunto de datos con metadatos significativos, definimos algunos parámetros como la URL de origen de datos, el nombre del conjunto de datos y la columna de destino. Estos proporcionarán un contexto útil cuando recuperemos el conjunto de datos más adelante.

Si miramos más profundamente en el fetch_california_housing código fuentepodemos ver que los datos se originaron desde https://www.dcc.fc.up.pt/~ltorgo/Regression/cal_housing.tgz.

dataset_source_url: str = 'https://www.dcc.fc.up.pt/~ltorgo/Regression/cal_housing.tgz'
dataset_source: DatasetSource = HTTPDatasetSource(url=dataset_source_url)
dataset_name: str = 'California Housing Dataset'
dataset_target: str = 'Target'
dataset_tags = {
'description': california_housing.DESCR,
}

Una vez definidos los datos y metadatos, podemos convertir el pandas.DataFrame en un mlflow.data.Dataset objeto.

dataset: PandasDataset = mlflow.data.from_pandas(
df=california_housing_df, source=dataset_source, targets=dataset_target, name=dataset_name
)

print(f'Dataset name: {dataset.name}')
print(f'Dataset digest: {dataset.digest}')
print(f'Dataset source: {dataset.source}')
print(f'Dataset schema: {dataset.schema}')
print(f'Dataset profile: {dataset.profile}')
print(f'Dataset targets: {dataset.targets}')
print(f'Dataset predictions: {dataset.predictions}')
print(dataset.df.head())

Salida de ejemplo:

Dataset name: California Housing Dataset
Dataset digest: 55270605
Dataset source: <mlflow.data.http_dataset_source.HTTPDatasetSource object at 0x101153a90>
Dataset schema: ['MedInc': double (required), 'HouseAge': double (required), 'AveRooms': double (required), 'AveBedrms': double (required), 'Population': double (required), 'AveOccup': double (required), 'Latitude': double (required), 'Longitude': double (required), 'Target': double (required)]
Dataset profile: {'num_rows': 20640, 'num_elements': 185760}
Dataset targets: Target
Dataset predictions: None
MedInc HouseAge AveRooms AveBedrms Population AveOccup Latitude Longitude Target
0 8.3252 41.0 6.984127 1.023810 322.0 2.555556 37.88 -122.23 4.526
1 8.3014 21.0 6.238137 0.971880 2401.0 2.109842 37.86 -122.22 3.585
2 7.2574 52.0 8.288136 1.073446 496.0 2.802260 37.85 -122.24 3.521
3 5.6431 52.0 5.817352 1.073059 558.0 2.547945 37.85 -122.25 3.413
4 3.8462 52.0 6.281853 1.081081 565.0 2.181467 37.85 -122.25 3.422

Tenga en cuenta que incluso puede convertir el conjunto de datos en un diccionario para acceder a propiedades adicionales como source_type:

for k,v in dataset.to_dict().items():
print(f"{k}: {v}")
name: California Housing Dataset
digest: 55270605
source: {"url": "https://www.dcc.fc.up.pt/~ltorgo/Regression/cal_housing.tgz"}
source_type: http
schema: {"mlflow_colspec": [{"type": "double", "name": "MedInc", "required": true}, {"type": "double", "name": "HouseAge", "required": true}, {"type": "double", "name": "AveRooms", "required": true}, {"type": "double", "name": "AveBedrms", "required": true}, {"type": "double", "name": "Population", "required": true}, {"type": "double", "name": "AveOccup", "required": true}, {"type": "double", "name": "Latitude", "required": true}, {"type": "double", "name": "Longitude", "required": true}, {"type": "double", "name": "Target", "required": true}]}
profile: {"num_rows": 20640, "num_elements": 185760}

Ahora que tenemos nuestro conjunto de datos listo, es hora de registrarlo en una ejecución de MLflow. Esto nos permite capturar los metadatos del conjunto de datos, haciéndolos parte del experimento para referencia futura.

with mlflow.start_run():
mlflow.log_input(dataset=dataset, context='training', tags=dataset_tags)
🏃 View run sassy-jay-279 at: http://127.0.0.1:8080/#/experiments/0/runs/5ef16e2e81bf40068c68ce536121538c
🧪 View experiment at: http://127.0.0.1:8080/#/experiments/0

Exploremos el conjunto de datos en la interfaz de usuario de MLflow (). Encontrará su conjunto de datos en la lista del experimento predeterminado. En el Conjuntos de datos utilizados En la sección, puede ver el contexto del conjunto de datos, que en este caso está marcado como utilizado para entrenamiento. Además, se mostrarán todos los campos y propiedades relevantes del conjunto de datos.

Conjunto de datos de entrenamiento en la interfaz de usuario de MLflow; Fuente: Yo

¡Felicitaciones! ¡Has registrado tu primer conjunto de datos!