python - PBS 集群节点上的多处理
问题描述
我必须使用不同的参数(或随机数生成器种子)对同一模型进行多次模拟。以前我在一个有很多内核的服务器上工作,在那里我使用了带有 apply_async 的 python 多处理库。这非常方便,因为我可以决定要占用的最大内核数,并且模拟只会进入队列。
正如我从其他问题中了解到的那样,只要您只在一个节点上工作,多处理就可以在 pbs 集群上工作,这目前还可以。但是,我的代码并不总是有效。
为了让您了解我的代码:
import functions_library as L
import multiprocessing as mp
if __name__ == "__main__":
N = 100
proc = 50
pool = mp.Pool(processes = proc)
seed = 342
np.random.seed(seed)
seeds = np.random.randint(low=1,high=100000,size=N)
resul = []
for SEED in seeds:
SEED = int(SEED)
resul.append(pool.apply_async(L.some_function, args = (some_args)))
print(SEED)
results = [p.get() for p in resul]
database = pd.DataFrame(results)
database.to_csv("prova.csv")
该函数创建 3 N=10000 个 networkx 图并对它们执行一些计算,然后返回一个简单的简短 Python 字典。
我无法调试的奇怪事情是以下错误消息:
multiprocessing.pool.MaybeEncodingError:错误发送结果:>''。>原因:'RecursionError('调用 >Python 对象时超出最大递归深度')'
奇怪的是,我在不同的节点上运行了多个代码实例。3 次代码正确工作,而大多数时候它返回前一个错误。我尝试使用不同数量的并行模拟,从 7 到 20(节点的 # 个核心),但似乎没有模式,所以我想这不是内存问题。
在其他问题中,类似的错误似乎与腌制奇怪或大的物体有关,但在这种情况下,函数中唯一出现的是一个简短的字典,所以它不应该与此相关。我还尝试在工作开始时使用 sys 库增加允许的递归深度,但没有达到 15000。
有什么想法可以解决或至少理解这种行为吗?
解决方案
它与 eigenvector_centrality() 不收敛有关。在 multiprocessing 之外运行时,它会正确返回 networkx 错误,而在其中只返回此递归错误。
我不知道这是否是一种非常奇怪的功能特定行为,或者有时多处理无法处理某些库错误。
推荐阅读
- redis - 将新的 redis 节点添加到现有集群
- reactjs - Ag-Grid - 如何在同一个网格中制作两个水平滚动?
- typescript - Vuetify Switcher I18N 翻译
- javascript - 我使用simpleLogger获取响应内容时,获取的信息是乱码
- javascript - 为什么这个 ajax 给我一个 400 错误?
- elasticsearch - elasticsearch嵌套查询,嵌套obj中的每个项目都具有相同的某个键值
- python - 为什么'str'没有属性'name'(PyCharm 2020.3.2 Python 3.9)
- javascript - 片段中的 Web 视图
- c++ - 从类继承但使用属性的子类
- c# - Visual Studio - 自动完成中的奇怪行为