@@ -65,7 +65,7 @@ def mock_get_container_config():
65
65
yield mock_config
66
66
67
67
68
- @pytest .fixture (autouse = True , scope = "class " )
68
+ @pytest .fixture (autouse = True , scope = "function " )
69
69
def mock_get_hf_model_info ():
70
70
with patch .object (HfApi , "model_info" ) as mock_get_hf_model_info :
71
71
test_hf_model_info = ModelInfo (
@@ -230,17 +230,17 @@ class TestDataset:
230
230
class TestAquaModel :
231
231
"""Contains unittests for AquaModelApp."""
232
232
233
- @pytest .fixture (autouse = True , scope = "class" )
234
- def mock_auth (cls ):
235
- with patch ("ads.common.auth.default_signer" ) as mock_default_signer :
236
- yield mock_default_signer
237
-
238
- @pytest .fixture (autouse = True , scope = "class" )
239
- def mock_init_client (cls ):
240
- with patch (
241
- "ads.common.oci_datascience.OCIDataScienceMixin.init_client"
242
- ) as mock_client :
243
- yield mock_client
233
+ # @pytest.fixture(autouse=True, scope="class")
234
+ # def mock_auth(cls):
235
+ # with patch("ads.common.auth.default_signer") as mock_default_signer:
236
+ # yield mock_default_signer
237
+ #
238
+ # @pytest.fixture(autouse=True, scope="class")
239
+ # def mock_init_client(cls):
240
+ # with patch(
241
+ # "ads.common.oci_datascience.OCIDataScienceMixin.init_client"
242
+ # ) as mock_client:
243
+ # yield mock_client
244
244
245
245
def setup_method (self ):
246
246
self .default_signer_patch = patch (
@@ -658,6 +658,9 @@ def test_get_model_fine_tuned(
658
658
(False , False ),
659
659
],
660
660
)
661
+ @patch ("ads.model.service.oci_datascience_model.OCIDataScienceModel.create" )
662
+ @patch ("ads.model.datascience_model.DataScienceModel.sync" )
663
+ @patch ("ads.model.datascience_model.DataScienceModel.upload_artifact" )
661
664
@patch .object (AquaModelApp , "_find_matching_aqua_model" )
662
665
@patch ("ads.aqua.common.utils.copy_file" )
663
666
@patch ("ads.common.object_storage_details.ObjectStorageDetails.list_objects" )
@@ -672,16 +675,15 @@ def test_import_verified_model(
672
675
mock_list_objects ,
673
676
mock_copy_file ,
674
677
mock__find_matching_aqua_model ,
678
+ mock_upload_artifact ,
679
+ mock_sync ,
680
+ mock_ocidsc_create ,
675
681
artifact_location_set ,
676
682
download_from_hf ,
677
683
mock_get_hf_model_info ,
684
+ mock_init_client ,
678
685
):
679
686
ObjectStorageDetails .is_bucket_versioned = MagicMock (return_value = True )
680
- ads .common .oci_datascience .OCIDataScienceMixin .init_client = MagicMock ()
681
- DataScienceModel .upload_artifact = MagicMock ()
682
- DataScienceModel .sync = MagicMock ()
683
- OCIDataScienceModel .create = MagicMock ()
684
-
685
687
# The name attribute cannot be mocked during creation of the mock object,
686
688
# hence attach it separately to the mocked objects.
687
689
artifact_path = "service_models/model-name/commit-id/artifact"
@@ -780,17 +782,21 @@ def test_import_verified_model(
780
782
assert model .ready_to_deploy is True
781
783
assert model .ready_to_finetune is False
782
784
785
+ @patch ("ads.model.service.oci_datascience_model.OCIDataScienceModel.create" )
786
+ @patch ("ads.model.datascience_model.DataScienceModel.sync" )
787
+ @patch ("ads.model.datascience_model.DataScienceModel.upload_artifact" )
783
788
@patch .object (AquaModelApp , "_validate_model" )
784
789
@patch ("ads.aqua.common.utils.load_config" , return_value = {})
785
790
def test_import_any_model_no_containers_specified (
786
- self , mock_load_config , mock__validate_model , mock_get_hf_model_info
791
+ self ,
792
+ mock_load_config ,
793
+ mock__validate_model ,
794
+ mock_upload_artifact ,
795
+ mock_sync ,
796
+ mock_ocidsc_create ,
797
+ mock_get_hf_model_info ,
787
798
):
788
799
ObjectStorageDetails .is_bucket_versioned = MagicMock (return_value = True )
789
- ads .common .oci_datascience .OCIDataScienceMixin .init_client = MagicMock ()
790
- DataScienceModel .upload_artifact = MagicMock ()
791
- DataScienceModel .sync = MagicMock ()
792
- OCIDataScienceModel .create = MagicMock ()
793
-
794
800
os_path = "oci://aqua-bkt@aqua-ns/prefix/path"
795
801
model_name = "oracle/aqua-1t-mega-model"
796
802
ds_freeform_tags = {
@@ -827,6 +833,9 @@ def test_import_any_model_no_containers_specified(
827
833
"download_from_hf" ,
828
834
[True , False ],
829
835
)
836
+ @patch ("ads.model.service.oci_datascience_model.OCIDataScienceModel.create" )
837
+ @patch ("ads.model.datascience_model.DataScienceModel.sync" )
838
+ @patch ("ads.model.datascience_model.DataScienceModel.upload_artifact" )
830
839
@patch .object (AquaModelApp , "_find_matching_aqua_model" )
831
840
@patch ("ads.common.object_storage_details.ObjectStorageDetails.list_objects" )
832
841
@patch ("ads.aqua.common.utils.load_config" , return_value = {})
@@ -839,14 +848,13 @@ def test_import_model_with_project_compartment_override(
839
848
mock_load_config ,
840
849
mock_list_objects ,
841
850
mock__find_matching_aqua_model ,
851
+ mock_upload_artifact ,
852
+ mock_sync ,
853
+ mock_ocidsc_create ,
842
854
download_from_hf ,
843
855
mock_get_hf_model_info ,
844
856
):
845
857
ObjectStorageDetails .is_bucket_versioned = MagicMock (return_value = True )
846
- ads .common .oci_datascience .OCIDataScienceMixin .init_client = MagicMock ()
847
- DataScienceModel .upload_artifact = MagicMock ()
848
- DataScienceModel .sync = MagicMock ()
849
- OCIDataScienceModel .create = MagicMock ()
850
858
851
859
mock_list_objects .return_value = MagicMock (objects = [])
852
860
ds_model = DataScienceModel ()
@@ -908,6 +916,8 @@ def test_import_model_with_project_compartment_override(
908
916
"download_from_hf" ,
909
917
[True , False ],
910
918
)
919
+ @patch ("ads.model.service.oci_datascience_model.OCIDataScienceModel.create" )
920
+ @patch ("ads.model.datascience_model.DataScienceModel.upload_artifact" )
911
921
@patch ("ads.common.object_storage_details.ObjectStorageDetails.list_objects" )
912
922
@patch ("ads.aqua.common.utils.load_config" , side_effect = AquaFileNotFoundError )
913
923
@patch ("huggingface_hub.snapshot_download" )
@@ -918,17 +928,18 @@ def test_import_model_with_missing_config(
918
928
mock_snapshot_download ,
919
929
mock_load_config ,
920
930
mock_list_objects ,
931
+ mock_upload_artifact ,
932
+ mock_ocidsc_create ,
921
933
mock_get_container_config ,
922
934
download_from_hf ,
923
935
mock_get_hf_model_info ,
936
+ mock_init_client ,
924
937
):
925
938
"""Test for validating if error is returned when model artifacts are incomplete or not available."""
926
939
927
940
os_path = "oci://aqua-bkt@aqua-ns/prefix/path"
928
941
model_name = "oracle/aqua-1t-mega-model"
929
942
ObjectStorageDetails .is_bucket_versioned = MagicMock (return_value = True )
930
- ads .common .oci_datascience .OCIDataScienceMixin .init_client = MagicMock ()
931
- DataScienceModel .upload_artifact = MagicMock ()
932
943
mock_list_objects .return_value = MagicMock (objects = [])
933
944
reload (ads .aqua .model .model )
934
945
app = AquaModelApp ()
@@ -952,21 +963,24 @@ def test_import_model_with_missing_config(
952
963
download_from_hf = False ,
953
964
)
954
965
966
+ @patch ("ads.model.service.oci_datascience_model.OCIDataScienceModel.create" )
967
+ @patch ("ads.model.datascience_model.DataScienceModel.sync" )
968
+ @patch ("ads.model.datascience_model.DataScienceModel.upload_artifact" )
955
969
@patch ("ads.common.object_storage_details.ObjectStorageDetails.list_objects" )
956
970
@patch .object (HfApi , "model_info" )
957
971
@patch ("ads.aqua.common.utils.load_config" , return_value = {})
958
972
def test_import_any_model_smc_container (
959
973
self ,
960
974
mock_load_config ,
961
975
mock_list_objects ,
976
+ mock_upload_artifact ,
977
+ mock_sync ,
978
+ mock_ocidsc_create ,
962
979
mock_get_hf_model_info ,
980
+ mock_init_client ,
963
981
):
964
982
my_model = "oracle/aqua-1t-mega-model"
965
983
ObjectStorageDetails .is_bucket_versioned = MagicMock (return_value = True )
966
- ads .common .oci_datascience .OCIDataScienceMixin .init_client = MagicMock ()
967
- DataScienceModel .upload_artifact = MagicMock ()
968
- DataScienceModel .sync = MagicMock ()
969
- OCIDataScienceModel .create = MagicMock ()
970
984
971
985
os_path = "oci://aqua-bkt@aqua-ns/prefix/path"
972
986
ds_freeform_tags = {
@@ -1014,86 +1028,89 @@ def test_import_any_model_smc_container(
1014
1028
assert model .ready_to_deploy is True
1015
1029
assert model .ready_to_finetune is True
1016
1030
1017
- # @pytest.mark.parametrize(
1018
- # "download_from_hf",
1019
- # [True, False],
1020
- # )
1021
- # @patch.object(AquaModelApp, "_find_matching_aqua_model")
1022
- # @patch("ads.common.object_storage_details.ObjectStorageDetails.list_objects")
1023
- # @patch("ads.aqua.common.utils.load_config", return_value={})
1024
- # @patch("huggingface_hub.snapshot_download")
1025
- # @patch("subprocess.check_call")
1026
- # def test_import_tei_model_byoc(
1027
- # self,
1028
- # mock_subprocess,
1029
- # mock_snapshot_download,
1030
- # mock_load_config,
1031
- # mock_list_objects,
1032
- # mock__find_matching_aqua_model,
1033
- # download_from_hf,
1034
- # mock_get_hf_model_info,
1035
- # ):
1036
- # ObjectStorageDetails.is_bucket_versioned = MagicMock(return_value=True)
1037
- # ads.common.oci_datascience.OCIDataScienceMixin.init_client = MagicMock()
1038
- # DataScienceModel.upload_artifact = MagicMock()
1039
- # DataScienceModel.sync = MagicMock()
1040
- # OCIDataScienceModel.create = MagicMock()
1041
- #
1042
- # artifact_path = "service_models/model-name/commit-id/artifact"
1043
- # obj1 = MagicMock(etag="12345-1234-1234-1234-123456789", size=150)
1044
- # obj1.name = f"{artifact_path}/config.json"
1045
- # objects = [obj1]
1046
- # mock_list_objects.return_value = MagicMock(objects=objects)
1047
- # ds_model = DataScienceModel()
1048
- # os_path = "oci://aqua-bkt@aqua-ns/prefix/path"
1049
- # model_name = "oracle/aqua-1t-mega-model"
1050
- # ds_freeform_tags = {
1051
- # "OCI_AQUA": "ACTIVE",
1052
- # "license": "aqua-license",
1053
- # "organization": "oracle",
1054
- # "task": "text_embedding",
1055
- # }
1056
- # ds_model = (
1057
- # ds_model.with_compartment_id("test_model_compartment_id")
1058
- # .with_project_id("test_project_id")
1059
- # .with_display_name(model_name)
1060
- # .with_description("test_description")
1061
- # .with_model_version_set_id("test_model_version_set_id")
1062
- # .with_freeform_tags(**ds_freeform_tags)
1063
- # .with_version_id("ocid1.version.id")
1064
- # )
1065
- # custom_metadata_list = ModelCustomMetadata()
1066
- # custom_metadata_list.add(
1067
- # **{"key": "deployment-container", "value": "odsc-tei-serving"}
1068
- # )
1069
- # ds_model.with_custom_metadata_list(custom_metadata_list)
1070
- # ds_model.set_spec(ds_model.CONST_MODEL_FILE_DESCRIPTION, {})
1071
- # DataScienceModel.from_id = MagicMock(return_value=ds_model)
1072
- # mock__find_matching_aqua_model.return_value = None
1073
- # reload(ads.aqua.model.model)
1074
- # app = AquaModelApp()
1075
- #
1076
- # if download_from_hf:
1077
- # with tempfile.TemporaryDirectory() as tmpdir:
1078
- # model: AquaModel = app.register(
1079
- # model=model_name,
1080
- # os_path=os_path,
1081
- # local_dir=str(tmpdir),
1082
- # download_from_hf=True,
1083
- # inference_container="odsc-tei-serving",
1084
- # inference_container_uri="region.ocir.io/your_tenancy/your_image",
1085
- # )
1086
- # else:
1087
- # model: AquaModel = app.register(
1088
- # model="ocid1.datasciencemodel.xxx.xxxx.",
1089
- # os_path=os_path,
1090
- # download_from_hf=False,
1091
- # inference_container="odsc-tei-serving",
1092
- # inference_container_uri="region.ocir.io/your_tenancy/your_image",
1093
- # )
1094
- # assert model.inference_container == "odsc-tei-serving"
1095
- # assert model.ready_to_deploy is True
1096
- # assert model.ready_to_finetune is False
1031
+ @pytest .mark .parametrize (
1032
+ "download_from_hf" ,
1033
+ [True , False ],
1034
+ )
1035
+ @patch ("ads.model.service.oci_datascience_model.OCIDataScienceModel.create" )
1036
+ @patch ("ads.model.datascience_model.DataScienceModel.sync" )
1037
+ @patch ("ads.model.datascience_model.DataScienceModel.upload_artifact" )
1038
+ @patch .object (AquaModelApp , "_find_matching_aqua_model" )
1039
+ @patch ("ads.common.object_storage_details.ObjectStorageDetails.list_objects" )
1040
+ @patch ("ads.aqua.common.utils.load_config" , return_value = {})
1041
+ @patch ("huggingface_hub.snapshot_download" )
1042
+ @patch ("subprocess.check_call" )
1043
+ def test_import_tei_model_byoc (
1044
+ self ,
1045
+ mock_subprocess ,
1046
+ mock_snapshot_download ,
1047
+ mock_load_config ,
1048
+ mock_list_objects ,
1049
+ mock__find_matching_aqua_model ,
1050
+ mock_upload_artifact ,
1051
+ mock_sync ,
1052
+ mock_ocidsc_create ,
1053
+ download_from_hf ,
1054
+ mock_get_hf_model_info ,
1055
+ mock_init_client ,
1056
+ ):
1057
+ ObjectStorageDetails .is_bucket_versioned = MagicMock (return_value = True )
1058
+
1059
+ artifact_path = "service_models/model-name/commit-id/artifact"
1060
+ obj1 = MagicMock (etag = "12345-1234-1234-1234-123456789" , size = 150 )
1061
+ obj1 .name = f"{ artifact_path } /config.json"
1062
+ objects = [obj1 ]
1063
+ mock_list_objects .return_value = MagicMock (objects = objects )
1064
+ ds_model = DataScienceModel ()
1065
+ os_path = "oci://aqua-bkt@aqua-ns/prefix/path"
1066
+ model_name = "oracle/aqua-1t-mega-model"
1067
+ ds_freeform_tags = {
1068
+ "OCI_AQUA" : "ACTIVE" ,
1069
+ "license" : "aqua-license" ,
1070
+ "organization" : "oracle" ,
1071
+ "task" : "text_embedding" ,
1072
+ }
1073
+ ds_model = (
1074
+ ds_model .with_compartment_id ("test_model_compartment_id" )
1075
+ .with_project_id ("test_project_id" )
1076
+ .with_display_name (model_name )
1077
+ .with_description ("test_description" )
1078
+ .with_model_version_set_id ("test_model_version_set_id" )
1079
+ .with_freeform_tags (** ds_freeform_tags )
1080
+ .with_version_id ("ocid1.version.id" )
1081
+ )
1082
+ custom_metadata_list = ModelCustomMetadata ()
1083
+ custom_metadata_list .add (
1084
+ ** {"key" : "deployment-container" , "value" : "odsc-tei-serving" }
1085
+ )
1086
+ ds_model .with_custom_metadata_list (custom_metadata_list )
1087
+ ds_model .set_spec (ds_model .CONST_MODEL_FILE_DESCRIPTION , {})
1088
+ DataScienceModel .from_id = MagicMock (return_value = ds_model )
1089
+ mock__find_matching_aqua_model .return_value = None
1090
+ reload (ads .aqua .model .model )
1091
+ app = AquaModelApp ()
1092
+
1093
+ if download_from_hf :
1094
+ with tempfile .TemporaryDirectory () as tmpdir :
1095
+ model : AquaModel = app .register (
1096
+ model = model_name ,
1097
+ os_path = os_path ,
1098
+ local_dir = str (tmpdir ),
1099
+ download_from_hf = True ,
1100
+ inference_container = "odsc-tei-serving" ,
1101
+ inference_container_uri = "region.ocir.io/your_tenancy/your_image" ,
1102
+ )
1103
+ else :
1104
+ model : AquaModel = app .register (
1105
+ model = "ocid1.datasciencemodel.xxx.xxxx." ,
1106
+ os_path = os_path ,
1107
+ download_from_hf = False ,
1108
+ inference_container = "odsc-tei-serving" ,
1109
+ inference_container_uri = "region.ocir.io/your_tenancy/your_image" ,
1110
+ )
1111
+ assert model .inference_container == "odsc-tei-serving"
1112
+ assert model .ready_to_deploy is True
1113
+ assert model .ready_to_finetune is False
1097
1114
1098
1115
@pytest .mark .parametrize (
1099
1116
"data, expected_output" ,
0 commit comments