gpustack-runtime 0.1.42__tar.gz → 0.1.42.post1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/PKG-INFO +1 -1
  2. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/_version.py +2 -2
  3. gpustack_runtime-0.1.42.post1/gpustack_runtime/_version_appendix.py +1 -0
  4. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/cmds/detector.py +1 -1
  5. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/cdi/__init__.py +1 -1
  6. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/cdi/__types__.py +2 -2
  7. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/cdi/amd.py +6 -8
  8. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/cdi/ascend.py +7 -9
  9. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/cdi/hygon.py +6 -8
  10. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/cdi/iluvatar.py +6 -8
  11. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/cdi/metax.py +6 -8
  12. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/cdi/thead.py +6 -8
  13. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/docker.py +29 -3
  14. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/k8s/deviceplugin/__init__.py +12 -7
  15. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/k8s/deviceplugin/plugin.py +6 -2
  16. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/podman.py +29 -3
  17. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/__utils__.py +3 -0
  18. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/amd.py +4 -2
  19. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/ascend.py +18 -9
  20. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/hygon.py +6 -2
  21. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/iluvatar.py +9 -7
  22. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/metax.py +8 -6
  23. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/mthreads.py +11 -8
  24. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/nvidia.py +11 -8
  25. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/pyacl/__init__.py +34 -14
  26. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/pydcmi/__init__.py +4 -2
  27. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/thead.py +12 -9
  28. gpustack_runtime-0.1.42/gpustack_runtime/_version_appendix.py +0 -1
  29. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/.codespelldict +0 -0
  30. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/.codespellrc +0 -0
  31. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/.dockerignore +0 -0
  32. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/.gitattributes +0 -0
  33. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/.gitignore +0 -0
  34. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/.pre-commit-config.yaml +0 -0
  35. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/.python-version +0 -0
  36. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/LICENSE +0 -0
  37. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/Makefile +0 -0
  38. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/README.md +0 -0
  39. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/buf.gen.yaml +0 -0
  40. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/buf.lock +0 -0
  41. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/buf.yaml +0 -0
  42. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/deploy/manifests/docker-compose.yaml +0 -0
  43. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/deploy/manifests/kubernetes.yaml +0 -0
  44. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/docs/index.md +0 -0
  45. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/docs/modules/gpustack_runtime.deployer.md +0 -0
  46. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/docs/modules/gpustack_runtime.detector.md +0 -0
  47. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/docs/modules/gpustack_runtime.md +0 -0
  48. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/__init__.py +0 -0
  49. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/__main__.py +0 -0
  50. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/_version.pyi +0 -0
  51. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/cmds/__init__.py +0 -0
  52. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/cmds/__types__.py +0 -0
  53. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/cmds/deployer.py +0 -0
  54. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/cmds/images.py +0 -0
  55. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/__init__.py +0 -0
  56. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/__patches__.py +0 -0
  57. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/__types__.py +0 -0
  58. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/__utils__.py +0 -0
  59. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/cdi/__utils__.py +0 -0
  60. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/k8s/deviceplugin/__types__.py +0 -0
  61. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/__init__.py +0 -0
  62. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/api.proto +0 -0
  63. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/api_pb2.py +0 -0
  64. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/api_pb2.pyi +0 -0
  65. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/api_pb2_grpc.py +0 -0
  66. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/k8s/types/kubelet/deviceplugin/v1beta1/constants.py +0 -0
  67. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/deployer/kuberentes.py +0 -0
  68. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/__init__.py +0 -0
  69. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/__types__.py +0 -0
  70. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/cambricon.py +0 -0
  71. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/pyamdgpu/__init__.py +0 -0
  72. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/pyamdsmi/__init__.py +0 -0
  73. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/pycuda/__init__.py +0 -0
  74. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/pyhgml/__init__.py +0 -0
  75. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/pyhgml/libhgml.so +0 -0
  76. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/pyhgml/libuki.so +0 -0
  77. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/pyhsa/__init__.py +0 -0
  78. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/pyixml/__init__.py +0 -0
  79. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/pymxsml/__init__.py +0 -0
  80. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/pyrocmcore/__init__.py +0 -0
  81. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/detector/pyrocmsmi/__init__.py +0 -0
  82. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/envs.py +0 -0
  83. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/gpustack_runtime/logging.py +0 -0
  84. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/hatch.toml +0 -0
  85. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/mkdocs.yml +0 -0
  86. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/pack/Dockerfile +0 -0
  87. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/pack/Dockerfile.dummy +0 -0
  88. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/pyproject.toml +0 -0
  89. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/pytest.ini +0 -0
  90. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/ruff.toml +0 -0
  91. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/deployer/fixtures/__init__.py +0 -0
  92. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/deployer/fixtures/test_compare_versions.json +0 -0
  93. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/deployer/fixtures/test_correct_runner_image.json +0 -0
  94. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/deployer/fixtures/test_load_yaml_or_json.json +0 -0
  95. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/deployer/fixtures/test_load_yaml_or_json_multiple_jsons.json +0 -0
  96. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/deployer/fixtures/test_load_yaml_or_json_multiple_yamls.yaml +0 -0
  97. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/deployer/fixtures/test_load_yaml_or_json_single_json.json +0 -0
  98. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/deployer/fixtures/test_load_yaml_or_json_single_yaml.yaml +0 -0
  99. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/deployer/fixtures/test_nginx_entrypoint.sh +0 -0
  100. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/deployer/test_utils.py +0 -0
  101. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/fixtures/__init__.py +0 -0
  102. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/README.md +0 -0
  103. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/detect_output_amd_mi300x.json +0 -0
  104. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/detect_output_amd_mi308x.json +0 -0
  105. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/detect_output_amd_rx7800xt.json +0 -0
  106. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/detect_output_ascend_310p3.json +0 -0
  107. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/detect_output_ascend_910b2.json +0 -0
  108. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/detect_output_hygon_k100ai.json +0 -0
  109. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/detect_output_metax_c500.json +0 -0
  110. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/detect_output_nvidia_gb10.json +0 -0
  111. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/detect_output_nvidia_h100.json +0 -0
  112. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/detect_output_nvidia_h100_mig.json +0 -0
  113. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/detect_output_nvidia_h200.json +0 -0
  114. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/detect_output_nvidia_rtx4080super.json +0 -0
  115. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/detect_output_nvidia_rtx4090d.json +0 -0
  116. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/detect_output_nvidia_rtx5090d.json +0 -0
  117. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/detect_output_thead_ppu.json +0 -0
  118. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/topology_output_amd_mi300x.json +0 -0
  119. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/topology_output_amd_mi308x.json +0 -0
  120. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/topology_output_amd_rx7800xt.json +0 -0
  121. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/topology_output_ascend_310p3.json +0 -0
  122. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/topology_output_ascend_910b2.json +0 -0
  123. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/topology_output_hygon_k100ai.json +0 -0
  124. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/topology_output_metax_c500.json +0 -0
  125. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/topology_output_mthreads_s5000.json +0 -0
  126. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/topology_output_nvidia_h100.json +0 -0
  127. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/topology_output_nvidia_h100_mig.json +0 -0
  128. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/topology_output_nvidia_h200.json +0 -0
  129. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/topology_output_nvidia_rtx4080super.json +0 -0
  130. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/topology_output_nvidia_rtx4090d.json +0 -0
  131. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/topology_output_nvidia_rtx5090d.json +0 -0
  132. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/samples/topology_output_thead_ppu.json +0 -0
  133. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/test_amd.py +0 -0
  134. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/test_ascend.py +0 -0
  135. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/test_cambricon.py +0 -0
  136. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/test_hygon.py +0 -0
  137. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/test_iluvatar.py +0 -0
  138. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/test_metax.py +0 -0
  139. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/test_mthreads.py +0 -0
  140. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/tests/gpustack_runtime/detector/test_nvidia.py +0 -0
  141. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/uv.lock +0 -0
  142. {gpustack_runtime-0.1.42 → gpustack_runtime-0.1.42.post1}/uv.toml +0 -0
@@ -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
@@ -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
@@ -0,0 +1 @@
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