Руководство 2. Экспериментирование и обучение моделей с помощью функций
В этом руководстве показано, как функции легко интегрируют все этапы жизненного цикла машинного обучения: прототип, обучение и эксплуатацию.
В первом руководстве показано, как создать спецификацию набора компонентов с пользовательскими преобразованиями. Затем он показал, как использовать этот набор функций для создания обучающих данных, включения материализации и выполнения обратной заполнения. В этом руководстве показано, как включить материализацию и выполнить обратную заполнение. В нем также показано, как экспериментировать с функциями, как способ повышения производительности модели.
В этом руководстве описано следующее:
- Прототип новой
accounts
спецификации набора компонентов с помощью существующих предварительно вычисляемых значений в качестве функций. Затем зарегистрируйте спецификацию локального набора компонентов в качестве набора компонентов в хранилище компонентов. Этот процесс отличается от первого учебника, в котором вы создали набор функций, который имел пользовательские преобразования. - Выберите компоненты для модели из
transactions
наборов компонентов иaccounts
сохраните их в качестве спецификации извлечения компонентов. - Запустите конвейер обучения, использующий спецификацию извлечения признаков для обучения новой модели. Этот конвейер использует встроенный компонент извлечения компонентов для создания обучающих данных.
Необходимые компоненты
Прежде чем продолжить работу с этим руководством, обязательно выполните первое руководство в серии.
Настройка
Настройте записную книжку Машинное обучение Azure Spark.
Вы можете создать записную книжку и выполнить инструкции, описанные в этом руководстве, пошаговые инструкции. Вы также можете открыть и запустить существующую записную книжку с именем 2.Experiment-train-models-using-features.ipynb из каталога featurestore_sample/notebooks . Вы можете выбрать sdk_only или sdk_and_cli. Оставьте это руководство открытым и ознакомьтесь с ним по ссылкам документации и дополнительным пояснениям.
В верхнем меню в раскрывающемся списке вычислений выберите бессерверные вычисления Spark в разделе Машинное обучение Azure Бессерверный Spark.
Настройка сеанса:
- Когда панель инструментов отображает сеанс настройки, выберите его.
- На вкладке "Пакеты Python" выберите "Отправить файл Conda".
- Отправьте файл conda.yml, который вы добавили в первом руководстве.
- В качестве параметра можно увеличить время ожидания сеанса (время простоя), чтобы избежать частого повторного выполнения предварительных требований.
Запустите сеанс 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")
Настройте корневой каталог для примеров.
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")
Настройте интерфейс командной строки.
Неприменимо.
Инициализация переменных рабочей области проекта.
Это текущая рабочая область, а записная книжка учебника выполняется в этом ресурсе.
### 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 )
Инициализация переменных хранилища компонентов.
Обязательно обновите
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, )
Инициализировать клиент потребления хранилища компонентов.
# 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, )
Создайте вычислительный кластер с именем
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
набор функций, использующий предварительно вычисляемые значения.
Чтобы подключить предварительно подготовленные функции, можно создать спецификацию набора компонентов без написания кода преобразования. Спецификация набора компонентов используется для разработки и тестирования набора компонентов в полностью локальной среде разработки.
Вам не нужно подключаться к хранилищу компонентов. В этой процедуре вы создаете спецификацию набора компонентов локально, а затем примеры значений из него. Чтобы воспользоваться возможностями хранилище управляемых функций, необходимо использовать определение ресурса компонента для регистрации спецификации набора компонентов в хранилище компонентов. Дальнейшие действия в этом руководстве содержат дополнительные сведения.
Изучите исходные данные для учетных записей.
Примечание.
Эта записная книжка использует примеры данных, размещенных в общедоступном контейнере 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))
Создайте спецификацию
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, )
Экспорт в виде спецификации набора компонентов.
Чтобы зарегистрировать спецификацию набора компонентов в хранилище компонентов, необходимо сохранить спецификацию набора компонентов в определенном формате.
После выполнения следующей ячейки проверьте спецификацию созданного
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)
Локально экспериментируйте с незарегистрированными функциями и зарегистрируйтесь в хранилище компонентов при готовности
При разработке функций может потребоваться локально протестировать и проверить их, прежде чем зарегистрировать их в хранилище компонентов или запустить конвейеры обучения в облаке. Сочетание локального незарегистрированного набора компонентов () и набора компонентов, зарегистрированного в хранилище компонентов (accounts
transactions
) создает обучающие данные для модели машинного обучения.
Выберите компоненты для модели.
# 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"), ]
Локальное создание обучающих данных.
На этом шаге создаются данные обучения для иллюстрирующих целей. В качестве варианта можно локально обучить модели здесь. Далее в этом руководстве объясняется, как обучить модель в облаке.
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
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())
Получите зарегистрированный набор компонентов и проверьте его.
# look up the featureset by providing name and version accounts_featureset = featurestore.feature_sets.get("accounts", "1")
Запуск обучаемого эксперимента
В этих шагах вы выбираете список функций, запустите конвейер обучения и зарегистрируйте модель. Эти действия можно повторить, пока модель не будет выполняться по мере необходимости.
При необходимости обнаружение функций из пользовательского интерфейса хранилища компонентов.
В первом руководстве описан этот шаг при регистрации
transactions
набора компонентов. Так как у вас также естьaccounts
набор функций, вы можете просмотреть доступные функции:- Перейдите на Машинное обучение Azure глобальную целевую страницу.
- На левой панели выберите магазины компонентов.
- В списке хранилищ компонентов выберите хранилище компонентов, созданное ранее.
В пользовательском интерфейсе показаны наборы функций и созданные сущности. Выберите наборы функций для просмотра определений компонентов. Вы можете использовать глобальное поле поиска для поиска наборов компонентов в разных хранилищах компонентов.
При необходимости найдите функции из пакета 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
Выберите компоненты для модели и экспортируйте модель в качестве спецификации извлечения признаков.
На предыдущих шагах вы выбрали функции из сочетания зарегистрированных и незарегистрированных наборов компонентов для локального экспериментирования и тестирования. Теперь вы можете экспериментировать в облаке. Гибкость доставки моделей увеличивается, если вы сохраняете выбранные функции в качестве спецификации извлечения признаков, а затем используете спецификацию в операциях машинного обучения (MLOps) или непрерывной интеграции и непрерывной доставки (CI/CD) для обучения и вывода.
Выберите компоненты для модели.
# 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)
Экспорт выбранных функций в качестве спецификации извлечения компонентов.
Спецификация извлечения признаков — это переносимое определение списка функций, связанного с моделью. Это может помочь упростить разработку и эксплуатацию модели машинного обучения. Он становится входным данным для конвейера обучения, который создает данные обучения. Затем она упакована с моделью.
Этап вывода использует извлечение признаков для поиска функций. Он интегрирует все этапы жизненного цикла машинного обучения. Изменения в конвейере обучения и вывода могут оставаться как минимум при эксперименте и развертывании.
Использование спецификации извлечения компонентов и встроенного компонента извлечения компонентов является необязательным. Вы можете напрямую использовать
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 может активировать его на основе изменений спецификации извлечения компонентов в исходном репозитории. Вы можете зарегистрировать модель, если она удовлетворительна.
Запустите конвейер обучения.
Конвейер обучения состоит из следующих действий:
Извлечение признаков. Для входных данных этот встроенный компонент принимает спецификацию извлечения признаков, данные наблюдения и имя столбца метки времени. Затем он создает данные обучения в виде выходных данных. Он выполняет эти действия в качестве управляемого задания Spark.
Обучение. На основе обучающих данных этот шаг обучает модель, а затем создает модель (еще не зарегистрирована).
Оценка. Этот шаг проверяет, падает ли производительность и качество модели в пороговое значение. (В этом руководстве это шаг заполнителя для иллюстрации.)
Зарегистрируйте модель: этот шаг регистрирует модель.
Примечание.
Во втором руководстве вы выполнили задание обратной заполнения для материализации данных для
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)
Проверьте конвейер обучения и модель.
- Чтобы отобразить шаги конвейера, выберите гиперссылку для конвейера веб-представления и откройте ее в новом окне.
Используйте спецификацию извлечения признаков в артефактах модели:
- На левой панели текущей рабочей области выберите "Модели " с правой кнопкой мыши.
- Выберите "Открыть" на новой вкладке или окне.
- Выберите fraud_model.
- Выберите Артефакты.
Спецификация извлечения признаков упаковается вместе с моделью. Шаг регистрации модели в конвейере обучения обработал этот шаг. Вы создали спецификацию извлечения признаков во время эксперимента. Теперь это часть определения модели. В следующем руководстве вы узнаете, как используется процесс вывода.
Просмотр набора компонентов и зависимостей модели
Просмотрите список наборов компонентов, связанных с моделью.
На той же странице "Модели" выберите вкладку наборов компонентов. На этой вкладке
transactions
показаны как наборы компонентов, так иaccounts
наборы компонентов. Эта модель зависит от этих наборов компонентов.Просмотрите список моделей, использующих наборы функций:
- Откройте пользовательский интерфейс хранилища компонентов (описано ранее в этом руководстве).
- На левой панели выберите наборы компонентов.
- Выберите набор компонентов.
- Перейдите на вкладку Модели.
Спецификация извлечения признаков определила этот список при регистрации модели.
Очистка
В пятом руководстве серии описывается удаление ресурсов.
Следующие шаги
- Перейдите к следующему руководству в серии: включите повторяющуюся материализацию и запустите пакетное вывод.
- Узнайте о концепциях хранилища функций и сущностях верхнего уровня в хранилище управляемых функций.
- Узнайте о удостоверении и управлении доступом для хранилище управляемых функций.
- Просмотрите руководство по устранению неполадок для хранилище управляемых функций.
- Просмотрите ссылку YAML.