簡體   English   中英

常規 Dask 和 dask.distributed 之間的關系

[英]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 分配了當前客戶端

https://github.com/dask/distributed/blob/f3f4bffea0640c01fc54f49c3219cf5807d14c66/distributed/client.py#L93

如果您在延遲的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM