Dask 是否支持自定义图形中具有多个输出的函数?
Does Dask support functions with multiple outputs in Custom Graphs?
Custom Graphs API of Dask 似乎只支持返回一个输出的函数 key/value。
例如,以下依赖项不能简单地表示为 Dask 图:
B -> D
/ \
A- -> F
\ /
C -> E
这可以通过将元组存储在 "composite" 键下(例如,在本例中为 "B_C")然后按 getitem()
或类似的方式拆分来解决。但是,这会导致执行效率低下(例如不必要的序列化)并降低 DAG 可视化的清晰度。
是否有更好的方法或者目前不支持这种方法?
简答
不,但应该没关系。
编程界面
你说得对,用 Dask 管理多个输出的正确方法是使用 getitem。在编程接口方面,使用 dask.delayed 执行此操作的标准方法是按照您的建议使用 getitem 。这是一个例子:
from dask import delayed
@delayed(pure=True)
def minmax(a, b):
if a > b:
return a, b
else:
return b, a
result = minmax(1, 2)
min, max = result[0], result[1]
性能
你提出了一个关于性能的有趣问题。在实践中,使用 distributed scheduler (在单台机器上工作得很好)应该可以很好地处理这种情况而不会造成性能损失。单机线程调度器也是如此。
Custom Graphs API of Dask 似乎只支持返回一个输出的函数 key/value。
例如,以下依赖项不能简单地表示为 Dask 图:
B -> D
/ \
A- -> F
\ /
C -> E
这可以通过将元组存储在 "composite" 键下(例如,在本例中为 "B_C")然后按 getitem()
或类似的方式拆分来解决。但是,这会导致执行效率低下(例如不必要的序列化)并降低 DAG 可视化的清晰度。
是否有更好的方法或者目前不支持这种方法?
简答
不,但应该没关系。
编程界面
你说得对,用 Dask 管理多个输出的正确方法是使用 getitem。在编程接口方面,使用 dask.delayed 执行此操作的标准方法是按照您的建议使用 getitem 。这是一个例子:
from dask import delayed
@delayed(pure=True)
def minmax(a, b):
if a > b:
return a, b
else:
return b, a
result = minmax(1, 2)
min, max = result[0], result[1]
性能
你提出了一个关于性能的有趣问题。在实践中,使用 distributed scheduler (在单台机器上工作得很好)应该可以很好地处理这种情况而不会造成性能损失。单机线程调度器也是如此。