I want to get the cpu usage during testing for my ML model (during a call to predict). Here is currently what I am doing. p is the current process:
start = p.cpu_percent(interval=1)
y_hat = clf.predict(X_test)
print(abs(p.cpu_percent(interval=None) - start)) # prints cpu usage (%)
Is this the correct approach or is there a better way to achieve this?
Assuming you want to do this within your program with a builtin, Python's resource module might be of use to you here. psutil is a good option (as suggested by Federico) if you're able to install packages.
Outside your program, there are many ways to get CPU usage of an arbitrary process. If you're on *nux and prefer the command line, top and similar commands should do the job. On a graphical interface, I personally prefer KSysGuard (I'm on Kubuntu). Gnome System Monitor works as well. On Windows, the Task Manager should suffice.
EDIT: psutil seems to return global usages. If you only wanted the usage of your process you'd be better off with resource or os.times, but if you want total CPU utilization (including other processes) psutil is a more robust solution.
For CPU times in resource:
import resource
resource.getrusage()[0]  # Returns the time in seconds in user mode
# Note that this time accumulates while the program runs,
# so you might want to save its previous value each time you take a measurement
Using psutil is suggested to use psutil.virtual_memory().
import psutil
mem = psutil.virtual_memory()
print(mem)
svmem(total=10367352832, available=6472179712, percent=37.6, used=8186245120, free=2181107712, active=4748992512, inactive=2758115328, buffers=790724608, cached=3500347392, shared=787554304, slab=199348224)
THRESHOLD = 100 * 1024 * 1024  # 100MB
if mem.available <= THRESHOLD:
     print("warning")
# you can convert that object to a dictionary 
dict(psutil.virtual_memory()._asdict())
psutil.cpu_times(percpu=False) Return system CPU times as a named tuple.
 import psutil
 print(psutil.cpu_times())
 #scputimes(user=17411.7, nice=77.99, system=3797.02, idle=51266.57, iowait=732.58,      irq=0.01, softirq=142.43, steal=0.0, guest=0.0, guest_nice=0.0)
os.times() Returns the current global process times. The return value is an object with five attributes
import os 
 curr_gp_times = os.times()      
 print(curr_gp_times) 
 # posix.times_result(user=0.03, system=0.01, children_user=0.0, children_system=0.0, elapsed=17370844.95)
EDIT This may be closer to what you are looking for:
psutil.cpu_times(percpu=False) Return system CPU times as a named tuple. Every attribute represents the seconds the CPU has spent in the given mode.
user: time spent by normal processes executing in user mode; on Linux this also includes guest time
system: time spent by processes executing in kernel mode
idle: time spent doing nothing
  import psutil
  psutil.cpu_times()
  # scputimes(user=17411.7, nice=77.99, system=3797.02, idle=51266.57, iowait=732.58, irq=0.01, softirq=142.43, steal=0.0, guest=0.0, guest_nice=0.0)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With