[英]relation between regular Dask and dask.distributed
我不明白常規 Dask 和dask.distributed
之間的關系。
使用dask.distributed
,例如使用 Futures 接口,我必須顯式創建一個客戶端,該客戶端由本地或遠程集群支持,然后使用client.submit()
提交給它。
使用常規 Dask,例如使用 Delayed 接口,我只是在我的函數上使用了delayed()
。
delayed
(或compute
)如何確定我的計算發生在哪里? 它背后肯定有一些全局 state - 但我將如何訪問它? 如果我理解正確, delayed
使用dask.distributed
客戶端(如果存在)。 它是否使用類似的東西
client = None
try:
client = Client.current()
except ValueError:
pass
if client is not None:
# use client
else:
# use default scheduler
如果是這樣,為什么不使用相同的submit
邏輯?
client = None
try:
client = Client.current()
except ValueError:
pass
if client is not None:
# use client
else:
# fail because futures don't work on the default scheduler
最后,延遲對象和未來對象看起來非常相似。 為什么第一個可以同時使用dask.distributed
客戶端和默認調度程序,而期貨需要dask.distributed
?
是的,有一些全局 state 分配了當前客戶端
如果您在延遲的 object 上調用compute
方法,您最終將使用當前客戶端
Dask 延遲只是構建計算圖的語法糖。 當您調用計算時,圖形最終會通過分布式客戶端進行分派。
未來是指可能尚未計算的集群上的遠程結果。 延遲的 object 尚未提交到集群
@delayed
def func(x):
return x
a = func(1)
在這種情況下, a
是延遲的 object。 該任務根本沒有在集群上排隊
future = client.compute(a, sync=False)
將任務提交到集群后,您將獲得未來。
Dask 有多個后端。 如果您沒有指定一個,那么所有東西都在本地集群上運行,其進程數與 CPU 中的內核數一樣多。 定義集群(本地、Kubernetes、HPC、Spark)時,您可以准確指定所需的內容。 但是,客戶看到的內容和執行方式沒有區別。
所有期貨在您發送它們時都會在您的后端執行,但您必須等待結果返回。 與此同時,您可以在客戶端上做其他事情。 完成后,您可以使用.result
獲取結果。 我沒有像 API 一樣使用期貨,但它應該像 Python 並發期貨一樣工作。 這也可能是您必須事先啟動客戶端的原因。 Dask 希望盡可能接近地鏡像 API。 更多信息在這里。
延遲的 dataframe 或數組 API 僅在您調用.compute()
后將計算發送到后端。 然后,您必須等待結果返回,並且在兩者之間不能做任何事情。 更多信息在這里。
future
不能在本地機器上使用(沒有本地集群),因為它會立即觸發計算,因此同一代碼中的任何進一步計算都將被阻止。 delay 允許你delayed
計算直到 DAG 形成。 所以delayed
可以在有或沒有集群的單台機器上運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.