11import { execCommand } from './utils' ;
22
33export type GPUUtilization = {
4+ clockSpeed : {
5+ /** Current frequency of the graphics (shaders) clock in MHz. */
6+ graphics ?: number ;
7+
8+ /** Current frequency of the memory clock in MHz. */
9+ memory ?: number ;
10+
11+ /** Current frequency of the streaming multiprocessor clock in MHz. */
12+ sm ?: number ;
13+
14+ /** Current frequency of the video encoder/decoder clock in MHz. */
15+ video ?: number ;
16+ } ;
17+
418 /** GPU memory utilization as a percentage (0.0-1.0). */
519 memory ?: number ;
620
@@ -21,6 +35,18 @@ export type GPUUtilization = {
2135} ;
2236
2337export type GPU = {
38+ /** Maximum clock speed of the GPU. */
39+ clockMaxSpeed ?: {
40+ /** Maximum frequency of the graphics (shaders) clock in MHz. */
41+ graphics ?: number ;
42+
43+ /** Maximum frequency of the memory clock in MHz. */
44+ memory ?: number ;
45+
46+ /** Maximum frequency of the streaming multiprocessor clock in MHz. */
47+ sm ?: number ;
48+ } ;
49+
2450 /** Unique ID of the GPU device. */
2551 id : string ;
2652
@@ -128,14 +154,15 @@ export async function getGPUs(): Promise<GPU[]> {
128154 // nvidia-smi for more detailed info
129155 {
130156 const output = await execCommand (
131- 'nvidia-smi --query-gpu=name,display_attached,display_active,fan.speed,memory.total,utilization.gpu,utilization.memory,temperature.gpu,temperature.memory,power.draw --format=csv,nounits,noheader' ,
157+ 'nvidia-smi --query-gpu=name,index, display_attached,display_active,fan.speed,memory.total,utilization.gpu,utilization.memory,temperature.gpu,temperature.memory,power.draw,clocks.current.graphics,clocks.current.sm,clocks.current.memory,clocks.current.memory,clocks.max.graphics,clocks.max.sm,clocks.max.memory --format=csv,nounits,noheader' ,
132158 ) . catch ( ( ) => '' ) ;
133159 const lines = output . split ( '\n' ) . filter ( ( line ) => line . trim ( ) !== '' ) ;
134160 const updatedIndexes = new Set < number > ( ) ;
135161 // tslint:disable-next-line:prefer-for-of
136162 for ( let i = 0 ; i < lines . length ; i ++ ) {
137163 const [
138164 name ,
165+ index ,
139166 displayAttached ,
140167 displayActive ,
141168 fanSpeed ,
@@ -145,6 +172,13 @@ export async function getGPUs(): Promise<GPU[]> {
145172 temperatureGPU ,
146173 temperatureMemory ,
147174 powerDraw ,
175+ clocksCurrentGraphics ,
176+ clocksCurrentSM ,
177+ clocksCurrentMemory ,
178+ clocksCurrentVideo ,
179+ clocksMaxGraphics ,
180+ clocksMaxSM ,
181+ clocksMaxMemory ,
148182 ] = lines [ i ] . split ( ',' ) . map ( ( s ) => s . trim ( ) ) ;
149183 let currIdx = gpus . length ;
150184 let currGpu : GPU | undefined = undefined ;
@@ -162,6 +196,7 @@ export async function getGPUs(): Promise<GPU[]> {
162196 updatedIndexes . add ( gpus . length ) ;
163197 gpus . push ( currGpu ) ;
164198 }
199+ if ( index . toString ( ) . length > 0 ) currGpu . index = parseInt ( index , 10 ) ;
165200 if ( displayAttached ) currGpu . displayAttached = [ 'yes' , 'enabled' , '1' ] . includes ( displayAttached . toLowerCase ( ) ) ;
166201 if ( displayActive ) currGpu . displayActive = [ 'yes' , 'enabled' , '1' ] . includes ( displayActive . toLowerCase ( ) ) ;
167202 if ( fanSpeed && ! Number . isNaN ( parseFloat ( fanSpeed ) ) ) {
@@ -190,6 +225,38 @@ export async function getGPUs(): Promise<GPU[]> {
190225 if ( ! currGpu . utilization ) currGpu . utilization = { } as GPUUtilization ;
191226 currGpu . utilization . powerDraw = parseFloat ( powerDraw ) ;
192227 }
228+ if ( clocksCurrentGraphics && ! Number . isNaN ( parseInt ( clocksCurrentGraphics , 10 ) ) ) {
229+ if ( ! currGpu . utilization ) currGpu . utilization = { } as GPUUtilization ;
230+ if ( ! currGpu . utilization . clockSpeed ) currGpu . utilization . clockSpeed = { } ;
231+ currGpu . utilization . clockSpeed . graphics = parseInt ( clocksCurrentGraphics , 10 ) ;
232+ }
233+ if ( clocksCurrentMemory && ! Number . isNaN ( parseInt ( clocksCurrentMemory , 10 ) ) ) {
234+ if ( ! currGpu . utilization ) currGpu . utilization = { } as GPUUtilization ;
235+ if ( ! currGpu . utilization . clockSpeed ) currGpu . utilization . clockSpeed = { } ;
236+ currGpu . utilization . clockSpeed . memory = parseInt ( clocksCurrentMemory , 10 ) ;
237+ }
238+ if ( clocksCurrentSM && ! Number . isNaN ( parseInt ( clocksCurrentSM , 10 ) ) ) {
239+ if ( ! currGpu . utilization ) currGpu . utilization = { } as GPUUtilization ;
240+ if ( ! currGpu . utilization . clockSpeed ) currGpu . utilization . clockSpeed = { } ;
241+ currGpu . utilization . clockSpeed . sm = parseInt ( clocksCurrentSM , 10 ) ;
242+ }
243+ if ( clocksCurrentVideo && ! Number . isNaN ( parseInt ( clocksCurrentVideo , 10 ) ) ) {
244+ if ( ! currGpu . utilization ) currGpu . utilization = { } as GPUUtilization ;
245+ if ( ! currGpu . utilization . clockSpeed ) currGpu . utilization . clockSpeed = { } ;
246+ currGpu . utilization . clockSpeed . video = parseInt ( clocksCurrentVideo , 10 ) ;
247+ }
248+ if ( clocksMaxGraphics && ! Number . isNaN ( parseInt ( clocksMaxGraphics , 10 ) ) ) {
249+ if ( ! currGpu . clockMaxSpeed ) currGpu . clockMaxSpeed = { } ;
250+ currGpu . clockMaxSpeed . graphics = parseInt ( clocksMaxGraphics , 10 ) ;
251+ }
252+ if ( clocksMaxMemory && ! Number . isNaN ( parseInt ( clocksMaxMemory , 10 ) ) ) {
253+ if ( ! currGpu . clockMaxSpeed ) currGpu . clockMaxSpeed = { } ;
254+ currGpu . clockMaxSpeed . memory = parseInt ( clocksMaxMemory , 10 ) ;
255+ }
256+ if ( clocksMaxSM && ! Number . isNaN ( parseInt ( clocksMaxSM , 10 ) ) ) {
257+ if ( ! currGpu . clockMaxSpeed ) currGpu . clockMaxSpeed = { } ;
258+ currGpu . clockMaxSpeed . sm = parseInt ( clocksMaxSM , 10 ) ;
259+ }
193260 gpus [ currIdx ] = currGpu ;
194261 }
195262 }
0 commit comments