clarifai 10.8.9__tar.gz → 10.9.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. {clarifai-10.8.9/clarifai.egg-info → clarifai-10.9.0}/PKG-INFO +1 -1
  2. clarifai-10.9.0/clarifai/__init__.py +1 -0
  3. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/loaders/imagenet_classification.py +5 -1
  4. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/utils/evaluation/helpers.py +10 -4
  5. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/utils/evaluation/main.py +2 -1
  6. {clarifai-10.8.9 → clarifai-10.9.0/clarifai.egg-info}/PKG-INFO +1 -1
  7. {clarifai-10.8.9 → clarifai-10.9.0}/tests/test_app.py +7 -12
  8. {clarifai-10.8.9 → clarifai-10.9.0}/tests/test_data_upload.py +35 -2
  9. clarifai-10.9.0/tests/test_eval.py +129 -0
  10. clarifai-10.8.9/clarifai/__init__.py +0 -1
  11. clarifai-10.8.9/tests/test_eval.py +0 -90
  12. {clarifai-10.8.9 → clarifai-10.9.0}/LICENSE +0 -0
  13. {clarifai-10.8.9 → clarifai-10.9.0}/MANIFEST.in +0 -0
  14. {clarifai-10.8.9 → clarifai-10.9.0}/README.md +0 -0
  15. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/cli.py +0 -0
  16. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/__init__.py +0 -0
  17. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/app.py +0 -0
  18. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/auth/__init__.py +0 -0
  19. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/auth/helper.py +0 -0
  20. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/auth/register.py +0 -0
  21. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/auth/stub.py +0 -0
  22. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/base.py +0 -0
  23. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/compute_cluster.py +0 -0
  24. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/dataset.py +0 -0
  25. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/deployment.py +0 -0
  26. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/input.py +0 -0
  27. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/lister.py +0 -0
  28. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/model.py +0 -0
  29. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/module.py +0 -0
  30. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/nodepool.py +0 -0
  31. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/search.py +0 -0
  32. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/user.py +0 -0
  33. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/workflow.py +0 -0
  34. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/constants/base.py +0 -0
  35. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/constants/dataset.py +0 -0
  36. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/constants/input.py +0 -0
  37. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/constants/model.py +0 -0
  38. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/constants/rag.py +0 -0
  39. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/constants/search.py +0 -0
  40. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/constants/workflow.py +0 -0
  41. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/__init__.py +0 -0
  42. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/export/__init__.py +0 -0
  43. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/export/inputs_annotations.py +0 -0
  44. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/__init__.py +0 -0
  45. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/base.py +0 -0
  46. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/features.py +0 -0
  47. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/image.py +0 -0
  48. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/loaders/README.md +0 -0
  49. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/loaders/__init__.py +0 -0
  50. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/loaders/coco_captions.py +0 -0
  51. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/loaders/coco_detection.py +0 -0
  52. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/loaders/xview_detection.py +0 -0
  53. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/multimodal.py +0 -0
  54. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/text.py +0 -0
  55. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/utils.py +0 -0
  56. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/errors.py +0 -0
  57. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/models/__init__.py +0 -0
  58. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/models/api.py +0 -0
  59. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/modules/README.md +0 -0
  60. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/modules/__init__.py +0 -0
  61. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/modules/css.py +0 -0
  62. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/modules/pages.py +0 -0
  63. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/modules/style.css +0 -0
  64. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/rag/__init__.py +0 -0
  65. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/rag/rag.py +0 -0
  66. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/rag/utils.py +0 -0
  67. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/__init__.py +0 -0
  68. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/dockerfile_template/Dockerfile.cpu.template +0 -0
  69. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/dockerfile_template/Dockerfile.cuda.template +0 -0
  70. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/models/__init__.py +0 -0
  71. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/models/base_typed_model.py +0 -0
  72. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/models/model_class.py +0 -0
  73. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/models/model_runner.py +0 -0
  74. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/models/model_servicer.py +0 -0
  75. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/models/model_upload.py +0 -0
  76. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/server.py +0 -0
  77. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/utils/__init__.py +0 -0
  78. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/utils/data_handler.py +0 -0
  79. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/utils/data_utils.py +0 -0
  80. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/utils/loader.py +0 -0
  81. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/utils/url_fetcher.py +0 -0
  82. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/schema/search.py +0 -0
  83. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/urls/helper.py +0 -0
  84. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/utils/__init__.py +0 -0
  85. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/utils/constants.py +0 -0
  86. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/utils/evaluation/__init__.py +0 -0
  87. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/utils/evaluation/testset_annotation_parser.py +0 -0
  88. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/utils/logging.py +0 -0
  89. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/utils/misc.py +0 -0
  90. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/utils/model_train.py +0 -0
  91. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/versions.py +0 -0
  92. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/workflows/__init__.py +0 -0
  93. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/workflows/export.py +0 -0
  94. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/workflows/utils.py +0 -0
  95. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/workflows/validate.py +0 -0
  96. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai.egg-info/SOURCES.txt +0 -0
  97. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai.egg-info/dependency_links.txt +0 -0
  98. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai.egg-info/entry_points.txt +0 -0
  99. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai.egg-info/requires.txt +0 -0
  100. {clarifai-10.8.9 → clarifai-10.9.0}/clarifai.egg-info/top_level.txt +0 -0
  101. {clarifai-10.8.9 → clarifai-10.9.0}/pyproject.toml +0 -0
  102. {clarifai-10.8.9 → clarifai-10.9.0}/requirements.txt +0 -0
  103. {clarifai-10.8.9 → clarifai-10.9.0}/setup.cfg +0 -0
  104. {clarifai-10.8.9 → clarifai-10.9.0}/setup.py +0 -0
  105. {clarifai-10.8.9 → clarifai-10.9.0}/tests/test_auth.py +0 -0
  106. {clarifai-10.8.9 → clarifai-10.9.0}/tests/test_misc.py +0 -0
  107. {clarifai-10.8.9 → clarifai-10.9.0}/tests/test_model_predict.py +0 -0
  108. {clarifai-10.8.9 → clarifai-10.9.0}/tests/test_model_train.py +0 -0
  109. {clarifai-10.8.9 → clarifai-10.9.0}/tests/test_modules.py +0 -0
  110. {clarifai-10.8.9 → clarifai-10.9.0}/tests/test_rag.py +0 -0
  111. {clarifai-10.8.9 → clarifai-10.9.0}/tests/test_search.py +0 -0
  112. {clarifai-10.8.9 → clarifai-10.9.0}/tests/test_stub.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: clarifai
3
- Version: 10.8.9
3
+ Version: 10.9.0
4
4
  Summary: Clarifai Python SDK
5
5
  Home-page: https://github.com/Clarifai/clarifai-python
6
6
  Author: Clarifai
@@ -0,0 +1 @@
1
+ __version__ = "10.9.0"
@@ -24,6 +24,10 @@ class ImageNetDataLoader(ClarifaiDataLoader):
24
24
 
25
25
  self.load_data()
26
26
 
27
+ @property
28
+ def task(self):
29
+ return "visual_classification"
30
+
27
31
  def load_data(self):
28
32
  #Creating label map
29
33
  with open(os.path.join(self.data_dir, "LOC_synset_mapping.txt")) as _file:
@@ -54,5 +58,5 @@ class ImageNetDataLoader(ClarifaiDataLoader):
54
58
  def __getitem__(self, idx):
55
59
  return VisualClassificationFeatures(
56
60
  image_path=self.image_paths[idx],
57
- label=self.concepts[idx],
61
+ labels=self.concepts[idx],
58
62
  id=self.image_paths[idx].split('.')[0].split('/')[-1])
@@ -58,13 +58,16 @@ class _BaseEvalResultHandler:
58
58
  model: Model
59
59
  eval_data: List[resources_pb2.EvalMetrics] = field(default_factory=list)
60
60
 
61
- def evaluate_and_wait(self, dataset: Dataset):
61
+ def evaluate_and_wait(self, dataset: Dataset, eval_info: dict = None):
62
62
  from tqdm import tqdm
63
63
  dataset_id = dataset.id
64
64
  dataset_app_id = dataset.app_id
65
65
  dataset_user_id = dataset.user_id
66
66
  _ = self.model.evaluate(
67
- dataset_id=dataset_id, dataset_app_id=dataset_app_id, dataset_user_id=dataset_user_id)
67
+ dataset_id=dataset_id,
68
+ dataset_app_id=dataset_app_id,
69
+ dataset_user_id=dataset_user_id,
70
+ eval_info=eval_info)
68
71
  latest_eval = self.model.list_evaluations()[0]
69
72
  excepted = 10
70
73
  desc = f"Please wait for the evaluation process between model {self.get_model_name()} and dataset {dataset_user_id}/{dataset_app_id}/{dataset_id} to complete."
@@ -83,7 +86,10 @@ class _BaseEvalResultHandler:
83
86
  f"Model has failed to evaluate \n {latest_eval.status}.\nPlease check your dataset inputs!"
84
87
  )
85
88
 
86
- def find_eval_id(self, datasets: List[Dataset] = [], attempt_evaluate: bool = False):
89
+ def find_eval_id(self,
90
+ datasets: List[Dataset] = [],
91
+ attempt_evaluate: bool = False,
92
+ eval_info: dict = None):
87
93
  list_eval_outputs = self.model.list_evaluations()
88
94
  self.eval_data = []
89
95
  for dataset in datasets:
@@ -117,7 +123,7 @@ class _BaseEvalResultHandler:
117
123
  # if not evaluated, but user wants to proceed it
118
124
  if not _is_found:
119
125
  if attempt_evaluate:
120
- self.eval_data.append(self.evaluate_and_wait(dataset))
126
+ self.eval_data.append(self.evaluate_and_wait(dataset, eval_info=eval_info))
121
127
  # otherwise raise error
122
128
  else:
123
129
  raise Exception(
@@ -53,6 +53,7 @@ class EvalResultCompare:
53
53
  models: Union[List[Model], List[str]],
54
54
  datasets: Union[Dataset, List[Dataset], str, List[str]],
55
55
  attempt_evaluate: bool = False,
56
+ eval_info: dict = None,
56
57
  auth_kwargs: dict = {}):
57
58
  assert isinstance(models, list), ValueError("Expected list")
58
59
 
@@ -97,7 +98,7 @@ class EvalResultCompare:
97
98
  assert self.model_type == model_type, f"Can not compare when model types are different, {self.model_type} != {model_type}"
98
99
  m = make_handler_by_type(model_type)(model=model)
99
100
  logger.info(f"* {m.get_model_name(pretify=True)}")
100
- m.find_eval_id(datasets=datasets, attempt_evaluate=attempt_evaluate)
101
+ m.find_eval_id(datasets=datasets, attempt_evaluate=attempt_evaluate, eval_info=eval_info)
101
102
  self._eval_handlers.append(m)
102
103
 
103
104
  @property
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: clarifai
3
- Version: 10.8.9
3
+ Version: 10.9.0
4
4
  Summary: Clarifai Python SDK
5
5
  Home-page: https://github.com/Clarifai/clarifai-python
6
6
  Author: Clarifai
@@ -1,6 +1,5 @@
1
1
  import logging
2
2
  import os
3
- import time
4
3
  import uuid
5
4
 
6
5
  import pytest
@@ -79,6 +78,11 @@ class TestApp:
79
78
  all_apps = list(client.list_apps())
80
79
  assert len(all_apps) > 0
81
80
 
81
+ # TODO To resolve `Insufficient scopes` error
82
+ # def test_app_input_count(self, app):
83
+ # input_count = app.get_input_count()
84
+ # assert input_count == 41
85
+
82
86
  def test_get_model(self, client):
83
87
  model = client.app(app_id=MAIN_APP_ID).model(model_id=GENERAL_MODEL_ID)
84
88
  versions = list(model.list_versions())
@@ -126,8 +130,9 @@ class TestApp:
126
130
 
127
131
  def test_get_dataset(self, create_app):
128
132
  dataset = create_app.dataset(dataset_id=CREATE_DATASET_ID)
133
+ dataset.create_version()
129
134
  versions = list(dataset.list_versions())
130
- assert len(versions) == 0 #test for list_versions
135
+ assert len(versions) == 1 #test for list_versions
131
136
  assert dataset.id == CREATE_DATASET_ID and dataset.app_id == CREATE_APP_ID and dataset.user_id == CREATE_APP_USER_ID
132
137
 
133
138
  def test_get_module(self, create_app):
@@ -144,16 +149,6 @@ class TestApp:
144
149
  all_concept_relations = list(create_app.search_concept_relations(show_tree=True))
145
150
  assert len(all_concept_relations) == 1
146
151
 
147
- def test_export_dataset(self, create_app):
148
- dataset = create_app.dataset(dataset_id=CREATE_DATASET_ID)
149
- dataset_demo_version = dataset.create_version()
150
- versions = list(dataset.list_versions())
151
- time.sleep(5)
152
- dataset_demo_version.export(save_path='tests/output_demo.zip')
153
- assert len(versions) == 1 #test for create_version
154
- assert os.path.exists('tests/output_demo.zip') is True
155
- os.remove('tests/output_demo.zip')
156
-
157
152
  def test_patch_app(self, caplog):
158
153
  with caplog.at_level(logging.INFO):
159
154
  User(user_id=CREATE_APP_USER_ID).patch_app(
@@ -1,11 +1,14 @@
1
1
  import logging
2
2
  import os
3
+ import time
3
4
  import uuid
4
5
 
5
6
  import pytest
6
7
  from google.protobuf.struct_pb2 import Struct
7
8
 
8
9
  from clarifai.client.user import User
10
+ from clarifai.datasets.upload.loaders.coco_detection import COCODetectionDataLoader
11
+ from clarifai.datasets.upload.loaders.imagenet_classification import ImageNetDataLoader
9
12
  from clarifai.datasets.upload.utils import load_module_dataloader
10
13
 
11
14
  CREATE_APP_USER_ID = os.environ["CLARIFAI_USER_ID"]
@@ -25,6 +28,8 @@ AUDIO_FILE_PATH = os.path.dirname(__file__) + "/assets/sample.mp3"
25
28
  CSV_FILE_PATH = os.path.dirname(__file__) + "/assets/sample.csv"
26
29
  FOLDER_PATH = os.path.dirname(__file__) + "/assets/test"
27
30
  MODULE_DIR = os.path.dirname(__file__) + "/assets/voc"
31
+ COCO_DET_DIR = os.path.dirname(__file__) + "/assets/coco_detection"
32
+ IMAGENET_DIR = os.path.dirname(__file__) + "/assets/imagenet_classification"
28
33
  TEXTS_FOLDER_PATH = os.path.dirname(__file__) + "/assets/sample_texts"
29
34
 
30
35
 
@@ -230,14 +235,42 @@ class Testdataupload:
230
235
 
231
236
  def test_upload_dataset(self, caplog):
232
237
  dataloader = load_module_dataloader(module_dir=MODULE_DIR, split="train")
233
- self.dataset.upload_dataset(dataloader)
238
+ self.dataset.upload_dataset(dataloader, get_upload_status=True, log_warnings=True)
234
239
  uploaded_inputs = list(self.input_object.list_inputs())
235
240
  annotations = list(self.input_object.list_annotations(batch_input=uploaded_inputs))
236
241
  with caplog.at_level(logging.INFO):
237
242
  self.input_object.delete_inputs(uploaded_inputs)
238
243
  assert "Inputs Deleted" in caplog.text # Testing delete inputs action
239
244
  assert len(uploaded_inputs) == 10 # 3 inputs are uploaded from the folder
240
- assert len(annotations) == 28 # Test for list annotatoins
245
+ assert len(annotations) == 28 # Test for list annotations
246
+
247
+ def test_upload_coco_dataset(self, caplog):
248
+ dataloader = COCODetectionDataLoader(
249
+ images_dir=os.path.join(COCO_DET_DIR, "images"),
250
+ label_filepath=os.path.join(COCO_DET_DIR, "instances_default.json"))
251
+ self.dataset.upload_dataset(dataloader)
252
+ uploaded_inputs = list(self.input_object.list_inputs())
253
+ annotations = list(self.input_object.list_annotations(batch_input=uploaded_inputs))
254
+ with caplog.at_level(logging.INFO):
255
+ self.input_object.delete_inputs(uploaded_inputs)
256
+ assert "Inputs Deleted" in caplog.text # Testing delete inputs action
257
+ assert len(uploaded_inputs) == 3 # 3 inputs are uploaded from the folder
258
+ assert len(annotations) == 7 # Test for list annotations
259
+
260
+ def test_upload_imagenet_dataset(self):
261
+ dataloader = ImageNetDataLoader(data_dir=IMAGENET_DIR)
262
+ self.dataset.upload_dataset(dataloader)
263
+ uploaded_inputs = list(self.input_object.list_inputs())
264
+ annotations = list(self.input_object.list_annotations(batch_input=uploaded_inputs))
265
+ assert len(uploaded_inputs) == 10 # 10 inputs are uploaded from the folder
266
+ assert len(annotations) == 10 # Test for list annotations
267
+
268
+ def test_export_dataset(self):
269
+ dataset_demo_version = self.dataset.create_version()
270
+ time.sleep(5)
271
+ dataset_demo_version.export(save_path='tests/output_demo.zip')
272
+ assert os.path.exists('tests/output_demo.zip') is True
273
+ os.remove('tests/output_demo.zip')
241
274
 
242
275
  @classmethod
243
276
  def teardown_class(self):
@@ -0,0 +1,129 @@
1
+ import logging
2
+ import os
3
+ import time
4
+ import uuid
5
+
6
+ import pytest
7
+ from clarifai_grpc.grpc.api.status import status_code_pb2
8
+
9
+ from clarifai.client.user import User
10
+ from clarifai.utils.evaluation import EvalResultCompare
11
+
12
+ CREATE_APP_USER_ID = os.environ["CLARIFAI_USER_ID"]
13
+ NOW = uuid.uuid4().hex[:10]
14
+ CREATE_APP_ID = f"ci_input_app_{NOW}"
15
+ CREATE_DATASET_ID = "ci_input_test_dataset"
16
+ CREATE_DATASET_NEW_ID = "ci_input_test_dataset_new"
17
+ CREATE_MODEL_ID = "ci_input_test_model_1"
18
+ CSV_FILE_PATH = os.path.dirname(__file__) + "/assets/sample.csv"
19
+
20
+
21
+ def create_app():
22
+ client = User(user_id=CREATE_APP_USER_ID)
23
+ return client.create_app(app_id=CREATE_APP_ID, base_workflow="Universal")
24
+
25
+
26
+ @pytest.mark.requires_secrets
27
+ class TestEval:
28
+ """Tests for model evaluating.
29
+ """
30
+
31
+ @classmethod
32
+ def setup_class(self):
33
+ self.app = create_app()
34
+ self.input_object = self.app.inputs()
35
+ self.dataset = self.app.create_dataset(dataset_id=CREATE_DATASET_ID)
36
+ self.dataset_new = self.app.create_dataset(dataset_id=CREATE_DATASET_NEW_ID)
37
+ self.model = self.app.create_model(
38
+ model_id=CREATE_MODEL_ID, model_type_id='embedding-classifier')
39
+
40
+ def test_evaluate(self, caplog):
41
+ # Prepare dataset
42
+ self.dataset.upload_from_csv(
43
+ csv_path=CSV_FILE_PATH, input_type='text', csv_type='raw', labels=True)
44
+ dataset_version = self.dataset.create_version()
45
+ self.dataset_new.upload_from_csv(
46
+ csv_path=CSV_FILE_PATH, input_type='text', csv_type='raw', labels=True)
47
+ self.dataset_new.create_version()
48
+ concepts = [concept.id for concept in self.app.list_concepts()]
49
+ # Prepare for training
50
+ self.model.get_params(save_to='tests/assets/model_params_for_eval.yaml')
51
+ assert len(concepts) == 2 #test data upload for training
52
+ self.model.update_params(
53
+ dataset_id=CREATE_DATASET_ID,
54
+ concepts=concepts,
55
+ dataset_version_id=dataset_version.version.id)
56
+ with caplog.at_level(logging.INFO):
57
+ model_version_id = self.model.train()
58
+ assert "Model Training Started" in caplog.text #test model training
59
+
60
+ while True:
61
+ status = self.model.training_status(version_id=model_version_id, training_logs=True)
62
+ if status.code == 21106: #MODEL_TRAINING_FAILED
63
+ break
64
+ elif status.code == 21100: #MODEL_TRAINED
65
+ break
66
+ else:
67
+ time.sleep(2)
68
+
69
+ # Test eval
70
+ ## Test list eval
71
+ all_evals = self.model.list_evaluations()
72
+ assert len(all_evals) == 0
73
+
74
+ ## Test evaluate
75
+ self.model.evaluate(dataset=self.dataset, eval_id="one", eval_info={"use_kfold": False})
76
+ all_evals = self.model.list_evaluations()
77
+ assert len(all_evals) == 1
78
+
79
+ ## Test get_eval_by_id
80
+ time.time()
81
+ while True:
82
+ response1 = self.model.get_eval_by_id("one")
83
+ if (response1.status.code == status_code_pb2.MODEL_EVALUATED):
84
+ break
85
+ else:
86
+ time.sleep(2)
87
+
88
+ ## Test get_eval_by_dataset
89
+ dataset_eval = self.model.get_eval_by_dataset(dataset=self.dataset)
90
+ assert dataset_eval[0].id == "one" and dataset_eval[0].status.code == status_code_pb2.MODEL_EVALUATED
91
+
92
+ ## Test get_raw_eval
93
+ with pytest.raises(Exception) as e:
94
+ self.model.get_raw_eval(dataset=self.dataset)
95
+ assert "method only supports model types ['visual-classifier', 'text-classifier', 'visual-detector']" in str(
96
+ e.value).lower()
97
+
98
+ ## Test get_latest_eval
99
+ current_eval = self.model.get_latest_eval(
100
+ label_counts=True,
101
+ test_set=True,
102
+ binary_metrics=True,
103
+ confusion_matrix=True,
104
+ metrics_by_area=True,
105
+ metrics_by_class=True)
106
+ assert current_eval.id == "one" and current_eval.status.code == status_code_pb2.MODEL_EVALUATED
107
+
108
+ ## Test EvalResultCompare
109
+ eval_result = EvalResultCompare(
110
+ models=[self.model],
111
+ datasets=[self.dataset, self.dataset_new],
112
+ attempt_evaluate=True,
113
+ eval_info={
114
+ "use_kfold": False
115
+ })
116
+ eval_result.all('tests/eval/', overwrite=True)
117
+ assert os.path.exists('tests/eval/conf-0.5') is True
118
+
119
+ # cleanup
120
+ with caplog.at_level(logging.INFO):
121
+ self.model.delete_version(version_id=model_version_id)
122
+ assert "Model Version Deleted" in caplog.text #test model version deletion
123
+ os.remove('tests/assets/model_params_for_eval.yaml')
124
+
125
+ @classmethod
126
+ def teardown_class(self):
127
+ self.app.delete_model(model_id=CREATE_MODEL_ID)
128
+ self.app.delete_dataset(dataset_id=CREATE_DATASET_ID)
129
+ User(user_id=CREATE_APP_USER_ID).delete_app(app_id=CREATE_APP_ID)
@@ -1 +0,0 @@
1
- __version__ = "10.8.9"
@@ -1,90 +0,0 @@
1
- import logging
2
- import os
3
- import uuid
4
-
5
- import pytest
6
-
7
- from clarifai.client.user import User
8
-
9
- CREATE_APP_USER_ID = os.environ["CLARIFAI_USER_ID"]
10
- NOW = uuid.uuid4().hex[:10]
11
- CREATE_APP_ID = f"ci_input_app_{NOW}"
12
- CREATE_DATASET_ID = "ci_input_test_dataset"
13
- CREATE_MODEL_ID = "ci_input_test_model_1"
14
- CSV_FILE_PATH = os.path.dirname(__file__) + "/assets/sample.csv"
15
-
16
-
17
- def create_app():
18
- client = User(user_id=CREATE_APP_USER_ID)
19
- return client.create_app(app_id=CREATE_APP_ID, base_workflow="Empty")
20
-
21
-
22
- @pytest.mark.requires_secrets
23
- class TestEval:
24
- """Tests for model evaluating.
25
- """
26
-
27
- @classmethod
28
- def setup_class(self):
29
- self.app = create_app()
30
- self.input_object = self.app.inputs()
31
- self.dataset = self.app.create_dataset(dataset_id=CREATE_DATASET_ID)
32
- self.model = self.app.create_model(model_id=CREATE_MODEL_ID, model_type_id='text-classifier')
33
-
34
- def test_evaluate(self, caplog):
35
- # Prepare dataset
36
- self.dataset.upload_from_csv(
37
- csv_path=CSV_FILE_PATH, input_type='text', csv_type='raw', labels=True)
38
- dataset_version = self.dataset.create_version()
39
- concepts = [concept.id for concept in self.app.list_concepts()]
40
- # Prepare for training
41
- self.model.get_params(
42
- template='HF_GPTNeo_125m_lora', save_to='tests/assets/model_params_for_eval.yaml')
43
- param_info = self.model.get_param_info(param='tokenizer_config')
44
- assert param_info['param'] == 'tokenizer_config' #test get param info
45
- assert len(concepts) == 2 #test data upload for training
46
- self.model.update_params(
47
- dataset_id=CREATE_DATASET_ID,
48
- concepts=concepts,
49
- dataset_version_id=dataset_version.version.id)
50
- with caplog.at_level(logging.INFO):
51
- model_version_id = self.model.train()
52
- assert "Model Training Started" in caplog.text #test model training
53
-
54
- # Test eval
55
- ## Test list eval
56
- with pytest.raises(Exception) as e:
57
- self.model.list_evaluations()
58
- assert "model version is empty" in str(e.value).lower()
59
-
60
- self.model.model_info.model_version.id = model_version_id
61
- with pytest.raises(Exception) as e:
62
- self.model.list_evaluations()
63
- assert "model not yet trained" in str(e.value).lower()
64
- ## Test evaluate
65
- with pytest.raises(Exception) as e:
66
- self.model.evaluate(dataset_id=CREATE_DATASET_ID)
67
- assert "model not yet trained" in str(e.value).lower()
68
-
69
- ## Test get eval
70
- with pytest.raises(Exception) as e:
71
- self.model.get_latest_eval(
72
- label_counts=True,
73
- test_set=True,
74
- binary_metrics=True,
75
- confusion_matrix=True,
76
- metrics_by_area=True,
77
- metrics_by_class=True)
78
- assert "model not yet trained" in str(e.value).lower()
79
-
80
- # cleanup
81
- with caplog.at_level(logging.INFO):
82
- self.model.delete_version(version_id=model_version_id)
83
- assert "Model Version Deleted" in caplog.text #test model version deletion
84
- os.remove('tests/assets/model_params_for_eval.yaml')
85
-
86
- @classmethod
87
- def teardown_class(self):
88
- self.app.delete_dataset(dataset_id=CREATE_DATASET_ID)
89
- self.app.delete_model(model_id=CREATE_MODEL_ID)
90
- User(user_id=CREATE_APP_USER_ID).delete_app(app_id=CREATE_APP_ID)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes