Импорт OpenCV после импорта беспорядков PyTorch с привязкой к процессору - PullRequest
1 голос
/ 01 апреля 2020

Это крайний случай странных проблем с программным обеспечением, с которыми мне приходилось сталкиваться. Нужна помощь!

Рассмотрим сценарий 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
...