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


Профилирование модели для определения использования ресурсов

ОБЛАСТЬ ПРИМЕНЕНИЯ:Расширение Машинного обучения для Azure CLI версии 1пакет SDK для Python azureml версии 1

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

Внимание

В этой статье даны инструкции для CLI версии 1 и пакета SDK версии 1. Описанный здесь метод профилирования не подходит для CLI версии 2 или пакета SDK версии 2.

Внимание

Для использования некоторых команд Azure CLI, приведенных в этой статье, используйте расширение azure-cli-ml (версия 1) для Машинного обучения Azure. Поддержка расширения версии 1 будет прекращена 30 сентября 2025 г. Вы можете установить и использовать расширение версии 1 до этой даты.

Рекомендуется перейти на расширение ml (версия 2) до 30 сентября 2025 г. Дополнительные сведения о расширении версии 2 см. на странице расширения CLI для Azure ML и пакета SDK для Python версии 2.

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

В этой статье предполагается, что модель обучена и зарегистрирована с помощью службы Машинного обучения Azure. Пример обучения и регистрации модели scikit-learn с помощью Машинного обучения Azure см. в этом руководстве.

Ограничения

  • Профилирование не работает, если Реестр контейнеров Azure (ACR) для вашей рабочей области находится за виртуальной сетью.

Запуск профилировщика

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

Для профилирования модели потребуется:

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

Внимание

На этом этапе поддерживается только профилирование служб, в которых данные запроса должны быть строками (например, сериализованный объект JSON, текст, сериализованное в строку изображение и т. п.) Содержимое каждой строки набора данных (строка) помещается в тело HTTP-запроса и отправляется службе, которая инкапсулирует модель для оценки.

Внимание

В регионах ChinaEast2 и USGovArizona мы поддерживаем профилирование только до 2 процессоров.

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

ОБЛАСТЬ ПРИМЕНЕНИЯ: Пакет SDK для Python версии 1

import json
from azureml.core import Datastore
from azureml.core.dataset import Dataset
from azureml.data import dataset_type_definitions

input_json = {'data': [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
                       [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]]}
# create a string that can be utf-8 encoded and
# put in the body of the request
serialized_input_json = json.dumps(input_json)
dataset_content = []
for i in range(100):
    dataset_content.append(serialized_input_json)
dataset_content = '\n'.join(dataset_content)
file_name = 'sample_request_data.txt'
f = open(file_name, 'w')
f.write(dataset_content)
f.close()

# upload the txt file created above to the Datastore and create a dataset from it
data_store = Datastore.get_default(ws)
data_store.upload_files(['./' + file_name], target_path='sample_request_data')
datastore_path = [(data_store, 'sample_request_data' +'/' + file_name)]
sample_request_data = Dataset.Tabular.from_delimited_files(
    datastore_path, separator='\n',
    infer_column_types=True,
    header=dataset_type_definitions.PromoteHeadersBehavior.NO_HEADERS)
sample_request_data = sample_request_data.register(workspace=ws,
                                                   name='sample_request_data',
                                                   create_new_version=True)

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

from azureml.core.model import InferenceConfig, Model
from azureml.core.dataset import Dataset


model = Model(ws, id=model_id)
inference_config = InferenceConfig(entry_script='path-to-score.py',
                                   environment=myenv)
input_dataset = Dataset.get_by_name(workspace=ws, name='sample_request_data')
profile = Model.profile(ws,
            'unique_name',
            [model],
            inference_config,
            input_dataset=input_dataset)

profile.wait_for_completion(True)

# see the result
details = profile.get_details()

ОБЛАСТЬ ПРИМЕНЕНИЯ: расширение машинного обучения Azure CLI версии 1

Следующая команда показывает, как выполнить профилирование модели с помощью интерфейса командной строки:

az ml model profile -g <resource-group-name> -w <workspace-name> --inference-config-file <path-to-inf-config.json> -m <model-id> --idi <input-dataset-id> -n <unique-name>

Совет

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

model.add_tags({'requestedCpu': details['requestedCpu'],
                'requestedMemoryInGb': details['requestedMemoryInGb']})
az ml model profile -g <resource-group-name> -w <workspace-name> --i <model-id> --add-tag requestedCpu=1 --add-tag requestedMemoryInGb=0.5

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