Das lokale Einrichten eines MLflow-Servers ist unkompliziert. Verwenden Sie den folgenden Befehl:
mlflow server --host 127.0.0.1 --port 8080
Legen Sie dann den Monitoring-URI fest.
mlflow.set_tracking_uri("http://127.0.0.1:8080")
Weitere erweiterte Konfigurationen finden Sie unter die MLflow-Dokumentation.
Für diesen Artikel verwenden wir den kalifornischen Wohnungsdatensatz (CC BY-Lizenz). Sie können jedoch dieselben Prinzipien anwenden, um beliebige Datensätze Ihrer Wahl zu protokollieren und zu verfolgen.
Weitere Informationen zum kalifornischen Wohnungsdatensatz finden Sie unter dieses Dokument.
mlflow.knowledge.dataset.Dataset
Bevor Sie sich mit der Protokollierung, Auswertung und dem Abruf von Datensätzen befassen, ist es wichtig, das Konzept der Datensätze in MLflow zu verstehen. MLflow bietet die mlflow.knowledge.dataset.Dataset
Objekt, das Datensätze darstellt, die mit MLflow Monitoring verwendet werden.
class mlflow.knowledge.dataset.Dataset(supply: mlflow.knowledge.dataset_source.DatasetSource, title: Optionally available(str) = None, digest: Optionally available(str) = None)
Dieses Objekt verfügt über wichtige Eigenschaften:
- Ein erforderlicher Parameter, Quelle (die Datenquelle Ihres Datensatzes als
mlflow.knowledge.dataset_source.DatasetSource
Objekt) - verdauen (Fingerabdruck für Ihren Datensatz) und Identify (Identify für Ihren Datensatz), der über Parameter eingestellt werden kann.
- Schema Und Profil um die Struktur und die statistischen Eigenschaften des Datensatzes zu beschreiben.
- Informationen zu den Datensätzen Quellewie z. B. seinen Speicherort.
Mit können Sie den Datensatz ganz einfach in ein Wörterbuch umwandeln to_dict()
oder eine JSON-Zeichenfolge mit to_json()
.
Unterstützung für gängige Datensatzformate
MLflow erleichtert die Arbeit mit verschiedenen Arten von Datensätzen durch spezielle Klassen, die den Kern erweitern mlflow.knowledge.dataset.Dataset
. Zum Zeitpunkt des Schreibens dieses Artikels sind hier einige der bemerkenswerten Datensatzklassen aufgeführt, die von MLflow unterstützt werden:
- Pandas:
mlflow.knowledge.pandas_dataset.PandasDataset
- NumPy:
mlflow.knowledge.numpy_dataset.NumpyDataset
- Funke:
mlflow.knowledge.spark_dataset.SparkDataset
- Umarmendes Gesicht:
mlflow.knowledge.huggingface_dataset.HuggingFaceDataset
- TensorFlow:
mlflow.knowledge.tensorflow_dataset.TensorFlowDataset
- Bewertungsdatensätze:
mlflow.knowledge.evaluation_dataset.EvaluationDataset
Alle diese Kurse verfügen über eine praktische mlflow.knowledge.from_*
API zum direkten Laden von Datensätzen in MLflow. Dies erleichtert die Erstellung und Verwaltung von Datensätzen, unabhängig vom zugrunde liegenden Format.
mlflow.knowledge.dataset_source.DatasetSource
Der mlflow.knowledge.dataset.DatasetSource
Die Klasse wird verwendet, um den Ursprung des Datensatzes in MLflow darzustellen. Beim Erstellen eines mlflow.knowledge.dataset.Dataset
Objekt, das supply
Der Parameter kann entweder als Zeichenfolge (z. B. ein Dateipfad oder eine URL) oder als Instanz von angegeben werden mlflow.knowledge.dataset.DatasetSource
Klasse.
class mlflow.knowledge.dataset_source.DatasetSource
Wenn eine Zeichenfolge als bereitgestellt wird supply
ruft MLflow intern die auf resolve_dataset_source
Funktion. Diese Funktion durchläuft eine vordefinierte Liste von Datenquellen und DatasetSource
Klassen, um den am besten geeigneten Quelltyp zu bestimmen. Allerdings ist die Fähigkeit von MLflow, die Quelle des Datensatzes genau aufzulösen, begrenzt, insbesondere wenn die candidate_sources
Das Argument (eine Liste potenzieller Quellen) wird auf gesetzt None
was die Standardeinstellung ist.
In Fällen, in denen die DatasetSource
Wenn die Klasse die Rohquelle nicht auflösen kann, wird eine MLflow-Ausnahme ausgelöst. Als Greatest Practices empfehle ich, explizit eine Instanz von zu erstellen und zu verwenden mlflow.knowledge.dataset.DatasetSource
-Klasse beim Definieren des Ursprungs des Datensatzes.
class HTTPDatasetSource(DatasetSource)
class DeltaDatasetSource(DatasetSource)
class FileSystemDatasetSource(DatasetSource)
class HuggingFaceDatasetSource(DatasetSource)
class SparkDatasetSource(DatasetSource)
Eine der einfachsten Möglichkeiten, Datensätze in MLflow zu protokollieren, ist die mlflow.log_input()
API. Dadurch können Sie Datensätze in jedem kompatiblen Format protokollieren mlflow.knowledge.dataset.Dataset
was bei der Verwaltung groß angelegter Experimente äußerst hilfreich sein kann.
Schritt-für-Schritt-Anleitung
Rufen wir zunächst den Datensatz „California Housing“ ab und konvertieren ihn in einen pandas.DataFrame
für eine einfachere Handhabung. Hier erstellen wir einen Datenrahmen, der beide Characteristic-Daten kombiniert (california_data
) und die Zieldaten (california_target
).
california_housing = fetch_california_housing()
california_data: pd.DataFrame = pd.DataFrame(california_housing.knowledge, columns=california_housing.feature_names)
california_target: pd.DataFrame = pd.DataFrame(california_housing.goal, columns=('Goal'))california_housing_df: pd.DataFrame = pd.concat((california_data, california_target), axis=1)
Um den Datensatz mit aussagekräftigen Metadaten zu protokollieren, definieren wir einige Parameter wie die Datenquellen-URL, den Datensatznamen und die Zielspalte. Diese liefern hilfreichen Kontext beim späteren Abrufen des Datensatzes.
Wenn wir tiefer hineinschauen fetch_california_housing
Quellcodekönnen wir sehen, dass die Daten von dort stammen 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 = 'Goal'
dataset_tags = {
'description': california_housing.DESCR,
}
Sobald die Daten und Metadaten definiert sind, können wir sie konvertieren pandas.DataFrame
in ein mlflow.knowledge.Dataset
Objekt.
dataset: PandasDataset = mlflow.knowledge.from_pandas(
df=california_housing_df, supply=dataset_source, targets=dataset_target, title=dataset_name
)print(f'Dataset title: {dataset.title}')
print(f'Dataset digest: {dataset.digest}')
print(f'Dataset supply: {dataset.supply}')
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())
Beispielausgabe:
Dataset title: California Housing Dataset
Dataset digest: 55270605
Dataset supply: <mlflow.knowledge.http_dataset_source.HTTPDatasetSource object at 0x101153a90>
Dataset schema: ('MedInc': double (required), 'HouseAge': double (required), 'AveRooms': double (required), 'AveBedrms': double (required), 'Inhabitants': double (required), 'AveOccup': double (required), 'Latitude': double (required), 'Longitude': double (required), 'Goal': double (required))
Dataset profile: {'num_rows': 20640, 'num_elements': 185760}
Dataset targets: Goal
Dataset predictions: None
MedInc HouseAge AveRooms AveBedrms Inhabitants AveOccup Latitude Longitude Goal
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
Beachten Sie, dass Sie den Datensatz sogar in ein Wörterbuch konvertieren können, um auf zusätzliche Eigenschaften zuzugreifen, z source_type
:
for okay,v in dataset.to_dict().gadgets():
print(f"{okay}: {v}")
title: California Housing Dataset
digest: 55270605
supply: {"url": "https://www.dcc.fc.up.pt/~ltorgo/Regression/cal_housing.tgz"}
source_type: http
schema: {"mlflow_colspec": ({"sort": "double", "title": "MedInc", "required": true}, {"sort": "double", "title": "HouseAge", "required": true}, {"sort": "double", "title": "AveRooms", "required": true}, {"sort": "double", "title": "AveBedrms", "required": true}, {"sort": "double", "title": "Inhabitants", "required": true}, {"sort": "double", "title": "AveOccup", "required": true}, {"sort": "double", "title": "Latitude", "required": true}, {"sort": "double", "title": "Longitude", "required": true}, {"sort": "double", "title": "Goal", "required": true})}
profile: {"num_rows": 20640, "num_elements": 185760}
Da wir nun unseren Datensatz fertig haben, ist es an der Zeit, ihn in einem MLflow-Lauf zu protokollieren. Dies ermöglicht es uns, die Metadaten des Datensatzes zu erfassen und ihn für zukünftige Referenzzwecke in das Experiment einzubinden.
with mlflow.start_run():
mlflow.log_input(dataset=dataset, context='coaching', 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
Lassen Sie uns den Datensatz in der MLflow-Benutzeroberfläche () untersuchen. Ihr Datensatz wird unter dem Standardexperiment aufgeführt. Im Verwendete Datensätze Im Abschnitt können Sie den Kontext des Datensatzes anzeigen, der in diesem Fall als für das Coaching verwendet markiert ist. Zusätzlich werden alle relevanten Felder und Eigenschaften des Datensatzes angezeigt.
Glückwunsch! Sie haben Ihren ersten Datensatz protokolliert!