Как вывести и развернуть несколько артефактов из компонента «Лучший дочерний элемент в задании очистки»?

Я создаю конвейер, состоящий из 6 компонентов, используя Azure Machine Learning SDK2 Python, и в настоящее время работаю над 4 компонентом.

В своем сценарии я создал задание очистки для гипернастройки моей модели, которая представляет собой автоэнкодер. Скрипт выполняет следующие задачи:

  • Создает и обучает автоэнкодер
  • Создайте автоэнкодер (обученный)
  • Получите слой кодировщика (для анализа)
  • Подходит для стандартного скалера (объекта)
  • Регистрируйте метрики с помощью mlflow

Я сохраняю следующее:

  • Модель автоэнкодера
  • Слои кодировщика
  • Объект StandardScaler (для анализа)
  • ScalerAutoencoderWrapper (StandardScaler fit + keras.model.predict) mlflow.sklearn_log() выдал предупреждение о том, что .predict метод отсутствует (для меня эта функция была создана для сквозного конвейера + алгоритма из Sklearn), поэтому я использую собственный pyfunc из mlflow

После нескольких экспериментов в работе я понял, что компонент SweepJob автоматически выводит лучшего дочернего элемента. Я не могу использовать mlflow_model в качестве выхода, потому что у меня четыре разных выхода, а не один (мне нужны все четыре).

Я думал об использовании uri_folder, но не уверен, как перебирать uri_folder, чтобы получить мой ScalerAutoencoderWrapper, или использовать mlflow для развертывания модели на следующем этапе.

Мой вопрос:

  1. Как я могу вывести все эти папки, особенно ScalerAutoencoderWrapper, и передать их как uri_folder? Кроме того
  2. как я могу использовать MLflow для развертывания ScalerAutoencoderWrapper в следующем компоненте, сохраняя при этом другие файлы?

Любые отзывы о том, как сохраняются файлы, также приветствуются. Большое спасибо!

Я приложил свой код.


.... 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,

        
    }
  1. Я попытался вывести файл из задания очистки как uri_folder и получил только закодированный файл хранилища больших двоичных объектов.
  2. Я пытался выполнить итерацию с помощью os.walk(path), но у меня ничего не получилось, значит пусто
  3. Я попытался последовать этому примеру Пример гиперпараметров Azure пожалуйста, ты можешь сказать мне, почему они это делают
# 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').

Я заметил, что у вас хорошая репутация в решении подобных проблем. Не могли бы вы помочь мне со следующими вопросами?

  1. Действительно ли Sweep Job выводит лучшую модель? Я вижу модель с выходом 2 Trials, но нет документации, подтверждающей мое предположение.
  2. Я использую pyfunc.log_model. Должен ли я перейти с модели MLflow на пользовательскую модель, поскольку я использую pyfunc? (в частности, относительно ввода/вывода YAML)
outputs:
  model_ouput:
    type: **mlflow_model** or **custom_model**
    description: ....
  artifacts_output:
    type: uri_folder
    description:.....

  1. Я попробовал установить (как вы предложили) 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')).

  2. Следуя примеру 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.

  1. Мой конвейер в настоящее время состоит из Шага 1, Шага 2, Очистки -> Оценка. На данный момент я передаю файл .h5 модели и объект StandardScaler другому компоненту для оценки и регистрации. Это не идеально, но это единственный обходной путь, который я нашел. Я подозреваю, что pyfunc может потребоваться другой подход для сохранения, но я не уверен, поскольку в документации представлены только простые примеры с использованием задания очистки и Sklearn.log_model или mlflow, но только с одной моделью, но не с моделями сохранения Sweep + mlflow».
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Ниже приведен пример 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.

Но я указал путь для сохранения вместо копирования.

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

Marvin 12.08.2024 08:13

Какие пути вы указали для model_output и артефактов?

JayashankarGS 12.08.2024 08:19

Также попробуйте сохранить модели вместо регистрации. mlflow.keras.save_model

JayashankarGS 12.08.2024 08:20

--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 (он работает), затем создайте еще один компонент для загрузки модели, оценки некоторых данных и регистрации модели (в зависимости от результатов оценки)

Marvin 12.08.2024 08:42

Да, вы указываете тот же путь вывода для следующего компонента для оценки. Вы можете увидеть файлы, сохраненные в этом месте?

JayashankarGS 12.08.2024 09:55

да, но только если я сохраню их в формате file_folder и .h5, но если я использую mlflow keras.log_model или pyfunc wapper, я получаю эту ошибку. Я решил сохранить файл в каталоге, а затем заново собрать модель. Большое спасибо.

Marvin 13.08.2024 09:12

Для сохранения типа mlflow вы указываете модель типа mlflow. который определен в разделе вывода компонента. выходные данные: model_output: тип: mlflow_model Здесь модель будет сохранена как mlflow по указанному пути.

JayashankarGS 13.08.2024 09:18

Для сохранения типа mlflow вы указываете модель типа mlflow. который определен в разделе вывода компонента. выходные данные: model_output: type: mlflow_model Здесь модель будет сохранена как mlflow по заданному пути --- В ответ: кажется, это работает с --- методом по умолчанию Anymodel.log_model --- но когда вы создаете пользовательскую оболочку pyfunc, это выдает много ошибок, или, может быть, это само задание очистки, поскольку оно запускает несколько испытаний одновременно, кто знает, я уже спрашивал Microsoft, надеясь, что они смогут предоставить дополнительную документацию

Marvin 13.08.2024 11:17

ваш пользовательский объект-оболочка должен иметь метод прогнозирования и должен наследовать mlflow.pyfunc.PythonModel, проверьте это условие. Также обратитесь к этой документации для индивидуального ведения журнала Learn.microsoft.com/en-us/azure/machine-learning/…

JayashankarGS 13.08.2024 11:37

Другие вопросы по теме