2017-04-11 35 views
0

我想使用Luigi或其他工作流程自動化套件。我的問題是我有節點具有未知數量的輸入。例如,Luigi要求您提前對輸入進行硬編碼。什麼是工作流程自動化工作,哪些任務的輸入數量未知?

比方說,我在那裏節點代表任務的圖形和線條都是從輸出流下來並指向其他任務

A 
/\ 
| B 
\/
    C 

我們在哪兒一個開始,但流下B,然後是C輸入, C也接受A的輸出。

我發現像SciLuigi出頭,但它並不完全解決我的問題。

+0

你有[動態依賴於路易吉(http://luigi.readthedocs.io/en/stable/tasks.html#dynamic-dependencies)(和這裏的[示例](https://github.com/ Spotify的/路易/斑點/主/示例/ dynamic_requirements.py))。除此之外,你應該嘗試解釋更多,你是如何試圖編寫你的Luigi任務來解決你的問題的。 – matagus

+0

我看過那個例子,但它不太適合我的問題情況。 對於單個任務,它可以接受任意數量的輸入,但不確定從哪些其他任務或多少個任務。所有重要的是他們的產出。 到目前爲止,我已經與SciLuigi和其他框架合作,看看哪些工作可行。除了這種情況之外,它們都不符合Luigi的易用性。 我看過創建一個特殊任務的子類,然後由工廠創建,特殊的run()方法將運行一個行爲。不知道它是否會奏效...... –

回答

0

您需要回答的問題是:C如何知道何時運行? A和B如何知道何時運行?這就是路易吉任務的requires方法。 Luigi模型是一個拉式模型,每個批處理任務根據完成它所依賴的任務來決定何時運行。 (這不利於想到AB「飛落」到C

在你展示的簡單模型,C是管道的發射任務。將加載C(但不呼叫run),並檢查AB是否已完成。如果其中任何一個都沒有完成,它會告訴該子集運行。如果他們已經完成,或者一旦他們完成,C將打電話給run。如果任務AB只有工作條件做,他們complete方法可以在他們沒有工作可做的情況下返回TrueC然後可以run

但是,我不確定這是你的特殊問題。也許你想C運行一次爲AC運行一次B?在這種情況下,我通常編寫run方法C來對任意輸入列表(無論它們是目錄中的文件,狀態數據庫中的行還是某些其他參考列表)進行操作。然而,在這種情況下,也有時最好只添加任何C確實進入定義AB,或者通過定義任務的子類,由C提供的後處理步驟增加。

在任何情況下,有很多方式來運行的流水線,但很難提出在非常高的水平抽象的,你描述很好的選擇。我發現將你的想法轉變爲拉模式可能是找到它們的第一步。

+0

你在前兩段中描述的是我認爲正在發生的事情。我的情況是,我確實知道A,B和C是什麼以及什麼時候應該跑。我想用它來運行人們可以快速改變的機器學習模型。假設用戶知道他們想要轉換數據,用A,B和C表示,但只改變周圍的超參數。也許他們需要再次添加從A到C的另一個B數據轉換(所以我們得到一個菱形圖)。 理想情況下,我想交出一個描述已知代碼模塊及其關係的JSON/YML文件,並讓它運行。 –

+0

我真正的問題是,A,B,C中的任何一個都不會提前知道他們依賴誰,所以也許基於拉伸的工作流程自動化就像您所描述的那樣不適合我。 –

+0

什麼樣的機器學習模型?像「Sklearn.pipeline.Pipeline」?我認爲Luigi的概念是由於嘗試在json/yml中執行管道變得過於複雜,因爲你試圖將它們用作編程語言。請參閱幻燈片23-26。 https://www.slideshare.net/erikbern/luigi-presentation-nyc-data-science – MattMcKnight

相關問題