使用Dask map_partitions陷入无限错误循环问题求助
我之前也碰到过类似的Dask版本兼容问题,结合你的情况和错误日志,来给你梳理下解决思路:
首先看你的错误核心:TypeError: 'int' object is not callable,出现在子进程初始化时调用np.random.seed()的环节。这说明在AWS Ubuntu环境的子进程里,np.random.seed被意外变成了一个整数,而不是原本的函数,导致调用失败,进而引发进程反复重启的无限循环。
针对这个问题,给你几个可行的解决方案:
优先升级Dask版本:你用的Dask 0.16.1是非常老旧的版本(现在都已经到20+版本了),这个版本的multiprocessing调度器存在不少已知的初始化bug。直接升级到稳定版就能大概率解决问题,执行命令:
pip install --upgrade dask切换到distributed调度器:如果暂时不想升级版本,可以改用Dask的distributed模块来替代原生multiprocessing的get方法,它的进程管理更稳定。修改代码如下:
import pandas as pd import dask.dataframe as dd from dask.distributed import Client def process_frame(x): # 你的wav文件处理逻辑 return process_wav_file(x) # 启动本地分布式集群 client = Client() dfdd = dd.from_pandas(existing_df, npartitions=4) results = dfdd.map_partitions(lambda df: df.wav_file.apply(process_frame), meta=('x', 'f8')).compute()排查环境变量/全局变量污染:检查下AWS环境里有没有代码(或者依赖库)不小心修改了
np.random.seed,比如误写了np.random.seed = 42这种把函数覆盖成整数的代码。不过你本地正常远程出问题,这个概率相对低,但也可以快速排查下。
另外补充下:在Linux环境下,Dask的multiprocessing依赖fork机制,和Windows的spawn机制有差异,老版本对这种差异的处理不够完善,这也是为什么本地Windows正常但远程Ubuntu出问题的原因之一。
内容的提问来源于stack exchange,提问作者olix20

