Azure / Azure/MachineLearningNotebooks

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

Đang mở
#1,392 3 bình luận 0 reaction 0 người được giao Xem trên GitHub
ADO MLOps product-question Training
Ngôn ngữ chính
Jupyter Notebook
Star
4.4k
Fork
2.6k
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

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**

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.