PBS 集群节点上的多处理
Multiprocessing on PBS cluster node
我必须 运行 对具有不同参数(或随机数生成器种子)的同一模型进行多次模拟。以前我在一个有很多内核的服务器上工作,我在其中使用 python 多处理库和 apply_async。这非常方便,因为我可以决定要占用的最大内核数,而模拟只会进入队列。
正如我从其他问题中了解到的那样,只要您只在一个节点上工作,多处理就可以在 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 图并对它们执行一些计算,然后 returns 一个简单的短 python 字典。
我无法调试的奇怪事情是以下错误消息:
multiprocessing.pool.MaybeEncodingError: Error sending result: >''. >Reason: 'RecursionError('maximum recursion depth exceeded while calling a >Python object')'
奇怪的是我运行 代码在不同节点上的多个实例。代码正确工作了 3 次,而大多数时候 returns 是之前的错误。我尝试使用不同数量的并行模拟,从 7 到 20(# 节点的核心),但似乎没有模式,所以我猜这不是内存问题。
在其他问题中,类似的错误似乎与 pickling strange or big objects 有关,但在这种情况下,函数唯一输出的是一个短字典,所以它不应该与此相关。
我还尝试在工作开始时使用 sys 库增加允许的递归深度,但没有达到 15000。
有解决或至少理解这种行为的想法吗?
与eigenvector_centrality()不收敛有关。
当 运行 在 multiprocessing 之外它正确 returns 一个 networkx 错误,而在它内部只返回这个递归错误。
我不知道这是一个非常奇怪的特定于功能的行为,还是有时多处理无法处理某些库错误。
我必须 运行 对具有不同参数(或随机数生成器种子)的同一模型进行多次模拟。以前我在一个有很多内核的服务器上工作,我在其中使用 python 多处理库和 apply_async。这非常方便,因为我可以决定要占用的最大内核数,而模拟只会进入队列。
正如我从其他问题中了解到的那样,只要您只在一个节点上工作,多处理就可以在 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 图并对它们执行一些计算,然后 returns 一个简单的短 python 字典。
我无法调试的奇怪事情是以下错误消息:
multiprocessing.pool.MaybeEncodingError: Error sending result: >''. >Reason: 'RecursionError('maximum recursion depth exceeded while calling a >Python object')'
奇怪的是我运行 代码在不同节点上的多个实例。代码正确工作了 3 次,而大多数时候 returns 是之前的错误。我尝试使用不同数量的并行模拟,从 7 到 20(# 节点的核心),但似乎没有模式,所以我猜这不是内存问题。
在其他问题中,类似的错误似乎与 pickling strange or big objects 有关,但在这种情况下,函数唯一输出的是一个短字典,所以它不应该与此相关。 我还尝试在工作开始时使用 sys 库增加允许的递归深度,但没有达到 15000。
有解决或至少理解这种行为的想法吗?
与eigenvector_centrality()不收敛有关。 当 运行 在 multiprocessing 之外它正确 returns 一个 networkx 错误,而在它内部只返回这个递归错误。
我不知道这是一个非常奇怪的特定于功能的行为,还是有时多处理无法处理某些库错误。