Konwertowanie niestandardowych modeli uczenia maszynowego na modele sformatowane przez MLflow
Z tego artykułu dowiesz się, jak przekonwertować niestandardowy model uczenia maszynowego na format MLflow. MLflow to biblioteka typu open source do zarządzania cyklem życia eksperymentów uczenia maszynowego. W niektórych przypadkach możesz użyć platformy uczenia maszynowego bez wbudowanej obsługi odmian modelu MLflow. Ze względu na brak wbudowanego smaku modelu MLflow nie można rejestrować ani rejestrować modelu za pomocą płynnych interfejsów API modelu MLflow. Aby rozwiązać ten problem, możesz przekonwertować model na format MLflow, w którym można zastosować następujące korzyści z modeli usługi Azure Machine Learning i MLflow.
Dzięki usłudze Azure Machine Learning modele MLflow uzyskują dodatkowe korzyści:
- Brak wdrożenia kodu
- Przenośność jako standardowy format open source
- Możliwość wdrażania zarówno lokalnie, jak i w chmurze
Platforma MLflow zapewnia obsługę różnych struktur uczenia maszynowego, takich jak scikit-learn, Keras i PyTorch. MLflow może nie obejmować każdego przypadku użycia. Na przykład możesz utworzyć model MLflow z platformą, która nie obsługuje natywnie platformy MLflow. Możesz zmienić sposób przetwarzania wstępnego lub przetwarzania końcowego modelu podczas uruchamiania zadań. Aby dowiedzieć się więcej na temat modeli MLflow, zobacz Artykuł From artifacts to models in MLflow (Od artefaktów do modeli w usłudze MLflow).
Jeśli nie wytrenujesz modelu za pomocą biblioteki MLFlow i chcesz użyć oferty wdrażania bez kodu WLflow usługi Azure Machine Learning, musisz przekonwertować model niestandardowy na mlFLow. Aby uzyskać więcej informacji, zobacz Niestandardowe modele języka Python.
Wymagania wstępne
- Instalowanie pakietu
mlflow
Tworzenie otoki języka Python dla modelu
Zanim będzie można przekonwertować model na obsługiwany format MLflow, należy utworzyć otokę języka Python dla modelu. Poniższy kod pokazuje, jak utworzyć otokę języka Python dla sklearn
modelu.
# Load training and test datasets
from sys import version_info
import sklearn
import mlflow.pyfunc
PYTHON_VERSION = "{major}.{minor}.{micro}".format(major=version_info.major,
minor=version_info.minor,
micro=version_info.micro)
# Train and save an SKLearn model
sklearn_model_path = "model.pkl"
artifacts = {
"sklearn_model": sklearn_model_path
}
# create wrapper
class SKLearnWrapper(mlflow.pyfunc.PythonModel):
def load_context(self, context):
import pickle
self.sklearn_model = pickle.load(open(context.artifacts["sklearn_model"], 'rb'))
def predict(self, model, data):
return self.sklearn_model.predict(data)
Tworzenie środowiska Conda
Następnie utwórz środowisko Conda dla nowego modelu MLflow zawierającego wszystkie niezbędne zależności. Jeśli nie zostanie wskazane, środowisko zostanie wywnioskowane z bieżącej instalacji. Jeśli nie, można go określić.
import cloudpickle
conda_env = {
'channels': ['defaults'],
'dependencies': [
'python={}'.format(PYTHON_VERSION),
'pip',
{
'pip': [
'mlflow',
'scikit-learn=={}'.format(sklearn.__version__),
'cloudpickle=={}'.format(cloudpickle.__version__),
],
},
],
'name': 'sklearn_env'
}
Ładowanie sformatowanego modelu MLflow i przewidywań testów
Gdy środowisko będzie gotowe, przekaż SKlearnWrapper
środowisko , środowisko Conda i nowo utworzony słownik artefaktów do mlflow.pyfunc.save_model()
metody . Dzięki temu model zostanie zapisany na dysku.
mlflow_pyfunc_model_path = "sklearn_mlflow_pyfunc_custom"
mlflow.pyfunc.save_model(path=mlflow_pyfunc_model_path, python_model=SKLearnWrapper(), conda_env=conda_env, artifacts=artifacts)
Aby upewnić się, że nowo zapisany model MLflow sformatowany nie zmienił się podczas zapisywania, załaduj model i wyświetl przewidywanie testu, aby porównać oryginalny model.
Poniższy kod wyświetla przewidywanie testowe z sformatowanego modelu mlflow i przewidywanie testu z modelu sklearn. Zapisuje przewidywania testów na dysku w celu porównania.
loaded_model = mlflow.pyfunc.load_model(mlflow_pyfunc_model_path)
input_data = "<insert test data>"
# Evaluate the model
import pandas as pd
test_predictions = loaded_model.predict(input_data)
print(test_predictions)
# load the model from disk
import pickle
loaded_model = pickle.load(open(sklearn_model_path, 'rb'))
result = loaded_model.predict(input_data)
print(result)
Rejestrowanie sformatowanego modelu MLflow
Po potwierdzeniu, że model został poprawnie zapisany, możesz utworzyć przebieg testu. Zarejestruj i zapisz sformatowany model MLflow w rejestrze modeli.
mlflow.start_run()
mlflow.pyfunc.log_model(artifact_path=mlflow_pyfunc_model_path,
loader_module=None,
data_path=None,
code_path=None,
python_model=SKLearnWrapper(),
registered_model_name="Custom_mlflow_model",
conda_env=conda_env,
artifacts=artifacts)
mlflow.end_run()
Ważne
W niektórych przypadkach możesz użyć platformy uczenia maszynowego bez wbudowanej obsługi odmian modelu MLflow. Na przykład vaderSentiment
biblioteka jest standardową biblioteką przetwarzania języka naturalnego (NLP) używaną do analizy tonacji. Ponieważ nie ma wbudowanej wersji modelu MLflow, nie można rejestrować ani rejestrować modelu za pomocą płynnych interfejsów API modelu MLflow. Aby zapoznać się z przykładem zapisywania, rejestrowania i rejestrowania modelu, który nie ma obsługiwanej wbudowanej wersji modelu MLflow, zobacz Rejestrowanie nieobsługiwanego modelu uczenia maszynowego.