@@ -107,6 +107,15 @@ def temperature(self):
107
107
v = self .entry ['temperature.gpu' ]
108
108
return int (v ) if v is not None else None
109
109
110
+ @property
111
+ def fan (self ):
112
+ """
113
+ Returns the fan percentage of GPU as an integer,
114
+ or None if the information is not available.
115
+ """
116
+ v = self .entry ['fan.speed' ]
117
+ return int (v ) if v is not None else None
118
+
110
119
@property
111
120
def utilization (self ):
112
121
"""
@@ -147,6 +156,7 @@ def print_to(self, fp,
147
156
show_user = False ,
148
157
show_pid = False ,
149
158
show_power = None ,
159
+ show_fan = None ,
150
160
gpuname_width = 16 ,
151
161
term = Terminal (),
152
162
):
@@ -165,6 +175,8 @@ def _conditional(cond_fn, true_value, false_value,
165
175
colors ['CName' ] = term .blue
166
176
colors ['CTemp' ] = _conditional (lambda : self .temperature < 50 ,
167
177
term .red , term .bold_red )
178
+ colors ['FSpeed' ] = _conditional (lambda : self .fan < 50 ,
179
+ term .yellow , term .bold_yellow )
168
180
colors ['CMemU' ] = term .bold_yellow
169
181
colors ['CMemT' ] = term .yellow
170
182
colors ['CMemP' ] = term .yellow
@@ -189,8 +201,12 @@ def _repr(v, none_value='??'):
189
201
# temperature and utilization
190
202
reps = "%(C1)s[{entry[index]}]%(C0)s " \
191
203
"%(CName)s{entry[name]:{gpuname_width}}%(C0)s |" \
192
- "%(CTemp)s{entry[temperature.gpu]:>3}'C%(C0)s, " \
193
- "%(CUtil)s{entry[utilization.gpu]:>3} %%%(C0)s"
204
+ "%(CTemp)s{entry[temperature.gpu]:>3}'C%(C0)s, "
205
+
206
+ if show_fan :
207
+ reps += "%(FSpeed)s{entry[fan.speed]:>3} %%%(C0)s, "
208
+
209
+ reps += "%(CUtil)s{entry[utilization.gpu]:>3} %%%(C0)s"
194
210
195
211
if show_power :
196
212
reps += ", %(CPowU)s{entry[power.draw]:>3}%(C0)s "
@@ -300,6 +316,11 @@ def get_process_info(nv_process):
300
316
except N .NVMLError :
301
317
temperature = None # Not supported
302
318
319
+ try :
320
+ fan_speed = N .nvmlDeviceGetFanSpeed (handle )
321
+ except N .NVMLError :
322
+ fan_speed = None # Not supported
323
+
303
324
try :
304
325
memory = N .nvmlDeviceGetMemoryInfo (handle ) # in Bytes
305
326
except N .NVMLError :
@@ -354,6 +375,7 @@ def get_process_info(nv_process):
354
375
'uuid' : uuid ,
355
376
'name' : name ,
356
377
'temperature.gpu' : temperature ,
378
+ 'fan.speed' : fan_speed ,
357
379
'utilization.gpu' : utilization .gpu if utilization else None ,
358
380
'power.draw' : power // 1000 if power is not None else None ,
359
381
'enforced.power.limit' : power_limit // 1000
@@ -403,7 +425,7 @@ def __repr__(self):
403
425
404
426
def print_formatted (self , fp = sys .stdout , force_color = False , no_color = False ,
405
427
show_cmd = False , show_user = False , show_pid = False ,
406
- show_power = None , gpuname_width = 16 ,
428
+ show_power = None , show_fan = None , gpuname_width = 16 ,
407
429
show_header = True ,
408
430
eol_char = os .linesep ,
409
431
** kwargs
@@ -453,6 +475,7 @@ def print_formatted(self, fp=sys.stdout, force_color=False, no_color=False,
453
475
show_user = show_user ,
454
476
show_pid = show_pid ,
455
477
show_power = show_power ,
478
+ show_fan = show_fan ,
456
479
gpuname_width = gpuname_width ,
457
480
term = t_color )
458
481
fp .write (eol_char )
0 commit comments