@@ -135,17 +135,29 @@ def persistence_mode(self, new_mode):
135
135
raise ValueError (
136
136
"Illegal value for persistence mode, should be either 0 or 1"
137
137
)
138
- pynvml .nvmlDeviceSetPersistenceMode (self .dev , new_mode )
139
- self ._persistence_mode = pynvml .nvmlDeviceGetPersistenceMode (self .dev )
138
+ try :
139
+ pynvml .nvmlDeviceSetPersistenceMode (self .dev , new_mode )
140
+ self ._persistence_mode = pynvml .nvmlDeviceGetPersistenceMode (self .dev )
141
+ except pynvml .NVMLError_NoPermission :
142
+ args = [
143
+ "sudo" ,
144
+ self .nvidia_smi ,
145
+ "-pm" ,
146
+ str (new_mode ),
147
+ ]
148
+ subprocess .run (args , check = True )
149
+ self ._persistence_mode = pynvml .nvmlDeviceGetPersistenceMode (self .dev )
140
150
141
151
def set_clocks (self , mem_clock , gr_clock ):
142
152
"""Set the memory and graphics clock for this device (may require permission)."""
143
- self .modified_clocks = True
144
153
if mem_clock not in self .supported_mem_clocks :
145
154
raise ValueError ("Illegal value for memory clock" )
146
155
if gr_clock not in self .supported_gr_clocks [mem_clock ]:
147
156
raise ValueError (f"Graphics clock incompatible with memory clock ({ mem_clock } ), compatible graphics clocks: { self .supported_gr_clocks [mem_clock ]} " )
157
+ self .modified_clocks = True
148
158
if self .use_locked_clocks :
159
+ if self .persistence_mode != 1 :
160
+ self .persistence_mode = 1
149
161
try :
150
162
pynvml .nvmlDeviceSetGpuLockedClocks (self .dev , gr_clock , gr_clock )
151
163
pynvml .nvmlDeviceSetMemoryLockedClocks (self .dev , mem_clock , mem_clock )
@@ -168,6 +180,11 @@ def set_clocks(self, mem_clock, gr_clock):
168
180
]
169
181
subprocess .run (args , check = True )
170
182
else :
183
+ try :
184
+ if self .persistence_mode != 0 :
185
+ self .persistence_mode = 0
186
+ except Exception :
187
+ pass
171
188
try :
172
189
pynvml .nvmlDeviceSetApplicationsClocks (self .dev , mem_clock , gr_clock )
173
190
except pynvml .NVMLError_NoPermission :
0 commit comments