Руководство 6. Изоляция сети с хранилищем компонентов
Машинное обучение Azure хранилище управляемых функций позволяет обнаруживать, создавать и использовать функции. Функции служат соединительной тканью в жизненном цикле машинного обучения, начиная с этапа прототипирования, где вы экспериментируйте с различными функциями. Этот жизненный цикл продолжается на этапе эксплуатации, где вы развертываете модели и выполняете поиск данных функций. Дополнительные сведения о хранилищах компонентов см. в документе о концепции хранилища компонентов.
В этом руководстве описывается настройка безопасного входящего трафика через частную конечную точку и безопасный исходящий трафик через управляемую виртуальную сеть.
Часть 1 этой серии учебников показала, как создать спецификацию набора компонентов с пользовательскими преобразованиями и использовать этот набор функций для создания обучающих данных. Часть 2 серии показала, как включить материализацию и выполнить обратную заполнение. Кроме того, часть 2 показала, как экспериментировать с функциями, как способ повысить производительность модели. Часть 3 показала, как хранилище функций повышает гибкость в потоках экспериментов и обучения. В части 3 также описано, как выполнять пакетное вывод. В руководстве 4 описано, как использовать хранилище функций для вариантов использования вывода в режиме реального времени. В руководстве 5 показано, как разработать набор компонентов с помощью пользовательского источника данных. Руководство 6 показано, как
- Настройте необходимые ресурсы для сетевой изоляции хранилище управляемых функций.
- Создайте ресурс хранилища компонентов.
- Настройте хранилище функций для поддержки сценариев сетевой изоляции.
- Обновите рабочую область проекта (текущую рабочую область), чтобы обеспечить поддержку сценариев сетевой изоляции.
Предварительные требования
Примечание.
В этом руководстве используется записная книжка Машинное обучение Azure с бессерверными вычислениями Spark.
Рабочая область Машинное обучение Azure с поддержкой управляемой виртуальной сети для бессерверных заданий Spark
Чтобы настроить рабочую область проекта, выполните следующие действия.
Создайте файл YAML с именем
network.yml
:managed_network: isolation_mode: allow_internet_outbound
Выполните следующие команды, чтобы обновить рабочую область и подготовить управляемую виртуальную сеть для бессерверных заданий Spark:
az ml workspace update --file network.yml --resource-group my_resource_group --name my_workspace_name az ml workspace provision-network --resource-group my_resource_group --name my_workspace_name --include-spark
Дополнительные сведения см. в разделе "Настройка для бессерверного задания Spark".
Учетная запись пользователя должна
Owner
Contributor
иметь или роль, назначенную группе ресурсов, в которой создается хранилище компонентов. Ваша учетная запись пользователя также нуждается вUser Access Administrator
роли.
Внимание
Для рабочей области Машинное обучение Azure задайте значение isolation_mode
allow_internet_outbound
. Это единственный поддерживаемый режим сетевой изоляции. В этом руководстве показано, как подключиться к источникам, хранилищу материализации и данным наблюдения безопасно через частные конечные точки.
Настройка
В этом руководстве используется основной пакет SDK для хранилища компонентов Python (azureml-featurestore
). Пакет SDK для Python используется только для разработки и тестирования набора компонентов. Интерфейс командной строки используется для операций создания, чтения, обновления и удаления (CRUD) в хранилищах компонентов, наборах компонентов и сущностях хранилища компонентов. Это полезно в сценариях непрерывной интеграции и непрерывной доставки (CI/CD) или GitOps, где интерфейс командной строки или YAML предпочтителен.
Вам не нужно явно устанавливать эти ресурсы для этого руководства, conda.yaml
так как в приведенных здесь инструкциях по настройке файл охватывает их.
Чтобы подготовить среду записной книжки для разработки, выполните следующие действия.
Клонируйте репозиторий azureml-examples в локальные ресурсы GitHub с помощью следующей команды:
git clone --depth 1 https://github.com/Azure/azureml-examples
Вы также можете скачать ZIP-файл из репозитория azureml-examples . На этой странице сначала выберите
code
раскрывающийся список, а затем выберитеDownload ZIP
. Затем распакуйте содержимое в папку на локальном устройстве.Отправка каталога примеров хранилища компонентов в рабочую область проекта
- В рабочей области Машинное обучение Azure откройте пользовательский интерфейс Студия машинного обучения Azure
- Выбор записных книжек на панели навигации слева
- Выберите имя пользователя в списке каталогов
- Выберите многоточие (...) и выберите "Отправить папку"
- Выберите папку примеров хранилища компонентов из клонированного пути клонированного каталога:
azureml-examples/sdk/python/featurestore-sample
Запуск учебника
Вариант 1. Создание записной книжки и выполнение инструкций в этом документе пошаговые инструкции
Вариант 2. Открытие существующей записной книжки
featurestore_sample/notebooks/sdk_and_cli/network_isolation/Network-isolation-feature-store.ipynb
. Этот документ можно открывать и ссылаться на него для получения дополнительных объяснений и ссылок на документацию- Выберите бессерверные вычисления Spark в раскрывающемся списке вычислений в верхней области навигации. Эта операция может занять от одного до двух минут. Дождитесь отображения сеанса настройки в верхней части строки состояния
- Выберите " Настройка сеанса " в верхней строке состояния
- Выбор пакетов Python
- Выберите "Отправить файл conda"
- Выбор файла
azureml-examples/sdk/python/featurestore-sample/project/env/conda.yml
, расположенного на локальном устройстве - (Необязательно) Увеличьте время ожидания сеанса (время простоя в минутах), чтобы сократить время запуска бессерверного кластера Spark.
Эта ячейка кода запускает сеанс Spark. Для установки всех зависимостей и запуска сеанса Spark требуется около 10 минут.
# 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 your alias below (or any custom directory you have uploaded the samples to). # You can find the name from the directory structure in the left navigation. 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")
Настройте интерфейс командной строки Машинное обучение Azure:
Установка расширения интерфейса командной строки Машинное обучение Azure
# install azure ml cli extension !az extension add --name ml
Аутентификация
# authenticate !az login
Настройка подписки по умолчанию
# Set default subscription import os subscription_id = os.environ["AZUREML_ARM_SUBSCRIPTION"] !az account set -s $subscription_id
Примечание.
Рабочая область хранилища функций поддерживает повторное использование функций в проектах. Рабочая область проекта , используемая в текущей рабочей области, использует функции из определенного хранилища функций для обучения и вывода моделей. Многие рабочие области проекта могут совместно использовать одну и ту же рабочую область хранилища функций.
Подготовка необходимых ресурсов
Вы можете создать новую учетную запись хранения и контейнеры Azure Data Lake Storage (ADLS) 2-го поколения или повторно использовать существующие учетные записи хранения и ресурсы контейнеров для хранилища компонентов. В реальной ситуации различные учетные записи хранения могут размещать контейнеры ADLS 2-го поколения. Оба варианта работают в зависимости от ваших требований.
В этом руководстве вы создадите три отдельных контейнера хранилища в одной учетной записи хранения ADLS 2-го поколения:
- Исходные данные
- Автономное хранилище
- Данные наблюдения
Создайте учетную запись хранения ADLS 2-го поколения для исходных данных, автономного хранения и данных наблюдения.
Укажите имя учетной записи хранения Azure Data Lake Storage 2-го поколения в следующем примере кода. Вы можете выполнить следующую ячейку кода с указанными параметрами по умолчанию. При необходимости можно переопределить параметры по умолчанию.
## Default Setting # We use the subscription, resource group, region of this active project workspace, # We hard-coded default resource names for creating new resources ## Overwrite # You can replace them if you want to create the resources in a different subsciprtion/resourceGroup, or use existing resources # At the minimum, provide an ADLS Gen2 storage account name for `storage_account_name` storage_subscription_id = os.environ["AZUREML_ARM_SUBSCRIPTION"] storage_resource_group_name = os.environ["AZUREML_ARM_RESOURCEGROUP"] storage_account_name = "<STORAGE_ACCOUNT_NAME>" storage_location = "eastus" storage_file_system_name_offline_store = "offline-store" storage_file_system_name_source_data = "source-data" storage_file_system_name_observation_data = "observation-data"
Эта ячейка кода создает учетную запись хранения ADLS 2-го поколения, определенную в приведенной выше ячейке кода.
# Create new storage account !az storage account create --name $storage_account_name --enable-hierarchical-namespace true --resource-group $storage_resource_group_name --location $storage_location --subscription $storage_subscription_id
Эта ячейка кода создает новый контейнер хранилища для автономного хранилища.
# Create a new storage container for offline store !az storage fs create --name $storage_file_system_name_offline_store --account-name $storage_account_name --subscription $storage_subscription_id
Эта ячейка кода создает новый контейнер хранилища для исходных данных.
# Create a new storage container for source data !az storage fs create --name $storage_file_system_name_source_data --account-name $storage_account_name --subscription $storage_subscription_id
Эта ячейка кода создает новый контейнер хранилища для данных наблюдения.
# Create a new storage container for observation data !az storage fs create --name $storage_file_system_name_observation_data --account-name $storage_account_name --subscription $storage_subscription_id
Скопируйте образец данных, необходимых для этого руководства, в только что созданные контейнеры хранилища.
Чтобы записать данные в контейнеры хранения, убедитесь, что роли участника и участника больших двоичных объектов хранилища назначаются идентификатору пользователя в созданной учетной записи хранения ADLS 2-го поколения в портал Azure ниже.
Внимание
После того как вы убедитесь, что роли участника и участника данных BLOB-объектов хранилища назначаются удостоверению пользователя, подождите несколько минут после назначения роли, чтобы разрешить распространение разрешений, прежде чем продолжить дальнейшие действия. Дополнительные сведения об управлении доступом см. на странице управления доступом на основе ролей (RBAC) для учетных записей хранения Azure.
Следующие ячейки кода копируют образец исходных данных для набора функций транзакций, используемых в этом руководстве из учетной записи общедоступного хранения в только что созданную учетную запись хранения.
# Copy sample source data for transactions feature set used in this tutorial series from the public storage account to the newly created storage account transactions_source_data_path = "wasbs://data@azuremlexampledata.blob.core.windows.net/feature-store-prp/datasources/transactions-source/*.parquet" transactions_src_df = spark.read.parquet(transactions_source_data_path) transactions_src_df.write.parquet( f"abfss://{storage_file_system_name_source_data}@{storage_account_name}.dfs.core.windows.net/transactions-source/" )
Для набора функций учетной записи, используемого в этом руководстве, скопируйте образец исходных данных для набора компонентов учетной записи в только что созданную учетную запись хранения.
# Copy sample source data for account feature set used in this tutorial series from the public storage account to the newly created storage account accounts_data_path = "wasbs://data@azuremlexampledata.blob.core.windows.net/feature-store-prp/datasources/accounts-precalculated/*.parquet" accounts_data_df = spark.read.parquet(accounts_data_path) accounts_data_df.write.parquet( f"abfss://{storage_file_system_name_source_data}@{storage_account_name}.dfs.core.windows.net/accounts-precalculated/" )
Скопируйте образец данных наблюдения, используемых для обучения из учетной записи общедоступного хранения в только что созданную учетную запись хранения.
# Copy sample observation data used for training from the public storage account to the newly created storage account observation_data_train_path = "wasbs://data@azuremlexampledata.blob.core.windows.net/feature-store-prp/observation_data/train/*.parquet" observation_data_train_df = spark.read.parquet(observation_data_train_path) observation_data_train_df.write.parquet( f"abfss://{storage_file_system_name_observation_data}@{storage_account_name}.dfs.core.windows.net/train/" )
Скопируйте примеры данных наблюдения, используемых для пакетного вывода из учетной записи общедоступного хранения, в только что созданную учетную запись хранения.
# Copy sample observation data used for batch inference from a public storage account to the newly created storage account observation_data_inference_path = "wasbs://data@azuremlexampledata.blob.core.windows.net/feature-store-prp/observation_data/batch_inference/*.parquet" observation_data_inference_df = spark.read.parquet(observation_data_inference_path) observation_data_inference_df.write.parquet( f"abfss://{storage_file_system_name_observation_data}@{storage_account_name}.dfs.core.windows.net/batch_inference/" )
Отключите доступ к общедоступной сети в созданной учетной записи хранения.
Эта ячейка кода отключает доступ к общедоступной сети для учетной записи хранения ADLS 2-го поколения, созданной ранее.
# Disable the public network access for the above created ADLS Gen2 storage account !az storage account update --name $storage_account_name --resource-group $storage_resource_group_name --subscription $storage_subscription_id --public-network-access disabled
Задайте идентификаторы ARM для автономного хранилища, исходных данных и контейнеров данных наблюдения.
# set the container arm id offline_store_gen2_container_arm_id = "/subscriptions/{sub_id}/resourceGroups/{rg}/providers/Microsoft.Storage/storageAccounts/{account}/blobServices/default/containers/{container}".format( sub_id=storage_subscription_id, rg=storage_resource_group_name, account=storage_account_name, container=storage_file_system_name_offline_store, ) print(offline_store_gen2_container_arm_id) source_data_gen2_container_arm_id = "/subscriptions/{sub_id}/resourceGroups/{rg}/providers/Microsoft.Storage/storageAccounts/{account}/blobServices/default/containers/{container}".format( sub_id=storage_subscription_id, rg=storage_resource_group_name, account=storage_account_name, container=storage_file_system_name_source_data, ) print(source_data_gen2_container_arm_id) observation_data_gen2_container_arm_id = "/subscriptions/{sub_id}/resourceGroups/{rg}/providers/Microsoft.Storage/storageAccounts/{account}/blobServices/default/containers/{container}".format( sub_id=storage_subscription_id, rg=storage_resource_group_name, account=storage_account_name, container=storage_file_system_name_observation_data, ) print(observation_data_gen2_container_arm_id)
Создание хранилища компонентов с включенной материализацией
Настройка параметров хранилища компонентов
Задайте имя хранилища функций, расположение, идентификатор подписки, имя группы и значения идентификатора ARM, как показано в этом примере ячейки кода:
# We use the subscription, resource group, region of this active project workspace.
# Optionally, you can replace them to create the resources in a different subsciprtion/resourceGroup, or use existing resources
import os
# At the minimum, define a name for the feature store
featurestore_name = "<FEATURESTORE_NAME>"
# It is recommended to create featurestore in the same location as the storage
featurestore_location = storage_location
featurestore_subscription_id = os.environ["AZUREML_ARM_SUBSCRIPTION"]
featurestore_resource_group_name = os.environ["AZUREML_ARM_RESOURCEGROUP"]
feature_store_arm_id = "/subscriptions/{sub_id}/resourceGroups/{rg}/providers/Microsoft.MachineLearningServices/workspaces/{ws_name}".format(
sub_id=featurestore_subscription_id,
rg=featurestore_resource_group_name,
ws_name=featurestore_name,
)
Эта ячейка кода создает файл спецификации YAML для хранилища компонентов с включенной материализацией.
# The below code creates a feature store with enabled materialization
import yaml
config = {
"$schema": "http://azureml/sdk-2-0/FeatureStore.json",
"name": featurestore_name,
"location": featurestore_location,
"compute_runtime": {"spark_runtime_version": "3.3"},
"offline_store": {
"type": "azure_data_lake_gen2",
"target": offline_store_gen2_container_arm_id,
},
}
feature_store_yaml = root_dir + "/featurestore/featurestore_with_offline_setting.yaml"
with open(feature_store_yaml, "w") as outfile:
yaml.dump(config, outfile, default_flow_style=False)
Создание хранилища компонентов
Эта ячейка кода использует файл спецификации YAML, созданный на предыдущем шаге, для создания хранилища компонентов с включенной материализацией.
!az ml feature-store create --file $feature_store_yaml --subscription $featurestore_subscription_id --resource-group $featurestore_resource_group_name
Инициализация основного клиента пакета SDK для хранилища компонентов Машинное обучение Azure
Клиент SDK, инициализированный в этой ячейке, упрощает разработку и использование функций:
# 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,
)
Назначение ролей удостоверению пользователя в хранилище компонентов
Следуйте этим инструкциям, чтобы получить идентификатор объекта Microsoft Entra для удостоверения пользователя. Затем используйте идентификатор объекта Microsoft Entra в следующей команде, чтобы назначить роль azureML Специалист по обработке и анализу данных идентификатору пользователя в созданном хранилище компонентов.
your_aad_objectid = "<YOUR_AAD_OBJECT_ID>"
!az role assignment create --role "AzureML Data Scientist" --assignee-object-id $your_aad_objectid --assignee-principal-type User --scope $feature_store_arm_id
Получение учетной записи хранения по умолчанию и хранилища ключей для хранилища компонентов и отключение доступа к соответствующим ресурсам общедоступной сети
Следующая ячейка кода возвращает объект хранилища компонентов для следующих шагов.
fs = featurestore.feature_stores.get()
Эта ячейка кода возвращает имена учетной записи хранения по умолчанию и хранилища ключей для хранилища компонентов.
# Copy the properties storage_account and key_vault from the response returned in feature store show command respectively
default_fs_storage_account_name = fs.storage_account.rsplit("/", 1)[-1]
default_key_vault_name = fs.key_vault.rsplit("/", 1)[-1]
Эта ячейка кода отключает доступ к учетной записи хранения по умолчанию для хранилища компонентов.
# Disable the public network access for the above created default ADLS Gen2 storage account for the feature store
!az storage account update --name $default_fs_storage_account_name --resource-group $featurestore_resource_group_name --subscription $featurestore_subscription_id --public-network-access disabled
Следующая ячейка выводит имя хранилища ключей по умолчанию для хранилища компонентов.
print(default_key_vault_name)
Отключение доступа к общедоступной сети для хранилища ключей хранилища ключей по умолчанию, созданного ранее.
- В портал Azure откройте хранилище ключей по умолчанию, созданное в предыдущей ячейке.
- Перейдите на вкладку Сеть.
- Выберите " Отключить общедоступный доступ" и нажмите кнопку "Применить" в левом нижнем углу страницы.
Включение управляемой виртуальной сети для рабочей области хранилища компонентов
Обновление хранилища компонентов с помощью необходимых правил исходящего трафика
Следующая ячейка кода создает файл спецификации YAML для правил исходящего трафика, определенных для хранилища компонентов.
# The below code creates a configuration for managed virtual network for the feature store
import yaml
config = {
"public_network_access": "disabled",
"managed_network": {
"isolation_mode": "allow_internet_outbound",
"outbound_rules": [
# You need to add multiple rules here if you have separate storage account for source, observation data and offline store.
{
"name": "sourcerulefs",
"destination": {
"spark_enabled": "true",
"subresource_target": "dfs",
"service_resource_id": f"/subscriptions/{storage_subscription_id}/resourcegroups/{storage_resource_group_name}/providers/Microsoft.Storage/storageAccounts/{storage_account_name}",
},
"type": "private_endpoint",
},
# This rule is added currently because serverless Spark doesn't automatically create a private endpoint to default key vault.
{
"name": "defaultkeyvault",
"destination": {
"spark_enabled": "true",
"subresource_target": "vault",
"service_resource_id": f"/subscriptions/{featurestore_subscription_id}/resourcegroups/{featurestore_resource_group_name}/providers/Microsoft.Keyvault/vaults/{default_key_vault_name}",
},
"type": "private_endpoint",
},
],
},
}
feature_store_managed_vnet_yaml = (
root_dir + "/featurestore/feature_store_managed_vnet_config.yaml"
)
with open(feature_store_managed_vnet_yaml, "w") as outfile:
yaml.dump(config, outfile, default_flow_style=False)
Эта ячейка кода использует созданный файл спецификации YAML для обновления хранилища компонентов.
!az ml feature-store update --file $feature_store_managed_vnet_yaml --name $featurestore_name --resource-group $featurestore_resource_group_name
Создание частных конечных точек для определенных правил исходящего трафика
Команда provision-network
создает частные конечные точки из управляемой виртуальной сети, где задание материализации выполняется в исходном, автономном хранилище, данных наблюдения, учетной записи хранения по умолчанию и хранилище ключей по умолчанию для хранилища компонентов. Для выполнения этой команды может потребоваться около 20 минут.
#### Provision network to create necessary private endpoints (it may take approximately 20 minutes)
!az ml feature-store provision-network --name $featurestore_name --resource-group $featurestore_resource_group_name --include-spark
Эта ячейка кода подтверждает создание частных конечных точек, определенных правилами исходящего трафика.
### Check that managed virtual network is correctly enabled
### After provisioning the network, all the outbound rules should become active
### For this tutorial, you will see 6 outbound rules
!az ml feature-store show --name $featurestore_name --resource-group $featurestore_resource_group_name
Обновление управляемой виртуальной сети для рабочей области проекта
Затем обновите управляемую виртуальную сеть для рабочей области проекта. Сначала получите идентификатор подписки, группу ресурсов и имя рабочей области проекта.
# lookup the subscription id, resource group and workspace name of the current workspace
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"]
Обновление рабочей области проекта с помощью необходимых правил исходящего трафика
Рабочая область проекта должна иметь доступ к этим ресурсам:
- Исходные данные
- Автономное хранилище
- Данные наблюдения
- Хранилище компонентов
- Учетная запись хранения по умолчанию хранилища компонентов
Эта ячейка кода обновляет рабочую область проекта с помощью созданного файла спецификации YAML с необходимыми правилами исходящего трафика.
# The below code creates a configuration for managed virtual network for the project workspace
import yaml
config = {
"managed_network": {
"isolation_mode": "allow_internet_outbound",
"outbound_rules": [
# Incase you have separate storage accounts for source, observation data and offline store, you need to add multiple rules here. No action needed otherwise.
{
"name": "projectsourcerule",
"destination": {
"spark_enabled": "true",
"subresource_target": "dfs",
"service_resource_id": f"/subscriptions/{storage_subscription_id}/resourcegroups/{storage_resource_group_name}/providers/Microsoft.Storage/storageAccounts/{storage_account_name}",
},
"type": "private_endpoint",
},
# Rule to create private endpoint to default storage of feature store
{
"name": "defaultfsstoragerule",
"destination": {
"spark_enabled": "true",
"subresource_target": "blob",
"service_resource_id": f"/subscriptions/{featurestore_subscription_id}/resourcegroups/{featurestore_resource_group_name}/providers/Microsoft.Storage/storageAccounts/{default_fs_storage_account_name}",
},
"type": "private_endpoint",
},
# Rule to create private endpoint to default key vault of feature store
{
"name": "defaultfskeyvaultrule",
"destination": {
"spark_enabled": "true",
"subresource_target": "vault",
"service_resource_id": f"/subscriptions/{featurestore_subscription_id}/resourcegroups/{featurestore_resource_group_name}/providers/Microsoft.Keyvault/vaults/{default_key_vault_name}",
},
"type": "private_endpoint",
},
# Rule to create private endpoint to feature store
{
"name": "featurestorerule",
"destination": {
"spark_enabled": "true",
"subresource_target": "amlworkspace",
"service_resource_id": f"/subscriptions/{featurestore_subscription_id}/resourcegroups/{featurestore_resource_group_name}/providers/Microsoft.MachineLearningServices/workspaces/{featurestore_name}",
},
"type": "private_endpoint",
},
],
}
}
project_ws_managed_vnet_yaml = (
root_dir + "/featurestore/project_ws_managed_vnet_config.yaml"
)
with open(project_ws_managed_vnet_yaml, "w") as outfile:
yaml.dump(config, outfile, default_flow_style=False)
Эта ячейка кода обновляет рабочую область проекта с помощью созданного файла спецификации YAML с правилами исходящего трафика.
#### Update project workspace to create private endpoints for the defined outbound rules (it may take approximately 15 minutes)
!az ml workspace update --file $project_ws_managed_vnet_yaml --name $project_ws_name --resource-group $project_ws_rg
Эта ячейка кода подтверждает создание частных конечных точек, определенных правилами исходящего трафика.
!az ml workspace show --name $project_ws_name --resource-group $project_ws_rg
Вы также можете проверить правила исходящего трафика из портал Azure. Перейдите к сети из левой панели навигации для рабочей области проекта, а затем откройте вкладку "Управляемый исходящий доступ рабочей области".
Создание прототипа и разработки набора компонентов агрегирования транзакций
Изучение исходных данных транзакций
Примечание.
В общедоступном контейнере BLOB-объектов размещаются примеры данных, используемых в этом руководстве. Его можно считывать только в Spark с помощью wasbs
драйвера. При создании наборов компонентов с помощью собственных исходных данных разместите их в учетной записи ADLS 2-го abfss
поколения и используйте драйвер в пути к данным.
# remove the "." in the root directory path as we need to generate absolute path to read from Spark
transactions_source_data_path = f"abfss://{storage_file_system_name_source_data}@{storage_account_name}.dfs.core.windows.net/transactions-source/*.parquet"
transactions_src_df = spark.read.parquet(transactions_source_data_path)
display(transactions_src_df.head(5))
# Note: display(training_df.head(5)) displays the timestamp column in a different format. You can can call transactions_src_df.show() to see correctly formatted value
Локальная разработка набора функций транзакций
Спецификация набора компонентов — это автономное определение набора компонентов, которое можно разрабатывать и тестировать локально.
Создайте следующие агрегатные функции скользящего окна:
- количество транзакций за три дня
- сумма транзакций в три дня
- сумма транзакций трехдневная средняя
- количество транзакций с семидневным числом
- сумма транзакций с семидневной суммой
- сумма транзакций в семь дней
Проверьте файл featurestore/featuresets/transactions/spec/transformation_code/transaction_transform.py
кода преобразования признаков. Этот преобразователь Spark выполняет скользящей агрегат, определенный для функций.
Дополнительные сведения о наборе функций и преобразованиях см. в основных понятиях хранилища функций.
from azureml.featurestore import create_feature_set_spec, FeatureSetSpec
from azureml.featurestore.contracts import (
DateTimeOffset,
FeatureSource,
TransformationCode,
Column,
ColumnType,
SourceType,
TimestampColumn,
)
transactions_featureset_code_path = (
root_dir + "/featurestore/featuresets/transactions/transformation_code"
)
transactions_featureset_spec = create_feature_set_spec(
source=FeatureSource(
type=SourceType.parquet,
path=f"abfss://{storage_file_system_name_source_data}@{storage_account_name}.dfs.core.windows.net/transactions-source/*.parquet",
timestamp_column=TimestampColumn(name="timestamp"),
source_delay=DateTimeOffset(days=0, hours=0, minutes=20),
),
transformation_code=TransformationCode(
path=transactions_featureset_code_path,
transformer_class="transaction_transform.TransactionFeatureTransformer",
),
index_columns=[Column(name="accountID", type=ColumnType.string)],
source_lookback=DateTimeOffset(days=7, hours=0, minutes=0),
temporal_join_lookback=DateTimeOffset(days=1, hours=0, minutes=0),
infer_schema=True,
)
# Generate a spark dataframe from the feature set specification
transactions_fset_df = transactions_featureset_spec.to_spark_dataframe()
# display few records
display(transactions_fset_df.head(5))
Экспорт спецификации набора компонентов
Чтобы зарегистрировать спецификацию набора компонентов в хранилище компонентов, эту спецификацию необходимо сохранить в определенном формате.
Чтобы проверить спецификацию набора функций созданных транзакций, откройте этот файл из дерева файлов, чтобы просмотреть спецификацию:
featurestore/featuresets/accounts/spec/FeaturesetSpec.yaml
Спецификация содержит следующие элементы:
source
: ссылка на ресурс хранилища — в данном случае файл parquet в ресурсе хранилища BLOB-объектовfeatures
: список функций и их типов данных. Если вы предоставляете код преобразованияindex_columns
: ключи соединения, необходимые для доступа к значениям из набора компонентов
В качестве еще одного преимущества сохранения спецификации набора компонентов в виде YAML-файла спецификации можно управлять версией. Дополнительные сведения о спецификации набора компонентов см. в документе сущностей хранилища компонентов верхнего уровня и справочнике по спецификации набора компонентов YAML.
import os
# create a new folder to dump the feature set specification
transactions_featureset_spec_folder = (
root_dir + "/featurestore/featuresets/transactions/spec"
)
# check if the folder exists, create one if not
if not os.path.exists(transactions_featureset_spec_folder):
os.makedirs(transactions_featureset_spec_folder)
transactions_featureset_spec.dump(transactions_featureset_spec_folder, overwrite=True)
Регистрация сущности хранилища компонентов
Сущности помогают применять одно и то же определение ключей соединения между наборами компонентов, которые используют одни и те же логические сущности. Примеры сущностей могут включать сущности учетной записи, сущности клиентов и т. д. Сущности обычно создаются один раз, а затем повторно используются в наборах компонентов. Дополнительные сведения см. в документе сущностей хранилища функций верхнего уровня.
Эта ячейка кода создает сущность учетной записи для хранилища компонентов.
account_entity_path = root_dir + "/featurestore/entities/account.yaml"
!az ml feature-store-entity create --file $account_entity_path --resource-group $featurestore_resource_group_name --workspace-name $featurestore_name
Регистрация набора функций транзакции в хранилище компонентов и отправка задания материализации
Чтобы предоставить общий доступ к ресурсу набора компонентов и повторно использовать его, необходимо сначала зарегистрировать этот ресурс в хранилище компонентов. Регистрация активов набора компонентов предоставляет управляемые возможности, включая управление версиями и материализацию. В этой серии учебников рассматриваются эти разделы.
Ресурс набора компонентов ссылается как на спецификацию набора компонентов, созданную ранее, так и другие свойства, например параметры версии и материализации.
Создание набора признаков
Следующая ячейка кода использует предварительно определенный файл спецификации YAML для создания набора компонентов.
transactions_featureset_path = (
root_dir
+ "/featurestore/featuresets/transactions/featureset_asset_offline_enabled.yaml"
)
!az ml feature-set create --file $transactions_featureset_path --resource-group $featurestore_resource_group_name --workspace-name $featurestore_name
Эта ячейка кода предварительно просматривает только что созданный набор компонентов.
# Preview the newly created feature set
!az ml feature-set show --resource-group $featurestore_resource_group_name --workspace-name $featurestore_name -n transactions -v 1
Отправка задания материализации обратной заполнения
Следующая ячейка кода определяет значения времени начала и окончания для окна материализации признаков и отправляет задание материализации обратной заполнения.
feature_window_start_time = "2023-02-01T00:00.000Z"
feature_window_end_time = "2023-03-01T00:00.000Z"
!az ml feature-set backfill --name transactions --version 1 --by-data-status "['None']" --workspace-name $featurestore_name --resource-group $featurestore_resource_group_name --feature-window-start-time $feature_window_start_time --feature-window-end-time $feature_window_end_time
Эта ячейка кода предоставляет <JOB_ID_FROM_PREVIOUS_COMMAND>
, чтобы проверить состояние задания материализации обратной заполнения.
### Check the job status
!az ml job show --name <JOB_ID_FROM_PREVIOUS_COMMAND> -g $featurestore_resource_group_name -w $featurestore_name
В этой ячейке кода перечислены все задания материализации для текущего набора компонентов.
### List all the materialization jobs for the current feature set
!az ml feature-set list-materialization-operation --name transactions --version 1 -g $featurestore_resource_group_name -w $featurestore_name
Присоединение Кэш Azure для Redis в качестве интернет-магазина
Создание экземпляра кэша Azure для Redis
В следующей ячейке кода определите имя Кэш Azure для Redis, которую вы хотите создать или повторно использовать. При необходимости можно переопределить другие параметры по умолчанию.
redis_subscription_id = os.environ["AZUREML_ARM_SUBSCRIPTION"]
redis_resource_group_name = os.environ["AZUREML_ARM_RESOURCEGROUP"]
redis_name = "my-redis"
redis_location = storage_location
Вы можете выбрать уровень кэша Redis (базовый, стандартный или премиум). Вы должны выбрать семейство SKU, доступное для выбранного уровня кэша. Дополнительные сведения о том, как выбор различных уровней может повлиять на производительность кэша, см . в этом ресурсе документации. Дополнительные сведения о ценах на различные уровни SKU и семейства Кэш Azure для Redis см. в этом ресурсе документации.
Выполните следующую ячейку кода, чтобы создать Кэш Azure для Redis с уровнем "Премиум", семейством P
SKU и емкостью кэша 2. Для подготовки экземпляра Redis может потребоваться примерно 5–10 минут.
# Create new redis cache
from azure.mgmt.redis import RedisManagementClient
from azure.mgmt.redis.models import RedisCreateParameters, Sku, SkuFamily, SkuName
management_client = RedisManagementClient(
AzureMLOnBehalfOfCredential(), redis_subscription_id
)
# It usually takes about 5 - 10 min to finish the provision of the Redis instance.
# If the following begin_create() call still hangs for longer than that,
# please check the status of the Redis instance on the Azure portal and cancel the cell if the provision has completed.
# This sample uses a PREMIUM tier Redis SKU from family P, which may cost more than a STANDARD tier SKU from family C.
# Please choose the SKU tier and family according to your performance and pricing requirements.
redis_arm_id = (
management_client.redis.begin_create(
resource_group_name=redis_resource_group_name,
name=redis_name,
parameters=RedisCreateParameters(
location=redis_location,
sku=Sku(name=SkuName.PREMIUM, family=SkuFamily.P, capacity=2),
public_network_access="Disabled", # can only disable PNA to redis cache during creation
),
)
.result()
.id
)
print(redis_arm_id)
Обновление хранилища компонентов с помощью интернет-магазина
Подключите Кэш Azure для Redis к хранилищу компонентов, чтобы использовать его в качестве интернет-хранилища материализации. Следующая ячейка кода создает файл спецификации YAML с правилами исходящего трафика интернет-магазина, определенными для хранилища компонентов.
# The following code cell creates a YAML specification file for outbound rules that are defined for the feature store.
## rule 1: PE to online store (redis cache): this is optional if online store is not used
import yaml
config = {
"public_network_access": "disabled",
"managed_network": {
"isolation_mode": "allow_internet_outbound",
"outbound_rules": [
{
"name": "sourceruleredis",
"destination": {
"spark_enabled": "true",
"subresource_target": "redisCache",
"service_resource_id": f"/subscriptions/{storage_subscription_id}/resourcegroups/{storage_resource_group_name}/providers/Microsoft.Cache/Redis/{redis_name}",
},
"type": "private_endpoint",
},
],
},
"online_store": {"target": f"{redis_arm_id}", "type": "redis"},
}
feature_store_managed_vnet_yaml = (
root_dir + "/featurestore/feature_store_managed_vnet_config.yaml"
)
with open(feature_store_managed_vnet_yaml, "w") as outfile:
yaml.dump(config, outfile, default_flow_style=False)
Следующая ячейка кода обновляет хранилище компонентов с созданным файлом спецификации YAML с правилами исходящего трафика для интернет-магазина.
!az ml feature-store update --file $feature_store_managed_vnet_yaml --name $featurestore_name --resource-group $featurestore_resource_group_name
Обновление правил исходящего трафика рабочей области проекта
Рабочая область проекта должна иметь доступ к интернет-магазину. Следующая ячейка кода создает файл спецификации YAML с необходимыми правилами исходящего трафика для рабочей области проекта.
import yaml
config = {
"managed_network": {
"isolation_mode": "allow_internet_outbound",
"outbound_rules": [
{
"name": "onlineruleredis",
"destination": {
"spark_enabled": "true",
"subresource_target": "redisCache",
"service_resource_id": f"/subscriptions/{storage_subscription_id}/resourcegroups/{storage_resource_group_name}/providers/Microsoft.Cache/Redis/{redis_name}",
},
"type": "private_endpoint",
},
],
}
}
project_ws_managed_vnet_yaml = (
root_dir + "/featurestore/project_ws_managed_vnet_config.yaml"
)
with open(project_ws_managed_vnet_yaml, "w") as outfile:
yaml.dump(config, outfile, default_flow_style=False)
Выполните следующую ячейку кода, чтобы обновить рабочую область проекта с созданным файлом спецификации YAML с правилами исходящего трафика для интернет-магазина.
#### Update project workspace to create private endpoints for the defined outbound rules (it may take approximately 15 minutes)
!az ml workspace update --file $project_ws_managed_vnet_yaml --name $project_ws_name --resource-group $project_ws_rg
Материализация функций транзакций, установленных в интернет-магазине
Следующая ячейка кода включает онлайн-материализацию для transactions
набора компонентов.
# Update featureset to enable online materialization
transactions_featureset_path = (
root_dir
+ "/featurestore/featuresets/transactions/featureset_asset_online_enabled.yaml"
)
!az ml feature-set update --file $transactions_featureset_path --resource-group $featurestore_resource_group_name --workspace-name $featurestore_name
Следующая ячейка кода определяет время начала и окончания для окна материализации признаков и отправляет задание материализации обратной заполнения.
feature_window_start_time = "2024-01-24T00:00.000Z"
feature_window_end_time = "2024-01-25T00:00.000Z"
!az ml feature-set backfill --name transactions --version 1 --by-data-status "['None']" --feature-window-start-time $feature_window_start_time --feature-window-end-time $feature_window_end_time --feature-store-name $featurestore_name --resource-group $featurestore_resource_group_name
Использование зарегистрированных функций для создания обучающих данных
Загрузка данных наблюдения
Во-первых, изучите данные наблюдения. Основные данные, используемые для обучения и вывода, обычно включают данные наблюдения. Затем эти данные объединяются с данными компонентов, чтобы создать полный ресурс данных обучения. Данные наблюдения — это данные, захваченные во время события. В этом случае у него есть основные данные транзакций, включая идентификатор транзакции, идентификатор учетной записи и значения суммы транзакций. Здесь, так как данные наблюдения используются для обучения, он также имеет целевую переменную, добавленную (is_fraud
).
observation_data_path = f"abfss://{storage_file_system_name_observation_data}@{storage_account_name}.dfs.core.windows.net/train/*.parquet"
observation_data_df = spark.read.parquet(observation_data_path)
obs_data_timestamp_column = "timestamp"
display(observation_data_df)
# Note: the timestamp column is displayed in a different format. Optionally, you can can call training_df.show() to see correctly formatted value
Получение зарегистрированного набора компонентов и перечисление его функций
Затем получите набор компонентов, указав его имя и версию, а затем перечислите функции в этом наборе компонентов. Кроме того, распечатайте некоторые примеры значений признаков.
# look up the featureset by providing name and version
transactions_featureset = featurestore.feature_sets.get("transactions", "1")
# list its features
transactions_featureset.features
# print sample values
display(transactions_featureset.to_spark_dataframe().head(5))
Выбор функций и создание обучающих данных
Выберите компоненты для обучающих данных и используйте пакет SDK для хранилища компонентов для создания обучающих данных.
from azureml.featurestore import get_offline_features
# you can select features in pythonic way
features = [
transactions_featureset.get_feature("transaction_amount_7d_sum"),
transactions_featureset.get_feature("transaction_amount_7d_avg"),
]
# you can also specify features in string form: featurestore:featureset:version:feature
more_features = [
"transactions:1:transaction_3d_count",
"transactions:1:transaction_amount_3d_avg",
]
more_features = featurestore.resolve_feature_uri(more_features)
features.extend(more_features)
# 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: the timestamp column is displayed in a different format. Optionally, you can can call training_df.show() to see correctly formatted value
Присоединение на определенный момент времени добавило функции к данным обучения.
Необязательные дальнейшие действия
Теперь, когда вы успешно создали безопасное хранилище компонентов и отправили успешное выполнение материализации, вы можете перейти к серии учебников для создания понимания хранилища компонентов.
В этом руководстве содержится сочетание шагов из учебников 1 и 2 из этой серии. Не забудьте заменить необходимые контейнеры общедоступного хранилища, используемые в других записных книжках учебника, созданными в этой записной книжке учебника, для сетевой изоляции.
На этом урок завершен. Данные обучения используют функции из хранилища компонентов. Его можно сохранить в хранилище для последующего использования или напрямую запустить обучение модели.