nv-ingest-api 2025.5.12.dev20250512__py3-none-any.whl → 2025.5.14.dev20250514__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.
Potentially problematic release.
This version of nv-ingest-api might be problematic. Click here for more details.
- nv_ingest_api/interface/transform.py +1 -1
- nv_ingest_api/internal/extract/docx/docx_extractor.py +3 -3
- nv_ingest_api/internal/extract/image/chart_extractor.py +3 -3
- nv_ingest_api/internal/extract/image/image_extractor.py +5 -5
- nv_ingest_api/internal/extract/image/image_helpers/common.py +1 -1
- nv_ingest_api/internal/extract/image/infographic_extractor.py +1 -1
- nv_ingest_api/internal/extract/image/table_extractor.py +2 -2
- nv_ingest_api/internal/extract/pdf/engines/nemoretriever.py +2 -2
- nv_ingest_api/internal/extract/pdf/engines/pdfium.py +1 -1
- nv_ingest_api/internal/extract/pptx/engines/pptx_helper.py +44 -17
- nv_ingest_api/internal/extract/pptx/pptx_extractor.py +1 -1
- nv_ingest_api/internal/primitives/nim/model_interface/text_embedding.py +0 -1
- nv_ingest_api/internal/primitives/nim/model_interface/yolox.py +7 -1
- nv_ingest_api/internal/primitives/nim/nim_client.py +1 -1
- nv_ingest_api/internal/primitives/tracing/tagging.py +20 -16
- nv_ingest_api/internal/schemas/extract/extract_pdf_schema.py +1 -1
- nv_ingest_api/internal/schemas/meta/ingest_job_schema.py +2 -2
- nv_ingest_api/internal/schemas/transform/transform_image_caption_schema.py +1 -1
- nv_ingest_api/internal/transform/caption_image.py +1 -1
- nv_ingest_api/internal/transform/embed_text.py +75 -56
- nv_ingest_api/util/exception_handlers/converters.py +1 -1
- nv_ingest_api/util/exception_handlers/decorators.py +309 -51
- nv_ingest_api/util/image_processing/processing.py +1 -1
- nv_ingest_api/util/logging/configuration.py +15 -8
- nv_ingest_api/util/pdf/pdfium.py +2 -2
- nv_ingest_api/util/service_clients/redis/redis_client.py +1 -1
- nv_ingest_api/util/service_clients/rest/rest_client.py +1 -1
- nv_ingest_api/util/system/__init__.py +0 -0
- nv_ingest_api/util/system/hardware_info.py +426 -0
- {nv_ingest_api-2025.5.12.dev20250512.dist-info → nv_ingest_api-2025.5.14.dev20250514.dist-info}/METADATA +1 -1
- {nv_ingest_api-2025.5.12.dev20250512.dist-info → nv_ingest_api-2025.5.14.dev20250514.dist-info}/RECORD +34 -32
- {nv_ingest_api-2025.5.12.dev20250512.dist-info → nv_ingest_api-2025.5.14.dev20250514.dist-info}/WHEEL +1 -1
- {nv_ingest_api-2025.5.12.dev20250512.dist-info → nv_ingest_api-2025.5.14.dev20250514.dist-info}/licenses/LICENSE +0 -0
- {nv_ingest_api-2025.5.12.dev20250512.dist-info → nv_ingest_api-2025.5.14.dev20250514.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
import platform
|
|
4
|
+
from typing import Optional, Dict, Any, Tuple
|
|
5
|
+
|
|
6
|
+
# Try importing psutil, but don't make it a hard requirement if only cgroups are needed
|
|
7
|
+
try:
|
|
8
|
+
import psutil
|
|
9
|
+
except ImportError:
|
|
10
|
+
psutil = None
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
# --- Cgroup Constants ---
|
|
15
|
+
CGROUP_V1_CPU_DIR = "/sys/fs/cgroup/cpu"
|
|
16
|
+
CGROUP_V1_CPUACCT_DIR = "/sys/fs/cgroup/cpuacct" # Sometimes usage is here
|
|
17
|
+
CGROUP_V2_CPU_FILE = "/sys/fs/cgroup/cpu.max" # Standard path in v2 unified hierarchy
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class SystemResourceProbe:
|
|
21
|
+
"""
|
|
22
|
+
Detects the effective CPU core count available to the current process,
|
|
23
|
+
optionally applying a weighting factor for hyperthreads (SMT).
|
|
24
|
+
|
|
25
|
+
It attempts to reconcile information from:
|
|
26
|
+
1. Linux Cgroup v2 CPU limits (cpu.max)
|
|
27
|
+
2. Linux Cgroup v1 CPU limits (cpu.cfs_quota_us, cpu.cfs_period_us)
|
|
28
|
+
3. OS scheduler affinity (os.sched_getaffinity)
|
|
29
|
+
4. OS reported CPU counts (psutil.cpu_count for logical/physical)
|
|
30
|
+
|
|
31
|
+
Prioritizes Cgroup quota limits. If the limit is based on core count
|
|
32
|
+
(affinity/OS), it applies hyperthreading weight if psutil provides
|
|
33
|
+
physical/logical counts.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __init__(self, hyperthread_weight: float = 0.75):
|
|
37
|
+
"""
|
|
38
|
+
Initializes the detector and performs the detection.
|
|
39
|
+
|
|
40
|
+
Parameters
|
|
41
|
+
----------
|
|
42
|
+
hyperthread_weight : float, optional
|
|
43
|
+
The performance weighting factor for hyperthreads (0.0 to 1.0).
|
|
44
|
+
A value of 1.0 treats hyperthreads the same as physical cores.
|
|
45
|
+
A value of 0.5 suggests a hyperthread adds 50% extra performance.
|
|
46
|
+
Requires psutil to be installed and report physical cores.
|
|
47
|
+
Defaults to 0.75.
|
|
48
|
+
"""
|
|
49
|
+
if not (0.0 <= hyperthread_weight <= 1.0):
|
|
50
|
+
raise ValueError("hyperthread_weight must be between 0.0 and 1.0")
|
|
51
|
+
|
|
52
|
+
self.hyperthread_weight: float = hyperthread_weight if psutil else 1.0 # Force 1.0 if psutil missing
|
|
53
|
+
if not psutil and hyperthread_weight != 1.0:
|
|
54
|
+
logger.warning("psutil not found. Hyperthreading weight ignored (effectively 1.0).")
|
|
55
|
+
|
|
56
|
+
# OS Info
|
|
57
|
+
self.os_logical_cores: Optional[int] = None
|
|
58
|
+
self.os_physical_cores: Optional[int] = None
|
|
59
|
+
self.os_sched_affinity_cores: Optional[int] = None
|
|
60
|
+
|
|
61
|
+
# Cgroup Info
|
|
62
|
+
self.cgroup_type: Optional[str] = None
|
|
63
|
+
self.cgroup_quota_cores: Optional[float] = None
|
|
64
|
+
self.cgroup_period_us: Optional[int] = None
|
|
65
|
+
self.cgroup_shares: Optional[int] = None
|
|
66
|
+
self.cgroup_usage_percpu_us: Optional[list[int]] = None
|
|
67
|
+
self.cgroup_usage_total_us: Optional[int] = None
|
|
68
|
+
|
|
69
|
+
# --- Result ---
|
|
70
|
+
# Raw limit before potential weighting
|
|
71
|
+
self.raw_limit_value: Optional[float] = None
|
|
72
|
+
self.raw_limit_method: str = "unknown"
|
|
73
|
+
# Final potentially weighted result
|
|
74
|
+
self.effective_cores: Optional[float] = None
|
|
75
|
+
self.detection_method: str = "unknown" # Method for the final effective_cores
|
|
76
|
+
|
|
77
|
+
self._detect()
|
|
78
|
+
|
|
79
|
+
@staticmethod
|
|
80
|
+
def _read_file_int(path: str) -> Optional[int]:
|
|
81
|
+
"""Safely reads an integer from a file."""
|
|
82
|
+
try:
|
|
83
|
+
if os.path.exists(path):
|
|
84
|
+
with open(path, "r") as f:
|
|
85
|
+
content = f.read().strip()
|
|
86
|
+
if content:
|
|
87
|
+
return int(content)
|
|
88
|
+
except (IOError, ValueError, PermissionError) as e:
|
|
89
|
+
logger.debug(f"Failed to read or parse int from {path}: {e}")
|
|
90
|
+
return None
|
|
91
|
+
|
|
92
|
+
@staticmethod
|
|
93
|
+
def _read_file_str(path: str) -> Optional[str]:
|
|
94
|
+
"""Safely reads a string from a file."""
|
|
95
|
+
try:
|
|
96
|
+
if os.path.exists(path):
|
|
97
|
+
with open(path, "r") as f:
|
|
98
|
+
return f.read().strip()
|
|
99
|
+
except (IOError, PermissionError) as e:
|
|
100
|
+
logger.debug(f"Failed to read string from {path}: {e}")
|
|
101
|
+
return None
|
|
102
|
+
|
|
103
|
+
def _read_cgroup_v1(self) -> bool:
|
|
104
|
+
"""Attempts to read Cgroup v1 CPU limits."""
|
|
105
|
+
if not os.path.exists(CGROUP_V1_CPU_DIR):
|
|
106
|
+
logger.debug(f"Cgroup v1 CPU dir not found: {CGROUP_V1_CPU_DIR}")
|
|
107
|
+
return False
|
|
108
|
+
|
|
109
|
+
logger.debug(f"Checking Cgroup v1 limits in {CGROUP_V1_CPU_DIR}")
|
|
110
|
+
quota_us = self._read_file_int(os.path.join(CGROUP_V1_CPU_DIR, "cpu.cfs_quota_us"))
|
|
111
|
+
period_us = self._read_file_int(os.path.join(CGROUP_V1_CPU_DIR, "cpu.cfs_period_us"))
|
|
112
|
+
shares = self._read_file_int(os.path.join(CGROUP_V1_CPU_DIR, "cpu.shares"))
|
|
113
|
+
|
|
114
|
+
# Check cpuacct for usage stats if dir exists
|
|
115
|
+
if os.path.exists(CGROUP_V1_CPUACCT_DIR):
|
|
116
|
+
usage_total = self._read_file_int(os.path.join(CGROUP_V1_CPUACCT_DIR, "cpuacct.usage"))
|
|
117
|
+
usage_percpu_str = self._read_file_str(os.path.join(CGROUP_V1_CPUACCT_DIR, "cpuacct.usage_percpu"))
|
|
118
|
+
if usage_percpu_str:
|
|
119
|
+
try:
|
|
120
|
+
self.cgroup_usage_percpu_us = [int(x) for x in usage_percpu_str.split()]
|
|
121
|
+
except ValueError:
|
|
122
|
+
logger.warning("Could not parse cpuacct.usage_percpu")
|
|
123
|
+
if usage_total is not None:
|
|
124
|
+
self.cgroup_usage_total_us = usage_total
|
|
125
|
+
|
|
126
|
+
if quota_us is not None and period_us is not None:
|
|
127
|
+
self.cgroup_type = "v1"
|
|
128
|
+
self.cgroup_period_us = period_us
|
|
129
|
+
self.cgroup_shares = shares # May be None if file doesn't exist/readable
|
|
130
|
+
|
|
131
|
+
if quota_us > 0 and period_us > 0:
|
|
132
|
+
self.cgroup_quota_cores = quota_us / period_us
|
|
133
|
+
logger.info(
|
|
134
|
+
f"Cgroup v1 quota detected: {quota_us} us / {period_us} us = {self.cgroup_quota_cores:.2f}"
|
|
135
|
+
f" effective cores"
|
|
136
|
+
)
|
|
137
|
+
return True
|
|
138
|
+
elif quota_us == -1:
|
|
139
|
+
logger.info("Cgroup v1 quota detected: Unlimited (-1)")
|
|
140
|
+
# No quota limit, but we know it's cgroup v1
|
|
141
|
+
return True # Return true because we identified the type
|
|
142
|
+
else:
|
|
143
|
+
logger.warning(f"Cgroup v1 quota/period values invalid? Quota: {quota_us}, Period: {period_us}")
|
|
144
|
+
|
|
145
|
+
elif shares is not None: # If only shares are readable, still note it's v1
|
|
146
|
+
self.cgroup_type = "v1"
|
|
147
|
+
self.cgroup_shares = shares
|
|
148
|
+
logger.info(f"Cgroup v1 shares detected: {shares} (no quota found)")
|
|
149
|
+
return True
|
|
150
|
+
|
|
151
|
+
return False
|
|
152
|
+
|
|
153
|
+
def _read_cgroup_v2(self) -> bool:
|
|
154
|
+
"""Attempts to read Cgroup v2 CPU limits."""
|
|
155
|
+
if not os.path.exists(CGROUP_V2_CPU_FILE):
|
|
156
|
+
logger.debug(f"Cgroup v2 cpu.max file not found: {CGROUP_V2_CPU_FILE}")
|
|
157
|
+
return False
|
|
158
|
+
|
|
159
|
+
logger.debug(f"Checking Cgroup v2 limits in {CGROUP_V2_CPU_FILE}")
|
|
160
|
+
content = self._read_file_str(CGROUP_V2_CPU_FILE)
|
|
161
|
+
if content:
|
|
162
|
+
self.cgroup_type = "v2"
|
|
163
|
+
parts = content.split()
|
|
164
|
+
if len(parts) == 2:
|
|
165
|
+
quota_str, period_str = parts
|
|
166
|
+
try:
|
|
167
|
+
period_us = int(period_str)
|
|
168
|
+
self.cgroup_period_us = period_us
|
|
169
|
+
if quota_str == "max":
|
|
170
|
+
logger.info("Cgroup v2 quota detected: Unlimited ('max')")
|
|
171
|
+
return True # Identified type, no quota limit
|
|
172
|
+
else:
|
|
173
|
+
quota_us = int(quota_str)
|
|
174
|
+
if quota_us > 0 and period_us > 0:
|
|
175
|
+
self.cgroup_quota_cores = quota_us / period_us
|
|
176
|
+
logger.info(
|
|
177
|
+
f"Cgroup v2 quota detected: {quota_us} us / {period_us}"
|
|
178
|
+
f" us = {self.cgroup_quota_cores:.2f} effective cores"
|
|
179
|
+
)
|
|
180
|
+
return True
|
|
181
|
+
else:
|
|
182
|
+
logger.warning(
|
|
183
|
+
f"Cgroup v2 quota/period values invalid? Quota: {quota_us}, Period: {period_us}"
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
except ValueError:
|
|
187
|
+
logger.warning(f"Could not parse Cgroup v2 cpu.max content: '{content}'")
|
|
188
|
+
else:
|
|
189
|
+
logger.warning(f"Unexpected format in Cgroup v2 cpu.max: '{content}'")
|
|
190
|
+
return False
|
|
191
|
+
|
|
192
|
+
@staticmethod
|
|
193
|
+
def _get_os_affinity() -> Optional[int]:
|
|
194
|
+
"""Gets CPU count via os.sched_getaffinity."""
|
|
195
|
+
if platform.system() != "Linux":
|
|
196
|
+
logger.debug("os.sched_getaffinity is Linux-specific.")
|
|
197
|
+
return None
|
|
198
|
+
try:
|
|
199
|
+
# sched_getaffinity exists on Linux
|
|
200
|
+
affinity = os.sched_getaffinity(0) # 0 for current process
|
|
201
|
+
count = len(affinity)
|
|
202
|
+
if count > 0:
|
|
203
|
+
logger.info(f"Detected {count} cores via os.sched_getaffinity.")
|
|
204
|
+
return count
|
|
205
|
+
else:
|
|
206
|
+
logger.warning("os.sched_getaffinity(0) returned 0 or empty set.")
|
|
207
|
+
return None
|
|
208
|
+
except AttributeError:
|
|
209
|
+
logger.debug("os.sched_getaffinity not available on this platform/Python version.")
|
|
210
|
+
return None
|
|
211
|
+
except OSError as e:
|
|
212
|
+
logger.warning(f"Could not get affinity: {e}")
|
|
213
|
+
return None
|
|
214
|
+
|
|
215
|
+
@staticmethod
|
|
216
|
+
def _get_os_cpu_counts() -> Tuple[Optional[int], Optional[int]]:
|
|
217
|
+
"""Gets logical and physical CPU counts using psutil or os.cpu_count."""
|
|
218
|
+
logical = None
|
|
219
|
+
physical = None
|
|
220
|
+
source = "unknown"
|
|
221
|
+
|
|
222
|
+
if psutil:
|
|
223
|
+
try:
|
|
224
|
+
logical = psutil.cpu_count(logical=True)
|
|
225
|
+
physical = psutil.cpu_count(logical=False)
|
|
226
|
+
source = "psutil"
|
|
227
|
+
if not logical:
|
|
228
|
+
logical = None # Ensure None if psutil returns 0/None
|
|
229
|
+
if not physical:
|
|
230
|
+
physical = None
|
|
231
|
+
except Exception as e:
|
|
232
|
+
logger.warning(f"psutil.cpu_count failed: {e}. Falling back to os.cpu_count.")
|
|
233
|
+
logical, physical = None, None # Reset before fallback
|
|
234
|
+
|
|
235
|
+
if logical is None: # Fallback if psutil failed or not installed
|
|
236
|
+
try:
|
|
237
|
+
logical = os.cpu_count()
|
|
238
|
+
source = "os.cpu_count"
|
|
239
|
+
# os.cpu_count doesn't usually provide physical count, leave as None
|
|
240
|
+
except NotImplementedError:
|
|
241
|
+
logger.error("os.cpu_count() is not implemented on this system.")
|
|
242
|
+
except Exception as e:
|
|
243
|
+
logger.error(f"os.cpu_count() failed: {e}")
|
|
244
|
+
|
|
245
|
+
if logical:
|
|
246
|
+
logger.info(f"Detected {logical} logical cores via {source}.")
|
|
247
|
+
if physical:
|
|
248
|
+
logger.info(f"Detected {physical} physical cores via {source}.")
|
|
249
|
+
|
|
250
|
+
return logical, physical
|
|
251
|
+
|
|
252
|
+
# --- Weighting Function ---
|
|
253
|
+
def _apply_hyperthread_weight(self, logical_limit: int) -> float:
|
|
254
|
+
"""
|
|
255
|
+
Applies hyperthreading weight to an integer logical core limit.
|
|
256
|
+
|
|
257
|
+
Parameters
|
|
258
|
+
----------
|
|
259
|
+
logical_limit : int
|
|
260
|
+
The maximum number of logical cores allowed (e.g., from affinity or OS count).
|
|
261
|
+
|
|
262
|
+
Returns
|
|
263
|
+
-------
|
|
264
|
+
float
|
|
265
|
+
The estimated effective core performance based on weighting.
|
|
266
|
+
Returns logical_limit if weighting cannot be applied.
|
|
267
|
+
"""
|
|
268
|
+
P = self.os_physical_cores
|
|
269
|
+
# Weighting requires knowing both physical and logical counts
|
|
270
|
+
if P is not None and P > 0 and self.os_logical_cores is not None:
|
|
271
|
+
# Apply the heuristic: P physical cores + (N-P) hyperthreads * weight
|
|
272
|
+
# Ensure N is capped by the actual number of logical cores available
|
|
273
|
+
N = min(logical_limit, self.os_logical_cores)
|
|
274
|
+
|
|
275
|
+
physical_part = min(N, P)
|
|
276
|
+
hyperthread_part = max(0, N - P)
|
|
277
|
+
|
|
278
|
+
weighted_cores = (physical_part * 1.0) + (hyperthread_part * self.hyperthread_weight)
|
|
279
|
+
|
|
280
|
+
if weighted_cores != N: # Log only if weighting changes the value
|
|
281
|
+
logger.info(
|
|
282
|
+
f"Applying hyperthread weight ({self.hyperthread_weight:.2f}) to "
|
|
283
|
+
f"logical limit {logical_limit} (System: {P}P/{self.os_logical_cores}L): "
|
|
284
|
+
f"Effective weighted cores = {weighted_cores:.2f}"
|
|
285
|
+
)
|
|
286
|
+
else:
|
|
287
|
+
logger.debug(
|
|
288
|
+
f"Hyperthread weighting ({self.hyperthread_weight:.2f}) applied to "
|
|
289
|
+
f"logical limit {logical_limit} (System: {P}P/{self.os_logical_cores}L), "
|
|
290
|
+
f"but result is still {weighted_cores:.2f} (e.g., limit <= physical or weight=1.0)"
|
|
291
|
+
)
|
|
292
|
+
return weighted_cores
|
|
293
|
+
else:
|
|
294
|
+
# Cannot apply weighting
|
|
295
|
+
if self.hyperthread_weight != 1.0: # Only warn if weighting was requested
|
|
296
|
+
if not psutil:
|
|
297
|
+
# Already warned about missing psutil during init
|
|
298
|
+
pass
|
|
299
|
+
elif P is None:
|
|
300
|
+
logger.warning("Cannot apply hyperthread weight: Physical core count not available.")
|
|
301
|
+
else: # L must be missing
|
|
302
|
+
logger.warning("Cannot apply hyperthread weight: Logical core count not available.")
|
|
303
|
+
|
|
304
|
+
logger.debug(f"Skipping hyperthread weight calculation for logical limit {logical_limit}.")
|
|
305
|
+
return float(logical_limit) # Return the original limit as float
|
|
306
|
+
|
|
307
|
+
def _detect(self):
|
|
308
|
+
"""Performs the detection sequence and applies weighting."""
|
|
309
|
+
logger.debug("Starting effective core count detection...")
|
|
310
|
+
|
|
311
|
+
# 1. Get OS level counts first
|
|
312
|
+
self.os_logical_cores, self.os_physical_cores = self._get_os_cpu_counts()
|
|
313
|
+
|
|
314
|
+
# 2. Try Cgroup v2
|
|
315
|
+
cgroup_detected = self._read_cgroup_v2()
|
|
316
|
+
|
|
317
|
+
# 3. Try Cgroup v1 if v2 not found or didn't yield quota
|
|
318
|
+
if not cgroup_detected or (self.cgroup_type == "v2" and self.cgroup_quota_cores is None):
|
|
319
|
+
cgroup_detected = self._read_cgroup_v1()
|
|
320
|
+
|
|
321
|
+
# 4. Get OS Affinity
|
|
322
|
+
self.os_sched_affinity_cores = self._get_os_affinity()
|
|
323
|
+
|
|
324
|
+
# --- 5. Determine the RAW Limit (before weighting) ---
|
|
325
|
+
raw_limit = float("inf")
|
|
326
|
+
raw_method = "unknown"
|
|
327
|
+
|
|
328
|
+
# Priority 1: Cgroup Quota
|
|
329
|
+
if self.cgroup_quota_cores is not None and self.cgroup_quota_cores > 0:
|
|
330
|
+
raw_limit = min(raw_limit, self.cgroup_quota_cores)
|
|
331
|
+
raw_method = f"cgroup_{self.cgroup_type}_quota"
|
|
332
|
+
logger.debug(f"Raw limit set by Cgroup Quota: {self.cgroup_quota_cores:.2f}")
|
|
333
|
+
|
|
334
|
+
# Priority 2: Scheduler Affinity
|
|
335
|
+
if self.os_sched_affinity_cores is not None and self.os_sched_affinity_cores > 0:
|
|
336
|
+
affinity_limit = float(self.os_sched_affinity_cores)
|
|
337
|
+
if affinity_limit < raw_limit:
|
|
338
|
+
raw_limit = affinity_limit
|
|
339
|
+
raw_method = "sched_affinity"
|
|
340
|
+
logger.debug(f"Raw limit updated by Sched Affinity: {affinity_limit}")
|
|
341
|
+
elif raw_method.startswith("cgroup"):
|
|
342
|
+
logger.debug(
|
|
343
|
+
f"Sched Affinity limit ({affinity_limit}) not stricter than Cgroup Quota ({raw_limit:.2f})."
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
# Priority 3: OS Logical Cores
|
|
347
|
+
if raw_limit == float("inf"): # If no cgroup quota or affinity was found/applied
|
|
348
|
+
if self.os_logical_cores is not None and self.os_logical_cores > 0:
|
|
349
|
+
raw_limit = float(self.os_logical_cores)
|
|
350
|
+
raw_method = "os_logical_count"
|
|
351
|
+
logger.debug(f"Raw limit set by OS Logical Core count: {self.os_logical_cores}")
|
|
352
|
+
else:
|
|
353
|
+
# Absolute fallback
|
|
354
|
+
logger.warning("Could not determine any CPU core limit. Defaulting raw limit to 1.0.")
|
|
355
|
+
raw_limit = 1.0
|
|
356
|
+
raw_method = "fallback_default"
|
|
357
|
+
|
|
358
|
+
self.raw_limit_value = raw_limit
|
|
359
|
+
self.raw_limit_method = raw_method
|
|
360
|
+
logger.info(f"Raw CPU limit determined: {self.raw_limit_value:.2f} (Method: {self.raw_limit_method})")
|
|
361
|
+
|
|
362
|
+
# --- 6. Apply Weighting (if applicable) ---
|
|
363
|
+
final_effective_cores = raw_limit
|
|
364
|
+
final_method = raw_method
|
|
365
|
+
|
|
366
|
+
# Apply weighting ONLY if the raw limit is NOT from a cgroup quota
|
|
367
|
+
# AND the limit is an integer (or effectively integer) core count
|
|
368
|
+
if not raw_method.startswith("cgroup_"):
|
|
369
|
+
# Check if raw_limit is effectively an integer
|
|
370
|
+
if abs(raw_limit - round(raw_limit)) < 1e-9 and raw_limit > 0:
|
|
371
|
+
logical_limit_int = int(round(raw_limit))
|
|
372
|
+
weighted_value = self._apply_hyperthread_weight(logical_limit_int)
|
|
373
|
+
final_effective_cores = weighted_value
|
|
374
|
+
# Update method if weighting was actually applied and changed the value
|
|
375
|
+
if abs(weighted_value - raw_limit) > 1e-9:
|
|
376
|
+
final_method = f"{raw_method}_weighted"
|
|
377
|
+
else:
|
|
378
|
+
# Keep original method name if weighting didn't change result
|
|
379
|
+
final_method = raw_method
|
|
380
|
+
|
|
381
|
+
else: # Raw limit was affinity/os count but not an integer? Should be rare.
|
|
382
|
+
logger.debug(
|
|
383
|
+
f"Raw limit method '{raw_method}' is not cgroup quota, "
|
|
384
|
+
f"but value {raw_limit:.2f} is not integer. Skipping weighting."
|
|
385
|
+
)
|
|
386
|
+
|
|
387
|
+
elif raw_method.startswith("cgroup_"):
|
|
388
|
+
logger.debug("Raw limit is from Cgroup quota. Using quota value directly (skipping SMT weighting).")
|
|
389
|
+
|
|
390
|
+
self.effective_cores = final_effective_cores
|
|
391
|
+
self.detection_method = final_method # The method for the final value
|
|
392
|
+
|
|
393
|
+
logger.info(
|
|
394
|
+
f"Effective CPU core limit determined: {self.effective_cores:.2f} " f"(Method: {self.detection_method})"
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
def get_effective_cores(self) -> Optional[float]:
|
|
398
|
+
"""Returns the primary result: the effective core limit, potentially weighted."""
|
|
399
|
+
return self.effective_cores
|
|
400
|
+
|
|
401
|
+
def get_details(self) -> Dict[str, Any]:
|
|
402
|
+
"""Returns a dictionary with all detected information."""
|
|
403
|
+
# Calculate full system weighted potential for info
|
|
404
|
+
os_weighted_cores = None
|
|
405
|
+
if self.os_physical_cores and self.os_logical_cores:
|
|
406
|
+
# Use weighting func with the total logical cores as the limit
|
|
407
|
+
os_weighted_cores = self._apply_hyperthread_weight(self.os_logical_cores)
|
|
408
|
+
|
|
409
|
+
return {
|
|
410
|
+
"effective_cores": self.effective_cores,
|
|
411
|
+
"detection_method": self.detection_method,
|
|
412
|
+
"raw_limit_value": self.raw_limit_value,
|
|
413
|
+
"raw_limit_method": self.raw_limit_method,
|
|
414
|
+
"hyperthread_weight_applied": self.hyperthread_weight,
|
|
415
|
+
"os_logical_cores": self.os_logical_cores,
|
|
416
|
+
"os_physical_cores": self.os_physical_cores,
|
|
417
|
+
"os_weighted_potential": os_weighted_cores, # Full system potential weighted
|
|
418
|
+
"os_sched_affinity_cores": self.os_sched_affinity_cores,
|
|
419
|
+
"cgroup_type": self.cgroup_type,
|
|
420
|
+
"cgroup_quota_cores": self.cgroup_quota_cores,
|
|
421
|
+
"cgroup_period_us": self.cgroup_period_us,
|
|
422
|
+
"cgroup_shares": self.cgroup_shares,
|
|
423
|
+
"cgroup_usage_total_us": self.cgroup_usage_total_us,
|
|
424
|
+
"cgroup_usage_percpu_us": self.cgroup_usage_percpu_us,
|
|
425
|
+
"platform": platform.system(),
|
|
426
|
+
}
|
|
@@ -3,7 +3,7 @@ nv_ingest_api/interface/__init__.py,sha256=ltWlfmtCewHSRK4B7DF__QvlSUPuliz58JEcE
|
|
|
3
3
|
nv_ingest_api/interface/extract.py,sha256=GyBfXKKTGwSb-y0k0nMiTf4HcCT2E-lxLY4aMYAPeOI,38815
|
|
4
4
|
nv_ingest_api/interface/mutate.py,sha256=eZkd3sbHEJQiEPJyMbhewlPxQNMnL_Xur15icclnb-U,5934
|
|
5
5
|
nv_ingest_api/interface/store.py,sha256=aR3Cf19lq9Yo9AHlAy1VVcrOP2dgyN01yYhwxyTprkQ,8207
|
|
6
|
-
nv_ingest_api/interface/transform.py,sha256=
|
|
6
|
+
nv_ingest_api/interface/transform.py,sha256=NtRmS36LqL4P4vivuiDe1MqKaELeuh-rlO-9kb6skAE,15829
|
|
7
7
|
nv_ingest_api/interface/utility.py,sha256=oXHV2Miz2BKviQg5vOVfiGSvPs2fKJsPDmnxe3fJL9c,7857
|
|
8
8
|
nv_ingest_api/internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
9
|
nv_ingest_api/internal/enums/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
@@ -12,32 +12,32 @@ nv_ingest_api/internal/extract/__init__.py,sha256=uLsBITo_XfgbwpzqXUm1IYX6XlZrTf
|
|
|
12
12
|
nv_ingest_api/internal/extract/audio/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
13
13
|
nv_ingest_api/internal/extract/audio/audio_extraction.py,sha256=L8cK7xB6QTaSx8gsrdyaYHYh0HpW6lycGfduCk7XSMg,5364
|
|
14
14
|
nv_ingest_api/internal/extract/docx/__init__.py,sha256=HIHfzSig66GT0Uk8qsGBm_f13fKYcPtItBicRUWOOVA,183
|
|
15
|
-
nv_ingest_api/internal/extract/docx/docx_extractor.py,sha256=
|
|
15
|
+
nv_ingest_api/internal/extract/docx/docx_extractor.py,sha256=jjbL12F5dtpbqHRbhL0uomSiQ90bcQq3N7M43XYsq34,8356
|
|
16
16
|
nv_ingest_api/internal/extract/docx/engines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
17
|
nv_ingest_api/internal/extract/docx/engines/docxreader_helpers/__init__.py,sha256=uLsBITo_XfgbwpzqXUm1IYX6XlZrTfx6T1cIhdILwG8,140
|
|
18
18
|
nv_ingest_api/internal/extract/docx/engines/docxreader_helpers/docx_helper.py,sha256=1wkciAxu8lz9WuPuoleJFy2s09ieSzXl1S71F9r0BWA,4385
|
|
19
19
|
nv_ingest_api/internal/extract/docx/engines/docxreader_helpers/docxreader.py,sha256=CM2yV8lfEw1F1ORAjupD4gyIKX0PDDJrL3nsZ5Mnrgg,31539
|
|
20
20
|
nv_ingest_api/internal/extract/image/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
21
|
-
nv_ingest_api/internal/extract/image/chart_extractor.py,sha256=
|
|
22
|
-
nv_ingest_api/internal/extract/image/image_extractor.py,sha256=
|
|
23
|
-
nv_ingest_api/internal/extract/image/infographic_extractor.py,sha256=
|
|
24
|
-
nv_ingest_api/internal/extract/image/table_extractor.py,sha256=
|
|
21
|
+
nv_ingest_api/internal/extract/image/chart_extractor.py,sha256=CkaW8ihPmGMQGrZh0ih14gtEpWuGOJ8InPQfZwpsP2g,13300
|
|
22
|
+
nv_ingest_api/internal/extract/image/image_extractor.py,sha256=4tUWinuFMN3ukWa2tZa2_LtzRiTyUAUCBF6BDkUEvm0,8705
|
|
23
|
+
nv_ingest_api/internal/extract/image/infographic_extractor.py,sha256=yc9b2q_Ea08CEVclZ47UkpU4F7qlakPuU3UV9P013W0,8903
|
|
24
|
+
nv_ingest_api/internal/extract/image/table_extractor.py,sha256=ivHaJxYjeHvFM1PZIpxVabPadxtcTsu51j398ZjMhD4,13123
|
|
25
25
|
nv_ingest_api/internal/extract/image/image_helpers/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
26
|
-
nv_ingest_api/internal/extract/image/image_helpers/common.py,sha256=
|
|
26
|
+
nv_ingest_api/internal/extract/image/image_helpers/common.py,sha256=P8rcl4YPyeWeMJg7u1yejD3k9EnDVEbJgfYEnJ4WO5c,15025
|
|
27
27
|
nv_ingest_api/internal/extract/pdf/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
28
28
|
nv_ingest_api/internal/extract/pdf/pdf_extractor.py,sha256=CxtWaD6mql9MEqSdk2CfSQ9T-Bn87beBkCOuGGjxGt8,2934
|
|
29
29
|
nv_ingest_api/internal/extract/pdf/engines/__init__.py,sha256=u4GnAZmDKRl0RwYGIRiozIRw70Kybw3A72-lcKFeoTI,582
|
|
30
30
|
nv_ingest_api/internal/extract/pdf/engines/adobe.py,sha256=VT0dEqkU-y2uGkaCqxtKYov_Q8R1028UQVBchgMLca4,17466
|
|
31
31
|
nv_ingest_api/internal/extract/pdf/engines/llama.py,sha256=PpKTqS8jGHBV6mKLGZWwjpfT8ga6Fy8ffrvL-gPAf2c,8182
|
|
32
|
-
nv_ingest_api/internal/extract/pdf/engines/nemoretriever.py,sha256=
|
|
33
|
-
nv_ingest_api/internal/extract/pdf/engines/pdfium.py,sha256=
|
|
32
|
+
nv_ingest_api/internal/extract/pdf/engines/nemoretriever.py,sha256=Uqj1NH7yWga9P6_vCzgny1WKALfF--UdAaGHUF8K_aQ,22926
|
|
33
|
+
nv_ingest_api/internal/extract/pdf/engines/pdfium.py,sha256=fDbrZwJ-lgeHYOq107WXehzdSvyF8zEDza_9UkDm5aE,22360
|
|
34
34
|
nv_ingest_api/internal/extract/pdf/engines/tika.py,sha256=6GyR2l6EsgNZl9jnYDXLeKNK9Fj2Mw9y2UWDq-eSkOc,3169
|
|
35
35
|
nv_ingest_api/internal/extract/pdf/engines/unstructured_io.py,sha256=jrv2B4VZAH4PevAQrFz965qz8UyXq3rViiOTbGLejec,14908
|
|
36
36
|
nv_ingest_api/internal/extract/pdf/engines/pdf_helpers/__init__.py,sha256=Jk3wrQ2CZs167juvEZ-uV6qXWQjR08hhIu8otk2MWj4,4931
|
|
37
37
|
nv_ingest_api/internal/extract/pptx/__init__.py,sha256=HIHfzSig66GT0Uk8qsGBm_f13fKYcPtItBicRUWOOVA,183
|
|
38
|
-
nv_ingest_api/internal/extract/pptx/pptx_extractor.py,sha256=
|
|
38
|
+
nv_ingest_api/internal/extract/pptx/pptx_extractor.py,sha256=vTGWaR0YXG4gLM0lYXFQ83F2nlU__mmOmXsA0jYlZ70,7871
|
|
39
39
|
nv_ingest_api/internal/extract/pptx/engines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
40
|
-
nv_ingest_api/internal/extract/pptx/engines/pptx_helper.py,sha256=
|
|
40
|
+
nv_ingest_api/internal/extract/pptx/engines/pptx_helper.py,sha256=Lg2I1Zq-WJagsZibgyn__8T-M86BjkqAiXWNta9X_EU,29430
|
|
41
41
|
nv_ingest_api/internal/mutate/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
42
42
|
nv_ingest_api/internal/mutate/deduplicate.py,sha256=hmvTTGevpCtlkM_wVZSoc8-Exr6rUJwqLjoEnbPcPzY,3849
|
|
43
43
|
nv_ingest_api/internal/mutate/filter.py,sha256=H-hOTBVP-zLpvQr-FoGIJKxkhtj4l_sZ9V2Fgu3rTEM,5183
|
|
@@ -46,7 +46,7 @@ nv_ingest_api/internal/primitives/control_message_task.py,sha256=nWVB3QsP6p8BKwH
|
|
|
46
46
|
nv_ingest_api/internal/primitives/ingest_control_message.py,sha256=rvipBiiUaHuRhupFCFDCG8rv0PylSJibCiJ7rDeb98A,8514
|
|
47
47
|
nv_ingest_api/internal/primitives/nim/__init__.py,sha256=i_i_fBR2EcRCh2Y19DF6GM3s_Q0VPgo_thPnhEIJUyg,266
|
|
48
48
|
nv_ingest_api/internal/primitives/nim/default_values.py,sha256=W92XjfyeC6uuVxut6J7p00x1kpNsnXIDb97gSVytZJk,380
|
|
49
|
-
nv_ingest_api/internal/primitives/nim/nim_client.py,sha256=
|
|
49
|
+
nv_ingest_api/internal/primitives/nim/nim_client.py,sha256=pvNxwMgNS7lFjXvLgRVUrL6FdXDGkfGnOGQh9WrpYzs,14858
|
|
50
50
|
nv_ingest_api/internal/primitives/nim/nim_model_interface.py,sha256=wMEgoi79YQn_4338MVemkeZgM1J-vnz0aZWpvqDhib4,2392
|
|
51
51
|
nv_ingest_api/internal/primitives/nim/model_interface/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
52
52
|
nv_ingest_api/internal/primitives/nim/model_interface/cached.py,sha256=b1HX-PY1ExW5V6pXC1ZiHdobeG_BmbPr3rBbVJef13s,11003
|
|
@@ -56,13 +56,13 @@ nv_ingest_api/internal/primitives/nim/model_interface/helpers.py,sha256=x35a9AyT
|
|
|
56
56
|
nv_ingest_api/internal/primitives/nim/model_interface/nemoretriever_parse.py,sha256=MFWPqMTXs_MZG3ripRR21o7f_mVeoE46Q10yvJ8KNr0,7023
|
|
57
57
|
nv_ingest_api/internal/primitives/nim/model_interface/paddle.py,sha256=rSUPwl5XOrqneoS6aKhatVjrNBg_LhP3nwUWS_aTwz0,17950
|
|
58
58
|
nv_ingest_api/internal/primitives/nim/model_interface/parakeet.py,sha256=OYg4AGki_wm--Np9VlSm0eZC-r54GbDOISbe9v0B9fw,12967
|
|
59
|
-
nv_ingest_api/internal/primitives/nim/model_interface/text_embedding.py,sha256=
|
|
59
|
+
nv_ingest_api/internal/primitives/nim/model_interface/text_embedding.py,sha256=lFhppNqrq5X_fzbCWKphvZQMzaJd3gHrkWsyJORzFrU,5010
|
|
60
60
|
nv_ingest_api/internal/primitives/nim/model_interface/vlm.py,sha256=qJ382PU1ZrIM-SR3cqIhtY_W2rmHec2HIa2aUB2SvaU,6031
|
|
61
|
-
nv_ingest_api/internal/primitives/nim/model_interface/yolox.py,sha256=
|
|
61
|
+
nv_ingest_api/internal/primitives/nim/model_interface/yolox.py,sha256=uYXqdvqgkyS4Yfr9ZoikRDX4e94OV3ch3Xhv3JVg-3s,49581
|
|
62
62
|
nv_ingest_api/internal/primitives/tracing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
63
63
|
nv_ingest_api/internal/primitives/tracing/latency.py,sha256=5kVTeYRbRdTlT_aI4MeS20N_S7mqCcLqZR6YHtxhXkY,2215
|
|
64
64
|
nv_ingest_api/internal/primitives/tracing/logging.py,sha256=SSzIgS7afLH-e1C7VagYDmkkA6rTXmQ-bmtLjoEguhg,3851
|
|
65
|
-
nv_ingest_api/internal/primitives/tracing/tagging.py,sha256=
|
|
65
|
+
nv_ingest_api/internal/primitives/tracing/tagging.py,sha256=O5dD7Z7j43nrjqn0AxhxOPm5zIyMFo0akxaWU_FguAM,7866
|
|
66
66
|
nv_ingest_api/internal/schemas/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
67
67
|
nv_ingest_api/internal/schemas/extract/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
68
68
|
nv_ingest_api/internal/schemas/extract/extract_audio_schema.py,sha256=VVppZgV1lnyJCTfADexzoj3V0lOSq3t6Dw_6VhIxZ7k,3771
|
|
@@ -70,7 +70,7 @@ nv_ingest_api/internal/schemas/extract/extract_chart_schema.py,sha256=mNsv628osl
|
|
|
70
70
|
nv_ingest_api/internal/schemas/extract/extract_docx_schema.py,sha256=M2N7WjMNvSemHcJHWeNUD_kFG0wC5VE2W3K6SVrJqvA,3761
|
|
71
71
|
nv_ingest_api/internal/schemas/extract/extract_image_schema.py,sha256=GC4xV8Z9TPLOuxlEtf2fbklSSp8ETGMrDpZgMQ02UwA,3766
|
|
72
72
|
nv_ingest_api/internal/schemas/extract/extract_infographic_schema.py,sha256=_ptTrxN74tpasJ0aQZgaXEUYFe298PJGbGNk6gyeM94,3992
|
|
73
|
-
nv_ingest_api/internal/schemas/extract/extract_pdf_schema.py,sha256=
|
|
73
|
+
nv_ingest_api/internal/schemas/extract/extract_pdf_schema.py,sha256=G9g1lEORmryUWTzDyZ0vHAuPnVMK7VaRx0E4xzmAw3Q,6589
|
|
74
74
|
nv_ingest_api/internal/schemas/extract/extract_pptx_schema.py,sha256=5dT0kv-Mmpe5KW-BZc1JOW3rUlgzVZI0rpB79NWytmw,3761
|
|
75
75
|
nv_ingest_api/internal/schemas/extract/extract_table_schema.py,sha256=SXBYDU3V97-pPOLfhFmXQveP_awARXP7k1aGcMMEJtU,3951
|
|
76
76
|
nv_ingest_api/internal/schemas/message_brokers/__init__.py,sha256=uLsBITo_XfgbwpzqXUm1IYX6XlZrTfx6T1cIhdILwG8,140
|
|
@@ -79,7 +79,7 @@ nv_ingest_api/internal/schemas/message_brokers/request_schema.py,sha256=LZX_wXDx
|
|
|
79
79
|
nv_ingest_api/internal/schemas/message_brokers/response_schema.py,sha256=4b275HlzBSzpmuE2wdoeaGKPCdKki3wuWldtRIfrj8w,727
|
|
80
80
|
nv_ingest_api/internal/schemas/meta/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
81
81
|
nv_ingest_api/internal/schemas/meta/base_model_noext.py,sha256=8hXU1uuiqZ6t8EsoZ8vlC5EFf2zSZrKEX133FcfZMwI,316
|
|
82
|
-
nv_ingest_api/internal/schemas/meta/ingest_job_schema.py,sha256=
|
|
82
|
+
nv_ingest_api/internal/schemas/meta/ingest_job_schema.py,sha256=nn2cExuU9AmrOMGFMN1RmBzzLaPtLMxs0cJai-cu9w8,7753
|
|
83
83
|
nv_ingest_api/internal/schemas/meta/metadata_schema.py,sha256=_FAE-yeb01hxq05SXrV3NLM4DPUPSfnIbH6ZMliWsEg,6625
|
|
84
84
|
nv_ingest_api/internal/schemas/mutate/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
85
85
|
nv_ingest_api/internal/schemas/mutate/mutate_image_dedup_schema.py,sha256=k1JOdlPPpsipc0XhHf-9YxJ_-W0HvpVE1ZhYmr7fzj0,395
|
|
@@ -87,7 +87,7 @@ nv_ingest_api/internal/schemas/store/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQu
|
|
|
87
87
|
nv_ingest_api/internal/schemas/store/store_embedding_schema.py,sha256=tdKeiraim9CDL9htgp4oUSCoPMoO5PrHBnlXqDyCpMw,956
|
|
88
88
|
nv_ingest_api/internal/schemas/store/store_image_schema.py,sha256=p2LGij9i6sG6RYmsfdiQOiWIc2j-POjxYrNuMrp3ELU,1010
|
|
89
89
|
nv_ingest_api/internal/schemas/transform/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
90
|
-
nv_ingest_api/internal/schemas/transform/transform_image_caption_schema.py,sha256=
|
|
90
|
+
nv_ingest_api/internal/schemas/transform/transform_image_caption_schema.py,sha256=xLxXJsm8QeaL7KPe7m5sP2rd_AuNRMX29rdeVdoei3Y,582
|
|
91
91
|
nv_ingest_api/internal/schemas/transform/transform_image_filter_schema.py,sha256=31ThI5fr0yyENeJeE1xMAA-pxk1QVJLwM842zMate_k,429
|
|
92
92
|
nv_ingest_api/internal/schemas/transform/transform_text_embedding_schema.py,sha256=vlTjAj1T78QkQXYkC83vZQKTW04x7PeoukEzmkam7sY,732
|
|
93
93
|
nv_ingest_api/internal/schemas/transform/transform_text_splitter_schema.py,sha256=iM1sUklcZVA6fdeEWRsMqV_ls-E4UcUsGwewv0JJRi4,759
|
|
@@ -95,8 +95,8 @@ nv_ingest_api/internal/store/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8y
|
|
|
95
95
|
nv_ingest_api/internal/store/embed_text_upload.py,sha256=maxb4FPsBvWgvlrjAPEBlRZEFdJX5NxPG-p8kUbzV7I,9898
|
|
96
96
|
nv_ingest_api/internal/store/image_upload.py,sha256=J5EHNng7Z5I6M4f3UcbniKQB29Scr3Qe05wsBpaVXds,9653
|
|
97
97
|
nv_ingest_api/internal/transform/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
98
|
-
nv_ingest_api/internal/transform/caption_image.py,sha256=
|
|
99
|
-
nv_ingest_api/internal/transform/embed_text.py,sha256=
|
|
98
|
+
nv_ingest_api/internal/transform/caption_image.py,sha256=RYL_b26zfaRlbHz0XvLw9HwaMlXpNhr7gayjxGzdALQ,8545
|
|
99
|
+
nv_ingest_api/internal/transform/embed_text.py,sha256=F8kg-WXihtuUMwDQUUYjnfGDCdQp1Mkd-jeThOiJT0s,16507
|
|
100
100
|
nv_ingest_api/internal/transform/split_text.py,sha256=y6NYRkCEVpVsDu-AqrKx2D6JPp1vwxclw9obNZNJIIs,6561
|
|
101
101
|
nv_ingest_api/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
102
102
|
nv_ingest_api/util/control_message/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -111,18 +111,18 @@ nv_ingest_api/util/converters/type_mappings.py,sha256=5TVXRyU6BlQvFOdqknEuQw3ss4
|
|
|
111
111
|
nv_ingest_api/util/detectors/__init__.py,sha256=HIHfzSig66GT0Uk8qsGBm_f13fKYcPtItBicRUWOOVA,183
|
|
112
112
|
nv_ingest_api/util/detectors/language.py,sha256=TvzcESYY0bn0U4aLY6GjB4VaCWA6XrXxAGZbVzHTMuE,965
|
|
113
113
|
nv_ingest_api/util/exception_handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
114
|
-
nv_ingest_api/util/exception_handlers/converters.py,sha256=
|
|
115
|
-
nv_ingest_api/util/exception_handlers/decorators.py,sha256=
|
|
114
|
+
nv_ingest_api/util/exception_handlers/converters.py,sha256=fX64p5GeoHOPbGccR2JrsKQLa0Ge9Mmi2W-9mLnVVl8,2221
|
|
115
|
+
nv_ingest_api/util/exception_handlers/decorators.py,sha256=ywaqekT9g2gfDH8my7JTJdcnDYbguSzWfAQ6TVxqQvE,21459
|
|
116
116
|
nv_ingest_api/util/exception_handlers/detectors.py,sha256=Q1O-QOzsShPpNian2lawXVAOCstIE7nSytNw516hTg8,2288
|
|
117
117
|
nv_ingest_api/util/exception_handlers/pdf.py,sha256=FUC41QJKDCfiTv-1c1_8Isxwt1xMxDZw9BN8JLEJKBw,3654
|
|
118
118
|
nv_ingest_api/util/exception_handlers/schemas.py,sha256=NJngVNf9sk5Uz6CFFfkNO_LBAMt2QZUcMYGxX64oYRk,2179
|
|
119
119
|
nv_ingest_api/util/image_processing/__init__.py,sha256=Jiy8C1ZuSrNb_eBM1ZTV9IKFIsnjhZi6Ku3JJhVLimA,104
|
|
120
120
|
nv_ingest_api/util/image_processing/clustering.py,sha256=sUGlZI4cx1q8h4Pns1N9JVpdfSM2BOH8zRmn9QFCtzI,9236
|
|
121
|
-
nv_ingest_api/util/image_processing/processing.py,sha256=
|
|
121
|
+
nv_ingest_api/util/image_processing/processing.py,sha256=LSoDDEmahr7a-qSS12McVcowRe3dOrAZwa1h-PD_JPQ,6554
|
|
122
122
|
nv_ingest_api/util/image_processing/table_and_chart.py,sha256=bxOu9PZYkG_WFCDGw_JLaO60S2pDSN8EOWK3xkIwr2A,14376
|
|
123
123
|
nv_ingest_api/util/image_processing/transforms.py,sha256=Kz9hrizV314Hy7cRCYK9ZmhmBbVUOZ_z0HEpzZYcslQ,14081
|
|
124
124
|
nv_ingest_api/util/logging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
125
|
-
nv_ingest_api/util/logging/configuration.py,sha256=
|
|
125
|
+
nv_ingest_api/util/logging/configuration.py,sha256=XUo7yON9V8IDPfN3x8RBwpZ3Gv4zrRq8QwsByf4dGNE,981
|
|
126
126
|
nv_ingest_api/util/message_brokers/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
127
127
|
nv_ingest_api/util/message_brokers/simple_message_broker/__init__.py,sha256=WaQ3CWIpIKWEivT5kL-bkmzcSQKLGFNFHdXHUJjqZFs,325
|
|
128
128
|
nv_ingest_api/util/message_brokers/simple_message_broker/broker.py,sha256=h9Q4q_alXGxCLNlJUZPan46q8fJ7B72sQy2eBfHdk6I,17265
|
|
@@ -134,19 +134,21 @@ nv_ingest_api/util/multi_processing/__init__.py,sha256=4fojP8Rp_5Hu1YAkqGylqTyEZ
|
|
|
134
134
|
nv_ingest_api/util/multi_processing/mp_pool_singleton.py,sha256=dTfP82DgGPaXEJH3jywTO8rNlLZUniD4FFzwv84_giE,7372
|
|
135
135
|
nv_ingest_api/util/nim/__init__.py,sha256=UqbiXFCqjWcjNvoduXd_0gOUOGBT8JvppiYHOmMyneA,1775
|
|
136
136
|
nv_ingest_api/util/pdf/__init__.py,sha256=uLsBITo_XfgbwpzqXUm1IYX6XlZrTfx6T1cIhdILwG8,140
|
|
137
|
-
nv_ingest_api/util/pdf/pdfium.py,sha256=
|
|
137
|
+
nv_ingest_api/util/pdf/pdfium.py,sha256=Ch9Gh5jRLcBr3stjCckqWwTUL-T0sI50PlQnZHo_9NA,15761
|
|
138
138
|
nv_ingest_api/util/schema/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
139
139
|
nv_ingest_api/util/schema/schema_validator.py,sha256=H0yZ_i_HZaiBRUCGmTBfRB9-hURhVqyd10aS_ynM1_0,321
|
|
140
140
|
nv_ingest_api/util/service_clients/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
141
141
|
nv_ingest_api/util/service_clients/client_base.py,sha256=eCOeq3Rr6Xnnsh-oHszYlQTOffQyzsT8s43V4V8H_h8,2716
|
|
142
142
|
nv_ingest_api/util/service_clients/kafka/__init__.py,sha256=uLsBITo_XfgbwpzqXUm1IYX6XlZrTfx6T1cIhdILwG8,140
|
|
143
143
|
nv_ingest_api/util/service_clients/redis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
144
|
-
nv_ingest_api/util/service_clients/redis/redis_client.py,sha256=
|
|
144
|
+
nv_ingest_api/util/service_clients/redis/redis_client.py,sha256=3NLecvIvVN1v-sA7d7G-_f6qJVZyfJE2H8Iu5KG3Aew,37417
|
|
145
145
|
nv_ingest_api/util/service_clients/rest/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
146
|
-
nv_ingest_api/util/service_clients/rest/rest_client.py,sha256=
|
|
146
|
+
nv_ingest_api/util/service_clients/rest/rest_client.py,sha256=dZ-jrk7IK7oNtHoXFSNTf7psoOpLREiLN5ezpHFW0HI,21732
|
|
147
147
|
nv_ingest_api/util/string_processing/__init__.py,sha256=mkwHthyS-IILcLcL1tJYeF6mpqX3pxEw5aUzDGjTSeU,1411
|
|
148
|
-
nv_ingest_api
|
|
149
|
-
nv_ingest_api
|
|
150
|
-
nv_ingest_api-2025.5.
|
|
151
|
-
nv_ingest_api-2025.5.
|
|
152
|
-
nv_ingest_api-2025.5.
|
|
148
|
+
nv_ingest_api/util/system/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
149
|
+
nv_ingest_api/util/system/hardware_info.py,sha256=JGxBbF3kvgYbwhhWvtjNzPxVZQV_npmsordAioBrglo,19252
|
|
150
|
+
nv_ingest_api-2025.5.14.dev20250514.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
151
|
+
nv_ingest_api-2025.5.14.dev20250514.dist-info/METADATA,sha256=ovvmVcwxqjyt5DQyPur4gOwFTmMRNiB-0S0lVN9v9OU,13889
|
|
152
|
+
nv_ingest_api-2025.5.14.dev20250514.dist-info/WHEEL,sha256=QZxptf4Y1BKFRCEDxD4h2V0mBFQOVFLFEpvxHmIs52A,91
|
|
153
|
+
nv_ingest_api-2025.5.14.dev20250514.dist-info/top_level.txt,sha256=abjYMlTJGoG5tOdfIB-IWvLyKclw6HLaRSc8MxX4X6I,14
|
|
154
|
+
nv_ingest_api-2025.5.14.dev20250514.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|