gpustack-runtime 0.1.41.post3__py3-none-any.whl → 0.1.42.post1__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 (41) hide show
  1. gpustack_runtime/_version.py +2 -2
  2. gpustack_runtime/_version_appendix.py +1 -1
  3. gpustack_runtime/cmds/detector.py +4 -2
  4. gpustack_runtime/deployer/__types__.py +314 -233
  5. gpustack_runtime/deployer/cdi/__init__.py +1 -1
  6. gpustack_runtime/deployer/cdi/__types__.py +2 -2
  7. gpustack_runtime/deployer/cdi/__utils__.py +4 -1
  8. gpustack_runtime/deployer/cdi/amd.py +6 -8
  9. gpustack_runtime/deployer/cdi/ascend.py +7 -9
  10. gpustack_runtime/deployer/cdi/hygon.py +6 -8
  11. gpustack_runtime/deployer/cdi/iluvatar.py +6 -8
  12. gpustack_runtime/deployer/cdi/metax.py +6 -8
  13. gpustack_runtime/deployer/cdi/thead.py +6 -8
  14. gpustack_runtime/deployer/docker.py +133 -146
  15. gpustack_runtime/deployer/k8s/deviceplugin/__init__.py +13 -8
  16. gpustack_runtime/deployer/k8s/deviceplugin/plugin.py +26 -21
  17. gpustack_runtime/deployer/kuberentes.py +89 -108
  18. gpustack_runtime/deployer/podman.py +113 -120
  19. gpustack_runtime/detector/__init__.py +2 -0
  20. gpustack_runtime/detector/__types__.py +26 -0
  21. gpustack_runtime/detector/__utils__.py +3 -0
  22. gpustack_runtime/detector/amd.py +32 -10
  23. gpustack_runtime/detector/ascend.py +67 -13
  24. gpustack_runtime/detector/cambricon.py +3 -0
  25. gpustack_runtime/detector/hygon.py +22 -3
  26. gpustack_runtime/detector/iluvatar.py +15 -7
  27. gpustack_runtime/detector/metax.py +16 -6
  28. gpustack_runtime/detector/mthreads.py +22 -8
  29. gpustack_runtime/detector/nvidia.py +148 -140
  30. gpustack_runtime/detector/pyacl/__init__.py +34 -14
  31. gpustack_runtime/detector/pydcmi/__init__.py +4 -2
  32. gpustack_runtime/detector/pyixml/__init__.py +16 -0
  33. gpustack_runtime/detector/pyrocmsmi/__init__.py +14 -0
  34. gpustack_runtime/detector/thead.py +145 -134
  35. gpustack_runtime/envs.py +7 -6
  36. {gpustack_runtime-0.1.41.post3.dist-info → gpustack_runtime-0.1.42.post1.dist-info}/METADATA +2 -2
  37. gpustack_runtime-0.1.42.post1.dist-info/RECORD +67 -0
  38. gpustack_runtime-0.1.41.post3.dist-info/RECORD +0 -67
  39. {gpustack_runtime-0.1.41.post3.dist-info → gpustack_runtime-0.1.42.post1.dist-info}/WHEEL +0 -0
  40. {gpustack_runtime-0.1.41.post3.dist-info → gpustack_runtime-0.1.42.post1.dist-info}/entry_points.txt +0 -0
  41. {gpustack_runtime-0.1.41.post3.dist-info → gpustack_runtime-0.1.42.post1.dist-info}/licenses/LICENSE +0 -0
@@ -12,6 +12,7 @@ from . import pyhgml
12
12
  from .__types__ import (
13
13
  Detector,
14
14
  Device,
15
+ DeviceMemoryStatusEnum,
15
16
  Devices,
16
17
  ManufacturerEnum,
17
18
  Topology,
@@ -49,7 +50,7 @@ class THeadDetector(Detector):
49
50
 
50
51
  """
51
52
  supported = False
52
- if envs.GPUSTACK_RUNTIME_DETECT.lower() not in ("auto", "iluvatar"):
53
+ if envs.GPUSTACK_RUNTIME_DETECT.lower() not in ("auto", "thead"):
53
54
  logger.debug("T-Head detection is disabled by environment variable")
54
55
  return supported
55
56
 
@@ -131,24 +132,41 @@ class THeadDetector(Detector):
131
132
 
132
133
  dev_numa = get_numa_node_by_bdf(dev_bdf)
133
134
  if not dev_numa:
134
- dev_node_affinity = pyhgml.hgmlDeviceGetMemoryAffinity(
135
+ with contextlib.suppress(pyhgml.HGMLError):
136
+ dev_node_affinity = pyhgml.hgmlDeviceGetMemoryAffinity(
137
+ dev,
138
+ get_numa_nodeset_size(),
139
+ pyhgml.HGML_AFFINITY_SCOPE_NODE,
140
+ )
141
+ dev_numa = bitmask_to_str(list(dev_node_affinity))
142
+
143
+ dev_temp = None
144
+ with contextlib.suppress(pyhgml.HGMLError):
145
+ dev_temp = pyhgml.hgmlDeviceGetTemperature(
135
146
  dev,
136
- get_numa_nodeset_size(),
137
- pyhgml.HGML_AFFINITY_SCOPE_NODE,
147
+ pyhgml.HGML_TEMPERATURE_GPU,
138
148
  )
139
- dev_numa = bitmask_to_str(list(dev_node_affinity))
149
+
150
+ dev_power = None
151
+ dev_power_used = None
152
+ with contextlib.suppress(pyhgml.HGMLError):
153
+ dev_power = pyhgml.hgmlDeviceGetPowerManagementDefaultLimit(dev)
154
+ dev_power = dev_power // 1000 # mW to W
155
+ dev_power_used = (
156
+ pyhgml.hgmlDeviceGetPowerUsage(dev) // 1000
157
+ ) # mW to W
140
158
 
141
159
  dev_mig_mode = pyhgml.HGML_DEVICE_MIG_DISABLE
142
160
  with contextlib.suppress(pyhgml.HGMLError):
143
161
  dev_mig_mode, _ = pyhgml.hgmlDeviceGetMigMode(dev)
144
162
 
163
+ dev_index = dev_idx
164
+ if envs.GPUSTACK_RUNTIME_DETECT_PHYSICAL_INDEX_PRIORITY:
165
+ dev_index = pyhgml.hgmlDeviceGetMinorNumber(dev)
166
+
145
167
  # With MIG disabled, treat as a single device.
146
168
 
147
169
  if dev_mig_mode == pyhgml.HGML_DEVICE_MIG_DISABLE:
148
- dev_index = dev_idx
149
- if envs.GPUSTACK_RUNTIME_DETECT_PHYSICAL_INDEX_PRIORITY:
150
- dev_index = pyhgml.hgmlDeviceGetMinorNumber(dev)
151
-
152
170
  dev_name = pyhgml.hgmlDeviceGetName(dev)
153
171
 
154
172
  dev_uuid = pyhgml.hgmlDeviceGetUUID(dev)
@@ -171,6 +189,7 @@ class THeadDetector(Detector):
171
189
 
172
190
  dev_mem = 0
173
191
  dev_mem_used = 0
192
+ dev_mem_status = DeviceMemoryStatusEnum.HEALTHY
174
193
  with contextlib.suppress(pyhgml.HGMLError):
175
194
  dev_mem_info = pyhgml.hgmlDeviceGetMemoryInfo(dev)
176
195
  dev_mem = byte_to_mebibyte( # byte to MiB
@@ -179,22 +198,14 @@ class THeadDetector(Detector):
179
198
  dev_mem_used = byte_to_mebibyte( # byte to MiB
180
199
  dev_mem_info.used,
181
200
  )
182
-
183
- dev_temp = None
184
- with contextlib.suppress(pyhgml.HGMLError):
185
- dev_temp = pyhgml.hgmlDeviceGetTemperature(
201
+ dev_mem_ecc_errors = pyhgml.hgmlDeviceGetMemoryErrorCounter(
186
202
  dev,
187
- pyhgml.HGML_TEMPERATURE_GPU,
203
+ pyhgml.HGML_MEMORY_ERROR_TYPE_UNCORRECTED,
204
+ pyhgml.HGML_VOLATILE_ECC,
205
+ pyhgml.HGML_MEMORY_LOCATION_DRAM,
188
206
  )
189
-
190
- dev_power = None
191
- dev_power_used = None
192
- with contextlib.suppress(pyhgml.HGMLError):
193
- dev_power = pyhgml.hgmlDeviceGetPowerManagementDefaultLimit(dev)
194
- dev_power = dev_power // 1000 # mW to W
195
- dev_power_used = (
196
- pyhgml.hgmlDeviceGetPowerUsage(dev) // 1000
197
- ) # mW to W
207
+ if dev_mem_ecc_errors > 0:
208
+ dev_mem_status = DeviceMemoryStatusEnum.UNHEALTHY
198
209
 
199
210
  dev_is_vgpu = False
200
211
  if dev_bdf:
@@ -203,8 +214,9 @@ class THeadDetector(Detector):
203
214
  dev_appendix = {
204
215
  "vgpu": dev_is_vgpu,
205
216
  "bdf": dev_bdf,
206
- "numa": dev_numa,
207
217
  }
218
+ if dev_numa:
219
+ dev_appendix["numa"] = dev_numa
208
220
 
209
221
  ret.append(
210
222
  Device(
@@ -221,6 +233,7 @@ class THeadDetector(Detector):
221
233
  memory=dev_mem,
222
234
  memory_used=dev_mem_used,
223
235
  memory_utilization=get_utilization(dev_mem_used, dev_mem),
236
+ memory_status=dev_mem_status,
224
237
  temperature=dev_temp,
225
238
  power=dev_power,
226
239
  power_used=dev_power_used,
@@ -236,41 +249,41 @@ class THeadDetector(Detector):
236
249
  mdev_cores = None
237
250
  mdev_count = pyhgml.hgmlDeviceGetMaxMigDeviceCount(dev)
238
251
  for mdev_idx in range(mdev_count):
239
- mdev = pyhgml.hgmlDeviceGetMigDeviceHandleByIndex(dev, mdev_idx)
252
+ mdev = None
253
+ with contextlib.suppress(pyhgml.HGMLError):
254
+ mdev = pyhgml.hgmlDeviceGetMigDeviceHandleByIndex(dev, mdev_idx)
255
+ if not mdev:
256
+ continue
240
257
 
241
- mdev_index = mdev_idx
258
+ mdev_index = mdev_idx + dev_count * (dev_idx + 1)
242
259
  mdev_uuid = pyhgml.hgmlDeviceGetUUID(mdev)
243
260
 
244
- mdev_mem, mdev_mem_used = 0, 0
261
+ mdev_mem = 0
262
+ mdev_mem_used = 0
263
+ mdev_mem_status = DeviceMemoryStatusEnum.HEALTHY
245
264
  with contextlib.suppress(pyhgml.HGMLError):
246
265
  mdev_mem_info = pyhgml.hgmlDeviceGetMemoryInfo(mdev)
247
- byte_to_mebibyte( # byte to MiB
266
+ mdev_mem = byte_to_mebibyte( # byte to MiB
248
267
  mdev_mem_info.total,
249
268
  )
250
- byte_to_mebibyte( # byte to MiB
269
+ mdev_mem_used = byte_to_mebibyte( # byte to MiB
251
270
  mdev_mem_info.used,
252
271
  )
253
-
254
- mdev_temp = pyhgml.hgmlDeviceGetTemperature(
255
- mdev,
256
- pyhgml.HGML_TEMPERATURE_GPU,
257
- )
258
-
259
- mdev_power = None
260
- with contextlib.suppress(pyhgml.HGMLError):
261
- mdev_power = pyhgml.hgmlDeviceGetPowerManagementDefaultLimit(
272
+ mdev_mem_ecc_errors = pyhgml.hgmlDeviceGetMemoryErrorCounter(
262
273
  mdev,
274
+ pyhgml.HGML_MEMORY_ERROR_TYPE_UNCORRECTED,
275
+ pyhgml.HGML_AGGREGATE_ECC,
276
+ pyhgml.HGML_MEMORY_LOCATION_SRAM,
263
277
  )
264
- mdev_power = mdev_power // 1000 # mW to W
265
- mdev_power_used = (
266
- pyhgml.hgmlDeviceGetPowerUsage(mdev) // 1000
267
- ) # mW to W
278
+ if mdev_mem_ecc_errors > 0:
279
+ mdev_mem_status = DeviceMemoryStatusEnum.UNHEALTHY
268
280
 
269
281
  mdev_appendix = {
270
282
  "vgpu": True,
271
283
  "bdf": dev_bdf,
272
- "numa": dev_numa,
273
284
  }
285
+ if dev_numa:
286
+ mdev_appendix["numa"] = dev_numa
274
287
 
275
288
  mdev_gi_id = pyhgml.hgmlDeviceGetGpuInstanceId(mdev)
276
289
  mdev_appendix["gpu_instance_id"] = mdev_gi_id
@@ -279,63 +292,64 @@ class THeadDetector(Detector):
279
292
 
280
293
  mdev_cores_util = _get_sm_util_from_gpm_metrics(dev, mdev_gi_id)
281
294
 
282
- if not mdev_name:
283
- mdev_gi = pyhgml.hgmlDeviceGetGpuInstanceById(dev, mdev_gi_id)
284
- mdev_ci = pyhgml.hgmlGpuInstanceGetComputeInstanceById(
285
- mdev_gi,
286
- mdev_ci_id,
287
- )
288
- mdev_gi_info = pyhgml.hgmlGpuInstanceGetInfo(mdev_gi)
289
- mdev_ci_info = pyhgml.hgmlComputeInstanceGetInfo(mdev_ci)
290
- for dev_gi_prf_id in range(
291
- pyhgml.HGML_GPU_INSTANCE_PROFILE_COUNT,
292
- ):
293
- try:
294
- dev_gi_prf = pyhgml.hgmlDeviceGetGpuInstanceProfileInfo(
295
- dev,
296
- dev_gi_prf_id,
297
- )
298
- if dev_gi_prf.id != mdev_gi_info.profileId:
299
- continue
300
- except pyhgml.HGMLError:
295
+ mdev_gi = pyhgml.hgmlDeviceGetGpuInstanceById(dev, mdev_gi_id)
296
+ mdev_ci = pyhgml.hgmlGpuInstanceGetComputeInstanceById(
297
+ mdev_gi,
298
+ mdev_ci_id,
299
+ )
300
+ mdev_gi_info = pyhgml.hgmlGpuInstanceGetInfo(mdev_gi)
301
+ mdev_ci_info = pyhgml.hgmlComputeInstanceGetInfo(mdev_ci)
302
+ for dev_gi_prf_id in range(
303
+ pyhgml.HGML_GPU_INSTANCE_PROFILE_COUNT,
304
+ ):
305
+ try:
306
+ dev_gi_prf = pyhgml.hgmlDeviceGetGpuInstanceProfileInfo(
307
+ dev,
308
+ dev_gi_prf_id,
309
+ )
310
+ if dev_gi_prf.id != mdev_gi_info.profileId:
301
311
  continue
312
+ except pyhgml.HGMLError:
313
+ continue
302
314
 
303
- for dev_ci_prf_id in range(
304
- pyhgml.HGML_COMPUTE_INSTANCE_PROFILE_COUNT,
315
+ for dev_ci_prf_id in range(
316
+ pyhgml.HGML_COMPUTE_INSTANCE_PROFILE_COUNT,
317
+ ):
318
+ for dev_cig_prf_id in range(
319
+ pyhgml.HGML_COMPUTE_INSTANCE_ENGINE_PROFILE_COUNT,
305
320
  ):
306
- for dev_cig_prf_id in range(
307
- pyhgml.HGML_COMPUTE_INSTANCE_ENGINE_PROFILE_COUNT,
308
- ):
309
- try:
310
- mdev_ci_prf = pyhgml.hgmlGpuInstanceGetComputeInstanceProfileInfo(
311
- mdev_gi,
312
- dev_ci_prf_id,
313
- dev_cig_prf_id,
314
- )
315
- if mdev_ci_prf.id != mdev_ci_info.profileId:
316
- continue
317
- except pyhgml.HGMLError:
318
- continue
319
-
320
- ci_slice = _get_compute_instance_slice(
321
+ try:
322
+ mdev_ci_prf = pyhgml.hgmlGpuInstanceGetComputeInstanceProfileInfo(
323
+ mdev_gi,
321
324
  dev_ci_prf_id,
325
+ dev_cig_prf_id,
322
326
  )
323
- gi_slice = _get_gpu_instance_slice(dev_gi_prf_id)
324
- gi_mem = _get_gpu_instance_memory(
325
- dev_mem_info,
326
- dev_gi_prf,
327
- )
327
+ if mdev_ci_prf.id != mdev_ci_info.profileId:
328
+ continue
329
+ except pyhgml.HGMLError:
330
+ continue
328
331
 
329
- if ci_slice == gi_slice:
330
- mdev_name = f"{gi_slice}g.{gi_mem}gb"
332
+ ci_slice = _get_compute_instance_slice(dev_ci_prf_id)
333
+ gi_slice = _get_gpu_instance_slice(dev_gi_prf_id)
334
+ if ci_slice == gi_slice:
335
+ if hasattr(dev_gi_prf, "name"):
336
+ mdev_name = dev_gi_prf.name
331
337
  else:
332
- mdev_name = (
333
- f"{ci_slice}u.{gi_slice}g.{gi_mem}gb"
338
+ gi_mem = round(
339
+ math.ceil(dev_gi_prf.memorySizeMB >> 10),
334
340
  )
341
+ mdev_name = f"{gi_slice}g.{gi_mem}gb"
342
+ elif hasattr(mdev_ci_prf, "name"):
343
+ mdev_name = mdev_ci_prf.name
344
+ else:
345
+ gi_mem = round(
346
+ math.ceil(dev_gi_prf.memorySizeMB >> 10),
347
+ )
348
+ mdev_name = f"{ci_slice}u.{gi_slice}g.{gi_mem}gb"
335
349
 
336
- mdev_cores = mdev_ci_prf.multiprocessorCount
350
+ mdev_cores = mdev_ci_prf.multiprocessorCount
337
351
 
338
- break
352
+ break
339
353
 
340
354
  ret.append(
341
355
  Device(
@@ -352,9 +366,10 @@ class THeadDetector(Detector):
352
366
  memory=mdev_mem,
353
367
  memory_used=mdev_mem_used,
354
368
  memory_utilization=get_utilization(mdev_mem_used, mdev_mem),
355
- temperature=mdev_temp,
356
- power=mdev_power,
357
- power_used=mdev_power_used,
369
+ memory_status=mdev_mem_status,
370
+ temperature=dev_temp,
371
+ power=dev_power,
372
+ power_used=dev_power_used,
358
373
  appendix=mdev_appendix,
359
374
  ),
360
375
  )
@@ -392,11 +407,17 @@ class THeadDetector(Detector):
392
407
  devices_count=len(devices),
393
408
  )
394
409
 
410
+ get_links_cache = {}
411
+
395
412
  try:
396
413
  pyhgml.hgmlInit()
397
414
 
398
415
  for i, dev_i in enumerate(devices):
399
- dev_i_handle = pyhgml.hgmlDeviceGetHandleByUUID(dev_i.uuid)
416
+ dev_i_bdf = dev_i.appendix.get("bdf")
417
+ if dev_i.appendix.get("vgpu", False):
418
+ dev_i_handle = pyhgml.hgmlDeviceGetHandleByPciBusId(dev_i_bdf)
419
+ else:
420
+ dev_i_handle = pyhgml.hgmlDeviceGetHandleByUUID(dev_i.uuid)
400
421
 
401
422
  # Get NUMA and CPU affinities.
402
423
  ret.devices_numa_affinities[i] = dev_i.appendix.get("numa", "")
@@ -405,7 +426,12 @@ class THeadDetector(Detector):
405
426
  )
406
427
 
407
428
  # Get links state if applicable.
408
- if dev_i_links_state := _get_links_state(dev_i_handle):
429
+ if dev_i_bdf in get_links_cache:
430
+ dev_i_links_state = get_links_cache[dev_i_bdf]
431
+ else:
432
+ dev_i_links_state = _get_links_state(dev_i_handle)
433
+ get_links_cache[dev_i_bdf] = dev_i_links_state
434
+ if dev_i_links_state:
409
435
  ret.appendices[i].update(dev_i_links_state)
410
436
  # In practice, if a card has an active *Link,
411
437
  # then other cards in the same machine should be interconnected with it through the *Link.
@@ -422,21 +448,30 @@ class THeadDetector(Detector):
422
448
  if dev_i.index == dev_j.index or ret.devices_distances[i][j] != 0:
423
449
  continue
424
450
 
425
- dev_j_handle = pyhgml.hgmlDeviceGetHandleByUUID(dev_j.uuid)
426
-
427
- distance = TopologyDistanceEnum.UNK
428
- try:
429
- distance = pyhgml.hgmlDeviceGetTopologyCommonAncestor(
430
- dev_i_handle,
431
- dev_j_handle,
432
- )
433
- except pyhgml.HGMLError:
434
- debug_log_exception(
435
- logger,
436
- "Failed to get distance between device %d and %d",
437
- dev_i.index,
438
- dev_j.index,
439
- )
451
+ dev_j_bdf = dev_j.appendix.get("bdf")
452
+ if dev_i_bdf == dev_j_bdf:
453
+ distance = TopologyDistanceEnum.SELF
454
+ else:
455
+ if dev_j.appendix.get("vgpu", False):
456
+ dev_j_handle = pyhgml.hgmlDeviceGetHandleByPciBusId(
457
+ dev_j_bdf,
458
+ )
459
+ else:
460
+ dev_j_handle = pyhgml.hgmlDeviceGetHandleByUUID(dev_j.uuid)
461
+
462
+ distance = TopologyDistanceEnum.UNK
463
+ try:
464
+ distance = pyhgml.hgmlDeviceGetTopologyCommonAncestor(
465
+ dev_i_handle,
466
+ dev_j_handle,
467
+ )
468
+ except pyhgml.HGMLError:
469
+ debug_log_exception(
470
+ logger,
471
+ "Failed to get distance between device %d and %d",
472
+ dev_i.index,
473
+ dev_j.index,
474
+ )
440
475
 
441
476
  ret.devices_distances[i][j] = distance
442
477
  ret.devices_distances[j][i] = distance
@@ -655,30 +690,6 @@ def _get_gpu_instance_slice(dev_gi_prf_id: int) -> int:
655
690
  raise AttributeError(msg)
656
691
 
657
692
 
658
- def _get_gpu_instance_memory(dev_mem, dev_gi_prf) -> int:
659
- """
660
- Compute the memory size of a MIG compute instance in GiB.
661
-
662
- Args:
663
- dev_mem:
664
- The total memory info of the parent GPU device.
665
- dev_gi_prf:
666
- The profile info of the GPU instance.
667
-
668
- Returns:
669
- The memory size in GiB.
670
-
671
- """
672
- mem = dev_gi_prf.memorySizeMB * (1 << 20) # MiB to byte
673
-
674
- gib = round(
675
- math.ceil(mem / dev_mem.total * 8)
676
- / 8
677
- * ((dev_mem.total + (1 << 30) - 1) / (1 << 30)),
678
- )
679
- return gib
680
-
681
-
682
693
  def _get_compute_instance_slice(dev_ci_prf_id: int) -> int:
683
694
  """
684
695
  Get the number of slice for a given Compute Instance Profile ID.
gpustack_runtime/envs.py CHANGED
@@ -246,7 +246,7 @@ if TYPE_CHECKING:
246
246
  GPUSTACK_RUNTIME_DOCKER_CDI_SPECS_GENERATE: bool = True
247
247
  """
248
248
  Generate CDI specifications during deployment when using CDI resource injection policy,
249
- requires `GPUSTACK_RUNTIME_DEPLOY_CDI_SPECS_DIRECTORY` to be existed.
249
+ requires `GPUSTACK_RUNTIME_DEPLOY_CDI_SPECS_DIRECTORY` to exist.
250
250
  Works only when `GPUSTACK_RUNTIME_DOCKER_RESOURCE_INJECTION_POLICY` is set to `CDI`.
251
251
  Using internal knowledge to generate the CDI specifications for deployer,
252
252
  if the output file conflicts with other tools generating CDI specifications(e.g., NVIDIA Container Toolkit),
@@ -283,7 +283,7 @@ if TYPE_CHECKING:
283
283
  Resource injection policy for the Kubernetes deployer (e.g., Auto, Env, KDP).
284
284
  `Auto`: Automatically choose the resource injection policy based on the environment.
285
285
  `Env`: Injects resources using standard environment variable, depends on underlying Container Toolkit, based on `GPUSTACK_RUNTIME_DEPLOY_RESOURCE_KEY_MAP_RUNTIME_VISIBLE_DEVICES`.
286
- `KDP`: Injects resources using Kubernetes Device Plugin, based on `GPUSTACK_RUNTIME_DEPLOY_RESOURCE_KEY_MAP_CDI`.
286
+ `KDP`: Injects resources using Kubernetes Device Plugin.
287
287
  """
288
288
  GPUSTACK_RUNTIME_KUBERNETES_KDP_PER_DEVICE_MAX_ALLOCATIONS: int | None = None
289
289
  """
@@ -294,14 +294,14 @@ if TYPE_CHECKING:
294
294
  """
295
295
  Device allocation policy for the Kubernetes Device Plugin (e.g., CDI, Env, Opaque).
296
296
  `Auto`: Automatically choose the device allocation policy based on the environment.
297
- `Env`: Allocates devices using runtime-visible environment variables; requires Container Toolkit support.
298
- `CDI`: Allocates devices using generated CDI specifications, making it easy to debug and troubleshoot; requires `GPUSTACK_RUNTIME_DEPLOY_CDI_SPECS_DIRECTORY` to exist.
297
+ `Env`: Allocates devices using runtime-visible environment variables, based on `GPUSTACK_RUNTIME_DEPLOY_RESOURCE_KEY_MAP_RUNTIME_VISIBLE_DEVICES`; requires Container Toolkit support.
298
+ `CDI`: Allocates devices using generated CDI specifications, based on `GPUSTACK_RUNTIME_DEPLOY_RESOURCE_KEY_MAP_CDI`, making it easy to debug and troubleshoot; requires `GPUSTACK_RUNTIME_DEPLOY_CDI_SPECS_DIRECTORY` to exist.
299
299
  `Opaque`: Uses internal logic for allocation, which is convenient for deployment but difficult to troubleshoot.
300
300
  """
301
301
  GPUSTACK_RUNTIME_KUBERNETES_KDP_CDI_SPECS_GENERATE: bool = True
302
302
  """
303
303
  Generate CDI specifications during deployment,
304
- requires `GPUSTACK_RUNTIME_DEPLOY_CDI_SPECS_DIRECTORY` to be existed.
304
+ requires `GPUSTACK_RUNTIME_DEPLOY_CDI_SPECS_DIRECTORY` to exist.
305
305
  Works only when `GPUSTACK_RUNTIME_KUBERNETES_KDP_DEVICE_ALLOCATION_POLICY` is set to `CDI`.
306
306
  Using internal knowledge to generate the CDI specifications for deployer,
307
307
  if the output file conflicts with other tools generating CDI specifications(e.g., NVIDIA Container Toolkit),
@@ -344,7 +344,7 @@ if TYPE_CHECKING:
344
344
  GPUSTACK_RUNTIME_PODMAN_CDI_SPECS_GENERATE: bool = True
345
345
  """
346
346
  Generate CDI specifications during deployment,
347
- requires `GPUSTACK_RUNTIME_DEPLOY_CDI_SPECS_DIRECTORY` to be existed.
347
+ requires `GPUSTACK_RUNTIME_DEPLOY_CDI_SPECS_DIRECTORY` to exist.
348
348
  Using internal knowledge to generate the CDI specifications for deployer,
349
349
  if the output file conflicts with other tools generating CDI specifications(e.g., NVIDIA Container Toolkit),
350
350
  please disable this and remove the output file manually.
@@ -577,6 +577,7 @@ variables: dict[str, Callable[[], Any]] = {
577
577
  "GPUSTACK_RUNTIME_DEPLOY_RUNTIME_VISIBLE_DEVICES_VALUE_UUID": lambda: to_set(
578
578
  getenv(
579
579
  "GPUSTACK_RUNTIME_DEPLOY_RUNTIME_VISIBLE_DEVICES_VALUE_UUID",
580
+ "NVIDIA_VISIBLE_DEVICES",
580
581
  ),
581
582
  sep=",",
582
583
  ),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gpustack-runtime
3
- Version: 0.1.41.post3
3
+ Version: 0.1.42.post1
4
4
  Summary: GPUStack Runtime is library for detecting GPU resources and launching GPU workloads.
5
5
  Project-URL: Homepage, https://github.com/gpustack/runtime
6
6
  Project-URL: Bug Tracker, https://github.com/gpustack/gpustack/issues
@@ -16,7 +16,7 @@ Requires-Python: >=3.10
16
16
  Requires-Dist: argcomplete>=3.6.3
17
17
  Requires-Dist: cachetools>=5.5.2
18
18
  Requires-Dist: docker>=7.1.0
19
- Requires-Dist: gpustack-runner>=0.1.24.post1
19
+ Requires-Dist: gpustack-runner>=0.1.24.post4
20
20
  Requires-Dist: grpc-interceptor>=0.15.4
21
21
  Requires-Dist: grpcio>=1.76.0
22
22
  Requires-Dist: kubernetes>=33.1.0
@@ -0,0 +1,67 @@
1
+ gpustack_runtime/__init__.py,sha256=Xw_PVWneitx-8QmW6sJQeymj6zVbEgEndGhIB_km6TI,186
2
+ gpustack_runtime/__main__.py,sha256=O9yJKcN7vg0Ppgc13qesxHwST2wkH3ccOkTQXPWHnNA,3939
3
+ gpustack_runtime/_version.py,sha256=-eNQZIno4AwtazIKHw4i1RxKHZxM9dKoQseocEVcMq0,792
4
+ gpustack_runtime/_version.pyi,sha256=A42NoSgcqEXVy2OeNm4LXC9CbyonbooYrSUBlPm2lGY,156
5
+ gpustack_runtime/envs.py,sha256=gkr30NnIq3USzSYvbW6ipf8tKdbXx-BrDcY3-4Oc-Hg,38894
6
+ gpustack_runtime/logging.py,sha256=wMPriPpOuVsuClsjMh0qwEPQKyJiJa89ggdDjqkk7i0,6934
7
+ gpustack_runtime/cmds/__init__.py,sha256=-_X2O2lBn6KcdLGUzhL3lEjQC4_cwA36fvWDnFAgtVM,1382
8
+ gpustack_runtime/cmds/__types__.py,sha256=TBnUWUqzTkDtJnsMv363kdw-H8fOf-XQYbOvrmQif-M,815
9
+ gpustack_runtime/cmds/deployer.py,sha256=KvhPhU6ZW-UV6vLykI5adKI1ThgVFFJqWaII3n4OhL8,32846
10
+ gpustack_runtime/cmds/detector.py,sha256=dFIo1d8dBh8v7JhisXAx-EqqOSLobcuwsJcO-obUh9c,8905
11
+ gpustack_runtime/cmds/images.py,sha256=7tb-D3G4yqLPkbS9aSuWI1bD3DYK8BLbPbgqac56blI,594
12
+ gpustack_runtime/deployer/__init__.py,sha256=impMrmvkMjuCBthsn3QUz3LuwpmmNAymHJKJ2o6SZoc,16249
13
+ gpustack_runtime/deployer/__patches__.py,sha256=cTBge8BT6IsY5MzETKY3kN28k3igYfNj7pcpgDzfDzw,17849
14
+ gpustack_runtime/deployer/__types__.py,sha256=J2YX8X7EYY_56_L9WL5YMmdsyJ572uOIhMoHCVjPaog,72469
15
+ gpustack_runtime/deployer/__utils__.py,sha256=paQu2M1UeoSfQPsiskmAqJSiln-8qwibTssEoWFMLec,21109
16
+ gpustack_runtime/deployer/docker.py,sha256=o8Fyc25kLYBOOqN2rDctmxrkQ67oaA8J3lXSRuDAN08,83107
17
+ gpustack_runtime/deployer/kuberentes.py,sha256=-G7eYuqTDDi3T9u2Jqr6j0Ut-8vkP5u2lxzSyDx0EWM,86776
18
+ gpustack_runtime/deployer/podman.py,sha256=Tvv6RbQ8aWY6Axz9iLvNwSiYxaxtd6q6g1TVl0e1VzY,80749
19
+ gpustack_runtime/deployer/cdi/__init__.py,sha256=V8ycQ9PrUiaozZcoxYOiEEQkGOSvYCaCV8kkVlbEQ_w,3991
20
+ gpustack_runtime/deployer/cdi/__types__.py,sha256=K5uDOmwYsLCz8j8diymN3loqYqPkbxN3F0SVP_iqahI,18387
21
+ gpustack_runtime/deployer/cdi/__utils__.py,sha256=CAYUv76akZiHJYZO_VY0NXKhEI2jrP7G3OgvQa8Pg4U,4050
22
+ gpustack_runtime/deployer/cdi/amd.py,sha256=6VgVlj-nA_124l1M8HHeXU3I6QU4BMhidLEuTrQ96o8,4029
23
+ gpustack_runtime/deployer/cdi/ascend.py,sha256=wyL9KOCIxTqs9NjMTLJ8db8btYqtGC4WD1qUy_T_BEE,4481
24
+ gpustack_runtime/deployer/cdi/hygon.py,sha256=E-jE3N_OMKWAWJxOIyqXCt-utGzVATytbCKPqCYtLiA,4064
25
+ gpustack_runtime/deployer/cdi/iluvatar.py,sha256=-LZ7LiKs0AjCaOX_9FNFIYi2lUO_xVhxR7C4e5XYvow,3597
26
+ gpustack_runtime/deployer/cdi/metax.py,sha256=tawLt1cWtsHLM5LXXtQEVBBWEyqBrnRvkPe54Usf1I0,4090
27
+ gpustack_runtime/deployer/cdi/thead.py,sha256=bEIpMVwhwcL_AX6CRwyrsLnpKJT46v-gjocR8gKukh8,3618
28
+ gpustack_runtime/deployer/k8s/deviceplugin/__init__.py,sha256=cZ8jbeaGZPmyNCzDlQauIRndvKuodDl3-oHEcn4IfWU,11156
29
+ gpustack_runtime/deployer/k8s/deviceplugin/__types__.py,sha256=LCkgPDZ64Mra7bo5jmtsAO2Ypbc4qK99lMl6R_nQhnY,3043
30
+ gpustack_runtime/deployer/k8s/deviceplugin/plugin.py,sha256=E4gNvsi2aPAeVM5vWlXpvO4ecmQu951pPzzxPaIaAv8,17829
31
+ gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/__init__.py,sha256=3rOYmgDIIJ4idEtwgnumGStH7PaK-J7EYrOnLa9A-8o,118
32
+ gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/api.proto,sha256=rmB8RDe4LN5FCVkQ608uS-pl32mk5tt6iGe-g2lKtPs,7919
33
+ gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/api_pb2.py,sha256=dNkzjTE-2y25q8NF0QRznNJ5r1-5ZxxJS598MHbjx98,45998
34
+ gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/api_pb2.pyi,sha256=lq1dbSgBYqJ7zyGfoKKHCyfr6R5vcCGzJxteeyQpbuI,8232
35
+ gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/api_pb2_grpc.py,sha256=GM6EyCEFeyOjL0XOCisbcHurRoLKqKDUI5obsUyTxpE,17446
36
+ gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/constants.py,sha256=tpNk3e_cvY67C9RwVsdTNl75YuNXBgsn53fSJIzeTR4,828
37
+ gpustack_runtime/detector/__init__.py,sha256=2GaczS5lWLuPsighvq7oPhlPFQSUJfBKLAliXPfl4i0,8162
38
+ gpustack_runtime/detector/__types__.py,sha256=ZiKuYZb0jeXqzyTCUWTDppoHnRmkaZuljAWbnR_ohX8,13626
39
+ gpustack_runtime/detector/__utils__.py,sha256=9ZkfDn1HHKao03xJHRD9TJ4JTkPhnLq7cFjbUk0UxMk,25194
40
+ gpustack_runtime/detector/amd.py,sha256=1zeF0PeXzmDQJA6JYvT1hQcjMN1cs36w8haHpzpp4NM,18413
41
+ gpustack_runtime/detector/ascend.py,sha256=4J7WvUX2cCPpGu0p9rRKEhV71zIMM7M3PPw2dgUauvE,19984
42
+ gpustack_runtime/detector/cambricon.py,sha256=5AXILG9NAMYiWjaLRZ5h8lXtFk7FLC7LB_aFQz0ZtYU,4102
43
+ gpustack_runtime/detector/hygon.py,sha256=ck7EaSUj1-gTYx1ZgdwbtHsneoCakDhZbQhFYFWd2ik,12967
44
+ gpustack_runtime/detector/iluvatar.py,sha256=YK-O53B_H16BLalbTwVqJWVi9WTCdCRM_GX7d7FmBO0,10682
45
+ gpustack_runtime/detector/metax.py,sha256=JZ9Z9vZ_iFrFOtoM626G0iPviqaTDJzBkh353RJfTMM,10930
46
+ gpustack_runtime/detector/mthreads.py,sha256=LL7iYbV5ov2edLmkZ5NvPt6rzHh7f3H6RWvjJgOXKZc,12880
47
+ gpustack_runtime/detector/nvidia.py,sha256=Xhp13TmhUneBpRFDFnWY9OHva4xlfGAEOGSLlpc56VE,34718
48
+ gpustack_runtime/detector/thead.py,sha256=NEifNMTnj37CB1bHviyE8F9ZGYKpfQtm7TsxnzlkLnU,26998
49
+ gpustack_runtime/detector/pyacl/__init__.py,sha256=sJc6K1NObJKUPQrAYQtcVhEMsN2kskIyNH1CncooTNw,16873
50
+ gpustack_runtime/detector/pyamdgpu/__init__.py,sha256=x-UO07EpKEgfTLmXQOD6j9f6kibuvDC7riQFof3YGdw,8617
51
+ gpustack_runtime/detector/pyamdsmi/__init__.py,sha256=800-khq2w6HLgXM12RkhcdvXBGeAJ4s1_TWJyHebCMk,955
52
+ gpustack_runtime/detector/pycuda/__init__.py,sha256=p-Na5eBjdsFGXPHCEEUfFj5TQFjPxPQGV0i4oU6ywBA,16922
53
+ gpustack_runtime/detector/pydcmi/__init__.py,sha256=63FoyTLAdJRUBUJ86CVONpO0Q15kvEhaEH_kN4qqrdo,37314
54
+ gpustack_runtime/detector/pyhgml/__init__.py,sha256=Yp9s-QhHS4ck7Iq9kd4v6a4BruyJQcuOTYlyYSmnOgI,182896
55
+ gpustack_runtime/detector/pyhgml/libhgml.so,sha256=BPzGVBpzrMX1tSvbXddq8Q0Qhi8w-No2JXX8sRxTioI,2101640
56
+ gpustack_runtime/detector/pyhgml/libuki.so,sha256=EE6v1vIYYT4FSDMMm9rSfAqwrwIPFD-4_6KtP51lSps,702352
57
+ gpustack_runtime/detector/pyhsa/__init__.py,sha256=4DuGnBBMUVOCPa6vTx3XT5mffGrKk6M6CYbUWBoMTJ0,15792
58
+ gpustack_runtime/detector/pyixml/__init__.py,sha256=2YmNoYhcIvc4CbRZgORM9o-GKdQ6O05J-5L3JbMZdhA,163157
59
+ gpustack_runtime/detector/pymxsml/__init__.py,sha256=YxfNHq7TWd7CpNroP45BGXhcWNpY_sXgVzNGtx68DII,45409
60
+ gpustack_runtime/detector/pyrocmcore/__init__.py,sha256=rgwIdPS-7GG7_5luRMR1XG9QyNM3lJh5ryD7kfZqpWg,2523
61
+ gpustack_runtime/detector/pyrocmsmi/__init__.py,sha256=Gk4pTadOMzLCZJvQJ2S1N_1ivogtYokfVPHj_9Y874Y,12286
62
+ gpustack_runtime/_version_appendix.py,sha256=-PDS1ZkWXq1N9cDAPU9eY8t4sJ5GHs8YQgMCBrRBrX0,23
63
+ gpustack_runtime-0.1.42.post1.dist-info/METADATA,sha256=2OqVrE1DJE5z3w_isNfXgoFioudBbs_EtlmV6LrHlBQ,2364
64
+ gpustack_runtime-0.1.42.post1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
65
+ gpustack_runtime-0.1.42.post1.dist-info/entry_points.txt,sha256=bBO_61GxP6dIT74uZwbSDgW5Vt2pTePUS3CgjUJkUgg,68
66
+ gpustack_runtime-0.1.42.post1.dist-info/licenses/LICENSE,sha256=OiPibowBvB-NHV3TP_NOj18XNBlXcshXZFMpa3uvKVE,10362
67
+ gpustack_runtime-0.1.42.post1.dist-info/RECORD,,
@@ -1,67 +0,0 @@
1
- gpustack_runtime/__init__.py,sha256=Xw_PVWneitx-8QmW6sJQeymj6zVbEgEndGhIB_km6TI,186
2
- gpustack_runtime/__main__.py,sha256=O9yJKcN7vg0Ppgc13qesxHwST2wkH3ccOkTQXPWHnNA,3939
3
- gpustack_runtime/_version.py,sha256=avOg2k2wJyqvBs2osdxAhmsDLf9lzQxB4hFsfDnq90s,792
4
- gpustack_runtime/_version.pyi,sha256=A42NoSgcqEXVy2OeNm4LXC9CbyonbooYrSUBlPm2lGY,156
5
- gpustack_runtime/envs.py,sha256=Q8vK42OpkY4T72zN6pOz_eCS_hnQElhAmxZ1wdks0xQ,38794
6
- gpustack_runtime/logging.py,sha256=wMPriPpOuVsuClsjMh0qwEPQKyJiJa89ggdDjqkk7i0,6934
7
- gpustack_runtime/cmds/__init__.py,sha256=-_X2O2lBn6KcdLGUzhL3lEjQC4_cwA36fvWDnFAgtVM,1382
8
- gpustack_runtime/cmds/__types__.py,sha256=TBnUWUqzTkDtJnsMv363kdw-H8fOf-XQYbOvrmQif-M,815
9
- gpustack_runtime/cmds/deployer.py,sha256=KvhPhU6ZW-UV6vLykI5adKI1ThgVFFJqWaII3n4OhL8,32846
10
- gpustack_runtime/cmds/detector.py,sha256=AALcoqCiNuwYucKBnyj7r5ScOWc_BSzAhHR2C0QbEHE,8750
11
- gpustack_runtime/cmds/images.py,sha256=7tb-D3G4yqLPkbS9aSuWI1bD3DYK8BLbPbgqac56blI,594
12
- gpustack_runtime/deployer/__init__.py,sha256=impMrmvkMjuCBthsn3QUz3LuwpmmNAymHJKJ2o6SZoc,16249
13
- gpustack_runtime/deployer/__patches__.py,sha256=cTBge8BT6IsY5MzETKY3kN28k3igYfNj7pcpgDzfDzw,17849
14
- gpustack_runtime/deployer/__types__.py,sha256=PgIWogHOvHKsHoeBjmKFEEM3JrKck89Mmnwlfx01BbE,72248
15
- gpustack_runtime/deployer/__utils__.py,sha256=paQu2M1UeoSfQPsiskmAqJSiln-8qwibTssEoWFMLec,21109
16
- gpustack_runtime/deployer/docker.py,sha256=bOaXbTnaalbO42FlyWR1Ha26Y30LGWPzWKPV5Q-Nk7g,85039
17
- gpustack_runtime/deployer/kuberentes.py,sha256=V7_lPMFaLCJz3vqFBGKomOs9EZs7nGjrSV9EJ5lLyVM,89323
18
- gpustack_runtime/deployer/podman.py,sha256=_qdbsTezacRmiXa3n04OUPUsgVy1pSFgJSKxous4s14,82156
19
- gpustack_runtime/deployer/cdi/__init__.py,sha256=2wHrxkud3GJokE3ytNc3jvjddemXkNuuz_oIKzxD3-I,4000
20
- gpustack_runtime/deployer/cdi/__types__.py,sha256=04DKvcogk7OoHS7TU2Bmht3VVMu7iOEBWTEOvxpHt4w,18399
21
- gpustack_runtime/deployer/cdi/__utils__.py,sha256=mvdOqkbhaSkphl0K-VpNwtFviAkttS9UrmKEA285kRw,3908
22
- gpustack_runtime/deployer/cdi/amd.py,sha256=-eq_SOlC56VX2QscZXvnoeffWSRindhr8zFZmaIcKrE,4082
23
- gpustack_runtime/deployer/cdi/ascend.py,sha256=lDs75a9--c0lM34xfJqu-_QbfWNFrf4zE-GXPKReBe4,4538
24
- gpustack_runtime/deployer/cdi/hygon.py,sha256=h6-vQfv03sgxYjMJAf_JOMq9cHFPaNjK1YbUYIiSXck,4117
25
- gpustack_runtime/deployer/cdi/iluvatar.py,sha256=6nNECZpU5IPP6-5l-O1rzU-ib-WcuwKvDg7ZV__1NE4,3650
26
- gpustack_runtime/deployer/cdi/metax.py,sha256=tmJBvr-n9pERAp-dXsa54qv6xmxt0rJoJwY36TFdoWk,4143
27
- gpustack_runtime/deployer/cdi/thead.py,sha256=SvIDKNYZx7FwMPTTxyJ2RRjlr9LXLN8BUYCUhidmiQk,3671
28
- gpustack_runtime/deployer/k8s/deviceplugin/__init__.py,sha256=cCP8Swtz_LzeIrKnwNszD54fj8ApAMgffUym4Wcyc_g,10975
29
- gpustack_runtime/deployer/k8s/deviceplugin/__types__.py,sha256=LCkgPDZ64Mra7bo5jmtsAO2Ypbc4qK99lMl6R_nQhnY,3043
30
- gpustack_runtime/deployer/k8s/deviceplugin/plugin.py,sha256=ipZ_V6pgJ2pzyEYUgAizZ7_W3a4noKEdTiZ9GAeuiRY,17728
31
- gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/__init__.py,sha256=3rOYmgDIIJ4idEtwgnumGStH7PaK-J7EYrOnLa9A-8o,118
32
- gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/api.proto,sha256=rmB8RDe4LN5FCVkQ608uS-pl32mk5tt6iGe-g2lKtPs,7919
33
- gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/api_pb2.py,sha256=dNkzjTE-2y25q8NF0QRznNJ5r1-5ZxxJS598MHbjx98,45998
34
- gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/api_pb2.pyi,sha256=lq1dbSgBYqJ7zyGfoKKHCyfr6R5vcCGzJxteeyQpbuI,8232
35
- gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/api_pb2_grpc.py,sha256=GM6EyCEFeyOjL0XOCisbcHurRoLKqKDUI5obsUyTxpE,17446
36
- gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/constants.py,sha256=tpNk3e_cvY67C9RwVsdTNl75YuNXBgsn53fSJIzeTR4,828
37
- gpustack_runtime/detector/__init__.py,sha256=9i6KOd3Qp_BmnSyPURlOBHlHJMSInqlDTh1kpAbs4_U,8104
38
- gpustack_runtime/detector/__types__.py,sha256=tiYbxPD6gV5wS79K3d2dUzy6btJl4QcsgunyxtJ240E,13162
39
- gpustack_runtime/detector/__utils__.py,sha256=QdLWXwsU1_EMxXG5Y29psqnttWJyXWMphHDjiC_6Byc,25153
40
- gpustack_runtime/detector/amd.py,sha256=qh86xGhPJRIXwiKaHmeyIrsxchUDRpyggR6yc0cLuKw,17553
41
- gpustack_runtime/detector/ascend.py,sha256=E6YPoREI5r2HZIegUaQb0XwC3Qau1mnkNeCRbgtlE5k,17992
42
- gpustack_runtime/detector/cambricon.py,sha256=GzXlS4et8zape0rr19d1EwSV9cfFEmHgaElTVMjR3IY,3947
43
- gpustack_runtime/detector/hygon.py,sha256=R4I8h66YHJC00iAtDJhBX772VMKUdZ8nleRXZFPUt3Q,12299
44
- gpustack_runtime/detector/iluvatar.py,sha256=bqciqjYE_tIxBg2PSOlIzH3WcFYBgTDjfN6nT90LSGg,10206
45
- gpustack_runtime/detector/metax.py,sha256=W4NSZD7Kf5431B63UBpYnKIk2Jz1SutEpwXkwgYfmfE,10374
46
- gpustack_runtime/detector/mthreads.py,sha256=GcElUIMvU5C6P4Fx_X_kSOsJps8WZ47tkZ2B2MJZmk4,12131
47
- gpustack_runtime/detector/nvidia.py,sha256=xdvoMdNx943on5fd_mI3WI_85kMY-0dYm5NU3vqXb9M,33400
48
- gpustack_runtime/detector/thead.py,sha256=43TGPq78FulpYBUeEMVxDTY-0X3ve2FsX4Hsd0Lswy0,25561
49
- gpustack_runtime/detector/pyacl/__init__.py,sha256=UQjaBxP7nJNyzr08N8_lH-5wPtnFmUY9pyQhs6vIChU,16232
50
- gpustack_runtime/detector/pyamdgpu/__init__.py,sha256=x-UO07EpKEgfTLmXQOD6j9f6kibuvDC7riQFof3YGdw,8617
51
- gpustack_runtime/detector/pyamdsmi/__init__.py,sha256=800-khq2w6HLgXM12RkhcdvXBGeAJ4s1_TWJyHebCMk,955
52
- gpustack_runtime/detector/pycuda/__init__.py,sha256=p-Na5eBjdsFGXPHCEEUfFj5TQFjPxPQGV0i4oU6ywBA,16922
53
- gpustack_runtime/detector/pydcmi/__init__.py,sha256=zCeImelWgbPDn51dJgp3LlCK-uGOuHmmPGiOsyYB3cI,37264
54
- gpustack_runtime/detector/pyhgml/__init__.py,sha256=Yp9s-QhHS4ck7Iq9kd4v6a4BruyJQcuOTYlyYSmnOgI,182896
55
- gpustack_runtime/detector/pyhgml/libhgml.so,sha256=BPzGVBpzrMX1tSvbXddq8Q0Qhi8w-No2JXX8sRxTioI,2101640
56
- gpustack_runtime/detector/pyhgml/libuki.so,sha256=EE6v1vIYYT4FSDMMm9rSfAqwrwIPFD-4_6KtP51lSps,702352
57
- gpustack_runtime/detector/pyhsa/__init__.py,sha256=4DuGnBBMUVOCPa6vTx3XT5mffGrKk6M6CYbUWBoMTJ0,15792
58
- gpustack_runtime/detector/pyixml/__init__.py,sha256=6ss_Dyl8lIT4WrKpfwmQqzBmg4Bxi38vg_eey_wsSY0,162681
59
- gpustack_runtime/detector/pymxsml/__init__.py,sha256=YxfNHq7TWd7CpNroP45BGXhcWNpY_sXgVzNGtx68DII,45409
60
- gpustack_runtime/detector/pyrocmcore/__init__.py,sha256=rgwIdPS-7GG7_5luRMR1XG9QyNM3lJh5ryD7kfZqpWg,2523
61
- gpustack_runtime/detector/pyrocmsmi/__init__.py,sha256=ACwRtJWVIuJ4NTcBJxk0zrVb_qtDOMkApMdbJoag5g0,11906
62
- gpustack_runtime/_version_appendix.py,sha256=NCkcFhpU5_5eIeG-39gvsVgVabq_3NDFCToVnvsn6EU,23
63
- gpustack_runtime-0.1.41.post3.dist-info/METADATA,sha256=RLNYsBXAICxX3S0JO0t_V-73-MfKoJoLH8Mcq5kessc,2364
64
- gpustack_runtime-0.1.41.post3.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
65
- gpustack_runtime-0.1.41.post3.dist-info/entry_points.txt,sha256=bBO_61GxP6dIT74uZwbSDgW5Vt2pTePUS3CgjUJkUgg,68
66
- gpustack_runtime-0.1.41.post3.dist-info/licenses/LICENSE,sha256=OiPibowBvB-NHV3TP_NOj18XNBlXcshXZFMpa3uvKVE,10362
67
- gpustack_runtime-0.1.41.post3.dist-info/RECORD,,