Чтение нескольких (CERN) ROOT-файлов в массив NumPy - используя n узлов и, скажем, 2n графических процессоров

Я читаю много (скажем, 1k) файлов CERN ROOT, используя цикл и храня некоторые данные во вложенном массиве NumPy. Использование циклов делает это последовательной задачей, и каждому файлу требуется некоторое время для завершения процесса. Поскольку я работаю над моделью глубокого обучения, я должен создать достаточно большой набор данных - но само время чтения занимает очень много времени (чтение 835 событий занимает около 21 минуты). Кто-нибудь может подсказать, возможно ли использовать несколько графических процессоров для чтения данных, чтобы для чтения потребовалось меньше времени? Если так, то как?

Добавим некоторые подробности: я подтолкнул программу к GitHub, чтобы это было видно (пожалуйста, дайте мне знать, если публикация ссылки на GitHub не разрешена, в этом случае я опубликую соответствующую часть здесь):

https://github.com/Kolahal/SupervisedCounting/blob/master/read_n_train.py

Я запускаю программу как:

python read_n_train.py <input-file-list>

где аргумент - это текстовый файл, содержащий список файлов с адресами. Я открывал ROOT файлы в цикле в read_data_into_list() функция. Но, как я уже говорил, эта последовательная задача отнимает много времени. Мало того, я заметил, что скорость чтения ухудшается, когда мы читаем все больше и больше данных.

Тем временем я пытался использовать пакет slurmpy https://github.com/brentp/slurmpy Таким образом, я могу распределить работу, например, по N рабочим узлам. В этом случае отдельная программа чтения прочитает назначенный ей файл и вернет соответствующий список. Просто в конце мне нужно добавить списки. Я не мог найти способ сделать это.

Любая помощь высоко ценится.

С уважением, Колахал

1 ответ

Вы последовательно просматриваете все события из Python, это, вероятно, узкое место.

Вы можете заглянуть в root_numpy, чтобы загрузить необходимые данные из корневого файла в массивы numpy:

root_numpy - это модуль расширения Python, который обеспечивает эффективный интерфейс между ROOT и NumPy. Внутренние компоненты root_numpy скомпилированы в C++ и поэтому могут обрабатывать большие объемы данных намного быстрее, чем эквивалентные реализации на чистом Python.

Я также в настоящее время смотрю на root_pandas, который кажется похожим.

Хотя это решение точно не отвечает на запрос о распараллеливании, оно может сделать распараллеливание ненужным. И если он все еще слишком медленный, то он все еще может использоваться параллельно с использованием slurm или чего-то еще.

Другие вопросы по тегам