Почему BasicEngine.RunInference застревает в дочернем процессе
Я пытаюсь выполнить метод RunInference объекта BasicEngine в отдельном процессе, используя многопроцессорный модуль. Похоже, он зашел в тупик, но я не знаю почему. Моя конечная цель - получить профиль использования процессора методом RunInference.
Я пытаюсь запустить его на RaspberryPi3B+ с Coral Accelerator и Python 3.5. Метод RunInference правильно выполняется, когда BasicEngine создается в том же процессе.
from edgetpu.classification.engine import BasicEngine
import random
import numpy as np
import psutil
import time
import multiprocessing as mp
#Code inspired from https://stackru.com/questions/49197916/how-to-profile-cpu-usage-of-a-python-script
def run_on_another_process(target, args=(), kwargs={}):
worker_process = mp.Process(target=target, args=args, kwargs=kwargs)
worker_process.start()
p = psutil.Process(worker_process.pid)
while worker_process.is_alive():
#Do something in the parent, e.g., measure the CPU percentage
print("[Parent] CPU PERCENT: " + str(p.cpu_percent()))
time.sleep(0.1)
worker_process.join()
#Loading model
model_path = "<path_to_model>/inception_v1_224_quant_edgetpu.tflite"
engine = BasicEngine(model_path)
print("Engine and model ready!")
#Prepare data
input_size = engine.required_input_array_size()
data = np.array([random.randint(0, 255) for _ in range(input_size)], dtype=np.uint8)
#Infernce on another process
run_on_another_process(engine.RunInference, args=(data,))
Метод выглядит как в тупике. Если я запускаю KeybordInterrupt, я получаю эти ошибки:
Traceback (most recent call last):
File "/<path_to_script>/script.py", line 31, in <module>
run_on_another_process(lambda data: engine.RunInference(data), args=(data,))
File "/<path_to_script>/script.py", line 17, in run_on_another_process
time.sleep(0.1)
KeyboardInterrupt
Тогда я получаю
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
File "/usr/lib/python3.5/multiprocessing/popen_fork.py", line 29, in poll
pid, sts = os.waitpid(self.pid, flag)
KeyboardInterrupt
Любая помощь будет очень полезна!
Редактировать № 1:
Ниже приведен рабочий пример, когда методы BasicEngine и RunInference вызываются в одном и том же процессе. Родительский процесс печатает ограниченное количество сообщений.
from edgetpu.classification.engine import BasicEngine
import random
import numpy as np
import psutil
import time
import multiprocessing as mp
def child_func():
#Loading model
model_path = "<path_to_model>/inception_v1_224_quant_edgetpu.tflite"
engine = BasicEngine(model_path)
print("[Child] Engine and model ready!")
#Prepare data
input_size = engine.required_input_array_size()
data = np.array([random.randint(0, 255) for _ in range(input_size)], dtype=np.uint8)
engine.RunInference(data)
def run_on_another_process(target, args=(), kwargs={}):
worker_process = mp.Process(target=target, args=args, kwargs=kwargs)
worker_process.start()
p = psutil.Process(worker_process.pid)
while worker_process.is_alive():
#Do something in the parent, e.g., measure the CPU percentage
print("[Parent] CPU PERCENT: " + str(p.cpu_percent()))
time.sleep(0.1)
worker_process.join()
#Run on another process
run_on_another_process(child_func)