我使用scikit-learn
来训练具有一些"高级"参数的KernelDensity
。在初始拟合后评估score_samples
时,处理需要很长时间,并且有多个内核可用,我希望得到一些速度改进。score_samples
(取任意长度的样本向量)应该易于并行化。
直到现在,我尝试multiprocessing
让事情工作。如果我运行我的脚本(我使用Pool.map()
),我得到一个实例方法是不可pickleable的错误。
这是很明显的,但是使用sklearn和严重依赖实例方法,我不能改变这种行为。
是否有任何方法可以使用sklearn(和实例方法)进行任何类型的多处理?我不介意python是否复制属于主进程的整个内存(这是可管理的),或者我是否需要将每个块从主程序提交给score_samples
(不优雅,但会完成这项工作)。
有什么建议吗?
我只是猜测您需要存储特定于线程的状态,这就是为什么您想要创建一个处理池。我不确定这是否会与scikit一起工作,但我会使用threading.local()。听起来你对Python很熟悉,这里有一个链接https://docs.python.org/3/library/threading.html#thread-local-data,如果有帮助的话。
我看了一下sci-kit和docs。你试过使用joblib/joblib.parallel吗?