sysinfo.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import json
  2. import os
  3. import sys
  4. import platform
  5. import hashlib
  6. import pkg_resources
  7. import psutil
  8. import re
  9. import launch
  10. from modules import paths_internal, timer, shared, extensions, errors
  11. checksum_token = "DontStealMyGamePlz__WINNERS_DONT_USE_DRUGS__DONT_COPY_THAT_FLOPPY"
  12. environment_whitelist = {
  13. "GIT",
  14. "INDEX_URL",
  15. "WEBUI_LAUNCH_LIVE_OUTPUT",
  16. "GRADIO_ANALYTICS_ENABLED",
  17. "PYTHONPATH",
  18. "TORCH_INDEX_URL",
  19. "TORCH_COMMAND",
  20. "REQS_FILE",
  21. "XFORMERS_PACKAGE",
  22. "CLIP_PACKAGE",
  23. "OPENCLIP_PACKAGE",
  24. "ASSETS_REPO",
  25. "STABLE_DIFFUSION_REPO",
  26. "K_DIFFUSION_REPO",
  27. "BLIP_REPO",
  28. "ASSETS_COMMIT_HASH",
  29. "STABLE_DIFFUSION_COMMIT_HASH",
  30. "K_DIFFUSION_COMMIT_HASH",
  31. "BLIP_COMMIT_HASH",
  32. "COMMANDLINE_ARGS",
  33. "IGNORE_CMD_ARGS_ERRORS",
  34. }
  35. def pretty_bytes(num, suffix="B"):
  36. for unit in ["", "K", "M", "G", "T", "P", "E", "Z", "Y"]:
  37. if abs(num) < 1024 or unit == 'Y':
  38. return f"{num:.0f}{unit}{suffix}"
  39. num /= 1024
  40. def get():
  41. res = get_dict()
  42. text = json.dumps(res, ensure_ascii=False, indent=4)
  43. h = hashlib.sha256(text.encode("utf8"))
  44. text = text.replace(checksum_token, h.hexdigest())
  45. return text
  46. re_checksum = re.compile(r'"Checksum": "([0-9a-fA-F]{64})"')
  47. def check(x):
  48. m = re.search(re_checksum, x)
  49. if not m:
  50. return False
  51. replaced = re.sub(re_checksum, f'"Checksum": "{checksum_token}"', x)
  52. h = hashlib.sha256(replaced.encode("utf8"))
  53. return h.hexdigest() == m.group(1)
  54. def get_dict():
  55. ram = psutil.virtual_memory()
  56. res = {
  57. "Platform": platform.platform(),
  58. "Python": platform.python_version(),
  59. "Version": launch.git_tag(),
  60. "Commit": launch.commit_hash(),
  61. "Script path": paths_internal.script_path,
  62. "Data path": paths_internal.data_path,
  63. "Extensions dir": paths_internal.extensions_dir,
  64. "Checksum": checksum_token,
  65. "Commandline": get_argv(),
  66. "Torch env info": get_torch_sysinfo(),
  67. "Exceptions": errors.get_exceptions(),
  68. "CPU": {
  69. "model": platform.processor(),
  70. "count logical": psutil.cpu_count(logical=True),
  71. "count physical": psutil.cpu_count(logical=False),
  72. },
  73. "RAM": {
  74. x: pretty_bytes(getattr(ram, x, 0)) for x in ["total", "used", "free", "active", "inactive", "buffers", "cached", "shared"] if getattr(ram, x, 0) != 0
  75. },
  76. "Extensions": get_extensions(enabled=True),
  77. "Inactive extensions": get_extensions(enabled=False),
  78. "Environment": get_environment(),
  79. "Config": get_config(),
  80. "Startup": timer.startup_record,
  81. "Packages": sorted([f"{pkg.key}=={pkg.version}" for pkg in pkg_resources.working_set]),
  82. }
  83. return res
  84. def get_environment():
  85. return {k: os.environ[k] for k in sorted(os.environ) if k in environment_whitelist}
  86. def get_argv():
  87. res = []
  88. for v in sys.argv:
  89. if shared.cmd_opts.gradio_auth and shared.cmd_opts.gradio_auth == v:
  90. res.append("<hidden>")
  91. continue
  92. if shared.cmd_opts.api_auth and shared.cmd_opts.api_auth == v:
  93. res.append("<hidden>")
  94. continue
  95. res.append(v)
  96. return res
  97. re_newline = re.compile(r"\r*\n")
  98. def get_torch_sysinfo():
  99. try:
  100. import torch.utils.collect_env
  101. info = torch.utils.collect_env.get_env_info()._asdict()
  102. return {k: re.split(re_newline, str(v)) if "\n" in str(v) else v for k, v in info.items()}
  103. except Exception as e:
  104. return str(e)
  105. def get_extensions(*, enabled):
  106. try:
  107. def to_json(x: extensions.Extension):
  108. return {
  109. "name": x.name,
  110. "path": x.path,
  111. "version": x.version,
  112. "branch": x.branch,
  113. "remote": x.remote,
  114. }
  115. return [to_json(x) for x in extensions.extensions if not x.is_builtin and x.enabled == enabled]
  116. except Exception as e:
  117. return str(e)
  118. def get_config():
  119. try:
  120. return shared.opts.data
  121. except Exception as e:
  122. return str(e)