Skip to content

Commit 71b1e9f

Browse files
add deployment tests
1 parent 60e6b68 commit 71b1e9f

File tree

3 files changed

+291
-0
lines changed

3 files changed

+291
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
kind: deployment
2+
spec:
3+
createdBy: ocid1.user.oc1..<OCID>
4+
displayName: model-deployment-name
5+
freeformTags:
6+
OCI_AQUA: active
7+
aqua_model_name: model-name
8+
id: "ocid1.datasciencemodeldeployment.oc1.<region>.<MD_OCID>"
9+
infrastructure:
10+
kind: infrastructure
11+
spec:
12+
bandwidthMbps: 10
13+
compartmentId: ocid1.compartment.oc1..<OCID>
14+
deploymentType: SINGLE_MODEL
15+
policyType: FIXED_SIZE
16+
projectId: ocid1.datascienceproject.oc1.iad.<OCID>
17+
replica: 1
18+
shapeName: "VM.GPU.A10.1"
19+
type: datascienceModelDeployment
20+
lifecycleState: CREATING
21+
modelDeploymentUrl: "https://modeldeployment.customer-oci.com/ocid1.datasciencemodeldeployment.oc1.<region>.<MD_OCID>"
22+
runtime:
23+
kind: runtime
24+
spec:
25+
env:
26+
BASE_MODEL: service_models/model-name/artifact
27+
MODEL_DEPLOY_PREDICT_ENDPOINT: /v1/embeddings
28+
healthCheckPort: 8080
29+
image: "dsmc://image-name:1.0.0.0"
30+
modelUri: "ocid1.datasciencemodeldeployment.oc1.<region>.<MODEL_OCID>"
31+
serverPort: 8080
32+
type: container
33+
timeCreated: 2024-01-01T00:00:00.000000+00:00
34+
type: modelDeployment
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
kind: datascienceModel
2+
spec:
3+
artifact: oci://service-managed-models@namespace/service_models/model-name/artifact
4+
compartmentId: ocid1.compartment.oc1..<OCID>
5+
customMetadataList:
6+
data:
7+
- category: Other
8+
description: artifact location
9+
key: artifact_location
10+
value: service_models/model-name/artifact
11+
- category: Other
12+
description: model by reference flag
13+
key: modelDescription
14+
value: true
15+
- category: Other
16+
description: Deployment container mapping for model model-name
17+
key: deployment-container
18+
value: odsc-tei-serving
19+
- category: Other
20+
description: Inference container URI for model model-name
21+
key: deployment-container-uri
22+
value: region.ocir.io/tenancy/image_name:tag
23+
- category: Other
24+
description: Inference container cmd vars for model-name
25+
key: container-cmd-var
26+
value: --model-id,/opt/ds/model/deployed_model/service_models/model-name/artifact/,--port,8080
27+
definedTags: {}
28+
description: Mock model description
29+
displayName: model-name
30+
freeformTags:
31+
OCI_AQUA: active
32+
license: License
33+
organization: Organization
34+
ready_to_fine_tune: false
35+
task: text_embedding
36+
id: ocid1.datasciencemodel.oc1.iad.<OCID>
37+
lifecycleState: ACTIVE
38+
modelDescription:
39+
models:
40+
- bucketName: service-managed-models
41+
namespace: namespace
42+
objects:
43+
- name: service_models/model-name/artifact/README.md
44+
sizeInBytes: 10317
45+
version: 450a8124-f5ca-4ee6-b4cf-c1dc05b13d46
46+
- name: service_models/model-name/artifact/config.json
47+
sizeInBytes: 950
48+
version: 3ace781b-4a48-4e89-88b6-61f0db6d51ad
49+
- name: service_models/model-name/artifact/configuration_RW.py
50+
sizeInBytes: 2607
51+
version: ba1df5b6-7546-42e5-964e-63cd013e988c
52+
- name: service_models/model-name/artifact/generation_config.json
53+
sizeInBytes: 111
54+
version: e23a04c8-9725-4f20-8bb1-f455129e2a4e
55+
- name: service_models/model-name/artifact/modelling_RW.py
56+
sizeInBytes: 47560
57+
version: a584c221-afab-441f-901d-fbe8251dccf6
58+
- name: service_models/model-name/artifact/pytorch_model-00001-of-00002.bin
59+
sizeInBytes: 9951028193
60+
version: e919676e-48dd-4bea-af82-14b5f3eb2b9b
61+
- name: service_models/model-name/artifact/pytorch_model-00002-of-00002.bin
62+
sizeInBytes: 4483421659
63+
version: d6255d3e-bd91-4c05-b3ca-fc1be576ee10
64+
- name: service_models/model-name/artifact/pytorch_model.bin.index.json
65+
sizeInBytes: 16924
66+
version: 0419428c-2a7b-45d9-bb78-142fe0630017
67+
- name: service_models/model-name/artifact/special_tokens_map.json
68+
sizeInBytes: 281
69+
version: 5569231a-a526-4881-8945-a94a1bb59b2e
70+
- name: service_models/model-name/artifact/tokenizer.json
71+
sizeInBytes: 2734130
72+
version: d3a8a00a-de79-4d80-aa69-d8f68ee800ec
73+
- name: service_models/model-name/artifact/tokenizer_config.json
74+
sizeInBytes: 220
75+
version: 84eed6ff-c1ed-4641-8c10-e6a49364d7dd
76+
prefix: service_models/model-name/artifact
77+
type: modelOSSReferenceDescription
78+
version: '1.0'
79+
projectId: ocid1.datascienceproject.oc1.iad.<OCID>
80+
provenanceMetadata:
81+
artifact_dir: null
82+
git_branch: null
83+
git_commit: 123456
84+
repository_url: https://model-name-url.com
85+
training_id: null
86+
training_script_path: null
87+
timeCreated: 2024-01-01T00:00:00.000000+00:00
88+
type: dataScienceModel

tests/unitary/with_extras/aqua/test_deployment.py

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,78 @@ class TestDataset:
171171
}
172172
]
173173

174+
model_deployment_object_tei_byoc = [
175+
{
176+
"category_log_details": oci.data_science.models.CategoryLogDetails(
177+
**{
178+
"access": oci.data_science.models.LogDetails(
179+
**{
180+
"log_group_id": "ocid1.loggroup.oc1.<region>.<OCID>",
181+
"log_id": "ocid1.log.oc1.<region>.<OCID>",
182+
}
183+
),
184+
"predict": oci.data_science.models.LogDetails(
185+
**{
186+
"log_group_id": "ocid1.loggroup.oc1.<region>.<OCID>",
187+
"log_id": "ocid1.log.oc1.<region>.<OCID>",
188+
}
189+
),
190+
}
191+
),
192+
"compartment_id": "ocid1.compartment.oc1..<OCID>",
193+
"created_by": "ocid1.user.oc1..<OCID>",
194+
"defined_tags": {},
195+
"description": "Mock description",
196+
"display_name": "model-deployment-name",
197+
"freeform_tags": {"OCI_AQUA": "active", "aqua_model_name": "model-name"},
198+
"id": "ocid1.datasciencemodeldeployment.oc1.<region>.<MD_OCID>",
199+
"lifecycle_state": "ACTIVE",
200+
"model_deployment_configuration_details": oci.data_science.models.SingleModelDeploymentConfigurationDetails(
201+
**{
202+
"deployment_type": "SINGLE_MODEL",
203+
"environment_configuration_details": oci.data_science.models.OcirModelDeploymentEnvironmentConfigurationDetails(
204+
**{
205+
"cmd": [
206+
"--model-id",
207+
"/opt/ds/model/deployed_model/service_models/model-name/artifact/",
208+
"--port",
209+
"8080",
210+
],
211+
"entrypoint": [],
212+
"environment_configuration_type": "OCIR_CONTAINER",
213+
"environment_variables": {
214+
"BASE_MODEL": "service_models/model-name/artifact",
215+
"MODEL_DEPLOY_PREDICT_ENDPOINT": "/v1/embeddings",
216+
},
217+
"health_check_port": 8080,
218+
"image": "dsmc://image-name:1.0.0.0",
219+
"image_digest": "sha256:mock22373c16f2015f6f33c5c8553923cf8520217da0bd9504471c5e53cbc9d",
220+
"server_port": 8080,
221+
}
222+
),
223+
"model_configuration_details": oci.data_science.models.ModelConfigurationDetails(
224+
**{
225+
"bandwidth_mbps": 10,
226+
"instance_configuration": oci.data_science.models.InstanceConfiguration(
227+
**{
228+
"instance_shape_name": DEPLOYMENT_SHAPE_NAME,
229+
"model_deployment_instance_shape_config_details": null,
230+
}
231+
),
232+
"model_id": "ocid1.datasciencemodel.oc1.<region>.<OCID>",
233+
"scaling_policy": oci.data_science.models.FixedSizeScalingPolicy(
234+
**{"instance_count": 1, "policy_type": "FIXED_SIZE"}
235+
),
236+
}
237+
),
238+
}
239+
),
240+
"model_deployment_url": MODEL_DEPLOYMENT_URL,
241+
"project_id": "ocid1.datascienceproject.oc1.<region>.<OCID>",
242+
"time_created": "2024-01-01T00:00:00.000000+00:00",
243+
}
244+
]
245+
174246
aqua_deployment_object = {
175247
"id": "ocid1.datasciencemodeldeployment.oc1.<region>.<MD_OCID>",
176248
"display_name": "model-deployment-name",
@@ -237,6 +309,25 @@ class TestDataset:
237309
"top_k": 10,
238310
}
239311

312+
aqua_deployment_tei_byoc_embeddings_env_vars = {
313+
"BASE_MODEL": "service_models/model-name/artifact",
314+
"MODEL_DEPLOY_PREDICT_ENDPOINT": "/v1/embeddings",
315+
}
316+
317+
aqua_deployment_tei_byoc_embeddings_shape_info = {
318+
"instance_shape": DEPLOYMENT_SHAPE_NAME,
319+
"instance_count": 1,
320+
"ocpus": None,
321+
"memory_in_gbs": None,
322+
}
323+
324+
aqua_deployment_tei_byoc_embeddings_cmd = [
325+
"--model-id",
326+
"/opt/ds/model/deployed_model/service_models/model-name/artifact/",
327+
"--port",
328+
"8080",
329+
]
330+
240331

241332
class TestAquaDeployment(unittest.TestCase):
242333
def setUp(self):
@@ -489,6 +580,84 @@ def test_create_deployment_for_fine_tuned_model(
489580
expected_result["state"] = "CREATING"
490581
assert actual_attributes == expected_result
491582

583+
@patch("ads.aqua.modeldeployment.deployment.get_container_config")
584+
@patch("ads.aqua.model.AquaModelApp.create")
585+
@patch("ads.aqua.modeldeployment.deployment.get_container_image")
586+
@patch("ads.model.deployment.model_deployment.ModelDeployment.deploy")
587+
def test_create_deployment_for_tei_byoc_embedding_model(
588+
self,
589+
mock_deploy,
590+
mock_get_container_image,
591+
mock_create,
592+
mock_get_container_config,
593+
):
594+
"""Test to create a deployment for fine-tuned model"""
595+
aqua_model = os.path.join(
596+
self.curr_dir, "test_data/deployment/aqua_tei_byoc_embedding_model.yaml"
597+
)
598+
datascience_model = DataScienceModel.from_yaml(uri=aqua_model)
599+
mock_create.return_value = datascience_model
600+
601+
config_json = os.path.join(
602+
self.curr_dir, "test_data/deployment/deployment_config.json"
603+
)
604+
with open(config_json, "r") as _file:
605+
config = json.load(_file)
606+
607+
self.app.get_deployment_config = MagicMock(return_value=config)
608+
609+
container_index_json = os.path.join(
610+
self.curr_dir, "test_data/ui/container_index.json"
611+
)
612+
with open(container_index_json, "r") as _file:
613+
container_index_config = json.load(_file)
614+
mock_get_container_config.return_value = container_index_config
615+
616+
mock_get_container_image.return_value = TestDataset.DEPLOYMENT_IMAGE_NAME
617+
aqua_deployment = os.path.join(
618+
self.curr_dir, "test_data/deployment/aqua_create_embedding_deployment.yaml"
619+
)
620+
model_deployment_obj = ModelDeployment.from_yaml(uri=aqua_deployment)
621+
model_deployment_dsc_obj = copy.deepcopy(
622+
TestDataset.model_deployment_object_tei_byoc[0]
623+
)
624+
model_deployment_dsc_obj["lifecycle_state"] = "CREATING"
625+
model_deployment_obj.dsc_model_deployment = (
626+
oci.data_science.models.ModelDeploymentSummary(**model_deployment_dsc_obj)
627+
)
628+
mock_deploy.return_value = model_deployment_obj
629+
630+
result = self.app.create(
631+
model_id=TestDataset.MODEL_ID,
632+
instance_shape=TestDataset.DEPLOYMENT_SHAPE_NAME,
633+
display_name="model-deployment-name",
634+
log_group_id="ocid1.loggroup.oc1.<region>.<OCID>",
635+
access_log_id="ocid1.log.oc1.<region>.<OCID>",
636+
predict_log_id="ocid1.log.oc1.<region>.<OCID>",
637+
container_family="odsc-tei-serving",
638+
cmd_var=[],
639+
)
640+
641+
mock_create.assert_called_with(
642+
model_id=TestDataset.MODEL_ID, compartment_id=None, project_id=None
643+
)
644+
mock_get_container_image.assert_called()
645+
mock_deploy.assert_called()
646+
647+
expected_attributes = set(AquaDeployment.__annotations__.keys())
648+
actual_attributes = asdict(result)
649+
assert set(actual_attributes) == set(expected_attributes), "Attributes mismatch"
650+
expected_result = copy.deepcopy(TestDataset.aqua_deployment_object)
651+
expected_result["state"] = "CREATING"
652+
expected_result["shape_info"] = (
653+
TestDataset.aqua_deployment_tei_byoc_embeddings_shape_info
654+
)
655+
expected_result["cmd"] = TestDataset.aqua_deployment_tei_byoc_embeddings_cmd
656+
expected_result["environment_variables"] = (
657+
TestDataset.aqua_deployment_tei_byoc_embeddings_env_vars
658+
)
659+
assert actual_attributes == expected_result
660+
492661
@patch("ads.aqua.modeldeployment.deployment.get_container_config")
493662
@patch("ads.aqua.model.AquaModelApp.create")
494663
@patch("ads.aqua.modeldeployment.deployment.get_container_image")

0 commit comments

Comments
 (0)