Uw model profileren om het resourcegebruik te bepalen

In dit artikel wordt beschreven hoe u een machine learning modelleren om te bepalen hoeveel CPU en geheugen u voor het model moet toewijzen wanneer u het model implementeert als een webservice.

Vereisten

In dit artikel wordt ervan uitgenomen dat u een model hebt getraind en geregistreerd bij Azure Machine Learning. Zie de voorbeeldzelfstudie hier voor een voorbeeld van het trainen en registreren van een scikit-learn-model met Azure Machine Learning.

Beperkingen

  • Profilering werkt niet wanneer de Azure Container Registry (ACR) voor uw werkruimte zich achter een virtueel netwerk.

De profiler uitvoeren

Zodra u uw model hebt geregistreerd en de andere onderdelen hebt voorbereid die nodig zijn voor de implementatie, kunt u de CPU en het geheugen bepalen die de geïmplementeerde service nodig heeft. Profilering test de service die uw model wordt uitgevoerd en retourneert informatie zoals het CPU-gebruik, geheugengebruik en reactielatentie. Het biedt ook een aanbeveling voor de CPU en het geheugen op basis van resourcegebruik.

Als u uw model wilt profileren, hebt u het volgende nodig:

  • Een geregistreerd model.
  • Een deferentieconfiguratie op basis van uw invoerscript en de definitie van deference-omgeving.
  • Een tabellaire gegevensset met één kolom, waarbij elke rij een tekenreeks bevat die voorbeeldaanvraaggegevens vertegenwoordigt.

Belangrijk

Op dit moment ondersteunen we alleen profilering van services die verwachten dat hun aanvraaggegevens een tekenreeks zijn, bijvoorbeeld: tekenreeks geser serialiseerde json, tekst, geser serialiseerde tekenreeksafbeelding, enzovoort. De inhoud van elke rij van de gegevensset (tekenreeks) wordt in de hoofdreeks van de HTTP-aanvraag gezet en verzonden naar de service waarin het model wordt ingekapselde om te scoren.

Belangrijk

We ondersteunen alleen profilering van maximaal 2 CPU's in chinaEast2 en USGovArizona-regio.

Hieronder ziet u een voorbeeld van hoe u een invoergegevensset kunt maken om een service te profileren die verwacht dat de inkomende aanvraaggegevens geseraliseerde json bevatten. In dit geval hebben we een gegevensset gemaakt op basis van 100 exemplaren van dezelfde aanvraaggegevensinhoud. In echte scenario's raden we u aan grotere gegevenssets met verschillende invoergegevens te gebruiken, met name als het gebruik/gedrag van uw modelresources afhankelijk is van invoer.

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)

Zodra u de gegevensset met voorbeeldaanvraaggegevens gereed hebt, maakt u een deference-configuratie. De deferentieconfiguratie is gebaseerd op de score.py en de omgevingsdefinitie. In het volgende voorbeeld wordt gedemonstreerd hoe u de deference-configuratie maakt en profileert:

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

De volgende opdracht laat zien hoe u een model profileren met behulp van de 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>

Tip

Gebruik tags of eigenschappen voor het model om de informatie die door profilering wordt geretourneerd, persistent te maken. Met behulp van tags of eigenschappen worden de gegevens met het model in het modelregister op slaat. In de volgende voorbeelden wordt het toevoegen van een nieuwe tag met de informatie requestedCpu en requestedMemoryInGb gedemonstreerd:

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

Volgende stappen