resources.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from .memory import transform_memory, TOTAL_MEM
  2. from .cpu import transform_cpu, CPU_COUNT
  3. def migrate_resources(resources, gpus=None, system_gpus=None):
  4. gpus = gpus or {}
  5. system_gpus = system_gpus or []
  6. result = {
  7. "limits": {
  8. "cpus": int((CPU_COUNT or 2) / 2),
  9. "memory": int(TOTAL_MEM / 1024 / 1024),
  10. }
  11. }
  12. if resources.get("limits", {}).get("cpu", ""):
  13. result["limits"].update(
  14. {"cpus": transform_cpu(resources.get("limits", {}).get("cpu", ""))}
  15. )
  16. if resources.get("limits", {}).get("memory", ""):
  17. result["limits"].update(
  18. {"memory": transform_memory(resources.get("limits", {}).get("memory", ""))}
  19. )
  20. gpus_result = {}
  21. for gpu in gpus.items() if gpus else []:
  22. kind = gpu[0].lower() # Kind of gpu (amd, nvidia, intel)
  23. count = gpu[1] # Number of gpus user requested
  24. if count == 0:
  25. continue
  26. if "amd" in kind or "intel" in kind:
  27. gpus_result.update({"use_all_gpus": True})
  28. elif "nvidia" in kind:
  29. sys_gpus = [
  30. gpu_item
  31. for gpu_item in system_gpus
  32. if gpu_item.get("error") is None
  33. and gpu_item.get("vendor", None) is not None
  34. and gpu_item.get("vendor", "").upper() == "NVIDIA"
  35. ]
  36. for sys_gpu in sys_gpus:
  37. if count == 0: # We passed # of gpus that user previously requested
  38. break
  39. guid = sys_gpu.get("vendor_specific_config", {}).get("uuid", "")
  40. pci_slot = sys_gpu.get("pci_slot", "")
  41. if not guid or not pci_slot:
  42. continue
  43. gpus_result.update(
  44. {"nvidia_gpu_selection": {pci_slot: {"uuid": guid, "use_gpu": True}}}
  45. )
  46. count -= 1
  47. if gpus_result:
  48. result.update({"gpus": gpus_result})
  49. return result