Advertisement
Guest User

report-gpu-utilization

a guest
Feb 9th, 2016
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.00 KB | None | 0 0
  1. #!/usr/bin/python
  2.  
  3. import subprocess
  4. import sys
  5. import re
  6. import syslog
  7. import time
  8.  
  9. #  Globals
  10. nvidia_smi_headers_regexp = '.*?Timestamp *: ([^\n]*)(.*)'
  11. nvidia_smi_stanzas_regexp = '.*?Process ID *: (\d+).*?GPU Utilization *: (\d+).*?Memory Utilization *: (\d+)(.*)'
  12. proc_pid_environ_regexp = '(?:^|\0)JOB_ID=(\d+)'
  13. verboselevel = 2
  14. syslog_opened_flag = False
  15.  
  16. def main():
  17.     global nvidia_smi_regexp
  18.  
  19.     #  Run nvidia-smi
  20.     nvidia_smi_output = subprocess.Popen("nvidia-smi -q -d ACCOUNTING", stdout=subprocess.PIPE, shell=True).communicate(None)[0]
  21.  
  22.     #  Extract time and convert to timestamp and preserve rest of output.
  23.     m = re.search(nvidia_smi_headers_regexp, nvidia_smi_output, flags=re.MULTILINE|re.DOTALL)
  24.     timestamp = int(time.mktime(time.strptime(m.group(1))))
  25.     nvidia_smi_output = m.group(2)
  26.  
  27.     #  Chop up GPU stanzas, deriving SGE job ID and extracting utilisation values and
  28.     #  displaying values.
  29.     while True:
  30.         m = re.search(nvidia_smi_stanzas_regexp, nvidia_smi_output, flags=re.MULTILINE|re.DOTALL)
  31.         if m is None:
  32.             break
  33.         pid               = int(m.group(1))
  34.         gpu_utilisation   = int(m.group(2))
  35.         mem_utilisation   = int(m.group(3))
  36.         nvidia_smi_output = m.group(4)
  37.         jobid             = pid2jobid(pid)
  38.         sys.stdout.write('%d,%d,%d,%d\n' % (timestamp, jobid, gpu_utilisation, mem_utilisation))
  39.        
  40. #  Support functions
  41. def pid2jobid(pid):
  42.     global proc_pid_environ_regexp
  43.     f = open('/proc/%d/environ' % (pid)).read()
  44.     m = re.search(proc_pid_environ_regexp, f, flags=re.MULTILINE|re.DOTALL)
  45.     jobid = int(m.group(1))
  46.     debug(10, 'pid2jobid: pid=%d, jobid=%d' % (pid, jobid))
  47.     return(jobid)
  48.  
  49. #  Messaging functions
  50. def debug(level, text):
  51.     global verboselevel
  52.     if verboselevel < level:
  53.         return
  54.     msg_writer("DEBUG[%s]: %s" % (level, text), syslog.LOG_ERR)
  55.  
  56. def info(text):
  57.     global verboselevel
  58.     if verboselevel < 3:
  59.         return
  60.     msg_writer("INFO: %s" % (text), syslog.LOG_ERR)
  61.  
  62. def warning(level, text):
  63.     global verboselevel
  64.     if verboselevel < 2:
  65.         return
  66.     msg_writer("WARNING: %s" % (text), syslog.LOG_ERR)
  67.  
  68. def error(text):
  69.     msg_writer("ERROR: %s" % (text), syslog.LOG_ERR)
  70.     sys.exit(1)
  71.  
  72. def msg_writer(text, syslog_level):
  73.     msg_writer_stderr(text)
  74.     msg_writer_syslog(text, syslog_level)
  75.  
  76. def msg_writer_stderr(text):
  77.     global progname
  78.     sys.stderr.write('%s: %s\n' % (progname, text))
  79.  
  80. def msg_writer_syslog(text, syslog_level):
  81.     global syslog_opened_flag, progname
  82.     if not syslog_opened_flag:
  83.         if sys.version_info < (2, 7):
  84.             syslog.openlog(progname, syslog.LOG_PID)
  85.         else:
  86.             syslog.openlog(progname, logoption=syslog.LOG_PID)
  87.         syslog_opened_flag = True
  88.     syslog.syslog((syslog.LOG_LOCAL0|syslog_level), text)
  89.  
  90. #  This code is for debugging and unit testing
  91. if __name__ == '__main__':
  92.     progname = sys.argv[0].rpartition("/")[2]
  93.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement