Почему 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://stackoverflow.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)

person Mattia Antonini    schedule 01.07.2019    source источник
comment
Я попытался воспроизвести эту проблему. Для меня он постоянно печатает [Parent] CPU PERCENT: 0.0 . Это то, что вы имеете в виду тупик? Вы также пытались запустить еще одну демонстрацию в цикле, которая выполняет выводы по изображению?   -  person Manoj    schedule 03.07.2019
comment
Это сообщение печатается родительским процессом, и это ожидается, но он должен напечатать только несколько сообщений, поскольку вызов RunInference должен быть довольно быстрым. Проблема в дочернем процессе, который выглядит заблокированным, а родитель ждет. Я добавил пример (Редактировать № 1), который работает, когда дочерний процесс выполняет как экземпляр BasicEngine, так и метод RunInference.   -  person Mattia Antonini    schedule 03.07.2019