Julia ---- 基於 DAG圖 的並行計算:Dagger

Dagger 是一個核心庫之外並行計算的框架。它借鑑了Python 的 並行計算框架 Dask。它可以在許多Julia工作進程上以向無環圖(DAGs)的形式高效地運行計算任務。DAGs 的數據結構就是Thunk,DAGs中每個節點成爲Chunk。一個Chunk的輸出可以成爲下一個Chunk的輸入參數。目前看Chunk 都是延遲計算的。

核心函數

delayed(f; options...)

f :是一個給定輸入的函數。

options... :包含一些控制DAGs的運行的可選參數。

  • get_result::Bool——將實際結果返回給調度程序,而不是塊對象。當f顯式地構造塊或當返回值很小時(例如,在reduce的情況下)使用
  • meta::Bool——將輸入“Chunk”對象本身傳遞給f,而不是其中包含的值——這總是在主進程上運行
  • persist::Bool——此Thunk的結果在DAG中未使用後不應釋放
  • cache::Bool——緩存這個Thunk的結果,這樣如果再次計算Thunk,就可以重用緩存的值。如果它已從緩存中刪除,請重新計算該值。

  collect(ctx::Context, chunk::Chunk),  獲取計算結果

compute(ctx, d::Thunk),創建一個完整的DAGs.

例子

下面是一個DAGs的計算拓撲圖

簡單的計算,並獲取計算結果

using Dagger

add1(value) = value + 1
add2(value) = value + 2
combine(a...) = sum(a)

p = delayed(add1)(4)
q = delayed(add2)(p)
r = delayed(add1)(3)
s = delayed(combine,get_result=true,meta=true)(p, q, r)

@assert collect(s) == 16

生成DAGs圖

using Dagger

add1(value) = value + 1
add2(value) = value + 2
combine(a...) = sum(a)

p = delayed(add1)(4)
q = delayed(add2)(p)
r = delayed(add1)(3)
s = delayed(combine,get_result=true,meta=true)(p, q, r)

group(x...) = [x...]
top_node = delayed(group)(p,q,r,s)
compute(top_node)
#Dagger.Chunk{Any,MemPool.DRef}(Array{Int64,1}, ArrayDomain{1}((1:4,)), MemPool.DRef(1, 6, 0x0000000000000020), false)
#ArrayDomain{1}((1:4,)) 可以看到,計算共有4個步驟

collect(top_node)#獲取每個步驟的計算結果
# 4-element Array{Int64,1}:
#   5
#   7
#   4
#  16

其他高級特性

我簡單嘗試了下,像SchedulerOptions, ThunkOptions等還無法正常使用,最起碼在julia 1.0.5版本還無法使用。所以要用的話,用一些簡單的功能就好了。但是一定要注意性能問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章