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.
- {clarifai-10.8.9/clarifai.egg-info → clarifai-10.9.0}/PKG-INFO +1 -1
- clarifai-10.9.0/clarifai/__init__.py +1 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/loaders/imagenet_classification.py +5 -1
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/utils/evaluation/helpers.py +10 -4
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/utils/evaluation/main.py +2 -1
- {clarifai-10.8.9 → clarifai-10.9.0/clarifai.egg-info}/PKG-INFO +1 -1
- {clarifai-10.8.9 → clarifai-10.9.0}/tests/test_app.py +7 -12
- {clarifai-10.8.9 → clarifai-10.9.0}/tests/test_data_upload.py +35 -2
- clarifai-10.9.0/tests/test_eval.py +129 -0
- clarifai-10.8.9/clarifai/__init__.py +0 -1
- clarifai-10.8.9/tests/test_eval.py +0 -90
- {clarifai-10.8.9 → clarifai-10.9.0}/LICENSE +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/MANIFEST.in +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/README.md +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/cli.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/__init__.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/app.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/auth/__init__.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/auth/helper.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/auth/register.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/auth/stub.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/base.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/compute_cluster.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/dataset.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/deployment.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/input.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/lister.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/model.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/module.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/nodepool.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/search.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/user.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/client/workflow.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/constants/base.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/constants/dataset.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/constants/input.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/constants/model.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/constants/rag.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/constants/search.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/constants/workflow.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/__init__.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/export/__init__.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/export/inputs_annotations.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/__init__.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/base.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/features.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/image.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/loaders/README.md +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/loaders/__init__.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/loaders/coco_captions.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/loaders/coco_detection.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/loaders/xview_detection.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/multimodal.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/text.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/utils.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/errors.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/models/__init__.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/models/api.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/modules/README.md +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/modules/__init__.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/modules/css.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/modules/pages.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/modules/style.css +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/rag/__init__.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/rag/rag.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/rag/utils.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/__init__.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/dockerfile_template/Dockerfile.cpu.template +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/dockerfile_template/Dockerfile.cuda.template +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/models/__init__.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/models/base_typed_model.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/models/model_class.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/models/model_runner.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/models/model_servicer.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/models/model_upload.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/server.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/utils/__init__.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/utils/data_handler.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/utils/data_utils.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/utils/loader.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/utils/url_fetcher.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/schema/search.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/urls/helper.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/utils/__init__.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/utils/constants.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/utils/evaluation/__init__.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/utils/evaluation/testset_annotation_parser.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/utils/logging.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/utils/misc.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/utils/model_train.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/versions.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/workflows/__init__.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/workflows/export.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/workflows/utils.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai/workflows/validate.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai.egg-info/SOURCES.txt +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai.egg-info/dependency_links.txt +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai.egg-info/entry_points.txt +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai.egg-info/requires.txt +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/clarifai.egg-info/top_level.txt +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/pyproject.toml +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/requirements.txt +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/setup.cfg +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/setup.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/tests/test_auth.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/tests/test_misc.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/tests/test_model_predict.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/tests/test_model_train.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/tests/test_modules.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/tests/test_rag.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/tests/test_search.py +0 -0
- {clarifai-10.8.9 → clarifai-10.9.0}/tests/test_stub.py +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "10.9.0"
|
{clarifai-10.8.9 → clarifai-10.9.0}/clarifai/datasets/upload/loaders/imagenet_classification.py
RENAMED
@@ -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
|
-
|
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,
|
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,
|
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,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) ==
|
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
|
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
|
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
|
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
|
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
|
{clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/dockerfile_template/Dockerfile.cpu.template
RENAMED
File without changes
|
{clarifai-10.8.9 → clarifai-10.9.0}/clarifai/runners/dockerfile_template/Dockerfile.cuda.template
RENAMED
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
|
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
|
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
|
File without changes
|
File without changes
|