Это крайний случай странных проблем с программным обеспечением, с которыми мне приходилось сталкиваться. Нужна помощь!
Рассмотрим сценарий Python:
import psutil
import torch
def run():
curr_process = psutil.Process()
curr_process.cpu_affinity([3])
print('Before', curr_process.cpu_affinity())
import cv2
print('After', curr_process.cpu_affinity())
import multiprocessing
multiprocessing.Process(target=run).start()
Можно подумать, что импорт OpenCV не имеет ничего общего с привязкой к процессору, и выходные данные до и после будут одинаковыми, но нет. Вывод этого сценария на моей машине:
Before [3]
After [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
Проблема, конечно, возникла в большом приложении, и потребовалось немало усилий, чтобы свести его к этому минимальному примеру. Я обнаружил, что для его воспроизведения необходимо ключевое условие: PyTorch и OpenCV следует импортировать из разных процессов. Один до и один после развилки. Он не воспроизводит, если я импортирую как в дочерний процесс, так и в основной процесс, но он воспроизводит, если я поменяю местами cv2
и torch
в этом скрипте.
Прежде всего, что делает импорт библиотека имеет отношение к сродству процессора? Возможно, это какая-то попытка оптимизации со стороны авторов библиотеки, которая пошла на мошенничество?
Тогда как мне исправить что-то подобное? Я мог бы, конечно, импортировать все до fork как быстрое хакерское решение, но я бы хотел докопаться до сути.
Мои версии библиотек (обе установлены из репо Conda):
opencv=4.1.0=py37h3aa1047_6
pytorch=1.4.0=py3.7_cuda10.1.243_cudnn7.6.3_0