clarifai 11.1.1__tar.gz → 11.1.3__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 (121) hide show
  1. {clarifai-11.1.1/clarifai.egg-info → clarifai-11.1.3}/PKG-INFO +4 -4
  2. clarifai-11.1.3/clarifai/__init__.py +1 -0
  3. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/runners/dockerfile_template/Dockerfile.template +8 -8
  4. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/runners/models/model_builder.py +90 -63
  5. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/runners/models/model_run_locally.py +1 -1
  6. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/runners/utils/const.py +4 -6
  7. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/runners/utils/loader.py +12 -0
  8. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/utils/logging.py +5 -1
  9. {clarifai-11.1.1 → clarifai-11.1.3/clarifai.egg-info}/PKG-INFO +4 -4
  10. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai.egg-info/requires.txt +3 -3
  11. {clarifai-11.1.1 → clarifai-11.1.3}/requirements.txt +3 -3
  12. clarifai-11.1.1/clarifai/__init__.py +0 -1
  13. {clarifai-11.1.1 → clarifai-11.1.3}/LICENSE +0 -0
  14. {clarifai-11.1.1 → clarifai-11.1.3}/MANIFEST.in +0 -0
  15. {clarifai-11.1.1 → clarifai-11.1.3}/README.md +0 -0
  16. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/cli/README.md +0 -0
  17. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/cli/__init__.py +0 -0
  18. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/cli/__main__.py +0 -0
  19. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/cli/base.py +0 -0
  20. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/cli/compute_cluster.py +0 -0
  21. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/cli/deployment.py +0 -0
  22. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/cli/model.py +0 -0
  23. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/cli/nodepool.py +0 -0
  24. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/cli.py +0 -0
  25. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/client/__init__.py +0 -0
  26. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/client/app.py +0 -0
  27. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/client/auth/__init__.py +0 -0
  28. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/client/auth/helper.py +0 -0
  29. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/client/auth/register.py +0 -0
  30. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/client/auth/stub.py +0 -0
  31. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/client/base.py +0 -0
  32. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/client/compute_cluster.py +0 -0
  33. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/client/dataset.py +0 -0
  34. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/client/deployment.py +0 -0
  35. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/client/input.py +0 -0
  36. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/client/lister.py +0 -0
  37. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/client/model.py +0 -0
  38. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/client/module.py +0 -0
  39. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/client/nodepool.py +0 -0
  40. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/client/search.py +0 -0
  41. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/client/user.py +0 -0
  42. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/client/workflow.py +0 -0
  43. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/constants/base.py +0 -0
  44. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/constants/dataset.py +0 -0
  45. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/constants/input.py +0 -0
  46. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/constants/model.py +0 -0
  47. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/constants/rag.py +0 -0
  48. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/constants/search.py +0 -0
  49. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/constants/workflow.py +0 -0
  50. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/datasets/__init__.py +0 -0
  51. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/datasets/export/__init__.py +0 -0
  52. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/datasets/export/inputs_annotations.py +0 -0
  53. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/datasets/upload/__init__.py +0 -0
  54. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/datasets/upload/base.py +0 -0
  55. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/datasets/upload/features.py +0 -0
  56. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/datasets/upload/image.py +0 -0
  57. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/datasets/upload/loaders/README.md +0 -0
  58. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/datasets/upload/loaders/__init__.py +0 -0
  59. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/datasets/upload/loaders/coco_captions.py +0 -0
  60. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/datasets/upload/loaders/coco_detection.py +0 -0
  61. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/datasets/upload/loaders/imagenet_classification.py +0 -0
  62. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/datasets/upload/loaders/xview_detection.py +0 -0
  63. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/datasets/upload/multimodal.py +0 -0
  64. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/datasets/upload/text.py +0 -0
  65. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/datasets/upload/utils.py +0 -0
  66. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/errors.py +0 -0
  67. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/models/__init__.py +0 -0
  68. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/models/api.py +0 -0
  69. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/modules/README.md +0 -0
  70. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/modules/__init__.py +0 -0
  71. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/modules/css.py +0 -0
  72. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/modules/pages.py +0 -0
  73. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/modules/style.css +0 -0
  74. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/rag/__init__.py +0 -0
  75. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/rag/rag.py +0 -0
  76. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/rag/utils.py +0 -0
  77. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/runners/__init__.py +0 -0
  78. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/runners/models/__init__.py +0 -0
  79. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/runners/models/base_typed_model.py +0 -0
  80. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/runners/models/model_class.py +0 -0
  81. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/runners/models/model_runner.py +0 -0
  82. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/runners/models/model_servicer.py +0 -0
  83. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/runners/server.py +0 -0
  84. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/runners/utils/__init__.py +0 -0
  85. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/runners/utils/data_handler.py +0 -0
  86. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/runners/utils/data_utils.py +0 -0
  87. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/runners/utils/url_fetcher.py +0 -0
  88. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/schema/search.py +0 -0
  89. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/urls/helper.py +0 -0
  90. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/utils/__init__.py +0 -0
  91. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/utils/cli.py +0 -0
  92. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/utils/constants.py +0 -0
  93. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/utils/evaluation/__init__.py +0 -0
  94. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/utils/evaluation/helpers.py +0 -0
  95. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/utils/evaluation/main.py +0 -0
  96. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/utils/evaluation/testset_annotation_parser.py +0 -0
  97. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/utils/misc.py +0 -0
  98. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/utils/model_train.py +0 -0
  99. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/versions.py +0 -0
  100. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/workflows/__init__.py +0 -0
  101. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/workflows/export.py +0 -0
  102. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/workflows/utils.py +0 -0
  103. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai/workflows/validate.py +0 -0
  104. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai.egg-info/SOURCES.txt +0 -0
  105. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai.egg-info/dependency_links.txt +0 -0
  106. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai.egg-info/entry_points.txt +0 -0
  107. {clarifai-11.1.1 → clarifai-11.1.3}/clarifai.egg-info/top_level.txt +0 -0
  108. {clarifai-11.1.1 → clarifai-11.1.3}/pyproject.toml +0 -0
  109. {clarifai-11.1.1 → clarifai-11.1.3}/setup.cfg +0 -0
  110. {clarifai-11.1.1 → clarifai-11.1.3}/setup.py +0 -0
  111. {clarifai-11.1.1 → clarifai-11.1.3}/tests/test_app.py +0 -0
  112. {clarifai-11.1.1 → clarifai-11.1.3}/tests/test_auth.py +0 -0
  113. {clarifai-11.1.1 → clarifai-11.1.3}/tests/test_data_upload.py +0 -0
  114. {clarifai-11.1.1 → clarifai-11.1.3}/tests/test_eval.py +0 -0
  115. {clarifai-11.1.1 → clarifai-11.1.3}/tests/test_misc.py +0 -0
  116. {clarifai-11.1.1 → clarifai-11.1.3}/tests/test_model_predict.py +0 -0
  117. {clarifai-11.1.1 → clarifai-11.1.3}/tests/test_model_train.py +0 -0
  118. {clarifai-11.1.1 → clarifai-11.1.3}/tests/test_modules.py +0 -0
  119. {clarifai-11.1.1 → clarifai-11.1.3}/tests/test_rag.py +0 -0
  120. {clarifai-11.1.1 → clarifai-11.1.3}/tests/test_search.py +0 -0
  121. {clarifai-11.1.1 → clarifai-11.1.3}/tests/test_stub.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: clarifai
3
- Version: 11.1.1
3
+ Version: 11.1.3
4
4
  Summary: Clarifai Python SDK
5
5
  Home-page: https://github.com/Clarifai/clarifai-python
6
6
  Author: Clarifai
@@ -29,9 +29,9 @@ Requires-Dist: PyYAML>=6.0.1
29
29
  Requires-Dist: schema==0.7.5
30
30
  Requires-Dist: Pillow>=9.5.0
31
31
  Requires-Dist: tabulate>=0.9.0
32
- Requires-Dist: fsspec==2024.6.1
33
- Requires-Dist: click==8.1.7
34
- Requires-Dist: requests==2.32.3
32
+ Requires-Dist: fsspec>=2024.6.1
33
+ Requires-Dist: click>=8.1.7
34
+ Requires-Dist: requests>=2.32.3
35
35
  Provides-Extra: all
36
36
  Requires-Dist: pycocotools==2.0.6; extra == "all"
37
37
  Dynamic: author
@@ -0,0 +1 @@
1
+ __version__ = "11.1.3"
@@ -1,14 +1,14 @@
1
- # syntax=docker/dockerfile:1
1
+ # syntax=docker/dockerfile:1.13-labs
2
2
  #############################
3
3
  # User specific requirements installed in the pip_packages
4
4
  #############################
5
- FROM --platform=$TARGETPLATFORM ${BUILDER_IMAGE} as pip_packages
5
+ FROM --platform=$TARGETPLATFORM ${FINAL_IMAGE} as pip_packages
6
6
 
7
7
  COPY --link requirements.txt /home/nonroot/requirements.txt
8
8
 
9
9
  # Update clarifai package so we always have latest protocol to the API. Everything should land in /venv
10
- RUN pip install --no-cache-dir -r /home/nonroot/requirements.txt && \
11
- (pip install --upgrade --upgrade-strategy only-if-needed --no-deps --no-cache-dir clarifai clarifai-grpc clarifai-protocol || true)
10
+ RUN ["pip", "install", "--no-cache-dir", "-r", "/home/nonroot/requirements.txt"]
11
+ RUN ["pip", "show", "clarifai"]
12
12
  #############################
13
13
 
14
14
  #############################
@@ -16,15 +16,15 @@ RUN pip install --no-cache-dir -r /home/nonroot/requirements.txt && \
16
16
  #############################
17
17
  FROM --platform=$TARGETPLATFORM ${DOWNLOADER_IMAGE} as downloader
18
18
 
19
- # make sure we have the latest clarifai package.
20
- RUN (pip install --upgrade --upgrade-strategy only-if-needed --no-cache-dir clarifai clarifai-grpc clarifai-protocol || true)
19
+ # make sure we have the latest clarifai package. This version is filled in by SDK.
20
+ RUN ["pip", "install", "clarifai==${CLARIFAI_VERSION}"]
21
21
  #####
22
22
 
23
23
 
24
24
  #############################
25
25
  # Final runtime image
26
26
  #############################
27
- FROM --platform=$TARGETPLATFORM ${RUNTIME_IMAGE} as final
27
+ FROM --platform=$TARGETPLATFORM ${FINAL_IMAGE} as final
28
28
 
29
29
  # Set the NUMBA cache dir to /tmp
30
30
  # Set the TORCHINDUCTOR cache dir to /tmp
@@ -54,7 +54,7 @@ RUN ["python", "-m", "clarifai.cli", "model", "download-checkpoints", "--model_p
54
54
 
55
55
 
56
56
  #####
57
- # Copy the python packages from the previous stage.
57
+ # Copy the python packages from the builder stage.
58
58
  COPY --link=true --from=pip_packages /venv /venv
59
59
  #####
60
60
 
@@ -16,12 +16,20 @@ from rich.markup import escape
16
16
 
17
17
  from clarifai.client import BaseClient
18
18
  from clarifai.runners.models.model_class import ModelClass
19
- from clarifai.runners.utils.const import (
20
- AVAILABLE_PYTHON_IMAGES, AVAILABLE_TORCH_IMAGES, CONCEPTS_REQUIRED_MODEL_TYPE,
21
- DEFAULT_PYTHON_VERSION, PYTHON_BUILDER_IMAGE, PYTHON_RUNTIME_IMAGE, TORCH_BASE_IMAGE)
19
+ from clarifai.runners.utils.const import (AVAILABLE_PYTHON_IMAGES, AVAILABLE_TORCH_IMAGES,
20
+ CONCEPTS_REQUIRED_MODEL_TYPE, DEFAULT_PYTHON_VERSION,
21
+ PYTHON_BASE_IMAGE, TORCH_BASE_IMAGE)
22
22
  from clarifai.runners.utils.loader import HuggingFaceLoader
23
23
  from clarifai.urls.helper import ClarifaiUrlHelper
24
24
  from clarifai.utils.logging import logger
25
+ from clarifai.versions import CLIENT_VERSION
26
+
27
+ # parse the user's requirements.txt to determine the proper base image to build on top of, based on the torch and other large dependencies and it's versions
28
+ # List of dependencies to look for
29
+ dependencies = [
30
+ 'torch',
31
+ 'clarifai',
32
+ ]
25
33
 
26
34
 
27
35
  def _clear_line(n: int = 1) -> None:
@@ -289,43 +297,42 @@ class ModelBuilder:
289
297
  )
290
298
  return self.client.STUB.PostModels(request)
291
299
 
300
+ def _match_req_line(self, line):
301
+ line = line.strip()
302
+ if not line or line.startswith('#'):
303
+ return None, None
304
+ # split on whitespace followed by #
305
+ line = re.split(r'\s+#', line)[0]
306
+ if "==" in line:
307
+ pkg, version = line.split("==")
308
+ elif ">=" in line:
309
+ pkg, version = line.split(">=")
310
+ elif ">" in line:
311
+ pkg, version = line.split(">")
312
+ elif "<=" in line:
313
+ pkg, version = line.split("<=")
314
+ elif "<" in line:
315
+ pkg, version = line.split("<")
316
+ else:
317
+ pkg, version = line, None # No version specified
318
+ for dep in dependencies:
319
+ if dep == pkg:
320
+ if dep == 'torch' and line.find(
321
+ 'whl/cpu') > 0: # Ignore torch-cpu whl files, use base mage.
322
+ return None, None
323
+ return dep.strip(), version.strip() if version else None
324
+ return None, None
325
+
292
326
  def _parse_requirements(self):
293
- # parse the user's requirements.txt to determine the proper base image to build on top of, based on the torch and other large dependencies and it's versions
294
- # List of dependencies to look for
295
- dependencies = [
296
- 'torch',
297
- ]
298
- # Escape dependency names for regex
299
- dep_pattern = '|'.join(map(re.escape, dependencies))
300
- # All possible version specifiers
301
- version_specifiers = '==|>=|<=|!=|~=|>|<'
302
- # Compile a regex pattern with verbose mode for readability
303
- pattern = re.compile(r"""
304
- ^\s* # Start of line, optional whitespace
305
- (?P<dependency>""" + dep_pattern + r""") # Dependency name
306
- \s* # Optional whitespace
307
- (?P<specifier>""" + version_specifiers + r""")? # Optional version specifier
308
- \s* # Optional whitespace
309
- (?P<version>[^\s;]+)? # Optional version (up to space or semicolon)
310
- """, re.VERBOSE)
311
-
312
- deendencies_version = {}
327
+ dependencies_version = {}
313
328
  with open(os.path.join(self.folder, 'requirements.txt'), 'r') as file:
314
329
  for line in file:
315
330
  # Skip empty lines and comments
316
- line = line.strip()
317
- if not line or line.startswith('#'):
331
+ dependency, version = self._match_req_line(line)
332
+ if dependency is None:
318
333
  continue
319
- match = pattern.match(line)
320
- if match:
321
- dependency = match.group('dependency')
322
- version = match.group('version')
323
- if dependency == "torch" and line.find(
324
- 'whl/cpu') > 0: # Ignore torch-cpu whl files, use base mage.
325
- continue
326
-
327
- deendencies_version[dependency] = version if version else None
328
- return deendencies_version
334
+ dependencies_version[dependency] = version if version else None
335
+ return dependencies_version
329
336
 
330
337
  def create_dockerfile(self):
331
338
  dockerfile_template = os.path.join(
@@ -357,9 +364,8 @@ class ModelBuilder:
357
364
  python_version = DEFAULT_PYTHON_VERSION
358
365
 
359
366
  # This is always the final image used for runtime.
360
- runtime_image = PYTHON_RUNTIME_IMAGE.format(python_version=python_version)
361
- builder_image = PYTHON_BUILDER_IMAGE.format(python_version=python_version)
362
- downloader_image = PYTHON_BUILDER_IMAGE.format(python_version=python_version)
367
+ final_image = PYTHON_BASE_IMAGE.format(python_version=python_version)
368
+ downloader_image = PYTHON_BASE_IMAGE.format(python_version=python_version)
363
369
 
364
370
  # Parse the requirements.txt file to determine the base image
365
371
  dependencies = self._parse_requirements()
@@ -370,23 +376,43 @@ class ModelBuilder:
370
376
  for image in sorted(AVAILABLE_TORCH_IMAGES, reverse=True):
371
377
  if torch_version in image and f'py{python_version}' in image:
372
378
  cuda_version = image.split('-')[-1].replace('cuda', '')
373
- builder_image = TORCH_BASE_IMAGE.format(
379
+ final_image = TORCH_BASE_IMAGE.format(
374
380
  torch_version=torch_version,
375
381
  python_version=python_version,
376
382
  cuda_version=cuda_version,
377
383
  )
378
- # download_image = base_image
379
384
  logger.info(f"Using Torch version {torch_version} base image to build the Docker image")
380
385
  break
381
- # else: # if not torch then use the download image for the base image too
382
- # # base_image = download_image
383
- # requirements_image = base_image
386
+
387
+ if 'clarifai' not in dependencies:
388
+ raise Exception(
389
+ f"clarifai not found in requirements.txt, please add clarifai to the requirements.txt file with a fixed version. Current version is clarifai=={CLIENT_VERSION}"
390
+ )
391
+ clarifai_version = dependencies['clarifai']
392
+ if not clarifai_version:
393
+ logger.warn(
394
+ f"clarifai version not found in requirements.txt, using the latest version {CLIENT_VERSION}"
395
+ )
396
+ clarifai_version = CLIENT_VERSION
397
+ lines = []
398
+ with open(os.path.join(self.folder, 'requirements.txt'), 'r') as file:
399
+ for line in file:
400
+ # if the line without whitespace is "clarifai"
401
+ dependency, version = self._match_req_line(line)
402
+ if dependency and dependency == "clarifai":
403
+ lines.append(line.replace("clarifai", f"clarifai=={CLIENT_VERSION}"))
404
+ else:
405
+ lines.append(line)
406
+ with open(os.path.join(self.folder, 'requirements.txt'), 'w') as file:
407
+ file.writelines(lines)
408
+ logger.warn(f"Updated requirements.txt to have clarifai=={CLIENT_VERSION}")
409
+
384
410
  # Replace placeholders with actual values
385
411
  dockerfile_content = dockerfile_template.safe_substitute(
386
412
  name='main',
387
- BUILDER_IMAGE=builder_image, # for pip requirements
388
- RUNTIME_IMAGE=runtime_image, # for runtime
413
+ FINAL_IMAGE=final_image, # for pip requirements
389
414
  DOWNLOADER_IMAGE=downloader_image, # for downloading checkpoints
415
+ CLARIFAI_VERSION=clarifai_version, # for clarifai
390
416
  )
391
417
 
392
418
  # Write Dockerfile
@@ -477,7 +503,8 @@ class ModelBuilder:
477
503
  for concept in labels:
478
504
  concept_proto = json_format.ParseDict(concept, resources_pb2.Concept())
479
505
  model_version_proto.output_info.data.concepts.append(concept_proto)
480
- else:
506
+ elif self.config.get("checkpoints") and HuggingFaceLoader.validate_concept(
507
+ self.checkpoint_path):
481
508
  labels = HuggingFaceLoader.fetch_labels(self.checkpoint_path)
482
509
  logger.info(f"Found {len(labels)} concepts from the model checkpoints.")
483
510
  # sort the concepts by id and then update the config file
@@ -495,7 +522,7 @@ class ModelBuilder:
495
522
 
496
523
  def upload_model_version(self, download_checkpoints):
497
524
  file_path = f"{self.folder}.tar.gz"
498
- logger.info(f"Will tar it into file: {file_path}")
525
+ logger.debug(f"Will tar it into file: {file_path}")
499
526
 
500
527
  model_type_id = self.config.get('model').get('model_type_id')
501
528
 
@@ -536,10 +563,10 @@ class ModelBuilder:
536
563
 
537
564
  with tarfile.open(self.tar_file, "w:gz") as tar:
538
565
  tar.add(self.folder, arcname=".", filter=filter_func)
539
- logger.info("Tarring complete, about to start upload.")
566
+ logger.debug("Tarring complete, about to start upload.")
540
567
 
541
568
  file_size = os.path.getsize(self.tar_file)
542
- logger.info(f"Size of the tar is: {file_size} bytes")
569
+ logger.debug(f"Size of the tar is: {file_size} bytes")
543
570
 
544
571
  self.storage_request_size = self._get_tar_file_content_size(file_path)
545
572
  if not download_checkpoints and self.config.get("checkpoints"):
@@ -572,7 +599,6 @@ class ModelBuilder:
572
599
  f"request_id: {response.status.req_id}",
573
600
  end='\r',
574
601
  flush=True)
575
- logger.info("")
576
602
  if response.status.code != status_code_pb2.MODEL_BUILDING:
577
603
  logger.error(f"Failed to upload model version: {response}")
578
604
  return
@@ -583,7 +609,7 @@ class ModelBuilder:
583
609
  self.monitor_model_build()
584
610
  finally:
585
611
  if os.path.exists(self.tar_file):
586
- logger.info(f"Cleaning up upload file: {self.tar_file}")
612
+ logger.debug(f"Cleaning up upload file: {self.tar_file}")
587
613
  os.remove(self.tar_file)
588
614
 
589
615
  def model_version_stream_upload_iterator(self, model_version_proto, file_path):
@@ -593,9 +619,9 @@ class ModelBuilder:
593
619
  chunk_size = int(127 * 1024 * 1024) # 127MB chunk size
594
620
  num_chunks = (file_size // chunk_size) + 1
595
621
  logger.info("Uploading file...")
596
- logger.info(f"File size: {file_size}")
597
- logger.info(f"Chunk size: {chunk_size}")
598
- logger.info(f"Number of chunks: {num_chunks}")
622
+ logger.debug(f"File size: {file_size}")
623
+ logger.debug(f"Chunk size: {chunk_size}")
624
+ logger.debug(f"Number of chunks: {num_chunks}")
599
625
  read_so_far = 0
600
626
  for part_id in range(num_chunks):
601
627
  try:
@@ -615,12 +641,12 @@ class ModelBuilder:
615
641
  break
616
642
 
617
643
  if read_so_far == file_size:
618
- logger.info("\nUpload complete!, waiting for model build...")
644
+ logger.info("Upload complete!")
619
645
 
620
646
  def init_upload_model_version(self, model_version_proto, file_path):
621
647
  file_size = os.path.getsize(file_path)
622
- logger.info(f"Uploading model version of model {self.model_proto.id}")
623
- logger.info(f"Using file '{os.path.basename(file_path)}' of size: {file_size} bytes")
648
+ logger.debug(f"Uploading model version of model {self.model_proto.id}")
649
+ logger.debug(f"Using file '{os.path.basename(file_path)}' of size: {file_size} bytes")
624
650
  result = service_pb2.PostModelVersionsUploadRequest(
625
651
  upload_config=service_pb2.PostModelVersionsUploadConfig(
626
652
  user_app_id=self.client.user_app_id,
@@ -655,18 +681,19 @@ class ModelBuilder:
655
681
  version_id=self.model_version_id,
656
682
  ))
657
683
  status_code = resp.model_version.status.code
684
+ logs = self.get_model_build_logs()
685
+ for log_entry in logs.log_entries:
686
+ if log_entry.url not in seen_logs:
687
+ seen_logs.add(log_entry.url)
688
+ logger.info(f"{escape(log_entry.message.strip())}")
658
689
  if status_code == status_code_pb2.MODEL_BUILDING:
659
690
  print(f"Model is building... (elapsed {time.time() - st:.1f}s)", end='\r', flush=True)
660
691
 
661
692
  # Fetch and display the logs
662
- logs = self.get_model_build_logs()
663
- for log_entry in logs.log_entries:
664
- if log_entry.url not in seen_logs:
665
- seen_logs.add(log_entry.url)
666
- logger.info(f"{escape(log_entry.message.strip())}")
667
693
  time.sleep(1)
668
694
  elif status_code == status_code_pb2.MODEL_TRAINED:
669
- logger.info(f"\nModel build complete! (elapsed {time.time() - st:.1f}s)")
695
+ logger.info("Model build complete!")
696
+ logger.info(f"Build time elapsed {time.time() - st:.1f}s)")
670
697
  logger.info(f"Check out the model at {self.model_url} version: {self.model_version_id}")
671
698
  return True
672
699
  else:
@@ -475,7 +475,7 @@ def main(model_path,
475
475
  keep_env=False,
476
476
  keep_image=False):
477
477
 
478
- if not os.environ['CLARIFAI_PAT']:
478
+ if not os.environ.get("CLARIFAI_PAT", None):
479
479
  logger.error(
480
480
  "CLARIFAI_PAT environment variable is not set! Please set your PAT in the 'CLARIFAI_PAT' environment variable."
481
481
  )
@@ -2,9 +2,10 @@ import os
2
2
 
3
3
  registry = os.environ.get('CLARIFAI_BASE_IMAGE_REGISTRY', 'public.ecr.aws/clarifai-models')
4
4
 
5
- PYTHON_BUILDER_IMAGE = registry + '/python-base:builder-{python_version}'
6
- PYTHON_RUNTIME_IMAGE = registry + '/python-base:runtime-{python_version}'
7
- TORCH_BASE_IMAGE = registry + '/torch:builder-{torch_version}-py{python_version}-cuda{cuda_version}'
5
+ GIT_SHA = "df565436eea93efb3e8d1eb558a0a46df29523ec"
6
+
7
+ PYTHON_BASE_IMAGE = registry + '/python-base:{python_version}-' + GIT_SHA
8
+ TORCH_BASE_IMAGE = registry + '/torch:{torch_version}-py{python_version}-cuda{cuda_version}-' + GIT_SHA
8
9
 
9
10
  # List of available python base images
10
11
  AVAILABLE_PYTHON_IMAGES = ['3.11', '3.12']
@@ -14,13 +15,10 @@ DEFAULT_PYTHON_VERSION = 3.12
14
15
  # List of available torch images
15
16
  # Keep sorted by most recent cuda version.
16
17
  AVAILABLE_TORCH_IMAGES = [
17
- '2.4.0-py3.11-cuda124',
18
18
  '2.4.1-py3.11-cuda124',
19
19
  '2.5.1-py3.11-cuda124',
20
- '2.4.0-py3.12-cuda124',
21
20
  '2.4.1-py3.12-cuda124',
22
21
  '2.5.1-py3.12-cuda124',
23
- # '2.4.0-py3.13-cuda124',
24
22
  # '2.4.1-py3.13-cuda124',
25
23
  # '2.5.1-py3.13-cuda124',
26
24
  ]
@@ -162,6 +162,18 @@ class HuggingFaceLoader:
162
162
  return os.path.exists(checkpoint_path) and os.path.exists(
163
163
  os.path.join(checkpoint_path, 'config.json'))
164
164
 
165
+ @staticmethod
166
+ def validate_concept(checkpoint_path: str):
167
+ # check if downloaded concept exists in hf model
168
+ config_path = os.path.join(checkpoint_path, 'config.json')
169
+ with open(config_path, 'r') as f:
170
+ config = json.load(f)
171
+
172
+ labels = config.get('id2label', None)
173
+ if labels:
174
+ return True
175
+ return False
176
+
165
177
  @staticmethod
166
178
  def fetch_labels(checkpoint_path: str):
167
179
  # Fetch labels for classification, detection and segmentation models
@@ -142,8 +142,12 @@ def _configure_logger(name: str, logger_level: Union[int, str] = logging.NOTSET)
142
142
  logger.addHandler(handler)
143
143
  else:
144
144
  # Add the new rich handler and formatter
145
+ try:
146
+ width, _ = os.get_terminal_size()
147
+ except OSError:
148
+ width = 255
145
149
  handler = RichHandler(
146
- rich_tracebacks=True, log_time_format="%Y-%m-%d %H:%M:%S.%f", console=Console(width=255))
150
+ rich_tracebacks=True, log_time_format="%Y-%m-%d %H:%M:%S.%f", console=Console(width=width))
147
151
  formatter = logging.Formatter('%(message)s')
148
152
  handler.setFormatter(formatter)
149
153
  logger.addHandler(handler)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: clarifai
3
- Version: 11.1.1
3
+ Version: 11.1.3
4
4
  Summary: Clarifai Python SDK
5
5
  Home-page: https://github.com/Clarifai/clarifai-python
6
6
  Author: Clarifai
@@ -29,9 +29,9 @@ Requires-Dist: PyYAML>=6.0.1
29
29
  Requires-Dist: schema==0.7.5
30
30
  Requires-Dist: Pillow>=9.5.0
31
31
  Requires-Dist: tabulate>=0.9.0
32
- Requires-Dist: fsspec==2024.6.1
33
- Requires-Dist: click==8.1.7
34
- Requires-Dist: requests==2.32.3
32
+ Requires-Dist: fsspec>=2024.6.1
33
+ Requires-Dist: click>=8.1.7
34
+ Requires-Dist: requests>=2.32.3
35
35
  Provides-Extra: all
36
36
  Requires-Dist: pycocotools==2.0.6; extra == "all"
37
37
  Dynamic: author
@@ -7,9 +7,9 @@ PyYAML>=6.0.1
7
7
  schema==0.7.5
8
8
  Pillow>=9.5.0
9
9
  tabulate>=0.9.0
10
- fsspec==2024.6.1
11
- click==8.1.7
12
- requests==2.32.3
10
+ fsspec>=2024.6.1
11
+ click>=8.1.7
12
+ requests>=2.32.3
13
13
 
14
14
  [all]
15
15
  pycocotools==2.0.6
@@ -7,6 +7,6 @@ PyYAML>=6.0.1
7
7
  schema==0.7.5
8
8
  Pillow>=9.5.0
9
9
  tabulate>=0.9.0
10
- fsspec==2024.6.1
11
- click==8.1.7
12
- requests==2.32.3
10
+ fsspec>=2024.6.1
11
+ click>=8.1.7
12
+ requests>=2.32.3
@@ -1 +0,0 @@
1
- __version__ = "11.1.1"
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