Skip to content

Commit 5f22cdb

Browse files
authored
Bump restclient version for model package and model ops (Azure#32531)
* fixes * fixes * fixes * fixes * test recording * test recording * target env fix * pylint & black * e2e test * e2e test * pylint
1 parent 53df797 commit 5f22cdb

File tree

10 files changed

+105
-67
lines changed

10 files changed

+105
-67
lines changed

sdk/ml/azure-ai-ml/assets.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
"AssetsRepo": "Azure/azure-sdk-assets",
33
"AssetsRepoPrefixPath": "python",
44
"TagPrefix": "python/ml/azure-ai-ml",
5-
"Tag": "python/ml/azure-ai-ml_748fafdb82"
5+
"Tag": "python/ml/azure-ai-ml_26cf777aef"
66
}

sdk/ml/azure-ai-ml/azure/ai/ml/_ml_client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -456,11 +456,11 @@ def __init__(
456456
self._operation_config,
457457
self._service_client_10_2021_dataplanepreview
458458
if registry_name or registry_reference
459-
else self._service_client_04_2023_preview,
459+
else self._service_client_08_2023_preview,
460460
self._datastores,
461461
self._operation_container,
462462
requests_pipeline=self._requests_pipeline,
463-
control_plane_client=self._service_client_04_2023_preview,
463+
control_plane_client=self._service_client_08_2023_preview,
464464
workspace_rg=self._ws_rg,
465465
workspace_sub=self._ws_sub,
466466
registry_reference=registry_reference,

sdk/ml/azure-ai-ml/azure/ai/ml/_schema/assets/package/model_package.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from marshmallow import fields, post_load
1010

1111
from azure.ai.ml._schema.core.schema import PathAwareSchema
12-
from azure.ai.ml._schema.core.fields import VersionField, NestedField
12+
from azure.ai.ml._schema.core.fields import UnionField, NestedField, StringTransformedEnum
1313
from .inference_server import InferenceServerSchema
1414
from .model_configuration import ModelConfigurationSchema
1515
from .model_package_input import ModelPackageInputSchema
@@ -19,8 +19,12 @@
1919

2020

2121
class ModelPackageSchema(PathAwareSchema):
22-
target_environment_name = fields.Str(required=True, dump_default="packaged-env")
23-
target_environment_version = VersionField()
22+
target_environment = UnionField(
23+
union_fields=[
24+
fields.Dict(keys=StringTransformedEnum(allowed_values=["name"]), values=fields.Str()),
25+
fields.Str(required=True),
26+
]
27+
) # pylint: disable=line-too-long
2428
base_environment_source = NestedField(BaseEnvironmentSourceSchema)
2529
inferencing_server = NestedField(InferenceServerSchema)
2630
model_configuration = NestedField(ModelConfigurationSchema)

sdk/ml/azure-ai-ml/azure/ai/ml/entities/_assets/_artifacts/_package/base_environment_source.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from typing import Dict
88

9-
from azure.ai.ml._restclient.v2023_02_01_preview.models import BaseEnvironmentId as RestBaseEnvironmentId
9+
from azure.ai.ml._restclient.v2023_08_01_preview.models import BaseEnvironmentId as RestBaseEnvironmentId
1010
from azure.ai.ml._schema.assets.package.base_environment_source import BaseEnvironmentSourceSchema
1111
from azure.ai.ml._utils._experimental import experimental
1212
from azure.ai.ml.constants._common import BASE_PATH_CONTEXT_KEY

sdk/ml/azure-ai-ml/azure/ai/ml/entities/_assets/_artifacts/_package/inferencing_server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
# pylint: disable=protected-access,redefined-builtin,unused-argument
66

7-
from azure.ai.ml._restclient.v2023_02_01_preview.models import (
7+
from azure.ai.ml._restclient.v2023_08_01_preview.models import (
88
AzureMLOnlineInferencingServer as RestAzureMLOnlineInferencingServer,
99
AzureMLBatchInferencingServer as RestAzureMLBatchInferencingServer,
1010
CustomInferencingServer as RestCustomInferencingServer,

sdk/ml/azure-ai-ml/azure/ai/ml/entities/_assets/_artifacts/_package/model_package.py

Lines changed: 36 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@
77
from os import PathLike
88
from pathlib import Path
99
from typing import IO, AnyStr, Dict, List, Optional, Union
10-
11-
from azure.ai.ml._restclient.v2021_10_01_dataplanepreview.models import PackageRequest as DataPlanePackageRequest
12-
from azure.ai.ml._restclient.v2023_02_01_preview.models import CodeConfiguration
13-
from azure.ai.ml._restclient.v2023_02_01_preview.models import ModelPackageInput as RestModelPackageInput
14-
from azure.ai.ml._restclient.v2023_02_01_preview.models import PackageInputPathId as RestPackageInputPathId
15-
from azure.ai.ml._restclient.v2023_02_01_preview.models import PackageInputPathUrl as RestPackageInputPathUrl
16-
from azure.ai.ml._restclient.v2023_02_01_preview.models import PackageInputPathVersion as RestPackageInputPathVersion
17-
from azure.ai.ml._restclient.v2023_02_01_preview.models import PackageRequest, PackageResponse
10+
import re
11+
12+
from azure.ai.ml._restclient.v2023_08_01_preview.models import CodeConfiguration
13+
from azure.ai.ml._restclient.v2023_08_01_preview.models import ModelPackageInput as RestModelPackageInput
14+
from azure.ai.ml._restclient.v2023_08_01_preview.models import PackageInputPathId as RestPackageInputPathId
15+
from azure.ai.ml._restclient.v2023_08_01_preview.models import PackageInputPathUrl as RestPackageInputPathUrl
16+
from azure.ai.ml._restclient.v2023_08_01_preview.models import PackageInputPathVersion as RestPackageInputPathVersion
17+
from azure.ai.ml._restclient.v2023_08_01_preview.models import PackageRequest, PackageResponse
1818
from azure.ai.ml._schema.assets.package.model_package import ModelPackageSchema
1919
from azure.ai.ml._utils._experimental import experimental
2020
from azure.ai.ml._utils.utils import dump_yaml_to_file, snake_to_pascal
@@ -221,30 +221,38 @@ class ModelPackage(Resource, PackageRequest):
221221
def __init__(
222222
self,
223223
*,
224-
target_environment_name: str = None,
225-
target_environment_id: str = None,
224+
target_environment: Union[str, Dict[str, str]],
226225
inferencing_server: Union[AzureMLOnlineInferencingServer, AzureMLBatchInferencingServer],
227226
base_environment_source: BaseEnvironment = None,
228-
target_environment_version: Optional[str] = None,
229227
environment_variables: Optional[Dict[str, str]] = None,
230228
inputs: Optional[List[ModelPackageInput]] = None,
231229
model_configuration: Optional[ModelConfiguration] = None,
232230
tags: Optional[Dict[str, str]] = None,
231+
**kwargs,
233232
):
234-
if target_environment_name is None:
235-
target_environment_name = "dummy_name"
233+
if isinstance(target_environment, dict):
234+
target_environment = target_environment["name"]
235+
env_version = None
236+
else:
237+
parse_id = re.match(r"azureml:(\w+):(\d+)$", target_environment)
238+
239+
if parse_id:
240+
target_environment = parse_id.group(1)
241+
env_version = parse_id.group(2)
242+
else:
243+
env_version = None
244+
236245
super().__init__(
237-
name=target_environment_name,
238-
target_environment_name=target_environment_name,
239-
target_environment_version=target_environment_version,
246+
name=target_environment,
247+
target_environment_id=target_environment,
240248
base_environment_source=base_environment_source,
241249
inferencing_server=inferencing_server,
242250
model_configuration=model_configuration,
243251
inputs=inputs,
244252
tags=tags,
245253
environment_variables=environment_variables,
246254
)
247-
self.target_environment_id = target_environment_id
255+
self.environment_version = env_version
248256

249257
@classmethod
250258
def _load(
@@ -307,29 +315,16 @@ def _to_rest_object(self) -> PackageRequest:
307315
)
308316
self.inferencing_server.code_configuration = code
309317

310-
if self.target_environment_id:
311-
package_request = DataPlanePackageRequest(
312-
target_environment_id=self.target_environment_id,
313-
base_environment_source=self.base_environment_source._to_rest_object()
314-
if self.base_environment_source
315-
else None,
316-
inferencing_server=self.inferencing_server._to_rest_object() if self.inferencing_server else None,
317-
model_configuration=self.model_configuration._to_rest_object() if self.model_configuration else None,
318-
inputs=[input._to_rest_object() for input in self.inputs] if self.inputs else None,
319-
tags=self.tags,
320-
environment_variables=self.environment_variables,
321-
)
322-
else:
323-
package_request = PackageRequest(
324-
target_environment_name=self.name,
325-
base_environment_source=self.base_environment_source._to_rest_object()
326-
if self.base_environment_source
327-
else None,
328-
inferencing_server=self.inferencing_server._to_rest_object() if self.inferencing_server else None,
329-
model_configuration=self.model_configuration._to_rest_object() if self.model_configuration else None,
330-
inputs=[input._to_rest_object() for input in self.inputs] if self.inputs else None,
331-
tags=self.tags,
332-
environment_variables=self.environment_variables,
333-
)
318+
package_request = PackageRequest(
319+
target_environment_id=self.target_environment_id,
320+
base_environment_source=self.base_environment_source._to_rest_object()
321+
if self.base_environment_source
322+
else None,
323+
inferencing_server=self.inferencing_server._to_rest_object() if self.inferencing_server else None,
324+
model_configuration=self.model_configuration._to_rest_object() if self.model_configuration else None,
325+
inputs=[input._to_rest_object() for input in self.inputs] if self.inputs else None,
326+
tags=self.tags,
327+
environment_variables=self.environment_variables,
328+
)
334329

335330
return package_request

sdk/ml/azure-ai-ml/azure/ai/ml/operations/_model_operations.py

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,19 @@
2424
from azure.ai.ml._restclient.v2021_10_01_dataplanepreview import (
2525
AzureMachineLearningWorkspaces as ServiceClient102021Dataplane,
2626
)
27-
from azure.ai.ml._restclient.v2023_04_01_preview import AzureMachineLearningWorkspaces as ServiceClient042023Preview
28-
from azure.ai.ml._restclient.v2023_04_01_preview.models import ListViewType, ModelVersion
27+
from azure.ai.ml._restclient.v2023_08_01_preview import AzureMachineLearningServices as ServiceClient082023Preview
28+
from azure.ai.ml._restclient.v2023_08_01_preview.models import ListViewType, ModelVersion
2929
from azure.ai.ml._scope_dependent_operations import (
3030
OperationConfig,
3131
OperationsContainer,
3232
OperationScope,
3333
_ScopeDependentOperations,
3434
)
3535
from azure.ai.ml._telemetry import ActivityType, monitor_with_activity
36-
from azure.ai.ml._utils._arm_id_utils import is_ARM_id_for_resource
36+
from azure.ai.ml._utils._arm_id_utils import (
37+
is_ARM_id_for_resource,
38+
AMLVersionedArmId,
39+
)
3740
from azure.ai.ml._utils._asset_utils import (
3841
_archive_or_restore,
3942
_get_latest,
@@ -82,7 +85,7 @@ class ModelOperations(_ScopeDependentOperations):
8285
:param operation_config: Common configuration for operations classes of an MLClient object.
8386
:type operation_config: ~azure.ai.ml._scope_dependent_operations.OperationConfig
8487
:param service_client: Service client to allow end users to operate on Azure Machine Learning Workspace
85-
resources (ServiceClient042023Preview or ServiceClient102021Dataplane).
88+
resources (ServiceClient082023Preview or ServiceClient102021Dataplane).
8689
:type service_client: typing.Union[
8790
~azure.ai.ml._restclient.v2023_04_01_preview._azure_machine_learning_workspaces.AzureMachineLearningWorkspaces,
8891
~azure.ai.ml._restclient.v2021_10_01_dataplanepreview._azure_machine_learning_workspaces.
@@ -98,7 +101,7 @@ def __init__(
98101
self,
99102
operation_scope: OperationScope,
100103
operation_config: OperationConfig,
101-
service_client: Union[ServiceClient042023Preview, ServiceClient102021Dataplane],
104+
service_client: Union[ServiceClient082023Preview, ServiceClient102021Dataplane],
102105
datastore_operations: DatastoreOperations,
103106
all_operations: OperationsContainer = None,
104107
**kwargs: Dict,
@@ -721,11 +724,22 @@ def package(self, name: str, version: str, package_request: ModelPackage, **kwar
721724
else package_request.base_environment_source.resource_id
722725
)
723726

724-
if self._registry_name:
725-
# create ARM id for the target environment
726-
if package_request.target_environment_name:
727-
package_request.target_environment_id = f"azureml://locations/{self._operation_scope._workspace_location}/workspaces/{self._operation_scope._workspace_id}/environments/{package_request.target_environment_name}"
727+
# create ARM id for the target environment
728+
if self._operation_scope._workspace_location and self._operation_scope._workspace_id:
729+
package_request.target_environment_id = f"azureml://locations/{self._operation_scope._workspace_location}/workspaces/{self._operation_scope._workspace_id}/environments/{package_request.target_environment_id}"
730+
else:
731+
ws = self._all_operations.all_operations.get("workspaces")
732+
ws_details = ws.get(self._workspace_name)
733+
workspace_location, workspace_id = (
734+
ws_details.location,
735+
ws_details._workspace_id,
736+
)
737+
package_request.target_environment_id = f"azureml://locations/{workspace_location}/workspaces/{workspace_id}/environments/{package_request.target_environment_id}"
728738

739+
if package_request.environment_version is not None:
740+
package_request.target_environment_id = (
741+
package_request.target_environment_id + f"/versions/{package_request.environment_version}"
742+
)
729743
package_request = package_request._to_rest_object()
730744

731745
if self._registry_reference:
@@ -749,15 +763,14 @@ def package(self, name: str, version: str, package_request: ModelPackage, **kwar
749763
)
750764
if is_deployment_flow: # No need to go through the schema, as this is for deployment notification only
751765
return package_out
752-
if hasattr(package_out, "target_environment_name"):
753-
environment_name = package_out.target_environment_name
766+
if hasattr(package_out, "target_environment_id"):
767+
environment_id = package_out.target_environment_id
754768
else:
755-
environment_name = package_out.additional_properties["targetEnvironmentName"]
769+
environment_id = package_out.additional_properties["targetEnvironmentId"]
756770

757-
if hasattr(package_out, "target_environment_version"):
758-
environment_version = package_out.target_environment_version
759-
else:
760-
environment_version = package_out.additional_properties["targetEnvironmentVersion"]
771+
parsed_id = AMLVersionedArmId(environment_id)
772+
environment_name = parsed_id.asset_name
773+
environment_version = parsed_id.asset_version
761774

762775
module_logger.info("\nPackage Created")
763776
if package_out is not None and package_out.__class__.__name__ == "PackageResponse":
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from typing import Callable, Union
2+
from devtools_testutils import AzureRecordedTestCase, is_live
3+
import pytest
4+
5+
from azure.ai.ml import MLClient
6+
7+
from azure.ai.ml.entities import (
8+
ModelPackage,
9+
ModelConfiguration,
10+
AzureMLOnlineInferencingServer,
11+
)
12+
13+
14+
@pytest.mark.timeout(600)
15+
@pytest.mark.usefixtures("recorded_test")
16+
@pytest.mark.production_experiences_test
17+
class TestModelPackage(AzureRecordedTestCase):
18+
def test_model_package_workspace(self, client: MLClient):
19+
package_config = ModelPackage(
20+
target_environment="my-package-name",
21+
inferencing_server=AzureMLOnlineInferencingServer(),
22+
model_configuration=ModelConfiguration(mode="copy"),
23+
)
24+
25+
client.models.package("test-model2", "1", package_config)

sdk/ml/azure-ai-ml/tests/test_configs/model_package/model_package_config_copy.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
target_environment_name: diabetes-online-mlflow
1+
target_environment:
2+
name: diabetes-online-mlflow
23
inferencing_server:
34
type: azureml_online
45
model_configuration:

sdk/ml/azure-ai-ml/tests/test_configs/model_package/model_package_simple.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
target_environment_name: diabetes-online-mlflow
1+
target_environment: diabetes-online-mlflow
22
inferencing_server:
33
type: azureml_online
44
model_configuration:

0 commit comments

Comments
 (0)