gpustack-runtime 0.1.42__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 (31) hide show
  1. gpustack_runtime/_version.py +2 -2
  2. gpustack_runtime/_version_appendix.py +1 -1
  3. gpustack_runtime/cmds/detector.py +1 -1
  4. gpustack_runtime/deployer/cdi/__init__.py +1 -1
  5. gpustack_runtime/deployer/cdi/__types__.py +2 -2
  6. gpustack_runtime/deployer/cdi/amd.py +6 -8
  7. gpustack_runtime/deployer/cdi/ascend.py +7 -9
  8. gpustack_runtime/deployer/cdi/hygon.py +6 -8
  9. gpustack_runtime/deployer/cdi/iluvatar.py +6 -8
  10. gpustack_runtime/deployer/cdi/metax.py +6 -8
  11. gpustack_runtime/deployer/cdi/thead.py +6 -8
  12. gpustack_runtime/deployer/docker.py +29 -3
  13. gpustack_runtime/deployer/k8s/deviceplugin/__init__.py +12 -7
  14. gpustack_runtime/deployer/k8s/deviceplugin/plugin.py +6 -2
  15. gpustack_runtime/deployer/podman.py +29 -3
  16. gpustack_runtime/detector/__utils__.py +3 -0
  17. gpustack_runtime/detector/amd.py +4 -2
  18. gpustack_runtime/detector/ascend.py +18 -9
  19. gpustack_runtime/detector/hygon.py +6 -2
  20. gpustack_runtime/detector/iluvatar.py +9 -7
  21. gpustack_runtime/detector/metax.py +8 -6
  22. gpustack_runtime/detector/mthreads.py +11 -8
  23. gpustack_runtime/detector/nvidia.py +11 -8
  24. gpustack_runtime/detector/pyacl/__init__.py +34 -14
  25. gpustack_runtime/detector/pydcmi/__init__.py +4 -2
  26. gpustack_runtime/detector/thead.py +12 -9
  27. {gpustack_runtime-0.1.42.dist-info → gpustack_runtime-0.1.42.post1.dist-info}/METADATA +1 -1
  28. {gpustack_runtime-0.1.42.dist-info → gpustack_runtime-0.1.42.post1.dist-info}/RECORD +31 -31
  29. {gpustack_runtime-0.1.42.dist-info → gpustack_runtime-0.1.42.post1.dist-info}/WHEEL +0 -0
  30. {gpustack_runtime-0.1.42.dist-info → gpustack_runtime-0.1.42.post1.dist-info}/entry_points.txt +0 -0
  31. {gpustack_runtime-0.1.42.dist-info → gpustack_runtime-0.1.42.post1.dist-info}/licenses/LICENSE +0 -0
@@ -27,8 +27,8 @@ version_tuple: VERSION_TUPLE
27
27
  __commit_id__: COMMIT_ID
28
28
  commit_id: COMMIT_ID
29
29
 
30
- __version__ = version = '0.1.42'
31
- __version_tuple__ = version_tuple = (0, 1, 42)
30
+ __version__ = version = '0.1.42.post1'
31
+ __version_tuple__ = version_tuple = (0, 1, 42, 'post1')
32
32
  try:
33
33
  from ._version_appendix import git_commit
34
34
  __commit_id__ = commit_id = git_commit
@@ -1 +1 @@
1
- git_commit = "a9222e0"
1
+ git_commit = "ff610ac"
@@ -123,7 +123,7 @@ class GetDevicesTopologySubCommand(SubCommand):
123
123
  "",
124
124
  "Legend (from nearest to farthest):",
125
125
  " X = Self",
126
- " LINK = Connection traversing with High-Speed Link (e.g., AMD XGMI, Ascend HCCS, NVIDIA NVLink)",
126
+ " LINK = Connection traversing with High-Speed Link (e.g., AMD XGMI, Ascend HCCS, MThreads MTLink, NVIDIA NVLink, T-Head ICNLink)",
127
127
  " PIX = Connection traversing at most a single PCIe bridge",
128
128
  " PXB = Connection traversing multiple PCIe bridges (without traversing the PCIe Host Bridge)",
129
129
  " PHB = Connection traversing PCIe as well as a PCIe Host Bridge (typically the CPU)",
@@ -82,7 +82,7 @@ def dump_config(
82
82
  if cdi_path.exists():
83
83
  actual = cdi_path.read_text(encoding="utf-8")
84
84
  if actual == expected:
85
- return expected, str(cdi_path)
85
+ return expected, None
86
86
 
87
87
  cdi_path.write_text(expected, encoding="utf-8")
88
88
  return expected, str(cdi_path)
@@ -527,7 +527,7 @@ class Config(dict):
527
527
  self,
528
528
  kind: str,
529
529
  devices: list[ConfigDevice],
530
- container_edits: list[ConfigContainerEdits] | None = None,
530
+ container_edits: ConfigContainerEdits | None = None,
531
531
  cdi_version: str = _DEFAULT_CDI_VERSION,
532
532
  annotations: dict[str, str] | None = None,
533
533
  ):
@@ -581,7 +581,7 @@ class Config(dict):
581
581
  return self["kind"]
582
582
 
583
583
  @property
584
- def container_edits(self) -> list[ConfigContainerEdits] | None:
584
+ def container_edits(self) -> ConfigContainerEdits | None:
585
585
  """
586
586
  Return the list of container edits in the CDI configuration.
587
587
 
@@ -135,12 +135,10 @@ class AMDGenerator(Generator):
135
135
  return Config(
136
136
  kind=kind,
137
137
  devices=cdi_devices,
138
- container_edits=[
139
- ConfigContainerEdits(
140
- env=[
141
- f"{runtime_env}=void",
142
- ],
143
- device_nodes=common_device_nodes,
144
- ),
145
- ],
138
+ container_edits=ConfigContainerEdits(
139
+ env=[
140
+ f"{runtime_env}=void",
141
+ ],
142
+ device_nodes=common_device_nodes,
143
+ ),
146
144
  )
@@ -152,13 +152,11 @@ class AscendGenerator(Generator):
152
152
  return Config(
153
153
  kind=kind,
154
154
  devices=cdi_devices,
155
- container_edits=[
156
- ConfigContainerEdits(
157
- env=[
158
- f"{runtime_env}=void",
159
- ],
160
- device_nodes=common_device_nodes,
161
- mounts=common_mounts,
162
- ),
163
- ],
155
+ container_edits=ConfigContainerEdits(
156
+ env=[
157
+ f"{runtime_env}=void",
158
+ ],
159
+ device_nodes=common_device_nodes,
160
+ mounts=common_mounts,
161
+ ),
164
162
  )
@@ -136,12 +136,10 @@ class HygonGenerator(Generator):
136
136
  return Config(
137
137
  kind=kind,
138
138
  devices=cdi_devices,
139
- container_edits=[
140
- ConfigContainerEdits(
141
- env=[
142
- f"{runtime_env}=void",
143
- ],
144
- device_nodes=common_device_nodes,
145
- ),
146
- ],
139
+ container_edits=ConfigContainerEdits(
140
+ env=[
141
+ f"{runtime_env}=void",
142
+ ],
143
+ device_nodes=common_device_nodes,
144
+ ),
147
145
  )
@@ -125,12 +125,10 @@ class IluvatarGenerator(Generator):
125
125
  return Config(
126
126
  kind=kind,
127
127
  devices=cdi_devices,
128
- container_edits=[
129
- ConfigContainerEdits(
130
- env=[
131
- f"{runtime_env}=void",
132
- ],
133
- device_nodes=common_device_nodes,
134
- ),
135
- ],
128
+ container_edits=ConfigContainerEdits(
129
+ env=[
130
+ f"{runtime_env}=void",
131
+ ],
132
+ device_nodes=common_device_nodes,
133
+ ),
136
134
  )
@@ -137,12 +137,10 @@ class MetaXGenerator(Generator):
137
137
  return Config(
138
138
  kind=kind,
139
139
  devices=cdi_devices,
140
- container_edits=[
141
- ConfigContainerEdits(
142
- env=[
143
- f"{runtime_env}=void",
144
- ],
145
- device_nodes=common_device_nodes,
146
- ),
147
- ],
140
+ container_edits=ConfigContainerEdits(
141
+ env=[
142
+ f"{runtime_env}=void",
143
+ ],
144
+ device_nodes=common_device_nodes,
145
+ ),
148
146
  )
@@ -126,12 +126,10 @@ class THeadGenerator(Generator):
126
126
  return Config(
127
127
  kind=kind,
128
128
  devices=cdi_devices,
129
- container_edits=[
130
- ConfigContainerEdits(
131
- env=[
132
- f"{runtime_env}=void",
133
- ],
134
- device_nodes=common_device_nodes,
135
- ),
136
- ],
129
+ container_edits=ConfigContainerEdits(
130
+ env=[
131
+ f"{runtime_env}=void",
132
+ ],
133
+ device_nodes=common_device_nodes,
134
+ ),
137
135
  )
@@ -985,11 +985,37 @@ class DockerDeployer(EndoscopicDeployer):
985
985
  # Generate CDI config if not yet.
986
986
  if cdi and envs.GPUSTACK_RUNTIME_DOCKER_CDI_SPECS_GENERATE:
987
987
  for ren in runtime_envs:
988
- r_m = self.get_manufacturer(ren)
989
- cdi_dump_config(
990
- manufacturer=r_m,
988
+ manu = self.get_manufacturer(ren)
989
+ cdi_config, cdi_config_path = cdi_dump_config(
990
+ manufacturer=manu,
991
991
  output=envs.GPUSTACK_RUNTIME_DEPLOY_CDI_SPECS_DIRECTORY,
992
992
  )
993
+ if cdi_config and cdi_config_path:
994
+ if logger.isEnabledFor(logging.DEBUG):
995
+ logger.debug(
996
+ "Generated CDI configuration for '%s' at '%s':\n%s",
997
+ manu,
998
+ cdi_config_path,
999
+ cdi_config,
1000
+ )
1001
+ else:
1002
+ logger.info(
1003
+ "Generated CDI configuration for '%s' at '%s'",
1004
+ manu,
1005
+ cdi_config_path,
1006
+ )
1007
+ elif cdi_config:
1008
+ logger.info(
1009
+ "Reuse generated CDI configuration for '%s'",
1010
+ manu,
1011
+ )
1012
+ else:
1013
+ logger.warning(
1014
+ "Delegated CDI configuration by other tools for '%s', "
1015
+ "e.g. for NVIDIA devices, please follow NVIDIA Container Toolkit Manual CDI Specification Generation to generate the CDI configuration, "
1016
+ "see https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/cdi-support.html#manual-cdi-specification-generation",
1017
+ manu,
1018
+ )
993
1019
 
994
1020
  # Request devices.
995
1021
  if r_v == "all":
@@ -78,28 +78,33 @@ async def serve_async(
78
78
  allocation_policy == "cdi"
79
79
  and envs.GPUSTACK_RUNTIME_KUBERNETES_KDP_CDI_SPECS_GENERATE
80
80
  ):
81
- generated_content, generated_path = cdi_dump_config(
81
+ cdi_config, cdi_config_path = cdi_dump_config(
82
82
  manufacturer=manu,
83
83
  output=cdi_generation_output,
84
84
  )
85
- if generated_content:
85
+ if cdi_config and cdi_config_path:
86
86
  if logger.isEnabledFor(logging.DEBUG):
87
87
  logger.debug(
88
88
  "Generated CDI configuration for '%s' at '%s':\n%s",
89
89
  manu,
90
- generated_path,
91
- generated_content,
90
+ cdi_config_path,
91
+ cdi_config,
92
92
  )
93
93
  else:
94
94
  logger.info(
95
95
  "Generated CDI configuration for '%s' at '%s'",
96
96
  manu,
97
- generated_path,
97
+ cdi_config_path,
98
98
  )
99
+ elif cdi_config:
100
+ logger.info(
101
+ "Reuse generated CDI configuration for '%s'",
102
+ manu,
103
+ )
99
104
  else:
100
105
  logger.warning(
101
- "Delegated CDI configuration by other tools for manufacturer '%s', "
102
- "e.g. NVIDIA Container Toolkit Manual CDI Specification Generation, "
106
+ "Delegated CDI configuration by other tools for '%s', "
107
+ "e.g. for NVIDIA devices, please follow NVIDIA Container Toolkit Manual CDI Specification Generation to generate the CDI configuration, "
103
108
  "see https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/cdi-support.html#manual-cdi-specification-generation",
104
109
  manu,
105
110
  )
@@ -12,6 +12,7 @@ from grpc_interceptor import AsyncServerInterceptor
12
12
  from grpc_interceptor.exceptions import GrpcException
13
13
 
14
14
  from ....detector import Device, DeviceMemoryStatusEnum, str_range_to_list
15
+ from ....detector.__utils__ import get_numa_node_size
15
16
  from ...cdi import (
16
17
  generate_config,
17
18
  manufacturer_to_cdi_kind,
@@ -346,8 +347,11 @@ class SharableDevicePlugin(PluginServer, DevicePluginServicer):
346
347
  NUMANode(
347
348
  ID=node_id,
348
349
  )
349
- for node_id in str_range_to_list(
350
- self._device.appendix.get("numa", "0"),
350
+ for node_id in (
351
+ str_range_to_list(
352
+ self._device.appendix.get("numa", ""),
353
+ )
354
+ or list(range(get_numa_node_size()))
351
355
  )
352
356
  ],
353
357
  )
@@ -982,11 +982,37 @@ class PodmanDeployer(EndoscopicDeployer):
982
982
  # Generate CDI config if not yet.
983
983
  if envs.GPUSTACK_RUNTIME_PODMAN_CDI_SPECS_GENERATE:
984
984
  for ren in runtime_envs:
985
- r_m = self.get_manufacturer(ren)
986
- cdi_dump_config(
987
- manufacturer=r_m,
985
+ manu = self.get_manufacturer(ren)
986
+ cdi_config, cdi_config_path = cdi_dump_config(
987
+ manufacturer=manu,
988
988
  output=envs.GPUSTACK_RUNTIME_DEPLOY_CDI_SPECS_DIRECTORY,
989
989
  )
990
+ if cdi_config and cdi_config_path:
991
+ if logger.isEnabledFor(logging.DEBUG):
992
+ logger.debug(
993
+ "Generated CDI configuration for '%s' at '%s':\n%s",
994
+ manu,
995
+ cdi_config_path,
996
+ cdi_config,
997
+ )
998
+ else:
999
+ logger.info(
1000
+ "Generated CDI configuration for '%s' at '%s'",
1001
+ manu,
1002
+ cdi_config_path,
1003
+ )
1004
+ elif cdi_config:
1005
+ logger.info(
1006
+ "Reuse generated CDI configuration for '%s'",
1007
+ manu,
1008
+ )
1009
+ else:
1010
+ logger.warning(
1011
+ "Delegated CDI configuration by other tools for '%s', "
1012
+ "e.g. for NVIDIA devices, please follow NVIDIA Container Toolkit Manual CDI Specification Generation to generate the CDI configuration, "
1013
+ "see https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/cdi-support.html#manual-cdi-specification-generation",
1014
+ manu,
1015
+ )
990
1016
 
991
1017
  # Configure device access environment variable.
992
1018
  if r_v == "all":
@@ -916,6 +916,9 @@ def str_range_to_list(str_range: str) -> list[int]:
916
916
  A list of indices.
917
917
 
918
918
  """
919
+ if not str_range:
920
+ return []
921
+
919
922
  str_range_parts = str_range.split(",")
920
923
 
921
924
  indices: set[int] = set()
@@ -220,14 +220,16 @@ class AMDDetector(Detector):
220
220
 
221
221
  dev_numa = get_numa_node_by_bdf(dev_bdf)
222
222
  if not dev_numa:
223
- dev_numa = str(pyamdsmi.amdsmi_topo_get_numa_node_number(dev))
223
+ with contextlib.suppress(pyamdsmi.AmdSmiException):
224
+ dev_numa = str(pyamdsmi.amdsmi_topo_get_numa_node_number(dev))
224
225
 
225
226
  dev_appendix = {
226
227
  "arch_family": _get_arch_family(dev_asic_family_id),
227
228
  "vgpu": dev_is_vgpu,
228
229
  "bdf": dev_bdf,
229
- "numa": dev_numa,
230
230
  }
231
+ if dev_numa:
232
+ dev_appendix["numa"] = dev_numa
231
233
  if dev_card_id is not None:
232
234
  dev_appendix["card_id"] = dev_card_id
233
235
  if dev_renderd_id is not None:
@@ -32,10 +32,12 @@ slogger = logger.getChild("internal")
32
32
  _TOPOLOGY_DISTANCE_MAPPING: dict[int, int] = {
33
33
  pydcmi.DCMI_TOPO_TYPE_SELF: TopologyDistanceEnum.SELF,
34
34
  pydcmi.DCMI_TOPO_TYPE_HCCS: TopologyDistanceEnum.LINK, # Traversing via high-speed interconnect, RoCE, etc.
35
+ pydcmi.DCMI_TOPO_TYPE_HCCS_SW: TopologyDistanceEnum.LINK, # Traversing via high-speed interconnect switch.
35
36
  pydcmi.DCMI_TOPO_TYPE_PIX: TopologyDistanceEnum.PIX, # Traversing via a single PCIe bridge.
36
37
  pydcmi.DCMI_TOPO_TYPE_PXB: TopologyDistanceEnum.PXB, # Traversing via multiple PCIe bridges without PCIe Host Bridge.
37
38
  pydcmi.DCMI_TOPO_TYPE_PHB: TopologyDistanceEnum.PHB, # Traversing via a PCIe Host Bridge.
38
39
  pydcmi.DCMI_TOPO_TYPE_SYS: TopologyDistanceEnum.SYS, # Traversing via SMP interconnect across other NUMA nodes.
40
+ pydcmi.DCMI_TOPO_TYPE_SIO: TopologyDistanceEnum.SYS, # Traversing via Super I/O or other slower interconnects.
39
41
  }
40
42
  """
41
43
  Mapping of Ascend topology types to distance values.
@@ -109,7 +111,7 @@ class AscendDetector(Detector):
109
111
 
110
112
  sys_driver_ver = pydcmi.dcmi_get_driver_version()
111
113
 
112
- sys_runtime_ver_original = pyacl.aclsysGetCANNVersion()
114
+ sys_runtime_ver_original = pyacl.aclsysGetVersion()
113
115
  sys_runtime_ver = get_brief_version(sys_runtime_ver_original)
114
116
 
115
117
  _, card_list = pydcmi.dcmi_get_card_list()
@@ -198,13 +200,14 @@ class AscendDetector(Detector):
198
200
 
199
201
  dev_numa = get_numa_node_by_bdf(dev_bdf)
200
202
  if not dev_numa:
201
- dev_cpu_affinity = (
202
- pydcmi.dcmi_get_affinity_cpu_info_by_device_id(
203
- dev_card_id,
204
- dev_device_id,
203
+ with contextlib.suppress(pydcmi.DCMIError):
204
+ dev_cpu_affinity = (
205
+ pydcmi.dcmi_get_affinity_cpu_info_by_device_id(
206
+ dev_card_id,
207
+ dev_device_id,
208
+ )
205
209
  )
206
- )
207
- dev_numa = map_cpu_affinity_to_numa_node(dev_cpu_affinity)
210
+ dev_numa = map_cpu_affinity_to_numa_node(dev_cpu_affinity)
208
211
 
209
212
  dev_appendix = {
210
213
  "arch_family": (
@@ -213,11 +216,12 @@ class AscendDetector(Detector):
213
216
  ),
214
217
  "vgpu": dev_is_vgpu,
215
218
  "bdf": dev_bdf,
216
- "numa": dev_numa,
217
219
  "card_id": dev_card_id,
218
220
  "device_id": dev_device_id,
219
221
  "device_id_max": device_num_in_card - 1,
220
222
  }
223
+ if dev_numa:
224
+ dev_appendix["numa"] = dev_numa
221
225
 
222
226
  dev_roce_ip, dev_roce_mask, dev_roce_gateway = (
223
227
  _get_device_roce_network_info(
@@ -440,7 +444,7 @@ def _get_device_roce_network_info(
440
444
  pydcmi.DCMI_PORT_TYPE_ROCE_PORT,
441
445
  )
442
446
  except pydcmi.DCMIError:
443
- debug_log_exception(logger, "Failed to get device roce network info")
447
+ debug_log_exception(logger, "Failed to get device RoCE network info")
444
448
 
445
449
  return ip, mask, gateway
446
450
 
@@ -501,12 +505,15 @@ _soc_name_version_mapping: dict[str, int] = {
501
505
  "Ascend310B3": 242,
502
506
  "Ascend310B4": 243,
503
507
  "Ascend910_9391": 250,
508
+ "Ascend910": 250,
504
509
  "Ascend910_9392": 251,
505
510
  "Ascend910_9381": 252,
506
511
  "Ascend910_9382": 253,
507
512
  "Ascend910_9372": 254,
508
513
  "Ascend910_9362": 255,
509
514
  "Ascend910_9579": 260,
515
+ "Ascend910_95": 260,
516
+ "Ascend950": 260,
510
517
  }
511
518
 
512
519
 
@@ -522,6 +529,8 @@ def _guess_soc_name_from_dev_name(dev_name: str) -> str | None:
522
529
  The guessed SoC name, or None if not found.
523
530
 
524
531
  """
532
+ if dev_name.startswith("Ascend"):
533
+ dev_name = dev_name[6:].strip()
525
534
  soc_name = f"Ascend{dev_name}"
526
535
  if soc_name in _soc_name_version_mapping:
527
536
  return soc_name
@@ -171,13 +171,17 @@ class HygonDetector(Detector):
171
171
 
172
172
  dev_numa = get_numa_node_by_bdf(dev_bdf)
173
173
  if not dev_numa:
174
- dev_numa = str(pyrocmsmi.rsmi_topo_get_numa_node_number(dev_idx))
174
+ with contextlib.suppress(pyrocmsmi.ROCMSMIError):
175
+ dev_numa = str(
176
+ pyrocmsmi.rsmi_topo_get_numa_node_number(dev_idx),
177
+ )
175
178
 
176
179
  dev_appendix = {
177
180
  "vgpu": dev_is_vgpu,
178
181
  "bdf": dev_bdf,
179
- "numa": dev_numa,
180
182
  }
183
+ if dev_numa:
184
+ dev_appendix["numa"] = dev_numa
181
185
  if dev_card_id is not None:
182
186
  dev_appendix["card_id"] = dev_card_id
183
187
  if dev_renderd_id is not None:
@@ -190,18 +190,20 @@ class IluvatarDetector(Detector):
190
190
 
191
191
  dev_numa = get_numa_node_by_bdf(dev_bdf)
192
192
  if not dev_numa:
193
- dev_node_affinity = pyixml.nvmlDeviceGetMemoryAffinity(
194
- dev,
195
- get_numa_nodeset_size(),
196
- pyixml.NVML_AFFINITY_SCOPE_NODE,
197
- )
198
- dev_numa = bitmask_to_str(list(dev_node_affinity))
193
+ with contextlib.suppress(pyixml.NVMLError):
194
+ dev_node_affinity = pyixml.nvmlDeviceGetMemoryAffinity(
195
+ dev,
196
+ get_numa_nodeset_size(),
197
+ pyixml.NVML_AFFINITY_SCOPE_NODE,
198
+ )
199
+ dev_numa = bitmask_to_str(list(dev_node_affinity))
199
200
 
200
201
  dev_appendix = {
201
202
  "vgpu": dev_is_vgpu,
202
203
  "bdf": dev_bdf,
203
- "numa": dev_numa,
204
204
  }
205
+ if dev_numa:
206
+ dev_appendix["numa"] = dev_numa
205
207
 
206
208
  ret.append(
207
209
  Device(
@@ -179,17 +179,19 @@ class MetaXDetector(Detector):
179
179
 
180
180
  dev_numa = get_numa_node_by_bdf(dev_bdf)
181
181
  if not dev_numa:
182
- dev_node_affinity = pymxsml.mxSmlGetNodeAffinity(
183
- dev_idx,
184
- get_numa_nodeset_size(),
185
- )
186
- dev_numa = bitmask_to_str(list(dev_node_affinity))
182
+ with contextlib.suppress(pymxsml.MXSMLError):
183
+ dev_node_affinity = pymxsml.mxSmlGetNodeAffinity(
184
+ dev_idx,
185
+ get_numa_nodeset_size(),
186
+ )
187
+ dev_numa = bitmask_to_str(list(dev_node_affinity))
187
188
 
188
189
  dev_appendix = {
189
190
  "vgpu": dev_is_vgpu,
190
191
  "bdf": dev_bdf,
191
- "numa": dev_numa,
192
192
  }
193
+ if dev_numa:
194
+ dev_appendix["numa"] = dev_numa
193
195
  if dev_card_id is not None:
194
196
  dev_appendix["card_id"] = dev_card_id
195
197
  if dev_renderd_id is not None:
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations as __future_annotations__
2
2
 
3
+ import contextlib
3
4
  import logging
4
5
  from functools import lru_cache
5
6
 
@@ -176,19 +177,21 @@ class MThreadsDetector(Detector):
176
177
 
177
178
  dev_numa = get_numa_node_by_bdf(dev_bdf)
178
179
  if not dev_numa:
179
- dev_node_affinity = pymtml.mtmlDeviceGetMemoryAffinityWithinNode(
180
- dev,
181
- get_numa_nodeset_size(),
182
- )
183
- dev_numa = bitmask_to_str(
184
- list(dev_node_affinity),
185
- )
180
+ with contextlib.suppress(pymtml.MTMLError):
181
+ dev_node_affinity = (
182
+ pymtml.mtmlDeviceGetMemoryAffinityWithinNode(
183
+ dev,
184
+ get_numa_nodeset_size(),
185
+ )
186
+ )
187
+ dev_numa = bitmask_to_str(list(dev_node_affinity))
186
188
 
187
189
  dev_appendix = {
188
190
  "vgpu": dev_is_vgpu,
189
191
  "bdf": dev_bdf,
190
- "numa": dev_numa,
191
192
  }
193
+ if dev_numa:
194
+ dev_appendix["numa"] = dev_numa
192
195
 
193
196
  ret.append(
194
197
  Device(
@@ -134,12 +134,13 @@ class NVIDIADetector(Detector):
134
134
 
135
135
  dev_numa = get_numa_node_by_bdf(dev_bdf)
136
136
  if not dev_numa:
137
- dev_node_affinity = pynvml.nvmlDeviceGetMemoryAffinity(
138
- dev,
139
- get_numa_nodeset_size(),
140
- pynvml.NVML_AFFINITY_SCOPE_NODE,
141
- )
142
- dev_numa = bitmask_to_str(list(dev_node_affinity))
137
+ with contextlib.suppress(pynvml.NVMLError):
138
+ dev_node_affinity = pynvml.nvmlDeviceGetMemoryAffinity(
139
+ dev,
140
+ get_numa_nodeset_size(),
141
+ pynvml.NVML_AFFINITY_SCOPE_NODE,
142
+ )
143
+ dev_numa = bitmask_to_str(list(dev_node_affinity))
143
144
 
144
145
  dev_temp = None
145
146
  with contextlib.suppress(pynvml.NVMLError):
@@ -224,8 +225,9 @@ class NVIDIADetector(Detector):
224
225
  "arch_family": _get_arch_family(dev_cc_t),
225
226
  "vgpu": dev_is_vgpu,
226
227
  "bdf": dev_bdf,
227
- "numa": dev_numa,
228
228
  }
229
+ if dev_numa:
230
+ dev_appendix["numa"] = dev_numa
229
231
 
230
232
  if dev_fabric_info := _get_fabric_info(dev):
231
233
  dev_appendix.update(dev_fabric_info)
@@ -297,8 +299,9 @@ class NVIDIADetector(Detector):
297
299
  "arch_family": _get_arch_family(dev_cc_t),
298
300
  "vgpu": True,
299
301
  "bdf": dev_bdf,
300
- "numa": dev_numa,
301
302
  }
303
+ if dev_numa:
304
+ mdev_appendix["numa"] = dev_numa
302
305
 
303
306
  mdev_gi_id = pynvml.nvmlDeviceGetGpuInstanceId(mdev)
304
307
  mdev_appendix["gpu_instance_id"] = mdev_gi_id
@@ -403,20 +403,21 @@ def _LoadAclLibrary():
403
403
  locs = [
404
404
  "libascendcl.so",
405
405
  ]
406
- ascend_path = Path(
407
- os.getenv(
408
- "ASCEND_HOME_PATH",
409
- "/usr/local/Ascend/ascend-toolkit/latest",
410
- ),
411
- )
412
- if ascend_path.exists():
413
- locs.extend(
414
- [
415
- str(ascend_path / "runtime/lib64/libascendcl.so"),
416
- str(ascend_path / "aarch64-linux/lib64/libascendcl.so"),
417
- str(ascend_path / "x86_64-linux/lib64/libascendcl.so"),
418
- ]
406
+ for default_path in [
407
+ "/usr/local/Ascend/ascend-toolkit/latest",
408
+ "/usr/local/Ascend/cann",
409
+ ]:
410
+ ascend_path = Path(
411
+ os.getenv("ASCEND_HOME_PATH", default_path),
419
412
  )
413
+ if ascend_path.exists():
414
+ locs.extend(
415
+ [
416
+ str(ascend_path / "runtime/lib64/libascendcl.so"),
417
+ str(ascend_path / "aarch64-linux/lib64/libascendcl.so"),
418
+ str(ascend_path / "x86_64-linux/lib64/libascendcl.so"),
419
+ ]
420
+ )
420
421
  for loc in locs:
421
422
  try:
422
423
  aclLib = CDLL(loc)
@@ -439,7 +440,8 @@ def aclrtGetSocName():
439
440
  fn = _aclGetFunctionPointer("aclrtGetSocName")
440
441
  fn.restype = c_char_p
441
442
  c_version = fn()
442
- return c_version.decode()
443
+ if c_version is not None:
444
+ return c_version.decode()
443
445
 
444
446
  return None
445
447
 
@@ -456,3 +458,21 @@ def aclsysGetCANNVersion(package_name=ACL_PKG_NAME_CANN):
456
458
  return f"{c_version.version}".lower()
457
459
 
458
460
  return None
461
+
462
+
463
+ def aclsysGetVersion():
464
+ cann_version = aclsysGetCANNVersion()
465
+ if cann_version is not None:
466
+ return cann_version
467
+
468
+ with contextlib.suppress(ACLError):
469
+ _LoadAclLibrary()
470
+
471
+ c_version = create_string_buffer(ACL_PKG_VERSION_MAX_SIZE)
472
+ package_name = b"runtime"
473
+ fn = _aclGetFunctionPointer("aclsysGetVersionStr")
474
+ ret = fn(package_name, c_version)
475
+ _aclCheckReturn(ret)
476
+ return c_version.value.decode().lower()
477
+
478
+ return None
@@ -135,8 +135,10 @@ DCMI_TOPO_TYPE_PHB = 2
135
135
  DCMI_TOPO_TYPE_HCCS = 3
136
136
  DCMI_TOPO_TYPE_PXB = 4
137
137
  DCMI_TOPO_TYPE_PIX = 5
138
- DCMI_TOPO_TYPE_BUTT = 6 # Unknown
139
- DCMI_TOPO_TYOE_MAX = 7
138
+ DCMI_TOPO_TYPE_SIO = 6
139
+ DCMI_TOPO_TYPE_HCCS_SW = 7
140
+ DCMI_TOPO_TYPE_BUTT = 8 # Unknown
141
+ DCMI_TOPO_TYOE_MAX = 9
140
142
 
141
143
 
142
144
  ## Error Codes ##
@@ -50,7 +50,7 @@ class THeadDetector(Detector):
50
50
 
51
51
  """
52
52
  supported = False
53
- if envs.GPUSTACK_RUNTIME_DETECT.lower() not in ("auto", "iluvatar"):
53
+ if envs.GPUSTACK_RUNTIME_DETECT.lower() not in ("auto", "thead"):
54
54
  logger.debug("T-Head detection is disabled by environment variable")
55
55
  return supported
56
56
 
@@ -132,12 +132,13 @@ class THeadDetector(Detector):
132
132
 
133
133
  dev_numa = get_numa_node_by_bdf(dev_bdf)
134
134
  if not dev_numa:
135
- dev_node_affinity = pyhgml.hgmlDeviceGetMemoryAffinity(
136
- dev,
137
- get_numa_nodeset_size(),
138
- pyhgml.HGML_AFFINITY_SCOPE_NODE,
139
- )
140
- dev_numa = bitmask_to_str(list(dev_node_affinity))
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))
141
142
 
142
143
  dev_temp = None
143
144
  with contextlib.suppress(pyhgml.HGMLError):
@@ -213,8 +214,9 @@ class THeadDetector(Detector):
213
214
  dev_appendix = {
214
215
  "vgpu": dev_is_vgpu,
215
216
  "bdf": dev_bdf,
216
- "numa": dev_numa,
217
217
  }
218
+ if dev_numa:
219
+ dev_appendix["numa"] = dev_numa
218
220
 
219
221
  ret.append(
220
222
  Device(
@@ -279,8 +281,9 @@ class THeadDetector(Detector):
279
281
  mdev_appendix = {
280
282
  "vgpu": True,
281
283
  "bdf": dev_bdf,
282
- "numa": dev_numa,
283
284
  }
285
+ if dev_numa:
286
+ mdev_appendix["numa"] = dev_numa
284
287
 
285
288
  mdev_gi_id = pyhgml.hgmlDeviceGetGpuInstanceId(mdev)
286
289
  mdev_appendix["gpu_instance_id"] = mdev_gi_id
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gpustack-runtime
3
- Version: 0.1.42
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
@@ -1,33 +1,33 @@
1
1
  gpustack_runtime/__init__.py,sha256=Xw_PVWneitx-8QmW6sJQeymj6zVbEgEndGhIB_km6TI,186
2
2
  gpustack_runtime/__main__.py,sha256=O9yJKcN7vg0Ppgc13qesxHwST2wkH3ccOkTQXPWHnNA,3939
3
- gpustack_runtime/_version.py,sha256=Vvw3zQNp4FXvAmZn_g3ZyhEUudGslUaT_mMkqwv_Tdg,777
3
+ gpustack_runtime/_version.py,sha256=-eNQZIno4AwtazIKHw4i1RxKHZxM9dKoQseocEVcMq0,792
4
4
  gpustack_runtime/_version.pyi,sha256=A42NoSgcqEXVy2OeNm4LXC9CbyonbooYrSUBlPm2lGY,156
5
5
  gpustack_runtime/envs.py,sha256=gkr30NnIq3USzSYvbW6ipf8tKdbXx-BrDcY3-4Oc-Hg,38894
6
6
  gpustack_runtime/logging.py,sha256=wMPriPpOuVsuClsjMh0qwEPQKyJiJa89ggdDjqkk7i0,6934
7
7
  gpustack_runtime/cmds/__init__.py,sha256=-_X2O2lBn6KcdLGUzhL3lEjQC4_cwA36fvWDnFAgtVM,1382
8
8
  gpustack_runtime/cmds/__types__.py,sha256=TBnUWUqzTkDtJnsMv363kdw-H8fOf-XQYbOvrmQif-M,815
9
9
  gpustack_runtime/cmds/deployer.py,sha256=KvhPhU6ZW-UV6vLykI5adKI1ThgVFFJqWaII3n4OhL8,32846
10
- gpustack_runtime/cmds/detector.py,sha256=2ORRF53q3goyYRB4T8gu3X8u0VZ4v0xeEndJqtuktyQ,8872
10
+ gpustack_runtime/cmds/detector.py,sha256=dFIo1d8dBh8v7JhisXAx-EqqOSLobcuwsJcO-obUh9c,8905
11
11
  gpustack_runtime/cmds/images.py,sha256=7tb-D3G4yqLPkbS9aSuWI1bD3DYK8BLbPbgqac56blI,594
12
12
  gpustack_runtime/deployer/__init__.py,sha256=impMrmvkMjuCBthsn3QUz3LuwpmmNAymHJKJ2o6SZoc,16249
13
13
  gpustack_runtime/deployer/__patches__.py,sha256=cTBge8BT6IsY5MzETKY3kN28k3igYfNj7pcpgDzfDzw,17849
14
14
  gpustack_runtime/deployer/__types__.py,sha256=J2YX8X7EYY_56_L9WL5YMmdsyJ572uOIhMoHCVjPaog,72469
15
15
  gpustack_runtime/deployer/__utils__.py,sha256=paQu2M1UeoSfQPsiskmAqJSiln-8qwibTssEoWFMLec,21109
16
- gpustack_runtime/deployer/docker.py,sha256=e48conm3gfu8dlwcIhvTvM5NhlhdgKlvk6Ix8xGYVeI,81448
16
+ gpustack_runtime/deployer/docker.py,sha256=o8Fyc25kLYBOOqN2rDctmxrkQ67oaA8J3lXSRuDAN08,83107
17
17
  gpustack_runtime/deployer/kuberentes.py,sha256=-G7eYuqTDDi3T9u2Jqr6j0Ut-8vkP5u2lxzSyDx0EWM,86776
18
- gpustack_runtime/deployer/podman.py,sha256=9lo4AvXzD3HUteY17-Fuz9A0ItScPb_D1tweDgm7PVo,79090
19
- gpustack_runtime/deployer/cdi/__init__.py,sha256=2wHrxkud3GJokE3ytNc3jvjddemXkNuuz_oIKzxD3-I,4000
20
- gpustack_runtime/deployer/cdi/__types__.py,sha256=04DKvcogk7OoHS7TU2Bmht3VVMu7iOEBWTEOvxpHt4w,18399
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
21
  gpustack_runtime/deployer/cdi/__utils__.py,sha256=CAYUv76akZiHJYZO_VY0NXKhEI2jrP7G3OgvQa8Pg4U,4050
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=kvjsDx_8kNt3h8a5MOx5A7qPvqRsk1amvFr_ZYDA1l0,10931
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
29
  gpustack_runtime/deployer/k8s/deviceplugin/__types__.py,sha256=LCkgPDZ64Mra7bo5jmtsAO2Ypbc4qK99lMl6R_nQhnY,3043
30
- gpustack_runtime/deployer/k8s/deviceplugin/plugin.py,sha256=20eUDvM_SBFCi5WDR3AfyDJpnL7CJxxcPdW4p626I_M,17671
30
+ gpustack_runtime/deployer/k8s/deviceplugin/plugin.py,sha256=E4gNvsi2aPAeVM5vWlXpvO4ecmQu951pPzzxPaIaAv8,17829
31
31
  gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/__init__.py,sha256=3rOYmgDIIJ4idEtwgnumGStH7PaK-J7EYrOnLa9A-8o,118
32
32
  gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/api.proto,sha256=rmB8RDe4LN5FCVkQ608uS-pl32mk5tt6iGe-g2lKtPs,7919
33
33
  gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/api_pb2.py,sha256=dNkzjTE-2y25q8NF0QRznNJ5r1-5ZxxJS598MHbjx98,45998
@@ -36,21 +36,21 @@ gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/api_pb2_grpc.py
36
36
  gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/constants.py,sha256=tpNk3e_cvY67C9RwVsdTNl75YuNXBgsn53fSJIzeTR4,828
37
37
  gpustack_runtime/detector/__init__.py,sha256=2GaczS5lWLuPsighvq7oPhlPFQSUJfBKLAliXPfl4i0,8162
38
38
  gpustack_runtime/detector/__types__.py,sha256=ZiKuYZb0jeXqzyTCUWTDppoHnRmkaZuljAWbnR_ohX8,13626
39
- gpustack_runtime/detector/__utils__.py,sha256=QdLWXwsU1_EMxXG5Y29psqnttWJyXWMphHDjiC_6Byc,25153
40
- gpustack_runtime/detector/amd.py,sha256=ywJMDKFnmF2REdJc1F8_zGYK6O4K0o5xh5eqWU-X2EE,18294
41
- gpustack_runtime/detector/ascend.py,sha256=a6QRnJfXdyU2tyGiiUKy0fgsp6NF652Zr2fFQgVg1Xw,19470
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
42
  gpustack_runtime/detector/cambricon.py,sha256=5AXILG9NAMYiWjaLRZ5h8lXtFk7FLC7LB_aFQz0ZtYU,4102
43
- gpustack_runtime/detector/hygon.py,sha256=3AcHBlPXTFiH0JQ0VS_xZcqjX-FXy-cdle6Nc-rNj5w,12795
44
- gpustack_runtime/detector/iluvatar.py,sha256=klFl5H607w8ksTvYSt21QkHMRzzeg-TkJKfoh9CMzqc,10551
45
- gpustack_runtime/detector/metax.py,sha256=P24WiqK2Ngjpu6AQt0Fp1wEVNra2Xgs-C8JAAwpYews,10801
46
- gpustack_runtime/detector/mthreads.py,sha256=mwNdsc42nebnSJMPFo6ue1tbiOwHmvPw6dF2CrLwdIQ,12714
47
- gpustack_runtime/detector/nvidia.py,sha256=oD3HUPfYWXRIRZ87iidNTW2Tg8CTVNIJh8qW1Z3HBO4,34535
48
- gpustack_runtime/detector/thead.py,sha256=hIRtlZNPa7xzAT0W_2XgFiDVH3YHSGi8NqCdaFaqQcA,26818
49
- gpustack_runtime/detector/pyacl/__init__.py,sha256=UQjaBxP7nJNyzr08N8_lH-5wPtnFmUY9pyQhs6vIChU,16232
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
50
  gpustack_runtime/detector/pyamdgpu/__init__.py,sha256=x-UO07EpKEgfTLmXQOD6j9f6kibuvDC7riQFof3YGdw,8617
51
51
  gpustack_runtime/detector/pyamdsmi/__init__.py,sha256=800-khq2w6HLgXM12RkhcdvXBGeAJ4s1_TWJyHebCMk,955
52
52
  gpustack_runtime/detector/pycuda/__init__.py,sha256=p-Na5eBjdsFGXPHCEEUfFj5TQFjPxPQGV0i4oU6ywBA,16922
53
- gpustack_runtime/detector/pydcmi/__init__.py,sha256=zCeImelWgbPDn51dJgp3LlCK-uGOuHmmPGiOsyYB3cI,37264
53
+ gpustack_runtime/detector/pydcmi/__init__.py,sha256=63FoyTLAdJRUBUJ86CVONpO0Q15kvEhaEH_kN4qqrdo,37314
54
54
  gpustack_runtime/detector/pyhgml/__init__.py,sha256=Yp9s-QhHS4ck7Iq9kd4v6a4BruyJQcuOTYlyYSmnOgI,182896
55
55
  gpustack_runtime/detector/pyhgml/libhgml.so,sha256=BPzGVBpzrMX1tSvbXddq8Q0Qhi8w-No2JXX8sRxTioI,2101640
56
56
  gpustack_runtime/detector/pyhgml/libuki.so,sha256=EE6v1vIYYT4FSDMMm9rSfAqwrwIPFD-4_6KtP51lSps,702352
@@ -59,9 +59,9 @@ gpustack_runtime/detector/pyixml/__init__.py,sha256=2YmNoYhcIvc4CbRZgORM9o-GKdQ6
59
59
  gpustack_runtime/detector/pymxsml/__init__.py,sha256=YxfNHq7TWd7CpNroP45BGXhcWNpY_sXgVzNGtx68DII,45409
60
60
  gpustack_runtime/detector/pyrocmcore/__init__.py,sha256=rgwIdPS-7GG7_5luRMR1XG9QyNM3lJh5ryD7kfZqpWg,2523
61
61
  gpustack_runtime/detector/pyrocmsmi/__init__.py,sha256=Gk4pTadOMzLCZJvQJ2S1N_1ivogtYokfVPHj_9Y874Y,12286
62
- gpustack_runtime/_version_appendix.py,sha256=2B6zFAHFYbVzMJ1w6ZW4XpqNz2XaMa-cAueeeQ4OfJk,23
63
- gpustack_runtime-0.1.42.dist-info/METADATA,sha256=sUS5YnNvheiK-tDT-rGSzuOKrOIFIKKhUBH1Jxc7lPE,2358
64
- gpustack_runtime-0.1.42.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
65
- gpustack_runtime-0.1.42.dist-info/entry_points.txt,sha256=bBO_61GxP6dIT74uZwbSDgW5Vt2pTePUS3CgjUJkUgg,68
66
- gpustack_runtime-0.1.42.dist-info/licenses/LICENSE,sha256=OiPibowBvB-NHV3TP_NOj18XNBlXcshXZFMpa3uvKVE,10362
67
- gpustack_runtime-0.1.42.dist-info/RECORD,,
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,,