gpustack-runtime 0.2.5.post1__tar.gz → 0.2.5.post3__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 (154) hide show
  1. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/PKG-INFO +1 -1
  2. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/_version.py +2 -2
  3. gpustack_runtime-0.2.5.post3/gpustack_runtime/_version_appendix.py +1 -0
  4. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/deployer/__init__.py +4 -4
  5. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/deployer/cdi/ascend.py +19 -3
  6. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/deployer/docker.py +1 -1
  7. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/deployer/kuberentes.py +31 -5
  8. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/deployer/podman.py +1 -1
  9. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/deployer/test_ascend_ranktable.py +1 -3
  10. gpustack_runtime-0.2.5.post3/tests/gpustack_runtime/deployer/test_logs_options.py +210 -0
  11. gpustack_runtime-0.2.5.post1/gpustack_runtime/_version_appendix.py +0 -1
  12. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/.codespelldict +0 -0
  13. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/.codespellrc +0 -0
  14. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/.dockerignore +0 -0
  15. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/.gitattributes +0 -0
  16. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/.gitignore +0 -0
  17. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/.pre-commit-config.yaml +0 -0
  18. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/.python-version +0 -0
  19. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/LICENSE +0 -0
  20. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/Makefile +0 -0
  21. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/README.md +0 -0
  22. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/deploy/manifests/docker-compose.yaml +0 -0
  23. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/deploy/manifests/kubernetes.yaml +0 -0
  24. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/docs/index.md +0 -0
  25. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/docs/modules/gpustack_runtime.deployer.md +0 -0
  26. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/docs/modules/gpustack_runtime.detector.md +0 -0
  27. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/docs/modules/gpustack_runtime.md +0 -0
  28. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/__init__.py +0 -0
  29. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/__main__.py +0 -0
  30. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/_version.pyi +0 -0
  31. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/cmds/__init__.py +0 -0
  32. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/cmds/__types__.py +0 -0
  33. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/cmds/deployer.py +0 -0
  34. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/cmds/detector.py +0 -0
  35. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/cmds/images.py +0 -0
  36. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/deployer/__patches__.py +0 -0
  37. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/deployer/__types__.py +0 -0
  38. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/deployer/__utils__.py +0 -0
  39. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/deployer/cdi/__init__.py +0 -0
  40. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/deployer/cdi/__types__.py +0 -0
  41. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/deployer/cdi/__utils__.py +0 -0
  42. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/deployer/cdi/amd.py +0 -0
  43. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/deployer/cdi/hygon.py +0 -0
  44. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/deployer/cdi/iluvatar.py +0 -0
  45. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/deployer/cdi/metax.py +0 -0
  46. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/deployer/cdi/thead.py +0 -0
  47. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/deployer/k8s/devicemanager/__init__.py +0 -0
  48. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/__init__.py +0 -0
  49. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/__types__.py +0 -0
  50. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/__utils__.py +0 -0
  51. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/amd.py +0 -0
  52. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/ascend.py +0 -0
  53. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/cambricon.py +0 -0
  54. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/hygon.py +0 -0
  55. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/iluvatar.py +0 -0
  56. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/metax.py +0 -0
  57. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/mthreads.py +0 -0
  58. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/nvidia.py +0 -0
  59. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/pyamdgpu/__init__.py +0 -0
  60. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/pyamdsmi/__init__.py +0 -0
  61. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/pycndev/__init__.py +0 -0
  62. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/pydcmi/__init__.py +0 -0
  63. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/pydmi/__init__.py +0 -0
  64. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/pyhgml/__init__.py +0 -0
  65. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/pyhgml/libhgml.so +0 -0
  66. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/pyhgml/libuki.so +0 -0
  67. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/pyhsa/__init__.py +0 -0
  68. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/pyixml/__init__.py +0 -0
  69. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/pymtml/__init__.py +0 -0
  70. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/pymxsml/__init__.py +0 -0
  71. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/pynvml/__init__.py +0 -0
  72. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/pyrocmsmi/__init__.py +0 -0
  73. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/detector/thead.py +0 -0
  74. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/envs.py +0 -0
  75. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/gpustack_runtime/logging.py +0 -0
  76. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/hatch.toml +0 -0
  77. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/mkdocs.yml +0 -0
  78. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/pack/Dockerfile +0 -0
  79. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/pack/Dockerfile.dummy +0 -0
  80. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/pyproject.toml +0 -0
  81. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/pytest.ini +0 -0
  82. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/ruff.toml +0 -0
  83. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/specs/2026-08-14-detector-alignment-and-workload-exit-status.md +0 -0
  84. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/deployer/fixtures/__init__.py +0 -0
  85. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/deployer/fixtures/test_compare_versions.json +0 -0
  86. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/deployer/fixtures/test_correct_runner_image.json +0 -0
  87. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/deployer/fixtures/test_load_yaml_or_json.json +0 -0
  88. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/deployer/fixtures/test_load_yaml_or_json_multiple_jsons.json +0 -0
  89. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/deployer/fixtures/test_load_yaml_or_json_multiple_yamls.yaml +0 -0
  90. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/deployer/fixtures/test_load_yaml_or_json_single_json.json +0 -0
  91. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/deployer/fixtures/test_load_yaml_or_json_single_yaml.yaml +0 -0
  92. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/deployer/fixtures/test_nginx_entrypoint.sh +0 -0
  93. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/deployer/test_docker_status.py +0 -0
  94. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/deployer/test_kubernetes_status.py +0 -0
  95. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/deployer/test_podman_status.py +0 -0
  96. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/deployer/test_privileged.py +0 -0
  97. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/deployer/test_resource_injection_policy.py +0 -0
  98. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/deployer/test_runtime_class.py +0 -0
  99. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/deployer/test_termination_grace_period.py +0 -0
  100. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/deployer/test_utils.py +0 -0
  101. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/deployer/test_visible_devices_ordering.py +0 -0
  102. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/deployer/test_workload_status.py +0 -0
  103. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/fixtures/__init__.py +0 -0
  104. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/README.md +0 -0
  105. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/detect_output_amd_mi300x.json +0 -0
  106. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/detect_output_amd_mi308x.json +0 -0
  107. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/detect_output_amd_rx7800xt.json +0 -0
  108. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/detect_output_ascend_310p3.json +0 -0
  109. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/detect_output_ascend_910b2.json +0 -0
  110. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/detect_output_hygon_k100ai.json +0 -0
  111. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/detect_output_metax_c500.json +0 -0
  112. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/detect_output_nvidia_gb10.json +0 -0
  113. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/detect_output_nvidia_h100.json +0 -0
  114. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/detect_output_nvidia_h100_mig.json +0 -0
  115. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/detect_output_nvidia_h200.json +0 -0
  116. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/detect_output_nvidia_rtx4080super.json +0 -0
  117. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/detect_output_nvidia_rtx4090_48g.json +0 -0
  118. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/detect_output_nvidia_rtx4090d.json +0 -0
  119. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/detect_output_nvidia_rtx5090d.json +0 -0
  120. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/detect_output_thead_ppu.json +0 -0
  121. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/topology_output_amd_mi300x.json +0 -0
  122. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/topology_output_amd_mi308x.json +0 -0
  123. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/topology_output_amd_rx7800xt.json +0 -0
  124. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/topology_output_ascend_310p3.json +0 -0
  125. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/topology_output_ascend_910b2.json +0 -0
  126. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/topology_output_hygon_k100ai.json +0 -0
  127. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/topology_output_metax_c500.json +0 -0
  128. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/topology_output_mthreads_s5000.json +0 -0
  129. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/topology_output_nvidia_h100.json +0 -0
  130. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/topology_output_nvidia_h100_mig.json +0 -0
  131. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/topology_output_nvidia_h200.json +0 -0
  132. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/topology_output_nvidia_rtx4080super.json +0 -0
  133. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/topology_output_nvidia_rtx4090_48g.json +0 -0
  134. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/topology_output_nvidia_rtx4090d.json +0 -0
  135. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/topology_output_nvidia_rtx5090d.json +0 -0
  136. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/samples/topology_output_thead_ppu.json +0 -0
  137. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/test_amd.py +0 -0
  138. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/test_ascend.py +0 -0
  139. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/test_cambricon.py +0 -0
  140. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/test_detector_cli.py +0 -0
  141. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/test_detector_types.py +0 -0
  142. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/test_detector_utils.py +0 -0
  143. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/test_hygon.py +0 -0
  144. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/test_iluvatar.py +0 -0
  145. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/test_metax.py +0 -0
  146. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/test_mig_devices.py +0 -0
  147. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/test_mthreads.py +0 -0
  148. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/test_nvidia.py +0 -0
  149. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/test_pycndev.py +0 -0
  150. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/test_pydmi.py +0 -0
  151. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/test_samples.py +0 -0
  152. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/tests/gpustack_runtime/detector/test_thead.py +0 -0
  153. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/uv.lock +0 -0
  154. {gpustack_runtime-0.2.5.post1 → gpustack_runtime-0.2.5.post3}/uv.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: gpustack-runtime
3
- Version: 0.2.5.post1
3
+ Version: 0.2.5.post3
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.2.5.post1'
31
- __version_tuple__ = version_tuple = (0, 2, 5, 'post1')
30
+ __version__ = version = '0.2.5.post3'
31
+ __version_tuple__ = version_tuple = (0, 2, 5, 'post3')
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 = "327b2fb"
@@ -245,7 +245,7 @@ def logs_workload(
245
245
  tail:
246
246
  The number of lines from the end of the logs to show.
247
247
  since:
248
- Show logs since a given time (in seconds).
248
+ Show logs since the given epoch in seconds.
249
249
  follow:
250
250
  Whether to follow the logs.
251
251
 
@@ -300,7 +300,7 @@ async def async_logs_workload(
300
300
  tail:
301
301
  The number of lines from the end of the logs to show.
302
302
  since:
303
- Show logs since a given time (in seconds).
303
+ Show logs since the given epoch in seconds.
304
304
  follow:
305
305
  Whether to follow the logs.
306
306
 
@@ -434,7 +434,7 @@ def logs_self(
434
434
  tail:
435
435
  The number of lines from the end of the logs to show.
436
436
  since:
437
- Show logs since a given time (in seconds).
437
+ Show logs since the given epoch in seconds.
438
438
  follow:
439
439
  Whether to follow the logs.
440
440
 
@@ -479,7 +479,7 @@ async def async_logs_self(
479
479
  tail:
480
480
  The number of lines from the end of the logs to show.
481
481
  since:
482
- Show logs since a given time (in seconds).
482
+ Show logs since the given epoch in seconds.
483
483
  follow:
484
484
  Whether to follow the logs.
485
485
 
@@ -43,6 +43,24 @@ mindcluster-tools and mounted only when present, see
43
43
  https://gitcode.com/Ascend/mind-cluster/blob/master/docs/en/scheduling/references/appendix.md.
44
44
  """
45
45
 
46
+ _ASCEND_DRIVER_PATH = "/usr/local/Ascend/driver"
47
+ """
48
+ The host driver tree, injected whole rather than as the three subdirectories
49
+ the libraries and the topology file sit in.
50
+
51
+ What the wider mount adds is hccn_tool: a transport that builds Device RoCE
52
+ endpoints reads each NPU's NIC address through it, and a container holding the
53
+ driver libraries but not the tool cannot open that transport at all -- it
54
+ fails with "Failed to get device ip from hccn.conf and hccn_tool" and every
55
+ process that opens it dies at startup. Reading the addresses out of
56
+ /etc/hccn.conf instead works too, but only on a host that keeps them there,
57
+ while the tool answers from the driver on every host that has one.
58
+
59
+ The driver belongs to the host on every Ascend containerization path -- the
60
+ image supplies the toolkit -- so injecting more of it shadows nothing a
61
+ container ships with its own image.
62
+ """
63
+
46
64
  _A5_RANKTABLE_VERSION = "2.0"
47
65
  """
48
66
  The ranktable version the A5 generation requires.
@@ -160,9 +178,7 @@ class AscendGenerator(Generator):
160
178
 
161
179
  mount_paths = [
162
180
  _HCCL_RANKTABLE_PATH,
163
- "/usr/local/Ascend/driver/topo",
164
- "/usr/local/Ascend/driver/lib64",
165
- "/usr/local/Ascend/driver/include",
181
+ _ASCEND_DRIVER_PATH,
166
182
  "/usr/local/dcmi",
167
183
  "/usr/local/bin/npu-smi",
168
184
  "/var/queue_schedule",
@@ -2105,7 +2105,7 @@ class DockerDeployer(EndoscopicDeployer):
2105
2105
 
2106
2106
  logs_options = {
2107
2107
  "timestamps": timestamps,
2108
- "tail": tail if tail >= 0 else None,
2108
+ "tail": tail if tail is not None and tail >= 0 else None,
2109
2109
  "since": since,
2110
2110
  "follow": follow,
2111
2111
  }
@@ -3,8 +3,10 @@ from __future__ import annotations as __future_annotations__
3
3
  import contextlib
4
4
  import json
5
5
  import logging
6
+ import math
6
7
  import os
7
8
  import re
9
+ import time
8
10
  from dataclasses import dataclass, field
9
11
  from datetime import datetime, timezone
10
12
  from decimal import Decimal
@@ -710,6 +712,30 @@ def _resolve_privileged(container: Container, kdp: bool) -> bool:
710
712
  return True
711
713
 
712
714
 
715
+ def to_since_seconds(since: int | None) -> int | None:
716
+ """
717
+ Convert an absolute epoch into the relative duration the Kubernetes API takes.
718
+
719
+ Every deployer reads `since` as an absolute epoch in seconds, but the
720
+ Kubernetes client only exposes `sinceSeconds`, counted back from now.
721
+ Rounding up and adding a second keeps the requested instant inside the
722
+ window instead of just outside it; the caller sees a couple of seconds of
723
+ older lines rather than a gap. The result is always positive, as the API
724
+ ignores a zero or negative duration.
725
+
726
+ Args:
727
+ since:
728
+ The absolute epoch in seconds, or None for no lower bound.
729
+
730
+ Returns:
731
+ The relative duration in seconds, or None if since is None.
732
+
733
+ """
734
+ if since is None:
735
+ return None
736
+ return max(1, math.ceil(time.time() - since) + 1)
737
+
738
+
713
739
  class KubernetesDeployer(EndoscopicDeployer):
714
740
  """
715
741
  Deployer implementation for Kubernetes.
@@ -2439,7 +2465,7 @@ class KubernetesDeployer(EndoscopicDeployer):
2439
2465
  tail:
2440
2466
  Number of lines from the end of the logs to retrieve.
2441
2467
  since:
2442
- Only return logs newer than a relative duration in seconds.
2468
+ Show logs since the given epoch in seconds.
2443
2469
  follow:
2444
2470
  Whether to stream the logs.
2445
2471
 
@@ -2477,8 +2503,8 @@ class KubernetesDeployer(EndoscopicDeployer):
2477
2503
 
2478
2504
  logs_options = {
2479
2505
  "timestamps": timestamps,
2480
- "tail_lines": tail if tail >= 0 else None,
2481
- "since_seconds": since,
2506
+ "tail_lines": tail if tail is not None and tail >= 0 else None,
2507
+ "since_seconds": to_since_seconds(since),
2482
2508
  "follow": follow,
2483
2509
  "_preload_content": not follow,
2484
2510
  }
@@ -2691,8 +2717,8 @@ class KubernetesDeployer(EndoscopicDeployer):
2691
2717
 
2692
2718
  logs_options = {
2693
2719
  "timestamps": timestamps,
2694
- "tail_lines": tail if tail >= 0 else None,
2695
- "since_seconds": since,
2720
+ "tail_lines": tail if tail is not None and tail >= 0 else None,
2721
+ "since_seconds": to_since_seconds(since),
2696
2722
  "follow": follow,
2697
2723
  "_preload_content": not follow,
2698
2724
  }
@@ -2046,7 +2046,7 @@ class PodmanDeployer(EndoscopicDeployer):
2046
2046
 
2047
2047
  logs_options = {
2048
2048
  "timestamps": timestamps,
2049
- "tail": tail if tail >= 0 else None,
2049
+ "tail": tail if tail is not None and tail >= 0 else None,
2050
2050
  "since": since,
2051
2051
  "follow": follow,
2052
2052
  }
@@ -79,9 +79,7 @@ def test_a5_omits_the_host_ranktable():
79
79
  targets = _mount_targets(cfg)
80
80
  assert cdi_ascend._HCCL_RANKTABLE_PATH not in targets
81
81
  # The rest of the vendor's named list is untouched.
82
- assert "/usr/local/Ascend/driver/topo" in targets
83
- assert "/usr/local/Ascend/driver/lib64" in targets
84
- assert "/usr/local/Ascend/driver/include" in targets
82
+ assert cdi_ascend._ASCEND_DRIVER_PATH in targets
85
83
  assert "/usr/local/dcmi" in targets
86
84
  assert "/usr/local/bin/npu-smi" in targets
87
85
 
@@ -0,0 +1,210 @@
1
+ # The cases below drive the deployers' own log path, which is where the log
2
+ # options become observable without a live Docker daemon, Podman socket or
3
+ # Kubernetes cluster. `since` is an absolute epoch in seconds for every
4
+ # deployer; only Kubernetes has to translate it, because its API takes a
5
+ # relative duration. `tail` has to survive its own declared default.
6
+ # ruff: noqa: SLF001
7
+
8
+ from types import SimpleNamespace
9
+
10
+ import kubernetes.client
11
+ import pytest
12
+
13
+ from gpustack_runtime.deployer.docker import (
14
+ _LABEL_COMPONENT_INDEX as _DOCKER_LABEL_COMPONENT_INDEX,
15
+ )
16
+ from gpustack_runtime.deployer.docker import (
17
+ DockerDeployer,
18
+ )
19
+ from gpustack_runtime.deployer.kuberentes import (
20
+ KubernetesDeployer,
21
+ to_since_seconds,
22
+ )
23
+ from gpustack_runtime.deployer.podman import (
24
+ _LABEL_COMPONENT_INDEX as _PODMAN_LABEL_COMPONENT_INDEX,
25
+ )
26
+ from gpustack_runtime.deployer.podman import (
27
+ PodmanDeployer,
28
+ )
29
+
30
+ _COMPONENT_INDEX_LABELS = {
31
+ DockerDeployer: _DOCKER_LABEL_COMPONENT_INDEX,
32
+ PodmanDeployer: _PODMAN_LABEL_COMPONENT_INDEX,
33
+ }
34
+
35
+ NOW = 1_700_000_000
36
+
37
+
38
+ @pytest.fixture
39
+ def frozen_now(monkeypatch):
40
+ monkeypatch.setattr(
41
+ "gpustack_runtime.deployer.kuberentes.time.time",
42
+ lambda: float(NOW),
43
+ )
44
+
45
+
46
+ class _FakeCoreV1LogApi:
47
+ """
48
+ Stand-in for the Kubernetes core API, recording the log calls it receives.
49
+ """
50
+
51
+ def __init__(self, journal: list):
52
+ self.journal = journal
53
+
54
+ def __call__(self, client=None):
55
+ return self
56
+
57
+ def read_namespaced_pod_log(self, **kwargs):
58
+ self.journal.append(kwargs)
59
+ return b""
60
+
61
+
62
+ def _kubernetes_deployer(monkeypatch, journal: list) -> SimpleNamespace:
63
+ monkeypatch.setattr(
64
+ kubernetes.client,
65
+ "CoreV1Api",
66
+ _FakeCoreV1LogApi(journal),
67
+ )
68
+ pod = kubernetes.client.V1Pod(
69
+ metadata=kubernetes.client.V1ObjectMeta(name="test", namespace="default"),
70
+ spec=kubernetes.client.V1PodSpec(
71
+ containers=[kubernetes.client.V1Container(name="run")],
72
+ ),
73
+ )
74
+ return SimpleNamespace(
75
+ is_supported=lambda: True,
76
+ get=lambda **_kwargs: SimpleNamespace(_k_pod=pod),
77
+ _client=None,
78
+ _find_self_pod_for_endoscopy=lambda: pod,
79
+ )
80
+
81
+
82
+ class _FakeContainer:
83
+ """
84
+ Stand-in for a Docker or Podman container, recording its log calls.
85
+ """
86
+
87
+ def __init__(self, journal: list):
88
+ self.journal = journal
89
+ self.labels = {}
90
+ self.id = "cid"
91
+ self.short_id = "cid"
92
+
93
+ def logs(self, **kwargs):
94
+ self.journal.append(kwargs)
95
+ return b""
96
+
97
+
98
+ def _container_deployer(journal: list, deployer) -> SimpleNamespace:
99
+ container = _FakeContainer(journal)
100
+ # The component index label is how both deployers pick the loggable container.
101
+ container.labels = {_COMPONENT_INDEX_LABELS[deployer]: "0"}
102
+ return SimpleNamespace(
103
+ is_supported=lambda: True,
104
+ get=lambda **_kwargs: SimpleNamespace(_d_containers=[container]),
105
+ _find_self_container_for_endoscopy=lambda: container,
106
+ )
107
+
108
+
109
+ @pytest.mark.parametrize(
110
+ "deployer",
111
+ [DockerDeployer, PodmanDeployer],
112
+ )
113
+ def test_container_logs_forward_the_epoch_verbatim(deployer):
114
+ # Docker and Podman both take an absolute epoch, so `since` passes through.
115
+ journal = []
116
+ dep = _container_deployer(journal, deployer)
117
+
118
+ deployer._logs(dep, name="test", tail=-1, since=NOW - 90)
119
+
120
+ assert journal[0]["since"] == NOW - 90
121
+
122
+
123
+ @pytest.mark.usefixtures("frozen_now")
124
+ def test_kubernetes_logs_convert_the_epoch_to_a_relative_duration(monkeypatch):
125
+ # The Kubernetes API counts back from now, so the same absolute epoch has to
126
+ # become a duration. Rounding up and adding a second keeps the requested
127
+ # instant inside the window rather than just outside it.
128
+ journal = []
129
+ dep = _kubernetes_deployer(monkeypatch, journal)
130
+
131
+ KubernetesDeployer._logs(dep, name="test", tail=-1, since=NOW - 90)
132
+
133
+ assert journal[0]["since_seconds"] == 91
134
+
135
+
136
+ @pytest.mark.usefixtures("frozen_now")
137
+ def test_kubernetes_endoscopic_logs_convert_the_epoch_too(monkeypatch):
138
+ # The deployer's own logs travel the same API and must not diverge.
139
+ journal = []
140
+ dep = _kubernetes_deployer(monkeypatch, journal)
141
+
142
+ KubernetesDeployer._endoscopic_logs(dep, tail=-1, since=NOW - 90)
143
+
144
+ assert journal[0]["since_seconds"] == 91
145
+
146
+
147
+ # Every way into the log path: each deployer serves both a workload and, in
148
+ # mirrored deployment, itself.
149
+ _ENTRY_POINTS = [
150
+ (DockerDeployer, "_logs", {"name": "test"}),
151
+ (DockerDeployer, "_endoscopic_logs", {}),
152
+ (PodmanDeployer, "_logs", {"name": "test"}),
153
+ (PodmanDeployer, "_endoscopic_logs", {}),
154
+ (KubernetesDeployer, "_logs", {"name": "test"}),
155
+ (KubernetesDeployer, "_endoscopic_logs", {}),
156
+ ]
157
+
158
+
159
+ def _entry_deployer(monkeypatch, journal: list, deployer) -> SimpleNamespace:
160
+ if deployer is KubernetesDeployer:
161
+ return _kubernetes_deployer(monkeypatch, journal)
162
+ return _container_deployer(journal, deployer)
163
+
164
+
165
+ @pytest.mark.parametrize("deployer, method, kwargs", _ENTRY_POINTS)
166
+ def test_an_unset_since_stays_unset(monkeypatch, deployer, method, kwargs):
167
+ # No lower bound must reach the API as no lower bound, not as "now".
168
+ journal = []
169
+ dep = _entry_deployer(monkeypatch, journal, deployer)
170
+
171
+ getattr(deployer, method)(dep, tail=-1, since=None, **kwargs)
172
+
173
+ key = "since_seconds" if deployer is KubernetesDeployer else "since"
174
+ assert journal[0][key] is None
175
+
176
+
177
+ @pytest.mark.parametrize("deployer, method, kwargs", _ENTRY_POINTS)
178
+ def test_the_declared_tail_default_reaches_the_api(
179
+ monkeypatch,
180
+ deployer,
181
+ method,
182
+ kwargs,
183
+ ):
184
+ # `tail` defaults to None, which has to mean "all lines" rather than blow up
185
+ # on a comparison against an integer.
186
+ journal = []
187
+ dep = _entry_deployer(monkeypatch, journal, deployer)
188
+
189
+ getattr(deployer, method)(dep, since=None, **kwargs)
190
+
191
+ key = "tail_lines" if deployer is KubernetesDeployer else "tail"
192
+ assert journal[0][key] is None
193
+
194
+
195
+ @pytest.mark.parametrize(
196
+ "since, expected",
197
+ [
198
+ # A whole minute back is a whole minute plus the safety second.
199
+ (NOW - 60, 61),
200
+ # The current second still has to ask for a positive duration.
201
+ (NOW, 1),
202
+ # A cursor ahead of the node's clock must not become a negative or zero
203
+ # duration, which the API rejects.
204
+ (NOW + 30, 1),
205
+ (None, None),
206
+ ],
207
+ )
208
+ @pytest.mark.usefixtures("frozen_now")
209
+ def test_to_since_seconds_never_returns_a_non_positive_duration(since, expected):
210
+ assert to_since_seconds(since) == expected
@@ -1 +0,0 @@
1
- git_commit = "55bbd00"