Profiler votre modèle pour déterminer l’utilisation des ressources

Cet article explique comment profiler un modèle Machine Learning afin de déterminer la quantité de processeur et de mémoire que vous devrez allouer pour le modèle lors de son déploiement en tant que service web.

Prérequis

Cet article suppose que vous avez entraîné et inscrit un modèle à l’aide d’Azure Machine Learning. Consultez cet exemple de tutoriel pour obtenir un exemple d’entraînement et d’inscription d’un modèle scikit-learn avec Azure Machine Learning.

Limites

  • Le profilage ne fonctionnera pas lorsque le compte Azure Container Registry (ACR) de votre espace de travail se trouve derrière un réseau virtuel.

Exécuter le profileur

Une fois que vous avez inscrit votre modèle et préparé les autres composants nécessaires à son déploiement, vous pouvez déterminer l’UC et la mémoire dont le service déployé aura besoin. Le profilage teste le service qui exécute votre modèle et retourne des informations telles que l’utilisation de l’UC, l’utilisation de la mémoire et la latence de la réponse. Il fournit également une recommandation pour l’UC et la mémoire en fonction de l’utilisation des ressources.

Pour profiler votre modèle, vous aurez besoin des éléments suivants :

  • Un modèle inscrit.
  • Une configuration d’inférence basée sur votre script d’entrée et la définition de l’environnement d’inférence.
  • Un jeu de données tabulaires à une seule colonne, où chaque ligne contient une chaîne représentant des exemples de données de requête.

Important

À ce stade, nous ne prenons en charge que le profilage des services qui s’attendent à ce que leurs données de requête soient une chaîne, par exemple : chaîne JSON sérialisée, texte, image sérialisée de chaîne, etc. Le contenu de chaque ligne du jeu de données (chaîne) est placé dans le corps de la requête HTTP et envoyé au service qui encapsule le modèle pour le scoring.

Important

Nous prenons uniquement en charge le profilage jusqu’à 2 processeurs dans les régions ChinaEast2 et USGovArizona.

Vous trouverez ci-dessous un exemple de création d’un jeu de données d’entrée pour profiler un service qui s’attend à ce que ses données de requête entrantes contiennent une chaîne JSON sérialisée. Dans ce cas, nous avons créé un jeu de données basé sur 100 instances du même contenu de données de requête. Dans les scénarios réels, nous vous suggérons d’utiliser des jeux de données plus volumineux contenant différentes entrées, en particulier si votre utilisation ou le comportement des ressources du modèle sont dépendants de l’entrée.

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)

Une fois que le jeu de données contenant des exemples de données de requête est prêt, créez une configuration d’inférence. La configuration de l’inférence est basée sur le fichier score.py et la définition de l’environnement. L’exemple suivant montre comment créer une configuration d’inférence et exécuter le profilage :

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()

La commande suivante montre comment profiler un modèle à l’aide de l’interface CLI :

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>

Conseil

Pour conserver les informations retournées par le profilage, utilisez des balises ou des propriétés pour le modèle. L’utilisation de balises ou de propriétés stocke les données avec le modèle dans le registre du modèle. Les exemples suivants illustrent l’ajout d’une nouvelle balise contenant les informations requestedCpu et 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

Étapes suivantes