Я создаю конвейер, состоящий из 6 компонентов, используя Azure Machine Learning SDK2 Python, и в настоящее время работаю над 4 компонентом.
В своем сценарии я создал задание очистки для гипернастройки моей модели, которая представляет собой автоэнкодер. Скрипт выполняет следующие задачи:
Я сохраняю следующее:
mlflow.sklearn_log()
выдал предупреждение о том, что .predict
метод отсутствует (для меня эта функция была создана для сквозного конвейера + алгоритма из Sklearn), поэтому я использую собственный pyfunc из mlflowПосле нескольких экспериментов в работе я понял, что компонент SweepJob автоматически выводит лучшего дочернего элемента. Я не могу использовать mlflow_model
в качестве выхода, потому что у меня четыре разных выхода, а не один (мне нужны все четыре).
Я думал об использовании uri_folder, но не уверен, как перебирать uri_folder, чтобы получить мой ScalerAutoencoderWrapper, или использовать mlflow для развертывания модели на следующем этапе.
Мой вопрос:
Любые отзывы о том, как сохраняются файлы, также приветствуются. Большое спасибо!
Я приложил свой код.
.... PARTIAL CODE ...
# Log Model
with mlflow.start_run() as run:
# Build Model
autoencoder, encoder = build_model(
input_dim=input_dim,
hidden_layers=hidden_layers,
encoded_dim=encoded_dim,
l1_regularizer=l1_regularizer,
learning_rate=learning_rate,
return_encoder=return_encoder,
)
# Define Strategy
early_stopping = EarlyStopping(
monitor=MONITOR,
patience=patience,
restore_best_weights=True
)
# Fit & Keep History
autoencoder.fit(
X_scaled,
X_scaled,
epochs=epochs,
batch_size=batch_size,
validation_data=(X_validate_scaled, X_validate_scaled),
callbacks=[early_stopping, MLflowCallback()], # Log the final validation loss
)
# Save Model artifacts
input_raw_example = X_train.iloc[:5]
input_transformed = scalerObj.fit_transform(input_raw_example)
# Artifact Names
scaler_pkl = 'scaler.pkl'
encoder_folder = 'encoder'
autoencoder_folder= 'autoencoder'
autoencoder_wrapper_folder = 'scaler_autoencoder_wrapper'
# Save StandardScaler Object
print("--------------> Save Object Scaler")
with open('scaler.pkl', "wb") as f:
pickle.dump(scalerObj, f)
mlflow.log_artifact('scaler.pkl', run_id=run_id)
# Save encoder layers
print("--------------> Save Encoder")
mlflow.keras.log_model(encoder, 'encoder', input_example=input_transformed)
# Save Autoencoder model Only
print("--------------> Save AutoEncoder")
mlflow.keras.log_model(autoencoder, 'autoencoder', input_example=input_transformed)
# Save StandardScaler + Autoencoder
print("--------------> Save ScalerAutoencoderWrapper")
scaler_autoencoder_wrapper = ScalerAutoencoderWrapper(
scaler=scalerObj,
autoencoder=autoencoder
)
mlflow.pyfunc.log_model(
artifact_path='scaler_autoencoder_wrapper',
python_model=scaler_autoencoder_wrapper,
input_example=input_transformed,
signature=infer_signature(
model_input=input_transformed,
model_output=scaler_autoencoder_wrapper.predict(
context=None,
model_input=input_raw_example
)
),
)
print(f"Training Completed, Model and Scaler saved with id : {run_id}")
Мой код Python
# Create Nodes for Pipelines
@pipeline(default_compute = 'XXXX',
display_name = "ABCDE",
experiment_name = "EFGH",
tags = {'objective':'DONTKNOW'})
def pipeline_autoencoder(input_file):
# Step 1: Local Feature Selection
feature_extraction_step = feature_extraction(
input_file = input_file,
)
# Step 2: Local Split Selection
data_split_step = data_split (
input_file = feature_extraction_step.outputs.output_file,
)
# Step 3: Hyperparameter tuning (Sweep Job)
train_model_step = train_tune_model(
x_train=data_split_step.outputs.x_train_path,
y_train=data_split_step.outputs.y_train_path,
x_validate=data_split_step.outputs.x_validate_path,
y_validate=data_split_step.outputs.y_validate_path,
hidden_layers = Choice([str, str]),
encoded_dim=Choice([int]),
l1_regularizer=Choice([float, float),
learning_rate=Choice([float, float]),
batch_size=Choice([int, int]),
epochs=Choice([int, int]),
patience=Choice([int, int]),
)
# OverWrite
sweep_step = train_model_step.sweep(
compute='XXXX',
primary_metric = "METRIC",
goal = "MINIMIZE",
sampling_algorithm = "RANDOM",
)
sweep_step.early_termination = BanditPolicy(
evaluation_interval=INT,
slack_factor=FLOAT,
delay_evaluation=INT)
sweep_step.set_limits(max_total_trials=INT, max_concurrent_trials=INT, timeout=INT)
# Step 4
deploybestchild (NOT DONE ALREADY)
)
return {
'model_output': sweep_step.outputs.model_output,
"x_test": data_split_step.outputs.x_test_path,
"y_test": data_split_step.outputs.y_test_path,
}
uri_folder
и получил только закодированный файл хранилища больших двоичных объектов.os.walk(path)
, но у меня ничего не получилось, значит пусто# train model
model = train_model(params, X_train, X_test, y_train, y_test)
# Output the model and test data
# write to local folder first, then copy to output folder
mlflow.sklearn.save_model(model, "model")
from distutils.dir_util import copy_tree
# copy subdirectory example
from_directory = "model"
to_directory = args.model_output
copy_tree(from_directory, to_directory)
обновить ответ @JayashankarGS
Я искренне ценю вашу поддержку, но в настоящее время я сталкиваюсь с ошибкой, в которой говорится, что либо хранилище BLOB-объектов не существует, либо я получаю следующее: yaml.representer.RepresenterError: ('cannot represent an object')
.
Я заметил, что у вас хорошая репутация в решении подобных проблем. Не могли бы вы помочь мне со следующими вопросами?
pyfunc.log_model
. Должен ли я перейти с модели MLflow на пользовательскую модель, поскольку я использую pyfunc
? (в частности, относительно ввода/вывода YAML)outputs:
model_ouput:
type: **mlflow_model** or **custom_model**
description: ....
artifacts_output:
type: uri_folder
description:.....
Я попробовал установить (как вы предложили)
autoencoder_wrapper_folder = args.artifacts+'scaler_autoencoder_wrapper'`, but I encountered `yaml.representer.RepresenterError: ('cannot represent an object', PosixPath('/mnt/azureml/cr/j/ABCDE/cap/data-capability/wd/model_output/model'))
.
Следуя примеру Azure:
# copy subdirectory example
from_directory = "model"
to_directory = args.model_output
copy_tree(from_directory, to_directory)
Я получил ошибку: «модель не является каталогом». Затем я попробовал использовать os.getcwd()
, поскольку предполагал, что моя модель сохранена в текущем каталоге, но получил сообщение «Нет такого файла или каталога: '/mnt/azureml/cr/j/ABCDS/exe/wd/model». Кажется, модель там не сохраняется, и я не уверен, где ее сохраняет Машинное обучение Azure.
.h5
модели и объект StandardScaler
другому компоненту для оценки и регистрации. Это не идеально, но это единственный обходной путь, который я нашел. Я подозреваю, что pyfunc
может потребоваться другой подход для сохранения, но я не уверен, поскольку в документации представлены только простые примеры с использованием задания очистки и Sklearn.log_model или mlflow, но только с одной моделью, но не с моделями сохранения Sweep + mlflow».Вам необходимо зарегистрировать файлы в выходном расположении, которое вы настроили для компонента обучения.
Ниже приведен пример YML-файла компонента обучения.
$schema: https://azuremlschemas.azureedge.net/latest/commandComponent.schema.json
type: command
name: train_model
display_name: train_model
version: 1
inputs:
data:
type: uri_folder
....Your extra inputs
max_iter:
type: integer
default: -1
decision_function_shape:
type: string
default: ovr
break_ties:
type: boolean
default: false
random_state:
type: integer
default: 42
outputs:
model_output:
type: mlflow_model
artifacts:
type: uri_folder
code: ./train-src
environment: azureml:AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest
command: >-
python train.py
--data ${{inputs.data}}
...You extra arguements
--model_output ${{outputs.model_output}}
--artifacts ${{outputs.artifacts}}
Здесь, если вы видите выходные данные, имеющие model_output
и artifacts
, которые используются для регистрации модели и сохранения ваших файлов.
Передайте эти значения в аргументах компонента обучения, как показано ниже, и они будут сохранены.
train_model_step = train_tune_model(
x_train=data_split_step.outputs.x_train_path,
y_train=data_split_step.outputs.y_train_path,
x_validate=data_split_step.outputs.x_validate_path,
y_validate=data_split_step.outputs.y_validate_path,
hidden_layers = Choice([str, str]),
encoded_dim=Choice([int]),
l1_regularizer=Choice([float, float),
learning_rate=Choice([float, float]),
batch_size=Choice([int, int]),
epochs=Choice([int, int]),
patience=Choice([int, int]),
model_output = "Path to save model",
artifacts = "Path to save artifacts."
)
Ниже код, который нужно сохранить.
# Artifact Names
scaler_pkl = args.artifacts+'scaler.pkl'
encoder_folder = args.artifacts+'encoder'
autoencoder_folder= args.artifacts+'autoencoder'
autoencoder_wrapper_folder = args.artifacts+'scaler_autoencoder_wrapper'
# Save StandardScaler Object
print("--------------> Save Object Scaler")
with open(scaler_pkl, "wb") as f:
pickle.dump(scalerObj, f)
# Save encoder layers
print("--------------> Save Encoder")
mlflow.keras.log_model(encoder, encoder_folder, input_example=input_transformed)
# Save Autoencoder model Only
print("--------------> Save AutoEncoder")
mlflow.keras.log_model(autoencoder, autoencoder_folder, input_example=input_transformed)
# Save StandardScaler + Autoencoder
print("--------------> Save ScalerAutoencoderWrapper")
scaler_autoencoder_wrapper = ScalerAutoencoderWrapper(
scaler=scalerObj,
autoencoder=autoencoder
)
mlflow.pyfunc.log_model(
artifact_path=autoencoder_wrapper_folder,
python_model=scaler_autoencoder_wrapper,
input_example=input_transformed,
signature=infer_signature(
model_input=input_transformed,
model_output=scaler_autoencoder_wrapper.predict(
context=None,
model_input=input_raw_example
)
),
)
и сохраните модель mlflow в args.model_output
.
Далее вы получаете доступ к модели в sweep_step.outputs.model_output
и
артефакты в sweep_step.outputs.artifacts
.
То же самое делается в приведенном вами примере кода Azure.
mlflow.sklearn.save_model(model, "model")
from distutils.dir_util import copy_tree
# copy subdirectory example
from_directory = "model"
to_directory = args.model_output
copy_tree(from_directory, to_directory)
После сохранения модели mlflow в папке model все файлы внутри копируются в выходную папку, указанную args.model_output
.
Но я указал путь для сохранения вместо копирования.
Какие пути вы указали для model_output и артефактов?
Также попробуйте сохранить модели вместо регистрации. mlflow.keras.save_model
--model_output_path ${{outputs.model_output}} --artifacts_output_path ${{outputs.artifacts_output}} model_output: type: mlflow_model & artifacts_output: type: uri_folder .... Я сохранил объект и модель Sklearn как pkl и h5 и сохранил артефакты_ouputs (он работает), затем создайте еще один компонент для загрузки модели, оценки некоторых данных и регистрации модели (в зависимости от результатов оценки)
Да, вы указываете тот же путь вывода для следующего компонента для оценки. Вы можете увидеть файлы, сохраненные в этом месте?
да, но только если я сохраню их в формате file_folder и .h5, но если я использую mlflow keras.log_model или pyfunc wapper, я получаю эту ошибку. Я решил сохранить файл в каталоге, а затем заново собрать модель. Большое спасибо.
Для сохранения типа mlflow вы указываете модель типа mlflow. который определен в разделе вывода компонента. выходные данные: model_output: тип: mlflow_model Здесь модель будет сохранена как mlflow по указанному пути.
Для сохранения типа mlflow вы указываете модель типа mlflow. который определен в разделе вывода компонента. выходные данные: model_output: type: mlflow_model Здесь модель будет сохранена как mlflow по заданному пути --- В ответ: кажется, это работает с --- методом по умолчанию Anymodel.log_model --- но когда вы создаете пользовательскую оболочку pyfunc, это выдает много ошибок, или, может быть, это само задание очистки, поскольку оно запускает несколько испытаний одновременно, кто знает, я уже спрашивал Microsoft, надеясь, что они смогут предоставить дополнительную документацию
ваш пользовательский объект-оболочка должен иметь метод прогнозирования и должен наследовать mlflow.pyfunc.PythonModel, проверьте это условие. Также обратитесь к этой документации для индивидуального ведения журнала Learn.microsoft.com/en-us/azure/machine-learning/…
Большое спасибо за вашу помощь, я следовал вашим отзывам и многим другим подходам, но у меня все еще есть та же проблема.