Как сохранить встроенный трансформатор в BLOB-объекте, чтобы ваш конвейер прогнозирования мог использовать его в службе AML? - PullRequest
1 голос
/ 12 июня 2019

Я строю конвейер преобразования и обучения данных в Azure Machine Leaning Service.Я хотел бы сохранить свой встроенный трансформатор (например, tf-idf) в BLOB-объекте, чтобы мой конвейер прогнозирования мог позже получить к нему доступ.

transformed_data = PipelineData("transformed_data", 
                               datastore = default_datastore,
                               output_path_on_compute="my_project/tfidf")

step_tfidf = PythonScriptStep(name = "tfidf_step",
                              script_name = "transform.py",
                              arguments = ['--input_data', blob_train_data, 
                                           '--output_folder', transformed_data],
                              inputs = [blob_train_data],
                              outputs = [transformed_data],
                              compute_target = aml_compute,
                              source_directory = project_folder,
                              runconfig = run_config,
                              allow_reuse = False)

Приведенный выше код сохраняет преобразователь в папку текущего цикла, которая динамически генерируется при каждом запуске.

Я хочу сохранить преобразователь в фиксированном месте на BLOB-объекте, чтобы я мог получить к нему доступ позже, при вызове конвейера прогнозирования.

Я попытался использовать экземпляр класса DataReference в качествеPythonScriptStep вывод, но это приводит к ошибке: ValueError: Unexpected output type: <class 'azureml.data.data_reference.DataReference'>

Это потому, что PythonScriptStep принимает только PipelineData или OutputPortBinding объекты в качестве выходных данных.

Как я могу сохранить свойвстроенный трансформатор, чтобы он был позже доступен любому процессу (например, мой конвейер прогнозирования)?

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Другое решение - передать DataReference в качестве ввода для PythonScriptStep.

Затем внутри transform.py вы можете прочитать это DataReference в качестве аргумента командной строки.

Вы можете проанализировать его и использовать как обычный путь для сохранения вашего векторизатора.

например. Вы можете:

step_tfidf = PythonScriptStep(name = "tfidf_step",
                              script_name = "transform.py",
                              arguments = ['--input_data', blob_train_data, 
                                           '--output_folder', transformed_data,
                                           '--transformer_path', trained_transformer_path],
                              inputs = [blob_train_data, trained_transformer_path],
                              outputs = [transformed_data],
                              compute_target = aml_compute,
                              source_directory = project_folder,
                              runconfig = run_config,
                              allow_reuse = False)

Тогда внутри вашего скрипта (transform.py в приведенном выше примере) вы можете, например ::

import argparse
import joblib as jbl
import os

from sklearn.feature_extraction.text import TfidfVectorizer

parser = argparse.ArgumentParser()
parser.add_argument('--transformer_path', dest="transformer_path", required=True)
args = parser.parse_args()

tfidf = ### HERE CREATE AND TRAIN YOUR VECTORIZER ###

vect_filename = os.path.join(args.vectorizer_path, 'my_vectorizer.jbl')


ДОПОЛНИТЕЛЬНО: Третий способ - просто зарегистрировать векторизатор в качестве другой модели в вашем рабочем пространстве. Затем вы можете использовать его точно так же, как любую другую зарегистрированную модель. (Хотя эта опция не предполагает явной записи в blob - как указано в вопросе выше)

1 голос
/ 16 июня 2019

Это, вероятно, недостаточно гибко для ваших нужд (также я еще не проверял это), но если вы используете scikit-learn, одна возможность - включить шаг tf-idf / translation в scikit-learn Pipeline возьмите и зарегистрируйте это в своем рабочем пространстве.

Таким образом, ваш учебный скрипт будет содержать:

pipeline = Pipeline([
    ('vectorizer', TfidfVectorizer(stop_words = list(text.ENGLISH_STOP_WORDS))),
    ('classifier', SGDClassifier()
])

pipeline.fit(train[label].values, train[pred_label].values)

# Serialize the pipeline
joblib.dump(value=pipeline, filename='outputs/model.pkl')

, а ваш сценарий отправки эксперимента будет содержать

run = exp.submit(src)
run.wait_for_completion(show_output = True)
model = run.register_model(model_name='my_pipeline', model_path='outputs/model.pkl')

Тогда,Вы можете использовать зарегистрированную «модель» и развернуть ее как службу, как объяснено в документации , загрузив ее в сценарий скоринга с помощью

model_path = Model.get_model_path('my_pipeline')
# deserialize the model file back into a sklearn model
model = joblib.load(model_path) 

Однако это может привести к преобразованию вваш конвейер, и, следовательно, не будет таким модульным, как вы просите ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...