У меня сейчас две проблемы.
Во-первых, я пытаюсь привести вывод в порядок. Что касается цикла, я хочу вывод в том же порядке. Я думал об использовании multiprocessing.pool, но не знаю, как добавить Pool в этот код.
Во-вторых, я написал код, который может прервать многопроцессорность, когда я прерываю с помощью "ctrl + c". Иногда это работает, но иногда возникает следующая ошибка:
Во время обработки вышеуказанного исключения произошло другое исключение:
Traceback (последний вызов был последним):
Файл "/home/minds/anaconda3/lib/python3.7/multiprocessing/process.py", строка 300, в _bootstrap
util._exit_function ()
Файл "/home/minds/anaconda3/lib/python3.7/multiprocessing/util.py", строка 299, в _exit_function
_run_finalizers (0)
Файл "/home/minds/anaconda3/lib/python3.7/multiprocessing/util.py", строка 249, в _run_finalizers
f = лямбда p: p [0] не является None и p [0]> = minpriority
Файл "gpu_monitoring_multiprocessing.py", строка 65, в service_shutdown
поднять ServiceExit
ServiceExit
from pynvml import *
import multiprocessing
import signal
class Monitor(multiprocessing.Process):
def __init__(self, device_id, logger=None):
multiprocessing.Process.__init__(self)
self.device_id = device_id
self.logger = logger
self.exit = multiprocessing.Event()
def run(self):
nvmlInit()
handle = nvmlDeviceGetHandleByIndex(self.device_id)
usage = nvmlDeviceGetUtilizationRates(handle)
gpu_util = 0
memory_util = 0
j = 0
while not self.exit.is_set():
while j < 100:
gpu_util += usage.gpu
memory_util += usage.memory
j += 1
time.sleep(0.01)
if j == 100:
self.logger.info("device_id : {}".format(str(self.device_id)))
self.logger.info("gpu_utility : {}".format(str(gpu_util / j)))
self.logger.info("memory_utility : {}".format(str(memory_util / j)))
self.logger.info("---------------------------------------------\n")
gpu_util = 0
memory_util = 0
j = 0
break
def shutdown(self):
print("Shutdown Initiated")
self.exit.set()
class ServiceExit(Exception):
pass
def service_shutdown(signum, frame):
raise ServiceExit
def main():
ini = utils.get_ini_parameters(INI_FNAME)
logger = utils.setup_logger_with_ini(ini['LOGGER'], logging_=True, console_=True)
signal.signal(signal.SIGTERM, service_shutdown)
signal.signal(signal.SIGINT, service_shutdown)
logger.info(" # START {}".format(_this_basename_))
process = []
nvmlInit()
deviceCount = nvmlDeviceGetCount()
logger.info("Total GPU: {}\n".format(deviceCount))
try:
for i in range(deviceCount):
monitor = Monitor(i, logger)
monitor.daemon = True
process.append(monitor)
#
# processes = [mp.Process(target=func, args=(a, b)) for (a, b) in list]
# for p in processes: p.start()
# for p in processes: p.join()
#
for i in range(deviceCount):
process[i].start()
while True:
time.sleep(0.5)
except ServiceExit:
for i in range(deviceCount):
process[i].terminate()
# process[i].shutdown()
for i in range(deviceCount):
process[i].join()
print("--------------------------------------")
except Exception as e:
print(e)
if __name__ == "__main__":
main()
Я ожидаю, что результат будет
device_id: 0
gpu_utility: 16,0
memory_utility: 5,0
device_id: 1
gpu_utility: 16,0
memory_utility: 5,0
device_id: 2
gpu_utility: 16,0
memory_utility: 5,0
device_id: 3
gpu_utility: 16,0
memory_utility: 5,0
device_id: 4
gpu_utility: 16,0
memory_utility: 5,0
что-то вроде этого в каждом цикле, пока я не прерву "Ctrl + C"