scheduler.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. from typing import List, Dict
  2. from gpustack.policies.base import ModelInstanceScheduleCandidate
  3. def compare_candidates( # noqa: C901
  4. candidates: List[ModelInstanceScheduleCandidate], expected_candidates: List[Dict]
  5. ):
  6. assert len(candidates) == len(
  7. expected_candidates
  8. ), f"Expected {len(expected_candidates)}, but got {len(candidates)}"
  9. for i, expected in enumerate(expected_candidates):
  10. actual = candidates[i]
  11. if "gpu_indexes" in expected:
  12. assert (
  13. actual.gpu_indexes == expected["gpu_indexes"]
  14. ), f"Expected gpu_indexes {expected['gpu_indexes']}, but got {actual.gpu_indexes}"
  15. if "gpu_type" in expected:
  16. assert (
  17. actual.gpu_type == expected["gpu_type"]
  18. ), f"Expected gpu_type {expected['gpu_type']}, but got {actual.gpu_type}"
  19. if "gpu_addresses" in expected:
  20. assert (
  21. actual.gpu_addresses == expected["gpu_addresses"]
  22. ), f"Expected gpu_addresses {expected['gpu_addresses']}, but got {actual.gpu_addresses}"
  23. if "vram" in expected:
  24. assert (
  25. actual.computed_resource_claim.vram == expected["vram"]
  26. ), f"Expected vram {expected['vram']}, but got {actual.computed_resource_claim.vram}"
  27. if "offload_layers" in expected:
  28. assert (
  29. actual.computed_resource_claim.offload_layers
  30. == expected["offload_layers"]
  31. ), f"Expected offload_layers {expected['offload_layers']}, but got {actual.computed_resource_claim.offload_layers}"
  32. if "worker_id" in expected:
  33. assert (
  34. actual.worker.id == expected["worker_id"]
  35. ), f"Expected worker_id {expected['worker_id']}, but got {actual.worker.id}"
  36. if "worker_name" in expected:
  37. assert (
  38. actual.worker.name == expected["worker_name"]
  39. ), f"Expected worker_name {expected['worker_name']}, but got {actual.worker.name}"
  40. if "is_unified_memory" in expected:
  41. assert (
  42. actual.computed_resource_claim.is_unified_memory
  43. == expected["is_unified_memory"]
  44. ), f"Expected is_unified_memory {expected['is_unified_memory']}, but got {actual.computed_resource_claim.is_unified_memory}"
  45. if "ram" in expected:
  46. assert (
  47. actual.computed_resource_claim.ram == expected["ram"]
  48. ), f"Expected ram {expected['ram']}, but got {actual.computed_resource_claim.ram}"
  49. if "score" in expected:
  50. assert actual.score is not None
  51. def truncate_2(value: float) -> float:
  52. return int(value * 100) / 100.0
  53. assert truncate_2(actual.score) == truncate_2(
  54. expected["score"]
  55. ), f"Expected score {expected['score']}, but got {actual.score}"
  56. if "subordinate_workers" in expected:
  57. for j, expected_subworker in enumerate(expected["subordinate_workers"]):
  58. actual_subworker = actual.subordinate_workers[j]
  59. assert (
  60. actual_subworker.worker_id == expected_subworker.worker_id
  61. ), f"Expected subordinate worker worker_id {expected_subworker.worker_id}, but got {actual_subworker.worker_id}"
  62. assert (
  63. actual_subworker.worker_ip == expected_subworker.worker_ip
  64. ), f"Expected subordinate worker worker_ip {expected_subworker.worker_ip}, but got {actual_subworker.worker_ip}"
  65. assert (
  66. actual_subworker.total_gpus == expected_subworker.total_gpus
  67. ), f"Expected subordinate worker total_gpus {expected_subworker.total_gpus}, but got {actual_subworker.total_gpus}"
  68. assert (
  69. actual_subworker.gpu_indexes == expected_subworker.gpu_indexes
  70. ), f"Expected subordinate worker gpu_indexes {expected_subworker.gpu_indexes}, but got {actual_subworker.gpu_indexes}"
  71. assert (
  72. actual_subworker.gpu_addresses == expected_subworker.gpu_addresses
  73. ), f"Expected subordinate worker gpu_addresses {expected_subworker.gpu_addresses}, but got {actual_subworker.gpu_addresses}"
  74. assert (
  75. actual_subworker.computed_resource_claim
  76. == expected_subworker.computed_resource_claim
  77. ), f"Expected subordinate worker computed_resource_claim {expected_subworker.computed_resource_claim}, but got {actual_subworker.computed_resource_claim}"
  78. if "tensor_split" in expected:
  79. assert (
  80. actual.computed_resource_claim.tensor_split == expected["tensor_split"]
  81. ), f"Expected tensor_split {expected['tensor_split']}, but got {actual.computed_resource_claim.tensor_split}"