mclapply сталкивается с ошибками в зависимости от идентификатора ядра?

У меня есть набор генов, для которых мне нужно рассчитать некоторые коэффициенты параллельно. Коэффициенты рассчитываются внутри GeneTo_GeneCoeffs_filtered это берет имя гена как вход и возвращает список 2 фреймов данных.

Имея длину 100 gene_array Я запустил эту команду с разным количеством ядер: 5, 6 и 7.

Coeffslist=mclapply(gene_array,GeneTo_GeneCoeffs_filtered,mc.cores = no_cores)

Я сталкиваюсь с ошибками на разных именах генов в зависимости от количества ядер, назначенных mclapply,

Индексы генов, по которым GeneTo_GeneCoeffs_filtered не может вернуть список фреймов данных, которые они имеют шаблон. В случае 7 ядер, назначенных для mclapply, это 4, 11, 18, 25, ... 95 элементов gene_array (каждое седьмое), а когда R работает с 6 ядрами, индексы составляют 2, 8, 14,..., 98 (каждое 6-е) и то же самое с 5 ядрами - каждое 5-е.

Самое главное, что они разные для этих процессов, а это значит, что проблема не в определенных генах.

Я подозреваю, что может быть "сломанное" ядро, которое не может правильно выполнять мои функции, и только оно генерирует эти ошибки. Есть ли способ отследить его идентификатор и исключить его из списка ядер, которые могут быть использованы R?

0 ответов

Внимательное прочтение mclapply в страницах руководства показывает, что это поведение является и возникает в результате взаимодействия:

(а)

"вход X разделен на столько частей, сколько ядер (в настоящее время значения распределяются по ядрам последовательно, то есть первое значение для ядра 1, второе для ядра 2, ... (ядро + 1)-е значение для ядра 1 и т. Д.), А затем по одному процессу разветвляется на каждое ядро ​​и собираются результаты ".

(б)

объект "try-error" будет возвращен для всех значений, связанных с ошибкой, даже если не все из них завершились ошибкой.

В вашем случае, в силу (a), ваш gene_array распространяется в стиле "round-robin" по ядрам (с промежутком в mc.cores между индексами последовательных элементов) и в силу (b), если есть Элемент gene_array вызывает ошибку, вы получаете сообщение об ошибке для каждого элемента gene_array, отправленного в это ядро ​​(с промежутком в mc.cores между индексами этих элементов).

Я обновил свое понимание этого вчера во время обмена мнениями с Саймоном Урбанеком: https://stat.ethz.ch/pipermail/r-sig-hpc/2019-September/002098.html, в котором я также предлагаю подход к обработке ошибок, дающий ошибки только для индексов, генерирующих ошибку.

Вы также можете получить ошибки только для индексов, которые генерируют ошибку, передав mc.preschedule=FALSE.

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