我是 Dask 的新手,如果您觉得这个问题很愚蠢,请原谅我。在 Dask 中,我正在使用一个包含大约 50GB 数据的 Dask 数据帧。这些数据是字符串数据,在将其提供给机器学习算法(线程快速)之前,我需要对其进行预处理(快速处理)。现在的问题是,当我针对进程设计集群时,数据帧操作很快,但在线程方面却很慢(但线程在机器学习方面很快)。因此,我正在寻找一种可以从进程环境切换到线程环境的解决方案。
目前,我正在使用进程集群保存预处理数据,然后关闭它并启动一个具有线程环境的新集群来应用机器学习。
有没有办法解决这个问题?
请在这方面帮助我。
答案 0 :(得分:0)
可以从命令行启动异构工作者:
# this runs in one shell process
dask-scheduler --scheduler-file scheduler.json
# this runs in another shell process/window
dask-worker --scheduler-file scheduler.json --name multi_proc --nprocs 5 --nthreads 1
# this runs in yet another shell process/window
dask-worker --scheduler-file scheduler.json --name multi_thread --nprocs 1 --nthreads 5
然后在您的脚本/笔记本中,您将使用 client = Client('scheduler.json')
连接到调度程序,并在提交时指定适合该任务的工作人员的名称,例如
# submit for completion only by the multi_thread worker
results_multi_thread = [client.submit(process_multi_thread, task, workers='multi_thread') for task in task_list]
# submit for completion only by the multi_process worker
results_multi_proc = [client.submit(process_multi_proc, task, workers='multi_proc') for task in task_list]
对于多个 worker,您必须指定唯一的名称(例如 multi_proc_1
、multi_proc_2
等),但正如您所看到的,这是一个相当复杂的过程,因此除非您的具体名称在这种情况下,所有事情都必须一次性完成,我会坚持使用您正在使用的解决方案(两个独立的集群),因为它更容易编码/维护,并且希望在某个时候能够支持异构工作者。
答案 1 :(得分:0)
您可以采用多种方法,最好的方法是对每种方法进行衡量。您将比我们猜测的任何内容都更准确地表示您的实际工作流程!
您可以将 abstract resources 分配给您的工作人员,这样您就可以根据进程绑定阶段的需要拥有尽可能多的工作人员,但每个工作人员实际上都有许多线程。使用资源标记,您可以让每个工作线程只运行一个线程。 LocalCluster 还允许您按比例增加/减少工作人员的数量,因此您可以在进入第 2 阶段时通过缩小来“切换”模式(集群中保存的所有数据都将复制到幸存的工作人员)。
我认为人们很少会遇到这种“仅进程”/“仅线程”模式。通常,线程和进程的混合足以让大多数工作负载顺利完成。