MLflow modellerini günlüğe kaydetme

Bu makalede, eğitilen modellerinizin (veya yapıtlarınızın) MLflow modelleri olarak nasıl günlüğe kaydedildiği açıklanır. MLflow'un modellerinizi nasıl paketleyişini ve bu modelleri nasıl çalıştıracaklarını özelleştirmenin farklı yollarını keşfeder.

Neden yapıtlar yerine modelleri günlüğe kaydetmeli?

MLflow'da yapıtlardan modellere, MLflow modellerini günlüğe kaydetmeye kıyasla günlük yapıtları veya dosyaları arasındaki farkı açıklar.

MLflow modeli de bir yapıttır. Ancak bu model, modeli oluşturan kişi ile kullanmayı amaçlayan kişi arasında sözleşme görevi görecek belirli bir yapıya sahiptir. Bu sözleşme, yapıtların kendileri ve anlamları arasında bir köprü oluşturulmasına yardımcı olur.

Model günlüğü şu avantajlara sahiptir:

  • Modelleri çıkarım için ile mlflow.<flavor>.load_modeldoğrudan yükleyebilir ve işlevini kullanabilirsiniz predict
  • İşlem hattı girişleri modelleri doğrudan kullanabilir
  • Puanlama betiği veya ortam belirtmeden modelleri dağıtabilirsiniz
  • Dağıtılan uç noktalarda Swagger otomatik olarak etkinleştirilir ve Azure Machine Learning stüdyosu Test özelliğini kullanabilir
  • Sorumlu yapay zeka panosunu kullanabilirsiniz

Bu bölümde, MLflow ile Azure Machine Learning'de modelin kavramının nasıl kullanılacağı açıklanmaktadır:

Otomatik kaydetme kullanarak modelleri günlüğe kaydetme

MLflow otomatik tamamlama işlevini kullanabilirsiniz. Otomatik kaydetme, MLflow'un çerçevenin ilgili olarak değerlendirdiğini düşündüğü tüm ölçümleri, parametreleri, yapıtları ve modelleri günlüğe kaydetmek için kullanılan çerçeveyi bildirmesine olanak tanır. Varsayılan olarak, otomatik kaydetme etkinse çoğu model günlüğe kaydedilir. Bazı durumlarda, bazı tatlar bir modeli günlüğe kaydetmeyebilir. Örneğin, PySpark aroması belirli bir boyutu aşan modelleri günlüğe kaydetmez.

mlflow.autolog() Otomatik kaydetmeyi etkinleştirmek için veya mlflow.<flavor>.autolog() kullanın. Bu örnek, XGBoost ile eğitilen bir sınıflandırıcı modelini günlüğe kaydetmek için kullanır autolog() :

import mlflow
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score

mlflow.autolog()

model = XGBClassifier(use_label_encoder=False, eval_metric="logloss")
model.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=False)

y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)

İpucu

Scikit-Learn işlem hatları gibi Machine Learning işlem hatlarını kullanıyorsanız modelleri günlüğe kaydetmek için bu işlem hattı özelliğinin işlevselliğini kullanın autolog . Yöntem işlem hattı nesnesinde fit() çağrıldığında model günlüğü otomatik olarak gerçekleşir. MLflow not defteriyle bir XGBoost sınıflandırıcısını eğitmek ve izlemek, işlem hatlarını kullanarak bir modelin ön işleme ile nasıl günlüğe kaydedileceklerini gösterir.

Özel imza, ortam veya örneklerle modelleri günlüğe kaydetme

MLflow mlflow.<flavor>.log_model yöntemi modelleri el ile günlüğe kaydedebilir. Bu iş akışı, model günlüğünün farklı yönlerini denetleyebilir.

Şu durumlarda bu yöntemi kullanın:

  • Pip paketlerini veya otomatik olarak algılananlardan farklı bir conda ortamını belirtmek istiyorsunuz
  • Giriş örnekleri eklemek istiyorsunuz
  • Belirli yapıtları gerekli pakete eklemek istiyorsunuz
  • autolog imzanızı doğru çıkarmıyor. Bu, imzanın belirli şekillere ihtiyaç duyduğu tensor girişleriyle uğraşırken önemlidir
  • Otomatik tamamlama davranışı bir nedenden dolayı amacınızı kapsamaz

Bu kod örneği, XGBoost sınıflandırıcısı için bir modeli günlüğe kaydeder:

import mlflow
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score
from mlflow.models import infer_signature
from mlflow.utils.environment import _mlflow_conda_env

mlflow.autolog(log_models=False)

model = XGBClassifier(use_label_encoder=False, eval_metric="logloss")
model.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=False)
y_pred = model.predict(X_test)

accuracy = accuracy_score(y_test, y_pred)

# Signature
signature = infer_signature(X_test, y_test)

# Conda environment
custom_env =_mlflow_conda_env(
    additional_conda_deps=None,
    additional_pip_deps=["xgboost==1.5.2"],
    additional_conda_channels=None,
)

# Sample
input_example = X_train.sample(n=1)

# Log the model manually
mlflow.xgboost.log_model(model, 
                         artifact_path="classifier", 
                         conda_env=custom_env,
                         signature=signature,
                         input_example=input_example)

Not

  • autolog yapılandırmaya log_models=False sahiptir. Bu, otomatik MLflow modeli günlüğünü engeller. Otomatik MLflow model günlüğü daha sonra el ile gerçekleştirilen bir işlem olarak gerçekleşir
  • İmzayı infer_signature doğrudan girişlerden ve çıkışlardan çıkarmaya çalışmak için yöntemini kullanın
  • mlflow.utils.environment._mlflow_conda_env yöntemi, MLflow SDK'sında özel bir yöntemdir. Bu örnekte, kodu daha basit hale getirir, ancak dikkatli kullanın. Gelecekte değişebilir. Alternatif olarak YAML tanımını Python sözlüğü olarak el ile oluşturabilirsiniz.

Tahmin yönteminde farklı davranışa sahip modelleri günlüğe kaydetme

Veya mlflow.<flavor>.log_modelile mlflow.autolog bir modeli günlüğe kaydettiğinizde, modelin türü çıkarımın nasıl yürütüleceğini ve modelin ne döndüreceğini belirler. MLflow, sonuçların oluşturulmasıyla predict ilgili belirli bir davranışı zorunlu kılmaz. Bazı senaryolarda, modeliniz yürütülmeden önce ve sonra bazı ön işleme veya işlem sonrası işlemler yapmak isteyebilirsiniz.

Bu durumda girişlerden çıkışlara doğrudan taşınan makine öğrenmesi işlem hatlarını uygulayın. Bu uygulama mümkün olsa ve bazen performansı geliştirmek için teşvik edilse de, elde etmek zor olabilir. Bu gibi durumlarda, modelinizin çıkarımla nasıl başa çıkabileceğini sonraki bölümde açıklandığı gibi özelleştirmenize yardımcı olabilir.

Özel modelleri günlüğe kaydetme

MLflow, dahil olmak üzere birçok makine öğrenmesi çerçevesini destekler

  • CatBoost
  • FastAI
  • h2o
  • Keras
  • LightGBM
  • MLeap
  • MXNet Gluon
  • ONNX
  • Peygamber
  • PyTorch
  • Scikit-Learn
  • spaCy
  • Spark MLLib
  • statsmodeller
  • TensorFlow
  • XGBoost

Ancak, bir aromanın çalışma şeklini değiştirmeniz, MLflow tarafından yerel olarak desteklenmeyen bir modeli günlüğe kaydetmeniz ve hatta farklı çerçevelerden birden çok öğe kullanan bir modeli günlüğe kaydetmeniz gerekebilir. Bu gibi durumlarda, özel bir model türü oluşturmanız gerekebilir.

MLflow, sorunu çözmek için aromayı pyfunc tanıtır (Python işlevinden başlayarak). Bu özellik, nesne iki koşulu karşıladıkça herhangi bir nesneyi model olarak günlüğe kaydedebilir:

  • Yöntem predict yöntemini en azından uygularsınız
  • Python nesnesinin devraldığı yer: mlflow.pyfunc.PythonModel

İpucu

Scikit-learn API'sini uygulayan serileştirilebilir modeller, modelin Scikit-learn ile oluşturulmuş olup olmadığına bakılmaksızın modeli günlüğe kaydetmek için Scikit-learn türünü kullanabilir. Modelinizi Pickle biçiminde kalıcı hale getirebiliyorsanız ve nesnesi ve yöntemlerine predict() (en azından) sahipse, modeli bir MLflow çalıştırmasının içinde günlüğe kaydetmek için kullanabilirsinizmlflow.sklearn.log_model().predict_proba()

Mevcut model nesnenizin çevresinde bir sarmalayıcı oluşturursanız, özel modeliniz için bir tür oluşturmak en kolay hale gelir. MLflow bunu sizin için seri hale getirerek paketler. Python nesneleri, nesne dosya sisteminde genellikle Pickle biçiminde bir dosya olarak depolanabilirse seri hale getirilebilir. Çalışma zamanında nesnesi bu dosyadan gerçekleştirebilir. Bu, kaydedildiğinde kullanılabilen tüm değerleri, özellikleri ve yöntemleri geri yükler.

Şu durumlarda bu yöntemi kullanın:

  • Modelinizi Pickle biçiminde seri hale getirebilirsiniz
  • Modelin durumunu eğitimden hemen sonra olduğu gibi korumak istiyorsunuz
  • İşlevin predict nasıl çalıştığını özelleştirmek istiyorsunuz.

Bu kod örneği, XGBoost flavor varsayılan uygulamasından farklı bir şekilde davranmasını sağlamak için XGBoost ile oluşturulan bir modeli sarmalar. Bunun yerine, sınıflar yerine olasılıkları döndürür:

from mlflow.pyfunc import PythonModel, PythonModelContext

class ModelWrapper(PythonModel):
    def __init__(self, model):
        self._model = model

    def predict(self, context: PythonModelContext, data):
        # You don't have to keep the semantic meaning of `predict`. You can use here model.recommend(), model.forecast(), etc
        return self._model.predict_proba(data)

    # You can even add extra functions if you need to. Since the model is serialized,
    # all of them will be available when you load your model back.
    def predict_batch(self, data):
        pass

Çalıştırmada özel bir modeli günlüğe kaydedin:

import mlflow
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score
from mlflow.models import infer_signature

mlflow.xgboost.autolog(log_models=False)

model = XGBClassifier(use_label_encoder=False, eval_metric="logloss")
model.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=False)
y_probs = model.predict_proba(X_test)

accuracy = accuracy_score(y_test, y_probs.argmax(axis=1))
mlflow.log_metric("accuracy", accuracy)

signature = infer_signature(X_test, y_probs)
mlflow.pyfunc.log_model("classifier", 
                        python_model=ModelWrapper(model),
                        signature=signature)

İpucu

Burada yöntemi, imzayı infer_signature çıkarsamak için kullanır y_probs . Hedef sütunumuzda hedef sınıf vardır, ancak modelimiz artık her sınıf için iki olasılığı döndürür.

Sonraki adımlar