clarifai 10.0.1__py3-none-any.whl → 10.1.1__py3-none-any.whl

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 (83) hide show
  1. clarifai/client/app.py +23 -43
  2. clarifai/client/base.py +46 -4
  3. clarifai/client/dataset.py +85 -33
  4. clarifai/client/input.py +35 -7
  5. clarifai/client/model.py +192 -11
  6. clarifai/client/module.py +8 -6
  7. clarifai/client/runner.py +3 -1
  8. clarifai/client/search.py +6 -3
  9. clarifai/client/user.py +14 -12
  10. clarifai/client/workflow.py +8 -5
  11. clarifai/datasets/upload/features.py +3 -0
  12. clarifai/datasets/upload/image.py +57 -26
  13. clarifai/datasets/upload/loaders/README.md +3 -4
  14. clarifai/datasets/upload/loaders/xview_detection.py +9 -5
  15. clarifai/datasets/upload/utils.py +23 -7
  16. clarifai/models/model_serving/README.md +113 -121
  17. clarifai/models/model_serving/__init__.py +2 -0
  18. clarifai/models/model_serving/cli/_utils.py +53 -0
  19. clarifai/models/model_serving/cli/base.py +14 -0
  20. clarifai/models/model_serving/cli/build.py +79 -0
  21. clarifai/models/model_serving/cli/clarifai_clis.py +33 -0
  22. clarifai/models/model_serving/cli/create.py +171 -0
  23. clarifai/models/model_serving/cli/example_cli.py +34 -0
  24. clarifai/models/model_serving/cli/login.py +26 -0
  25. clarifai/models/model_serving/cli/upload.py +182 -0
  26. clarifai/models/model_serving/constants.py +20 -0
  27. clarifai/models/model_serving/docs/cli.md +150 -0
  28. clarifai/models/model_serving/docs/concepts.md +229 -0
  29. clarifai/models/model_serving/docs/dependencies.md +1 -1
  30. clarifai/models/model_serving/docs/inference_parameters.md +112 -107
  31. clarifai/models/model_serving/docs/model_types.md +16 -17
  32. clarifai/models/model_serving/model_config/__init__.py +4 -2
  33. clarifai/models/model_serving/model_config/base.py +369 -0
  34. clarifai/models/model_serving/model_config/config.py +219 -224
  35. clarifai/models/model_serving/model_config/inference_parameter.py +5 -0
  36. clarifai/models/model_serving/model_config/model_types_config/multimodal-embedder.yaml +25 -24
  37. clarifai/models/model_serving/model_config/model_types_config/text-classifier.yaml +19 -18
  38. clarifai/models/model_serving/model_config/model_types_config/text-embedder.yaml +20 -18
  39. clarifai/models/model_serving/model_config/model_types_config/text-to-image.yaml +19 -18
  40. clarifai/models/model_serving/model_config/model_types_config/text-to-text.yaml +19 -18
  41. clarifai/models/model_serving/model_config/model_types_config/visual-classifier.yaml +22 -18
  42. clarifai/models/model_serving/model_config/model_types_config/visual-detector.yaml +32 -28
  43. clarifai/models/model_serving/model_config/model_types_config/visual-embedder.yaml +19 -18
  44. clarifai/models/model_serving/model_config/model_types_config/visual-segmenter.yaml +19 -18
  45. clarifai/models/model_serving/{models → model_config}/output.py +8 -0
  46. clarifai/models/model_serving/model_config/triton/__init__.py +14 -0
  47. clarifai/models/model_serving/model_config/{serializer.py → triton/serializer.py} +3 -1
  48. clarifai/models/model_serving/model_config/triton/triton_config.py +182 -0
  49. clarifai/models/model_serving/{models/model_types.py → model_config/triton/wrappers.py} +4 -4
  50. clarifai/models/model_serving/{models → repo_build}/__init__.py +2 -0
  51. clarifai/models/model_serving/repo_build/build.py +198 -0
  52. clarifai/models/model_serving/repo_build/static_files/_requirements.txt +2 -0
  53. clarifai/models/model_serving/repo_build/static_files/base_test.py +169 -0
  54. clarifai/models/model_serving/repo_build/static_files/inference.py +26 -0
  55. clarifai/models/model_serving/repo_build/static_files/sample_clarifai_config.yaml +25 -0
  56. clarifai/models/model_serving/repo_build/static_files/test.py +40 -0
  57. clarifai/models/model_serving/{models/pb_model.py → repo_build/static_files/triton/model.py} +15 -14
  58. clarifai/models/model_serving/utils.py +21 -0
  59. clarifai/rag/rag.py +67 -23
  60. clarifai/rag/utils.py +21 -5
  61. clarifai/utils/evaluation/__init__.py +427 -0
  62. clarifai/utils/evaluation/helpers.py +522 -0
  63. clarifai/utils/logging.py +7 -0
  64. clarifai/utils/model_train.py +3 -1
  65. clarifai/versions.py +1 -1
  66. {clarifai-10.0.1.dist-info → clarifai-10.1.1.dist-info}/METADATA +58 -10
  67. clarifai-10.1.1.dist-info/RECORD +115 -0
  68. clarifai-10.1.1.dist-info/entry_points.txt +2 -0
  69. clarifai/datasets/upload/loaders/coco_segmentation.py +0 -98
  70. clarifai/models/model_serving/cli/deploy_cli.py +0 -123
  71. clarifai/models/model_serving/cli/model_zip.py +0 -61
  72. clarifai/models/model_serving/cli/repository.py +0 -89
  73. clarifai/models/model_serving/docs/custom_config.md +0 -33
  74. clarifai/models/model_serving/docs/output.md +0 -28
  75. clarifai/models/model_serving/models/default_test.py +0 -281
  76. clarifai/models/model_serving/models/inference.py +0 -50
  77. clarifai/models/model_serving/models/test.py +0 -64
  78. clarifai/models/model_serving/pb_model_repository.py +0 -108
  79. clarifai-10.0.1.dist-info/RECORD +0 -103
  80. clarifai-10.0.1.dist-info/entry_points.txt +0 -4
  81. {clarifai-10.0.1.dist-info → clarifai-10.1.1.dist-info}/LICENSE +0 -0
  82. {clarifai-10.0.1.dist-info → clarifai-10.1.1.dist-info}/WHEEL +0 -0
  83. {clarifai-10.0.1.dist-info → clarifai-10.1.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,171 @@
1
+ import os
2
+ import shutil
3
+ from argparse import Namespace, _SubParsersAction
4
+ from typing import List
5
+
6
+ from InquirerPy import prompt
7
+
8
+ from ..model_config import MODEL_TYPES
9
+ from ..repo_build import RepositoryBuilder
10
+ from ._utils import list_model_upload_examples
11
+ from .base import BaseClarifaiCli
12
+
13
+
14
+ class CreateCli(BaseClarifaiCli):
15
+
16
+ @staticmethod
17
+ def register(parser: _SubParsersAction):
18
+ creator_parser = parser.add_parser("create", help="Create component of Clarifai platform")
19
+ sub_creator_parser = creator_parser.add_subparsers()
20
+
21
+ SubCreateModelCli.register(sub_creator_parser)
22
+
23
+ creator_parser.set_defaults(func=CreateCli)
24
+
25
+
26
+ class SubCreateModelCli(BaseClarifaiCli):
27
+
28
+ @staticmethod
29
+ def register(parser: _SubParsersAction):
30
+ model_parser = parser.add_parser("model")
31
+ model_parser.add_argument(
32
+ "--working-dir",
33
+ type=str,
34
+ required=True,
35
+ help="Path to your working dir. Create new dir if it does not exist")
36
+ model_parser.add_argument(
37
+ "--from-example",
38
+ required=False,
39
+ action="store_true",
40
+ help="Create repository from example")
41
+ model_parser.add_argument(
42
+ "--example-id",
43
+ required=False,
44
+ type=str,
45
+ help="Example id, run `clarifai example list` to list of examples")
46
+
47
+ model_parser.add_argument(
48
+ "--type",
49
+ type=str,
50
+ choices=MODEL_TYPES,
51
+ required=False,
52
+ help="Clarifai supported model types.")
53
+ model_parser.add_argument(
54
+ "--image-shape",
55
+ nargs='+',
56
+ type=int,
57
+ required=False,
58
+ help="H W dims for models with an image input type. H and W each have a max value of 1024",
59
+ default=[-1, -1])
60
+ model_parser.add_argument(
61
+ "--max-bs", type=int, default=1, required=False, help="Max batch size")
62
+
63
+ model_parser.add_argument(
64
+ "--overwrite", action="store_true", help="Overwrite working-dir if exists")
65
+
66
+ model_parser.set_defaults(func=SubCreateModelCli)
67
+
68
+ def __init__(self, args: Namespace) -> None:
69
+ self.working_dir: str = args.working_dir
70
+ self.from_example = args.from_example
71
+ self.example_id = args.example_id
72
+ self.overwrite = args.overwrite
73
+
74
+ if os.path.exists(self.working_dir):
75
+ if self.overwrite:
76
+ print(f"Overwrite {self.working_dir}")
77
+ else:
78
+ raise FileExistsError(
79
+ f"{self.working_dir} exists. If you want to overwrite it, please set `--overwrite` flag"
80
+ )
81
+
82
+ # prevent wrong args when creating from example
83
+ if not self.from_example:
84
+ self.image_shape: List[int] = args.image_shape
85
+
86
+ self.type: str = args.type
87
+ self.max_bs: int = args.max_bs
88
+
89
+ else:
90
+ if not self.example_id:
91
+ questions = [
92
+ {
93
+ "type": "list",
94
+ "message": "Select an example:",
95
+ "choices": list_model_upload_examples(),
96
+ },
97
+ ]
98
+ result = prompt(questions)
99
+ self.example_id = result[0]
100
+
101
+ else:
102
+ available_examples = list(list_model_upload_examples().keys())
103
+ assert self.example_id in available_examples, f"Available examples are: {available_examples}, got {self.example_id}."
104
+
105
+ def run(self):
106
+ if self.from_example:
107
+ os.makedirs(self.working_dir, exist_ok=True)
108
+ model_repo, readme = list_model_upload_examples()[self.example_id]
109
+ shutil.copytree(model_repo, self.working_dir, dirs_exist_ok=True)
110
+ if readme:
111
+ shutil.copy(readme, os.path.join(self.working_dir, "readme.md"))
112
+
113
+ else:
114
+ RepositoryBuilder.init_repository(
115
+ self.type,
116
+ self.working_dir,
117
+ backend="triton",
118
+ max_batch_size=self.max_bs,
119
+ image_shape=self.image_shape)
120
+
121
+ from itertools import islice
122
+ from pathlib import Path
123
+
124
+ def tree(dir_path: Path,
125
+ level: int = -1,
126
+ limit_to_directories: bool = False,
127
+ length_limit: int = 1000):
128
+ # prefix components:
129
+ space = ' '
130
+ branch = '│ '
131
+ # pointers:
132
+ tee = '├── '
133
+ last = '└── '
134
+ """Given a directory Path object print a visual tree structure"""
135
+ dir_path = Path(dir_path) # accept string coerceable to Path
136
+ files = 0
137
+ directories = 0
138
+
139
+ def inner(dir_path: Path, prefix: str = '', level=-1):
140
+ nonlocal files, directories
141
+ if not level:
142
+ return # 0, stop iterating
143
+ if limit_to_directories:
144
+ contents = [d for d in dir_path.iterdir() if d.is_dir()]
145
+ else:
146
+ contents = list(dir_path.iterdir())
147
+ pointers = [tee] * (len(contents) - 1) + [last]
148
+ for pointer, path in zip(pointers, contents):
149
+ if path.is_dir():
150
+ yield prefix + pointer + path.name
151
+ directories += 1
152
+ extension = branch if pointer == tee else space
153
+ yield from inner(path, prefix=prefix + extension, level=level - 1)
154
+ elif not limit_to_directories:
155
+ yield prefix + pointer + path.name
156
+ files += 1
157
+
158
+ print(dir_path.name)
159
+ iterator = inner(dir_path, level=level)
160
+ for line in islice(iterator, length_limit):
161
+ print(line)
162
+ if next(iterator, None):
163
+ print(f'... length_limit, {length_limit}, reached, counted:')
164
+ print(f'\n{directories} directories' + (f', {files} files' if files else ''))
165
+
166
+ print("-" * 75)
167
+ print(f"* Created repository at: {self.working_dir}")
168
+ tree(self.working_dir)
169
+ print()
170
+ print("* Please make sure your code is tested using `test.py` before uploading")
171
+ print("-" * 75)
@@ -0,0 +1,34 @@
1
+ from argparse import Namespace, _SubParsersAction
2
+
3
+ from ._utils import list_model_upload_examples
4
+ from .base import BaseClarifaiCli
5
+
6
+
7
+ class ExampleCli(BaseClarifaiCli):
8
+
9
+ @staticmethod
10
+ def register(parser: _SubParsersAction):
11
+ creator_parser = parser.add_parser("example", help="Download/List examples of model upload")
12
+ sub_creator_parser = creator_parser.add_subparsers()
13
+
14
+ SubListExampleCli.register(sub_creator_parser)
15
+
16
+ creator_parser.set_defaults(func=ExampleCli)
17
+
18
+
19
+ class SubListExampleCli(BaseClarifaiCli):
20
+
21
+ @staticmethod
22
+ def register(parser: _SubParsersAction):
23
+ _parser = parser.add_parser("list")
24
+ _parser.add_argument("--force-download", action="store_true", help="Force download examples")
25
+ _parser.set_defaults(func=SubListExampleCli)
26
+
27
+ def __init__(self, args: Namespace) -> None:
28
+ self.force_download = args.force_download
29
+
30
+ def run(self):
31
+ _list = list_model_upload_examples(self.force_download)
32
+ print(f"Found {len(_list)} examples")
33
+ for each in _list:
34
+ print(f" * {each}")
@@ -0,0 +1,26 @@
1
+ import argparse
2
+
3
+ from ..constants import CLARIFAI_PAT_PATH
4
+ from ..utils import _persist_pat
5
+ from .base import BaseClarifaiCli
6
+
7
+
8
+ class LoginCli(BaseClarifaiCli):
9
+
10
+ @staticmethod
11
+ def register(parser: argparse._SubParsersAction):
12
+ upload_parser = parser.add_parser("login", help="Login to Clarifai and save PAT locally")
13
+ upload_parser.set_defaults(func=LoginCli)
14
+
15
+ def __init__(self, args: argparse.Namespace) -> None:
16
+ pass
17
+
18
+ def _parse_config(self):
19
+ # do something with self.config_path
20
+ raise NotImplementedError()
21
+
22
+ def run(self):
23
+ msg = "Get your PAT from https://clarifai.com/settings/security and pass it here: "
24
+ _pat = input(msg)
25
+ _persist_pat(_pat)
26
+ print(f"Your PAT is saved at {CLARIFAI_PAT_PATH}")
@@ -0,0 +1,182 @@
1
+ # Copyright 2023 Clarifai, Inc.
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
+ # you may not use this file except in compliance with the License.
4
+ # You may obtain a copy of the License at
5
+ #
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ #
8
+ # Unless required by applicable law or agreed to in writing, software
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ # See the License for the specific language governing permissions and
12
+ # limitations under the License.
13
+ """Commandline interface for model upload utils."""
14
+ import argparse
15
+ import os
16
+ import subprocess
17
+ from typing import Union
18
+
19
+ from clarifai.client.auth.helper import ClarifaiAuthHelper
20
+ from clarifai.models.api import Models
21
+ from clarifai.models.model_serving.model_config import (MODEL_TYPES, get_model_config,
22
+ load_user_config)
23
+ from clarifai.models.model_serving.model_config.inference_parameter import InferParamManager
24
+
25
+ from ..utils import login
26
+ from .base import BaseClarifaiCli
27
+
28
+
29
+ class UploadCli(BaseClarifaiCli):
30
+
31
+ @staticmethod
32
+ def register(parser: argparse._SubParsersAction):
33
+ creator_parser = parser.add_parser("upload", help="Upload component to Clarifai platform")
34
+ sub_creator_parser = creator_parser.add_subparsers()
35
+
36
+ UploadModelSubCli.register(sub_creator_parser)
37
+
38
+ creator_parser.set_defaults(func=UploadCli)
39
+
40
+
41
+ class UploadModelSubCli(BaseClarifaiCli):
42
+
43
+ @staticmethod
44
+ def register(parser: argparse._SubParsersAction):
45
+ upload_parser = parser.add_parser("model", help="Upload Clarifai model")
46
+ upload_parser.add_argument(
47
+ "path",
48
+ type=str,
49
+ nargs='?',
50
+ help=
51
+ "Path to working dir to get clarifai_config.yaml or path to yaml. Default is current directory",
52
+ default=".")
53
+ upload_parser.add_argument(
54
+ "--url", type=str, required=True, help="Direct download url of zip file")
55
+ upload_parser.add_argument("--id", type=str, required=False, help="Model ID")
56
+ upload_parser.add_argument(
57
+ "--user-app",
58
+ type=str,
59
+ required=False,
60
+ help="User ID and App ID separated by '/', e.g., <user_id>/<app_id>")
61
+ upload_parser.add_argument(
62
+ "--no-test",
63
+ action="store_true",
64
+ help="Trigger this flag to skip testing before uploading")
65
+
66
+ upload_parser.add_argument(
67
+ "--update-version",
68
+ action="store_true",
69
+ required=False,
70
+ help="Update exist model with new version")
71
+
72
+ upload_parser.set_defaults(func=UploadModelSubCli)
73
+
74
+ def __init__(self, args: argparse.Namespace) -> None:
75
+ self.no_test = args.no_test
76
+
77
+ working_dir_or_config = args.path
78
+ # if input a config file, then not running test
79
+ if working_dir_or_config.endswith(".yaml"):
80
+ config_yaml_path = working_dir_or_config
81
+ self.test_path = None
82
+ self.no_test = True
83
+ # if it is a directory - working dir then it must contain config and test
84
+ else:
85
+ config_yaml_path = os.path.join(working_dir_or_config, "clarifai_config.yaml")
86
+ self.test_path = os.path.join(working_dir_or_config, "test.py")
87
+
88
+ assert os.path.exists(config_yaml_path), FileNotFoundError(
89
+ f"`{config_yaml_path}` does not exist")
90
+ self.config = load_user_config(cfg_path=config_yaml_path)
91
+
92
+ self.user_id, self.app_id = "", ""
93
+ user_app = args.user_app
94
+ self.url: str = args.url
95
+ self.update_version = args.update_version
96
+ assert self.url.startswith("http") or self.url.startswith(
97
+ "s3"), f"Invalid url supported http or s3 url. Got {self.url}"
98
+
99
+ clarifai_cfg = self.config.clarifai_model
100
+ self.url: str = args.url
101
+ self.id = args.id or clarifai_cfg.clarifai_model_id
102
+ self.type = clarifai_cfg.type
103
+ self.desc = clarifai_cfg.description
104
+ self.infer_param = clarifai_cfg.inference_parameters
105
+ user_app = user_app or clarifai_cfg.clarifai_user_app_id
106
+
107
+ if user_app:
108
+ user_app = user_app.split('/')
109
+ assert len(
110
+ user_app
111
+ ) == 2, f"id must be combination of user_id and app_id separated by `/`, e.g. <user_id>/<app_id>. Got {args.id}"
112
+ self.user_id, self.app_id = user_app
113
+
114
+ if self.user_id:
115
+ os.environ["CLARIFAI_USER_ID"] = self.user_id
116
+ if self.app_id:
117
+ os.environ["CLARIFAI_APP_ID"] = self.app_id
118
+
119
+ _user_id = os.environ.get("CLARIFAI_USER_ID", None)
120
+ _app_id = os.environ.get("CLARIFAI_APP_ID", None)
121
+ assert _user_id or _app_id, f"Missing user-id or app-id, got user-id {_user_id} and app-id {_app_id}"
122
+ login()
123
+
124
+ def run(self):
125
+
126
+ # Run test before uploading
127
+ if not self.no_test:
128
+ assert os.path.exists(self.test_path), FileNotFoundError(f"Not found {self.test_path}")
129
+ result = subprocess.run(f"pytest -s --log-level=INFO {self.test_path}")
130
+ assert result.returncode == 0, "Test has failed. Please make sure no error exists in your code."
131
+
132
+ deploy(
133
+ model_url=self.url,
134
+ model_id=self.id,
135
+ desc=self.desc,
136
+ model_type=self.type,
137
+ update_version=self.update_version,
138
+ inference_parameters=self.infer_param)
139
+
140
+
141
+ def deploy(model_url,
142
+ model_id: str = None,
143
+ model_type: str = None,
144
+ desc: str = "",
145
+ update_version: bool = False,
146
+ inference_parameters: Union[dict, str] = None):
147
+ # init Auth from env vars
148
+ auth = ClarifaiAuthHelper.from_env()
149
+ # init api
150
+ model_api = Models(auth)
151
+ # key map
152
+ assert model_type in MODEL_TYPES, f"model_type should be one of {MODEL_TYPES}"
153
+ clarifai_key_map = get_model_config(model_type=model_type).clarifai_model.field_maps
154
+ # inference parameters
155
+ if isinstance(inference_parameters, str) and os.path.isfile(inference_parameters):
156
+ inference_parameters = InferParamManager(json_path=inference_parameters).get_list_params()
157
+ # if updating new version of existing model
158
+ if update_version:
159
+ resp = model_api.post_model_version(
160
+ model_id=model_id,
161
+ model_zip_url=model_url,
162
+ input=clarifai_key_map.input_fields_map,
163
+ outputs=clarifai_key_map.output_fields_map,
164
+ param_specs=inference_parameters)
165
+ # creating new model
166
+ else:
167
+ # post model
168
+ resp = model_api.upload_model(
169
+ model_id=model_id,
170
+ model_zip_url=model_url,
171
+ model_type=model_type,
172
+ input=clarifai_key_map.input_fields_map,
173
+ outputs=clarifai_key_map.output_fields_map,
174
+ description=desc,
175
+ param_specs=inference_parameters)
176
+ # response
177
+ if resp["status"]["code"] != "SUCCESS":
178
+ raise Exception("Post models failed, details: {}, {}".format(resp["status"]["description"],
179
+ resp["status"]["details"]))
180
+ else:
181
+ print("Success!")
182
+ print(f'Model version: {resp["model"]["model_version"]["id"]}')
@@ -1 +1,21 @@
1
+ import os
2
+
1
3
  MAX_HW_DIM = 1024
4
+ IMAGE_TENSOR_NAME = "image"
5
+ TEXT_TENSOR_NAME = "text"
6
+
7
+ BUILT_MODEL_EXT = ".clarifai"
8
+
9
+ default_home = os.path.join(os.path.expanduser("~"), ".cache")
10
+ CLARIFAI_HOME = os.path.expanduser(
11
+ os.getenv(
12
+ "CLARIFAI_HOME",
13
+ os.path.join(os.getenv("XDG_CACHE_HOME", default_home), "clarifai"),
14
+ ))
15
+ os.makedirs(CLARIFAI_HOME, exist_ok=True)
16
+ CLARIFAI_PAT_PATH = os.path.join(CLARIFAI_HOME, "pat")
17
+
18
+ CLARIFAI_EXAMPLES_REPO = "https://github.com/Clarifai/examples.git"
19
+ repo_name = CLARIFAI_EXAMPLES_REPO.split("/")[-1].replace(".git", "")
20
+ CLARIFAI_EXAMPLES_REPO_PATH = os.path.join(CLARIFAI_HOME, repo_name)
21
+ MODEL_UPLOAD_EXAMPLE_FOLDER = "model_upload"
@@ -0,0 +1,150 @@
1
+ # CLI helpers
2
+
3
+ Supported cli:
4
+
5
+ ```bash
6
+ $ clarifai -h
7
+ upload Upload component to Clarifai platform
8
+ create Create component of Clarifai platform
9
+ login Login to Clarifai and save PAT locally
10
+ example Download/List examples of model upload
11
+ build Build clarifai model for uploading
12
+ ```
13
+
14
+ 1. Login
15
+
16
+ ```bash
17
+ $ clarifai login
18
+ Get your PAT from https://clarifai.com/settings/security and pass it here: <your pat>
19
+ ```
20
+
21
+ 2. Create model repository
22
+
23
+ Initialize template for specify model type in provided directory
24
+
25
+ * `From scratch`:
26
+
27
+ ```bash
28
+ $ clarifai create model --type <model-type> --working-dir <your_working_dir>
29
+ ```
30
+
31
+ * `From example`:
32
+
33
+ ```bash
34
+ $ clarifai create model --from-example --working-dir <your_working_dir>
35
+ ? Select an example:
36
+ ❯ multimodal_embedder/clip
37
+ text_classifier/xlm-roberta
38
+ text_embedder/instructor-xl
39
+ ...
40
+ ```
41
+
42
+ Then will see below output
43
+
44
+ ```bash
45
+ ---------------------------------------------------------------------------
46
+ * Created repository at: ./<your_working_dir>
47
+ <your_working_dir>
48
+ ├── clarifai_config.yaml
49
+ ├── inference.py
50
+ ├── requirements.txt
51
+ └── test.py
52
+
53
+ 0 directories, 4 files
54
+
55
+ * Please make sure your code is tested using `test.py` before uploading
56
+ ---------------------------------------------------------------------------
57
+ ```
58
+
59
+ > NOTE: if working-dir exists, need to set --overwrite flag otherwise an error arises
60
+
61
+ Full arguments
62
+
63
+ ```bash
64
+ $ clarifai create model -h
65
+ --working-dir Path to your working dir. Create new dir if it does not exist
66
+ --from-example Create repository from example
67
+ --example-id Example id, run `clarifai example list` to list of examples
68
+ --type Clarifai supported model types.
69
+ --image-shape list of H W dims for models with an image input type. H and W each have a max value of 1024
70
+ --max-bs Max batch size
71
+ --overwrite Overwrite working-dir if exists
72
+ ```
73
+
74
+ 3. See available examples
75
+
76
+ ```bash
77
+ $ clarifai example list
78
+ Found 11 examples
79
+ * multimodal_embedder/clip
80
+ * text_classifier/xlm-roberta
81
+ * text_embedder/instructor-xl
82
+ ....
83
+ ```
84
+
85
+ 4. Build
86
+
87
+ This step will run `test.py` in provided working dir as default before building
88
+
89
+ ```
90
+ $ clarifai build model <your_working_dir> --name model-name
91
+ $ tree <your_working_dir> -a
92
+ <your_working_dir>
93
+ ├── .cache # (*)
94
+ │ ├── 1
95
+ │ │ ├── clarifai_config.yaml
96
+ │ │ ├── inference.py
97
+ │ │ ├── model.py
98
+ │ │ ├── test.py
99
+ │ │ └── ...
100
+ │ ├── config.pbtxt
101
+ │ └── requirements.txt
102
+ ├── clarifai_config.yaml
103
+ ├── inference.py
104
+ ├── model-name.clarifai # (**)
105
+ ├── requirements.txt
106
+ ├── test.py
107
+ └── ...
108
+ ```
109
+
110
+ **NOTE:**
111
+
112
+ (*): Build cache, user can simply ignore it.
113
+
114
+ (**): zipped of .cache
115
+
116
+ Full arguments
117
+
118
+ ```bash
119
+ $ clarifai build model -h
120
+ positional arguments:
121
+ path Path to working directory, default is current directory
122
+ optional arguments:
123
+ --out-path Output path of built model
124
+ --name Name of built file, default is `clarifai_model_id` in config if set or`model`
125
+ --no-test Trigger this flag to skip testing before uploading
126
+ ```
127
+
128
+ 5. Upload
129
+
130
+ This step will run `test.py` in provided working dir as default before building
131
+
132
+ ```bash
133
+ $ clarifai upload model <your_working_dir> --url <your url>
134
+ ```
135
+
136
+ Full arguments
137
+
138
+ ```bash
139
+ $ clarifai upload model -h
140
+ positional arguments:
141
+ path Path to working dir to get clarifai_config.yaml or path to yaml. Default is current directory
142
+
143
+ optional arguments:
144
+ --url Direct download url of zip file
145
+ --id Model ID
146
+ --user-app User ID and App ID separated by '/', e.g., <user_id>/<app_id>
147
+ --update-version Update exist model with new version
148
+ --no-test Trigger this flag to skip testing before uploading
149
+
150
+ ```