Azure / Azure/MachineLearningNotebooks

Logging a metric with a trailing space causes get_metrics to throw "Exception: Malformed metric value"

Aberta
#1,392 3 comentários 0 reações 0 responsáveis Ver no GitHub
ADO MLOps product-question Training
Linguagem predominante
Jupyter Notebook
Estrelas
4.4k
Forks
2.6k
Métricas de merge de PRs
Nenhum PR com merge em 30d

Descrição

This issue is provided for reference purposes.

Tested with azureml-sdk version 1.22.0 on the jupyter notebook instance and the current default SKLearn backend.

Example:

```
from azureml.core import Workspace, Experiment, Run
from azureml.train.sklearn import SKLearn
from azureml.train.hyperdrive.sampling import RandomParameterSampling
from azureml.train.hyperdrive.parameter_expressions import choice
from azureml.train.hyperdrive.runconfig import HyperDriveConfig
from azureml.train.hyperdrive.run import PrimaryMetricGoal
from azureml.core.compute import ComputeTarget, AmlCompute

print(azureml.core.VERSION)

ws = Workspace.from_config()
experiment_name = 'test'
experiment = Experiment(ws, experiment_name)

compute_config = AmlCompute.provisioning_configuration(vm_size='Standard_D2_V2',
max_nodes=1)
compute_target = ComputeTarget.create(ws, "test", compute_config)
compute_target.wait_for_completion(show_output=True)

estimator = SKLearn(source_directory=".",
entry_script="train.py",
compute_target=compute_target)

param_sampling = RandomParameterSampling({"--dummy": choice(1)})

run_config = HyperDriveConfig(estimator=estimator,
hyperparameter_sampling=param_sampling,
policy=None,
primary_metric_name="Accuracy",
primary_metric_goal=PrimaryMetricGoal.MAXIMIZE,
max_total_runs=1,
max_concurrent_runs=1)

run = experiment.submit(config=run_config, show_output=True)

run.wait_for_completion(show_output=True)

best_run = run.get_best_run_by_primary_metric()
print('best_run.id: ', best_run.id)

best_run_metrics = best_run.get_metrics()
print("best_run.get_metrics():", best_run_metrics)
```

with the following train.py

```
import argparse

from azureml.core import Run

run = Run.get_context()

def main():
parser = argparse.ArgumentParser()

parser.add_argument('--dummy', type=int, default=1, help="Nothing to do")

args = parser.parse_args()

run.log("Metric ending with a space: ", 0.1)
run.log("Accuracy", 1.0)

if __name__ == "__main__":
main()
```

The exception is thrown

```
---------------------------------------------------------------------------
Exception Traceback (most recent call last)
in
----> 1 best_run_metrics = best_run.get_metrics()
2 print("best_run.get_metrics():", best_run_metrics)

/anaconda/envs/azureml_py36/lib/python3.6/site-packages/azureml/core/run.py in get_metrics(self, name, recursive, run_type, populate)
1272 """
1273 return self._client.get_metrics(name=name, recursive=recursive, run_type=run_type,
-> 1274 populate=populate, root_run_id=self._root_run_id)
1275
1276 def _get_outputs_datapath(self):

/anaconda/envs/azureml_py36/lib/python3.6/site-packages/azureml/_run_impl/run_history_facade.py in get_metrics(self, name, recursive, run_type, populate, root_run_id, run_ids, use_batch)
363 return self.metrics.get_all_metrics_v2(name=name, run_ids=run_ids, populate=populate,
364 artifact_client=self.artifacts,
--> 365 data_container=self._data_container_id)
366
367 return self.metrics.get_all_metrics(run_ids=run_ids, populate=populate, artifact_client=self.artifacts,

/anaconda/envs/azureml_py36/lib/python3.6/site-packages/azureml/_restclient/metrics_client.py in get_all_metrics_v2(self, name, run_ids, populate, artifact_client, data_container, after_timestamp, custom_headers)
311 return self.get_metrics_for_run_ids_v2(name=name, run_ids=run_ids, start_time=after_timestamp,
312 populate=populate, artifact_client=artifact_client,
--> 313 data_container=data_container, custom_headers=custom_headers)
314
315 def get_all_metrics(self, run_ids=None, populate=False, artifact_client=None,

/anaconda/envs/azureml_py36/lib/python3.6/site-packages/azureml/_restclient/metrics_client.py in get_metrics_for_run_ids_v2(self, name, run_ids, start_time, end_time, populate, artifact_client, data_container, custom_headers)
298 end_time=end_time, populate=populate,
299 artifact_client=artifact_client, data_container=data_container,
--> 300 custom_headers=custom_headers)
301 if len(metrics) != 0:
302 returned_metrics_for_runs[run_id] = metrics

/anaconda/envs/azureml_py36/lib/python3.6/site-packages/azureml/_restclient/metrics_client.py in get_metrics_for_run_v2(self, run_id, name, start_time, end_time, populate, artifact_client, data_container, custom_headers)
284 metric = self.get_metric_for_run_v2(metric_name, run_id=run_id, start_time=start_time,
285 end_time=end_time, artifact_client=artifact_client,
--> 286 populate=populate, custom_headers=custom_headers)
287 if metric is not None:
288 returned_metrics[metric_name] = metric

/anaconda/envs/azureml_py36/lib/python3.6/site-packages/azureml/_restclient/metrics_client.py in get_metric_for_run_v2(self, name, run_id, start_time, end_time, artifact_client, populate, custom_headers)
263 if metric_dto is None or len(metric_dto.value) == 0:
264 return None
--> 265 return MetricsClient.dto_v2_to_metric_cells(metric_dto, artifact_client, populate)
266
267 def get_metrics_for_run_v2(self, run_id=None, name=None, start_time=None, end_time=None, populate=False,

/anaconda/envs/azureml_py36/lib/python3.6/site-packages/azureml/_restclient/metrics_client.py in dto_v2_to_metric_cells(cls, metric_dto, artifact_client, populate)
115 metric_type = metric_dto.properties.ux_metric_type
116 if metric_type in INLINE_METRICS:
--> 117 return InlineMetric.get_cells_from_metric_v2_dto(metric_dto)
118
119 if populate and artifact_client is None:

/anaconda/envs/azureml_py36/lib/python3.6/site-packages/azureml/core/_metrics.py in get_cells_from_metric_v2_dto(metric_dto)
415 values = []
416 for metric_value in metric_dto.value:
--> 417 cell = InlineMetric.get_cell_v2(columns, metric_value, metric_dto.name)
418 values.append(cell)
419 if len(values) == 1:

/anaconda/envs/azureml_py36/lib/python3.6/site-packages/azureml/core/_metrics.py in get_cell_v2(columns, metric_v2_value, column_name)
424 def get_cell_v2(columns, metric_v2_value, column_name):
425 if column_name not in columns.keys() or column_name not in metric_v2_value.data.keys():
--> 426 raise Exception("Malformed metric value")
427 cell_type = str.lower(columns[column_name])
428 value = metric_v2_value.data[column_name]

Exception: Malformed metric value
```

---
#### Document Details

⚠ *Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.*

* ID: 9a70336d-fb4a-4c18-26d0-68784b5b3d72
* Version Independent ID: e28876d8-08a0-8546-4bd1-6e434c8c7826
* Content: [azureml.core.Run class - Azure Machine Learning Python](https://docs.microsoft.com/en-us/python/api/azureml-core/azureml.core.run(class)?view=azure-ml-py)
* Content Source: [AzureML-Docset/stable/docs-ref-autogen/azureml-core/azureml.core.Run(class).yml](https://github.com/MicrosoftDocs/MachineLearning-Python-pr/blob/live/AzureML-Docset/stable/docs-ref-autogen/azureml-core/azureml.core.Run(class).yml)
* Service: **machine-learning**
* Sub-service: **core**
* GitHub Login: @DebFro
* Microsoft Alias: **debfro**

Guia de contribuição

Nenhum guia de contribuição indexado para este repositório

Direção de pesquisa

Reproduza o exemplo no notebook com azureml-sdk 1.22.0 e, em seguida, inspecione azureml/core/_metrics.py e azureml/_restclient/metrics_client.py nos locais indicados pelo traceback. Está concluído quando get_metrics() lidar com a métrica que contém um espaço no final sem gerar "Malformed metric value", enquanto continua retornando as métricas registradas.

Escrita pelo modelo de indexação a partir do texto da issue.

Avaliação

Stack de tecnologia
azure, jupyter-notebook, python
Domínio
machine-learning
Tipo de issue
Bug
Dificuldade
4/5
Tempo estimado
3-5 dias
Status de atividade
Estagnada
Clareza
Razoavelmente clara
Facilidade para iniciantes
35/100

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.