Поделиться через


Руководство 2. Экспериментирование и обучение моделей с помощью функций

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

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

В этом руководстве описано следующее:

  • Прототип новой accounts спецификации набора компонентов с помощью существующих предварительно вычисляемых значений в качестве функций. Затем зарегистрируйте спецификацию локального набора компонентов в качестве набора компонентов в хранилище компонентов. Этот процесс отличается от первого учебника, в котором вы создали набор функций, который имел пользовательские преобразования.
  • Выберите компоненты для модели из transactions наборов компонентов и accounts сохраните их в качестве спецификации извлечения компонентов.
  • Запустите конвейер обучения, использующий спецификацию извлечения признаков для обучения новой модели. Этот конвейер использует встроенный компонент извлечения компонентов для создания обучающих данных.

Необходимые компоненты

Прежде чем продолжить работу с этим руководством, обязательно выполните первое руководство в серии.

Настройка

  1. Настройте записную книжку Машинное обучение Azure Spark.

    Вы можете создать записную книжку и выполнить инструкции, описанные в этом руководстве, пошаговые инструкции. Вы также можете открыть и запустить существующую записную книжку с именем 2.Experiment-train-models-using-features.ipynb из каталога featurestore_sample/notebooks . Вы можете выбрать sdk_only или sdk_and_cli. Оставьте это руководство открытым и ознакомьтесь с ним по ссылкам документации и дополнительным пояснениям.

    1. В верхнем меню в раскрывающемся списке вычислений выберите бессерверные вычисления Spark в разделе Машинное обучение Azure Бессерверный Spark.

    2. Настройка сеанса:

      1. Когда панель инструментов отображает сеанс настройки, выберите его.
      2. На вкладке "Пакеты Python" выберите "Отправить файл Conda".
      3. Отправьте файл conda.yml, который вы добавили в первом руководстве.
      4. В качестве параметра можно увеличить время ожидания сеанса (время простоя), чтобы избежать частого повторного выполнения предварительных требований.
  2. Запустите сеанс Spark.

    # run this cell to start the spark session (any code block will start the session ). This can take around 10 mins.
    print("start spark session")
  3. Настройте корневой каталог для примеров.

    import os
    
    # please update the dir to ./Users/<your_user_alias> (or any custom directory you uploaded the samples to).
    # You can find the name from the directory structure in the left nav
    root_dir = "./Users/<your_user_alias>/featurestore_sample"
    
    if os.path.isdir(root_dir):
        print("The folder exists.")
    else:
        print("The folder does not exist. Please create or fix the path")
  4. Настройте интерфейс командной строки.

    Неприменимо.


  1. Инициализация переменных рабочей области проекта.

    Это текущая рабочая область, а записная книжка учебника выполняется в этом ресурсе.

    ### Initialize the MLClient of this project workspace
    import os
    from azure.ai.ml import MLClient
    from azure.ai.ml.identity import AzureMLOnBehalfOfCredential
    
    project_ws_sub_id = os.environ["AZUREML_ARM_SUBSCRIPTION"]
    project_ws_rg = os.environ["AZUREML_ARM_RESOURCEGROUP"]
    project_ws_name = os.environ["AZUREML_ARM_WORKSPACE_NAME"]
    
    # connect to the project workspace
    ws_client = MLClient(
        AzureMLOnBehalfOfCredential(), project_ws_sub_id, project_ws_rg, project_ws_name
    )
  2. Инициализация переменных хранилища компонентов.

    Обязательно обновите featurestore_name значения и featurestore_location значения, чтобы отразить то, что вы создали в первом руководстве.

    from azure.ai.ml import MLClient
    from azure.ai.ml.identity import AzureMLOnBehalfOfCredential
    
    # feature store
    featurestore_name = (
        "<FEATURESTORE_NAME>"  # use the same name from part #1 of the tutorial
    )
    featurestore_subscription_id = os.environ["AZUREML_ARM_SUBSCRIPTION"]
    featurestore_resource_group_name = os.environ["AZUREML_ARM_RESOURCEGROUP"]
    
    # feature store ml client
    fs_client = MLClient(
        AzureMLOnBehalfOfCredential(),
        featurestore_subscription_id,
        featurestore_resource_group_name,
        featurestore_name,
    )
  3. Инициализировать клиент потребления хранилища компонентов.

    # feature store client
    from azureml.featurestore import FeatureStoreClient
    from azure.ai.ml.identity import AzureMLOnBehalfOfCredential
    
    featurestore = FeatureStoreClient(
        credential=AzureMLOnBehalfOfCredential(),
        subscription_id=featurestore_subscription_id,
        resource_group_name=featurestore_resource_group_name,
        name=featurestore_name,
    )
  4. Создайте вычислительный кластер с именем cpu-cluster в рабочей области проекта.

    Этот вычислительный кластер требуется при выполнении заданий обучения или пакетного вывода.

    from azure.ai.ml.entities import AmlCompute
    
    cluster_basic = AmlCompute(
        name="cpu-cluster-fs",
        type="amlcompute",
        size="STANDARD_F4S_V2",  # you can replace it with other supported VM SKUs
        location=ws_client.workspaces.get(ws_client.workspace_name).location,
        min_instances=0,
        max_instances=1,
        idle_time_before_scale_down=360,
    )
    ws_client.begin_create_or_update(cluster_basic).result()

Создание набора функций учетных записей в локальной среде

В первом руководстве вы создали transactions набор компонентов, который имел пользовательские преобразования. Здесь вы создадите accounts набор функций, использующий предварительно вычисляемые значения.

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

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

  1. Изучите исходные данные для учетных записей.

    Примечание.

    Эта записная книжка использует примеры данных, размещенных в общедоступном контейнере BLOB-объектов. wasbs Только драйвер может прочитать его в Spark. При создании наборов компонентов с помощью собственных исходных данных размещайте эти наборы компонентов в учетной записи Azure Data Lake Storage 2-го поколения и используйте abfss драйвер в пути к данным.

    accounts_data_path = "wasbs://data@azuremlexampledata.blob.core.windows.net/feature-store-prp/datasources/accounts-precalculated/*.parquet"
    accounts_df = spark.read.parquet(accounts_data_path)
    
    display(accounts_df.head(5))
  2. Создайте спецификацию accounts набора компонентов локально из этих предварительно подготовленных компонентов.

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

    from azureml.featurestore import create_feature_set_spec, FeatureSetSpec
    from azureml.featurestore.contracts import (
        DateTimeOffset,
        Column,
        ColumnType,
        SourceType,
        TimestampColumn,
    )
    from azureml.featurestore.feature_source import ParquetFeatureSource
    
    
    accounts_featureset_spec = create_feature_set_spec(
        source=ParquetFeatureSource(
            path="wasbs://data@azuremlexampledata.blob.core.windows.net/feature-store-prp/datasources/accounts-precalculated/*.parquet",
            timestamp_column=TimestampColumn(name="timestamp"),
        ),
        index_columns=[Column(name="accountID", type=ColumnType.string)],
        # account profiles in the source are updated once a year. set temporal_join_lookback to 365 days
        temporal_join_lookback=DateTimeOffset(days=365, hours=0, minutes=0),
        infer_schema=True,
    )
  3. Экспорт в виде спецификации набора компонентов.

    Чтобы зарегистрировать спецификацию набора компонентов в хранилище компонентов, необходимо сохранить спецификацию набора компонентов в определенном формате.

    После выполнения следующей ячейки проверьте спецификацию созданного accounts набора компонентов. Чтобы просмотреть спецификацию, откройте файл featurestore/featuresets/accounts/spec/FeatureSetSpec.yaml из дерева файлов.

    Спецификация содержит следующие важные элементы:

    • source: ссылка на ресурс хранилища. В этом случае это файл Parquet в ресурсе хранилища BLOB-объектов.

    • features: список функций и их типов данных. В предоставленном коде преобразования код должен возвращать кадр данных, который сопоставляется с функциями и типами данных. Без предоставленного кода преобразования система создает запрос для сопоставления функций и типов данных с источником. В этом случае спецификация созданного accounts набора компонентов не содержит код преобразования, так как компоненты предварительно компютируются.

    • index_columns: ключи соединения, необходимые для доступа к значениям из набора компонентов.

    Дополнительные сведения см. в статье "Основные сведения о сущностях верхнего уровня" в хранилище управляемых функций и ресурсах схемы набора компонентов CLI (версии 2).

    В качестве дополнительного преимущества сохранение поддерживает управление версиями.

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

    import os
    
    # create a new folder to dump the feature set spec
    accounts_featureset_spec_folder = root_dir + "/featurestore/featuresets/accounts/spec"
    
    # check if the folder exists, create one if not
    if not os.path.exists(accounts_featureset_spec_folder):
        os.makedirs(accounts_featureset_spec_folder)
    
    accounts_featureset_spec.dump(accounts_featureset_spec_folder, overwrite=True)

Локально экспериментируйте с незарегистрированными функциями и зарегистрируйтесь в хранилище компонентов при готовности

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

  1. Выберите компоненты для модели.

    # get the registered transactions feature set, version 1
    transactions_featureset = featurestore.feature_sets.get("transactions", "1")
    # Notice that account feature set spec is in your local dev environment (this notebook): not registered with feature store yet
    features = [
        accounts_featureset_spec.get_feature("accountAge"),
        accounts_featureset_spec.get_feature("numPaymentRejects1dPerUser"),
        transactions_featureset.get_feature("transaction_amount_7d_sum"),
        transactions_featureset.get_feature("transaction_amount_3d_sum"),
        transactions_featureset.get_feature("transaction_amount_7d_avg"),
    ]
  2. Локальное создание обучающих данных.

    На этом шаге создаются данные обучения для иллюстрирующих целей. В качестве варианта можно локально обучить модели здесь. Далее в этом руководстве объясняется, как обучить модель в облаке.

    from azureml.featurestore import get_offline_features
    
    # Load the observation data. To understand observatio ndata, refer to part 1 of this tutorial
    observation_data_path = "wasbs://data@azuremlexampledata.blob.core.windows.net/feature-store-prp/observation_data/train/*.parquet"
    observation_data_df = spark.read.parquet(observation_data_path)
    obs_data_timestamp_column = "timestamp"
    # generate training dataframe by using feature data and observation data
    training_df = get_offline_features(
        features=features,
        observation_data=observation_data_df,
        timestamp_column=obs_data_timestamp_column,
    )
    
    # Ignore the message that says feature set is not materialized (materialization is optional). We will enable materialization in the next part of the tutorial.
    display(training_df)
    # Note: display(training_df.head(5)) displays the timestamp column in a different format. You can can call training_df.show() to see correctly formatted value
  3. accounts Зарегистрируйте набор компонентов в хранилище компонентов.

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

    from azure.ai.ml.entities import FeatureSet, FeatureSetSpecification
    
    accounts_fset_config = FeatureSet(
        name="accounts",
        version="1",
        description="accounts featureset",
        entities=[f"azureml:account:1"],
        stage="Development",
        specification=FeatureSetSpecification(path=accounts_featureset_spec_folder),
        tags={"data_type": "nonPII"},
    )
    
    poller = fs_client.feature_sets.begin_create_or_update(accounts_fset_config)
    print(poller.result())
  4. Получите зарегистрированный набор компонентов и проверьте его.

    # look up the featureset by providing name and version
    accounts_featureset = featurestore.feature_sets.get("accounts", "1")

Запуск обучаемого эксперимента

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

  1. При необходимости обнаружение функций из пользовательского интерфейса хранилища компонентов.

    В первом руководстве описан этот шаг при регистрации transactions набора компонентов. Так как у вас также есть accounts набор функций, вы можете просмотреть доступные функции:

    1. Перейдите на Машинное обучение Azure глобальную целевую страницу.
    2. На левой панели выберите магазины компонентов.
    3. В списке хранилищ компонентов выберите хранилище компонентов, созданное ранее.

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

  2. При необходимости найдите функции из пакета SDK.

    # List available feature sets
    all_featuresets = featurestore.feature_sets.list()
    for fs in all_featuresets:
        print(fs)
    
    # List of versions for transactions feature set
    all_transactions_featureset_versions = featurestore.feature_sets.list(
        name="transactions"
    )
    for fs in all_transactions_featureset_versions:
        print(fs)
    
    # See properties of the transactions featureset including list of features
    featurestore.feature_sets.get(name="transactions", version="1").features
  3. Выберите компоненты для модели и экспортируйте модель в качестве спецификации извлечения признаков.

    На предыдущих шагах вы выбрали функции из сочетания зарегистрированных и незарегистрированных наборов компонентов для локального экспериментирования и тестирования. Теперь вы можете экспериментировать в облаке. Гибкость доставки моделей увеличивается, если вы сохраняете выбранные функции в качестве спецификации извлечения признаков, а затем используете спецификацию в операциях машинного обучения (MLOps) или непрерывной интеграции и непрерывной доставки (CI/CD) для обучения и вывода.

    1. Выберите компоненты для модели.

      # you can select features in pythonic way
      features = [
          accounts_featureset.get_feature("accountAge"),
          transactions_featureset.get_feature("transaction_amount_7d_sum"),
          transactions_featureset.get_feature("transaction_amount_3d_sum"),
      ]
      
      # you can also specify features in string form: featurestore:featureset:version:feature
      more_features = [
          f"accounts:1:numPaymentRejects1dPerUser",
          f"transactions:1:transaction_amount_7d_avg",
      ]
      
      more_features = featurestore.resolve_feature_uri(more_features)
      
      features.extend(more_features)
    2. Экспорт выбранных функций в качестве спецификации извлечения компонентов.

      Спецификация извлечения признаков — это переносимое определение списка функций, связанного с моделью. Это может помочь упростить разработку и эксплуатацию модели машинного обучения. Он становится входным данным для конвейера обучения, который создает данные обучения. Затем она упакована с моделью.

      Этап вывода использует извлечение признаков для поиска функций. Он интегрирует все этапы жизненного цикла машинного обучения. Изменения в конвейере обучения и вывода могут оставаться как минимум при эксперименте и развертывании.

      Использование спецификации извлечения компонентов и встроенного компонента извлечения компонентов является необязательным. Вы можете напрямую использовать get_offline_features() API, как показано ранее. Имя спецификации должно быть feature_retrieval_spec.yaml при его упаковке с помощью модели. Таким образом, система может распознать ее.

      # Create feature retrieval spec
      feature_retrieval_spec_folder = root_dir + "/project/fraud_model/feature_retrieval_spec"
      
      # check if the folder exists, create one if not
      if not os.path.exists(feature_retrieval_spec_folder):
          os.makedirs(feature_retrieval_spec_folder)
      
      featurestore.generate_feature_retrieval_spec(feature_retrieval_spec_folder, features)

Обучение в облаке с помощью конвейеров и регистрация модели

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

  1. Запустите конвейер обучения.

    Конвейер обучения состоит из следующих действий:

    1. Извлечение признаков. Для входных данных этот встроенный компонент принимает спецификацию извлечения признаков, данные наблюдения и имя столбца метки времени. Затем он создает данные обучения в виде выходных данных. Он выполняет эти действия в качестве управляемого задания Spark.

    2. Обучение. На основе обучающих данных этот шаг обучает модель, а затем создает модель (еще не зарегистрирована).

    3. Оценка. Этот шаг проверяет, падает ли производительность и качество модели в пороговое значение. (В этом руководстве это шаг заполнителя для иллюстрации.)

    4. Зарегистрируйте модель: этот шаг регистрирует модель.

      Примечание.

      Во втором руководстве вы выполнили задание обратной заполнения для материализации данных для transactions набора компонентов. Шаг извлечения признаков считывает значения компонентов из автономного хранилища для этого набора компонентов. Такое же поведение, даже если вы используете get_offline_features() API.

      from azure.ai.ml import load_job  # will be used later
      
      training_pipeline_path = (
          root_dir + "/project/fraud_model/pipelines/training_pipeline.yaml"
      )
      training_pipeline_definition = load_job(source=training_pipeline_path)
      training_pipeline_job = ws_client.jobs.create_or_update(training_pipeline_definition)
      ws_client.jobs.stream(training_pipeline_job.name)
      # Note: First time it runs, each step in pipeline can take ~ 15 mins. However subsequent runs can be faster (assuming spark pool is warm - default timeout is 30 mins)
    5. Проверьте конвейер обучения и модель.

      • Чтобы отобразить шаги конвейера, выберите гиперссылку для конвейера веб-представления и откройте ее в новом окне.
  2. Используйте спецификацию извлечения признаков в артефактах модели:

    1. На левой панели текущей рабочей области выберите "Модели " с правой кнопкой мыши.
    2. Выберите "Открыть" на новой вкладке или окне.
    3. Выберите fraud_model.
    4. Выберите Артефакты.

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

Просмотр набора компонентов и зависимостей модели

  1. Просмотрите список наборов компонентов, связанных с моделью.

    На той же странице "Модели" выберите вкладку наборов компонентов. На этой вкладке transactions показаны как наборы компонентов, так и accounts наборы компонентов. Эта модель зависит от этих наборов компонентов.

  2. Просмотрите список моделей, использующих наборы функций:

    1. Откройте пользовательский интерфейс хранилища компонентов (описано ранее в этом руководстве).
    2. На левой панели выберите наборы компонентов.
    3. Выберите набор компонентов.
    4. Перейдите на вкладку Модели.

    Спецификация извлечения признаков определила этот список при регистрации модели.

Очистка

В пятом руководстве серии описывается удаление ресурсов.

Следующие шаги