化學(xué)習(xí)超啟發(fā)式的復(fù)雜約束云工作流調(diào)度)
做云工作流調(diào)度的同學(xué)應(yīng)該都體會(huì)過那種感覺論文里的實(shí)驗(yàn)環(huán)境干凈得像一張白紙任務(wù)依賴簡單、資源類型固定、約束條件就一個(gè)“別超預(yù)算”??梢坏┗氐秸鎸?shí)場(chǎng)景一個(gè)工作流里幾十上百個(gè)任務(wù)依賴關(guān)系繞成一團(tuán)再加上截止時(shí)間、成本預(yù)算、可靠性要求、資源競(jìng)爭(zhēng)這些復(fù)雜約束一股腦涌上來傳統(tǒng)調(diào)度算法基本上就是原地崩潰。我見過不少同學(xué)在“基于強(qiáng)化學(xué)習(xí)超啟發(fā)式算法的帶復(fù)雜約束云工作流調(diào)度”這個(gè)題目上轉(zhuǎn)了很久不是因?yàn)楦拍疃嗌願(yuàn)W而是不知道該從哪里下手搭體系。這篇內(nèi)容就圍繞這個(gè)題目把超啟發(fā)式算法和強(qiáng)化學(xué)習(xí)的結(jié)合邏輯、狀態(tài)動(dòng)作獎(jiǎng)勵(lì)設(shè)計(jì)、可復(fù)現(xiàn)的實(shí)驗(yàn)框架以及我在實(shí)際調(diào)試中踩過的坑掰開了講清楚。這個(gè)方向適合兩類人一類是要做相關(guān)課題開題和實(shí)驗(yàn)的研究生一類是有一定調(diào)度經(jīng)驗(yàn)、想引入強(qiáng)化學(xué)習(xí)做策略自動(dòng)生成的工程師。前置知識(shí)不需要太多懂一點(diǎn)工作流基本概念知道DAG是什么再了解一點(diǎn)深度強(qiáng)化學(xué)習(xí)的皮毛就能跟著這套思路往下走。1. 首先弄明白這個(gè)題目到底在解決什么問題1.1 云工作流調(diào)度從DAG說起云工作流調(diào)度本質(zhì)上就是在一批異構(gòu)的計(jì)算資源比如不同規(guī)格的虛擬機(jī)、容器實(shí)例上安排一組有依賴關(guān)系的任務(wù)決定它們什么時(shí)候執(zhí)行、放在哪個(gè)資源上執(zhí)行最終讓整個(gè)工作流在滿足各種硬性條件的前提下盡可能高效地跑完。工作流通常用DAG有向無環(huán)圖描述節(jié)點(diǎn)是任務(wù)邊是數(shù)據(jù)或控制依賴。一個(gè)任務(wù)必須等它的所有前驅(qū)任務(wù)完成后才能開始。下面是一個(gè)很典型的結(jié)構(gòu)任務(wù)A和任務(wù)B可以并行執(zhí)行因?yàn)樗鼈儧]有依賴關(guān)系任務(wù)C必須等A、B都完成后才能啟動(dòng)任務(wù)D依賴C而且D本身需要較大的內(nèi)存所以它對(duì)資源類型有要求。聽起來不復(fù)雜但一旦任務(wù)數(shù)量從十個(gè)漲到幾百個(gè)資源類型從一類變成四類再加上不同的用戶對(duì)完成時(shí)間、費(fèi)用、可靠性有不同的要求調(diào)度決策空間就會(huì)爆炸式增長。這也是為什么調(diào)度問題被歸為NP難問題——它沒有多項(xiàng)式時(shí)間的精確最優(yōu)解只能用近似策略去逼近。1.2 復(fù)雜約束是什么為什么讓經(jīng)典調(diào)度算法失靈做調(diào)度方向的研究繞不開HEFTHeterogeneous Earliest Finish Time這類經(jīng)典啟發(fā)式算法。HEFT的做法是給每個(gè)任務(wù)算一個(gè)向上排序值然后按優(yōu)先級(jí)從高到低逐個(gè)調(diào)度每次把任務(wù)放到預(yù)計(jì)完工時(shí)間最早的資源上。這種策略在“只追求總完成時(shí)間最短”的簡單場(chǎng)景下效果確實(shí)不錯(cuò)而且實(shí)現(xiàn)簡單、速度快。但一旦引入復(fù)雜約束事情就變了。我列一下在實(shí)際項(xiàng)目中經(jīng)常會(huì)碰到的約束類型截止時(shí)間約束整個(gè)工作流或其中某些關(guān)鍵任務(wù)必須在某個(gè)時(shí)間點(diǎn)前完成預(yù)算約束所有資源使用費(fèi)用總和不能超過某個(gè)上限可靠性約束關(guān)鍵任務(wù)需要運(yùn)行在可靠性評(píng)級(jí)較高的資源上甚至需要副本機(jī)制資源競(jìng)爭(zhēng)約束多個(gè)任務(wù)共享有限的CPU、內(nèi)存、帶寬不能同時(shí)超量占用數(shù)據(jù)本地性約束某些任務(wù)最好調(diào)度到離數(shù)據(jù)源更近的資源上否則傳輸時(shí)間會(huì)拖慢整體進(jìn)度。經(jīng)典啟發(fā)式算法在處理這些約束時(shí)各有短板。HEFT只優(yōu)化完工時(shí)間完全不管成本預(yù)算約束一加它可能把所有任務(wù)丟到最貴的快資源上直接超支。Min-Min這類方法偏向處理短任務(wù)任務(wù)規(guī)模一大或依賴變復(fù)雜就失靈。更麻煩的是約束之間還會(huì)互相打架追求更短的完工時(shí)間往往意味著用更快更貴的資源追求省錢就得犧牲速度。真實(shí)場(chǎng)景里這些目標(biāo)只會(huì)同時(shí)出現(xiàn)不存在一個(gè)固定的優(yōu)先級(jí)排序調(diào)度策略必須能根據(jù)工作流的當(dāng)前狀態(tài)靈活調(diào)整。1.3 這個(gè)方向適合誰、需要什么前置知識(shí)說到底這個(gè)題目要解決的是“策略動(dòng)態(tài)選擇”的問題面對(duì)一個(gè)新工作流應(yīng)該采用哪條調(diào)度策略或者這些策略怎么組合著用才能在滿足約束的同時(shí)把性能拉上去。經(jīng)典做法里這個(gè)選擇是由人拍腦袋定的或者用遺傳算法這類元啟發(fā)式離線搜一大堆規(guī)則。而“強(qiáng)化學(xué)習(xí)超啟發(fā)式算法”這套思路是想訓(xùn)練一個(gè)智能體實(shí)時(shí)觀察工作流狀態(tài)和資源狀態(tài)動(dòng)態(tài)決策“這一輪該用哪個(gè)低層啟發(fā)式策略”從而讓整個(gè)調(diào)度過程具備自適應(yīng)能力。前置知識(shí)方面如果你已經(jīng)理解DAG調(diào)度、了解HEFT的優(yōu)先級(jí)計(jì)算過程并且用過Python、看過一點(diǎn)PyTorch的深度Q網(wǎng)絡(luò)那基本可以直接上手。如果里面還有薄弱環(huán)節(jié)建議先補(bǔ)一下經(jīng)典工作流調(diào)度中“列表調(diào)度list scheduling”的核心思路再回來看后面的內(nèi)容。2. 超啟發(fā)式算法的分層邏輯把“調(diào)度策略”本身當(dāng)成決策對(duì)象2.1 低層啟發(fā)式集合怎么選、怎么設(shè)計(jì)超啟發(fā)式算法的核心思想是“不只是直接調(diào)度任務(wù)而是調(diào)度策略本身”。它把問題拆成兩層低層一組現(xiàn)成的調(diào)度啟發(fā)式比如HEFT、Min-Min、Max-Min、輪轉(zhuǎn)調(diào)度、隨機(jī)調(diào)度等它們負(fù)責(zé)真正產(chǎn)生任務(wù)到資源的映射高層一個(gè)策略選擇器它決定在當(dāng)前狀態(tài)下調(diào)用哪個(gè)低層啟發(fā)式或者以什么順序組合調(diào)用幾個(gè)低層啟發(fā)式。這樣一個(gè)分層結(jié)構(gòu)帶來的直接好處是你不需要親自發(fā)明新的調(diào)度規(guī)則只需要把幾個(gè)經(jīng)過驗(yàn)證的規(guī)則組合起來并根據(jù)場(chǎng)景動(dòng)態(tài)選擇。低層啟發(fā)式的集合設(shè)計(jì)很關(guān)鍵。我見過一些同學(xué)隨便選了兩三個(gè)策略就開跑最后發(fā)現(xiàn)智能體的表達(dá)能力根本不夠——就好比你手上只有錘子和剪刀再聰明的工匠也做不出精細(xì)的榫卯。一般建議低層集合至少包含三類互補(bǔ)策略低層策略核心特征強(qiáng)項(xiàng)場(chǎng)景HEFT按關(guān)鍵路徑優(yōu)先級(jí)排序插空調(diào)度依賴復(fù)雜、追求低完工時(shí)間Min-Min優(yōu)先調(diào)度預(yù)估執(zhí)行時(shí)間最短的任務(wù)任務(wù)規(guī)模小、異構(gòu)性明顯Max-Min優(yōu)先調(diào)度預(yù)估執(zhí)行時(shí)間最長的任務(wù)有長尾任務(wù)、防止大任務(wù)后置輪轉(zhuǎn)調(diào)度逐個(gè)任務(wù)循環(huán)分配到不同資源資源負(fù)載均衡、成本控制隨機(jī)調(diào)度隨機(jī)生成可行映射提供探索性、避免陷入局部解這里要注意低層策略的輸入輸出格式必須統(tǒng)一都接收“當(dāng)前工作流狀態(tài) 資源狀態(tài)”輸出“一批任務(wù)的調(diào)度決策”否則高層策略沒法統(tǒng)一操作。我在實(shí)際項(xiàng)目里會(huì)把每個(gè)低層策略封裝成統(tǒng)一的接口入?yún)⑹且粋€(gè)工作流快照對(duì)象出參是一組“任務(wù)-資源-預(yù)計(jì)開始時(shí)間”的映射關(guān)系。2.2 高層策略為什么用強(qiáng)化學(xué)習(xí)而不是傳統(tǒng)搜索確定了低層集合之后剩下的問題就是高層策略怎么選。經(jīng)典的超啟發(fā)式算法多用遺傳算法、模擬退火這類元啟發(fā)式在高層的策略空間里離線搜索一個(gè)固定規(guī)則。這種做法的局限在于搜索出來的規(guī)則是靜態(tài)的——它雖然是從大量訓(xùn)練樣本中歸納出來的但一旦遇到訓(xùn)練集里沒出現(xiàn)過的新工作流形態(tài)或者資源環(huán)境發(fā)生了變化這個(gè)規(guī)則不會(huì)自我調(diào)整。強(qiáng)化學(xué)習(xí)的不同之處在于它做的是“在線序貫決策”。智能體每完成一部分調(diào)度就能觀察狀態(tài)回報(bào)不斷調(diào)整后續(xù)的動(dòng)作選擇。這跟調(diào)度過程的天然結(jié)構(gòu)是吻合的調(diào)度不是一個(gè)一步到位的動(dòng)作而是分階段不斷做決策的過程。第一階段選了某個(gè)低層策略后可以看到它實(shí)際產(chǎn)生的效果然后再?zèng)Q定第二階段要不要換成另一個(gè)低層策略。這種試錯(cuò)-反饋-調(diào)整的動(dòng)態(tài)閉環(huán)正是靜態(tài)搜索方法難以具備的。再說得直白一點(diǎn)強(qiáng)化學(xué)習(xí)是“邊看邊決策”遺傳算法是“先搜好再用”。在離線批量調(diào)度這類靜態(tài)問題上后者也許夠用但云工作流調(diào)度往往有很強(qiáng)的時(shí)效性——新工作流不斷到達(dá)資源狀態(tài)隨時(shí)在變一個(gè)能根據(jù)上下文不斷調(diào)整策略的智能體明顯更貼合真實(shí)場(chǎng)景。2.3 RL超啟發(fā)式的核心鏈路我習(xí)慣把整個(gè)鏈路畫成這樣的循環(huán)觀察當(dāng)前工作流圖的剩余任務(wù)結(jié)構(gòu)以及每個(gè)資源的負(fù)載情況把觀察到的信息編碼成狀態(tài)向量智能體輸出一個(gè)動(dòng)作即選擇一個(gè)低層策略或策略序列環(huán)境執(zhí)行這個(gè)低層策略調(diào)度掉一批任務(wù)計(jì)算這一步帶來的收益比如完工時(shí)間縮短了多少、有沒有違反約束把收益作為獎(jiǎng)勵(lì)反饋給智能體更新策略。這個(gè)鏈路里最關(guān)鍵的設(shè)計(jì)決策在于第3步“動(dòng)作”的定義。目前主流做法有兩種一種是每次只選一個(gè)低層策略調(diào)度一批任務(wù)后重新觀察狀態(tài)再選下一個(gè)另一種是把低層策略當(dāng)成固定組件讓智能體在任務(wù)層面直接選“當(dāng)前任務(wù)派給哪個(gè)資源”。前者更接近超啟發(fā)式的原意保持了低層策略的模塊化后者更像端到端強(qiáng)化學(xué)習(xí)調(diào)度缺點(diǎn)是動(dòng)作空間巨大。我自己的經(jīng)驗(yàn)是先做第一種把問題拆小了后面再考慮細(xì)化。用代碼來表達(dá)這個(gè)循環(huán)大概是這樣的while not env.all_tasks_scheduled(): state env.get_state() # 包括工作流DAG剩余結(jié)構(gòu)、資源負(fù)載等 llh_id agent.select_llh(state) # 智能體從低層策略集合中選一個(gè) decisions llh_set[llh_id].schedule(state) reward env.apply_decisions(decisions) agent.learn(state, llh_id, reward)3. 強(qiáng)化學(xué)習(xí)建模狀態(tài)空間、動(dòng)作空間與獎(jiǎng)勵(lì)函數(shù)的設(shè)計(jì)細(xì)節(jié)3.1 狀態(tài)讓模型“看得到”工作流和資源狀態(tài)空間的設(shè)計(jì)直接決定智能體能不能學(xué)到有意義的規(guī)律這也是整個(gè)題目里最考驗(yàn)功力的地方。我的建議是狀態(tài)至少包含以下幾類信息工作流結(jié)構(gòu)信息剩余任務(wù)總數(shù)、當(dāng)前可直接執(zhí)行的任務(wù)數(shù)入度為零的任務(wù)、關(guān)鍵路徑長度、任務(wù)執(zhí)行時(shí)間分布資源狀態(tài)信息每類資源的CPU和內(nèi)存容量、已用負(fù)載、剩余可用量、當(dāng)前隊(duì)列長度約束預(yù)算信息剩余可用預(yù)算、距離截止時(shí)間的余量。這些信息有的可以直接用數(shù)值有的需要做一些聚合。比如任務(wù)之間復(fù)雜的依賴關(guān)系如果硬編碼進(jìn)一個(gè)固定長度的向量任務(wù)數(shù)量一多就裝不下。更穩(wěn)妥的做法是用圖神經(jīng)網(wǎng)絡(luò)GNN對(duì)DAG做嵌入把每個(gè)任務(wù)的狀態(tài)編碼成固定維度的向量然后做全局平均池化得到整個(gè)工作流的狀態(tài)表示。我在實(shí)際實(shí)驗(yàn)里用了一個(gè)兩層的圖卷積網(wǎng)絡(luò)嵌入維度設(shè)為32效果比手工拼特征向量好不少。要注意歸一化。任務(wù)執(zhí)行時(shí)間的量級(jí)可能是幾十秒剩余預(yù)算可能是幾千塊錢如果不歸一化強(qiáng)化學(xué)習(xí)的訓(xùn)練會(huì)極不穩(wěn)定。我的習(xí)慣是把開工時(shí)間除以整個(gè)工作流的截止時(shí)間預(yù)算消耗除以總預(yù)算資源負(fù)載除以資源總?cè)萘孔屗刑卣鞅M量落在0到1區(qū)間。3.2 動(dòng)作選任務(wù)、選LLH還是選資源動(dòng)作空間的設(shè)計(jì)可以分成三個(gè)層次來看待。第一層是“選資源”——直接在任務(wù)上決定放到哪臺(tái)機(jī)器上執(zhí)行。這個(gè)方式最直接但當(dāng)任務(wù)和資源數(shù)量都很大時(shí)動(dòng)作空間的維度就是任務(wù)數(shù)乘資源數(shù)訓(xùn)練難度很高。比如100個(gè)任務(wù)、20類資源那就是2000個(gè)動(dòng)作還不是一步就完每一步都要做一次選擇累計(jì)下來整個(gè)序列非常長。第二層是“選低層策略”也就是超啟發(fā)式思路的核心。智能體每次從5到10個(gè)低層策略里選一個(gè)然后這個(gè)策略負(fù)責(zé)調(diào)度一批任務(wù)。這種方式大幅壓縮了動(dòng)作空間訓(xùn)練效率高而且可解釋性更強(qiáng)——至少你能看出來在什么狀態(tài)下智能體偏好用HEFT、什么時(shí)候偏好用Min-Min。第三層是“選策略序列”相當(dāng)于智能體一次性輸出一個(gè)長度為N的策略序列比如“先HEFT調(diào)度前20個(gè)任務(wù)再切換到Min-Min調(diào)度剩下的”。這個(gè)實(shí)現(xiàn)難度更高但在任務(wù)結(jié)構(gòu)有明顯階段劃分時(shí)效果可能會(huì)更好。我建議先從第二層開始。先把強(qiáng)化學(xué)習(xí)超啟發(fā)式這條鏈路跑通驗(yàn)證了可行性之后再考慮序列化或更細(xì)粒度的動(dòng)作定義。一上來就沖最復(fù)雜的方案通常是訓(xùn)練半天不收斂最后連調(diào)試的切入口都找不到。3.3 獎(jiǎng)勵(lì)目標(biāo)與約束如何換算成數(shù)字獎(jiǎng)勵(lì)函數(shù)是整個(gè)建模過程中最容易被低估的部分。它設(shè)計(jì)得好不好直接決定智能體是穩(wěn)步提升還是原地抽風(fēng)。對(duì)于多目標(biāo)優(yōu)化問題一個(gè)常用的做法是單步獎(jiǎng)勵(lì)加權(quán)組合step_reward alpha * time_improvement beta * budget_savings gamma * penalty其中time_improvement當(dāng)前一步調(diào)度完成后預(yù)計(jì)完工時(shí)間比上一步減少的幅度歸一化到0到1budget_savings當(dāng)前一步實(shí)際費(fèi)用相比平均費(fèi)用水平的節(jié)省比例penalty如果當(dāng)前調(diào)度決策違反了某個(gè)硬約束給出一個(gè)較大的負(fù)值懲罰。這個(gè)公式里最關(guān)鍵的教訓(xùn)是penalty的數(shù)值量級(jí)一定要比正獎(jiǎng)勵(lì)大一個(gè)數(shù)量級(jí)。我曾經(jīng)在一次實(shí)驗(yàn)里把約束違反懲罰設(shè)為0.5正獎(jiǎng)勵(lì)設(shè)為主項(xiàng)的一半結(jié)果智能體學(xué)到的策略是“偶爾違反約束也沒關(guān)系”因?yàn)樵谒磥硪淮芜`反換來的時(shí)間收益是劃算的。后來我把懲罰系數(shù)調(diào)到了3以上約束滿足率才明顯回升。另一個(gè)需要留意的問題是獎(jiǎng)勵(lì)稀疏。如果一次調(diào)度動(dòng)作要等幾十步之后才能看到整體的完工時(shí)間變化中間步驟的獎(jiǎng)勵(lì)全是0智能體就很難學(xué)會(huì)東西。解決辦法是把最終目標(biāo)拆解成中間過程的密集獎(jiǎng)勵(lì)比如用“每調(diào)度一個(gè)任務(wù)距離關(guān)鍵路徑終點(diǎn)的時(shí)間余量變化”作為即時(shí)獎(jiǎng)勵(lì)。這種方法在實(shí)驗(yàn)里顯著加速了收斂我的經(jīng)驗(yàn)是訓(xùn)練收斂所需的回合數(shù)能減少30%以上。4. 從零搭建可復(fù)現(xiàn)的實(shí)驗(yàn)管線4.1 模擬環(huán)境與工作流數(shù)據(jù)生成做這個(gè)方向的實(shí)驗(yàn)第一步是搭一個(gè)自己能完全控制的模擬環(huán)境。真實(shí)云端資源是沒法用來做強(qiáng)化學(xué)習(xí)訓(xùn)練的成本高不說狀態(tài)爆炸和并發(fā)沖突問題也會(huì)讓調(diào)試變成災(zāi)難。模擬環(huán)境要包含三個(gè)模塊工作流生成器、異構(gòu)資源模型、調(diào)度執(zhí)行器。工作流生成器負(fù)責(zé)生成DAG。建議用參數(shù)化的隨機(jī)生成方式讓任務(wù)數(shù)量、依賴密度、每個(gè)任務(wù)的計(jì)算量分布都可通過參數(shù)調(diào)整。例如可以生成1000個(gè)工作流其中一半任務(wù)數(shù)在20到50之間另一半在50到120之間任務(wù)的執(zhí)行時(shí)間服從均勻分布依賴稠密度設(shè)置為中等等。這樣訓(xùn)練集和測(cè)試集可以分開測(cè)試工作流不參加訓(xùn)練用來檢驗(yàn)泛化能力。資源模型里我一般定義三到四類虛擬機(jī)規(guī)格比如“高算力型”CPU強(qiáng)、內(nèi)存大、單價(jià)高、“均衡型”、“低成本型”CPU弱、內(nèi)存小、單價(jià)低。每類資源的執(zhí)行速度倍率和費(fèi)用單價(jià)不同這直接對(duì)應(yīng)了調(diào)度中“快與貴”的權(quán)衡。調(diào)度執(zhí)行器負(fù)責(zé)根據(jù)低層策略的決策模擬任務(wù)在對(duì)應(yīng)資源上的執(zhí)行并更新任務(wù)狀態(tài)、資源負(fù)載和剩余預(yù)算。這個(gè)模塊的實(shí)現(xiàn)要注意任務(wù)之間的依賴關(guān)系必須保證“一個(gè)任務(wù)的所有前驅(qū)都完成后才能開始執(zhí)行”這一前提這也是調(diào)度可行性的硬底線。4.2 算法主體一個(gè)可落地的Double DQN方案算法主體我推薦從Double Deep Q-Network開始不是因?yàn)樗露且驗(yàn)樗€(wěn)定、實(shí)現(xiàn)難度適中、適合作為基線。用三層全連接網(wǎng)絡(luò)作為Q函數(shù)近似器輸入是狀態(tài)向量輸出是每個(gè)低層策略的Q值。經(jīng)驗(yàn)回放緩沖區(qū)存最近的10000條轉(zhuǎn)移數(shù)據(jù)每次訓(xùn)練隨機(jī)采樣200條。目標(biāo)網(wǎng)絡(luò)每200步同步一次。探索策略使用epsilon貪心初始為0.9隨著訓(xùn)練逐步衰減到0.05保證訓(xùn)練早期有足夠探索、后期逐漸收斂。訓(xùn)練流程大致如下env WorkflowSchedulingEnv(dag_generator..., resource_model...) agent DoubleDQN(state_dim64, action_dimlen(llh_set), hidden_size128) for episode in range(3000): env.reset() state env.observe() while not env.terminal(): action agent.epsilon_greedy(state) reward, next_state, done env.step(action) agent.replay_buffer.add(state, action, reward, next_state, done) agent.train_step() state next_state我建議先跑100到200個(gè)回合做冒煙測(cè)試確認(rèn)獎(jiǎng)勵(lì)曲線在上升、約束違反率在下降再拉長訓(xùn)練量。不要一上來就3000個(gè)回合跑通宵發(fā)現(xiàn)問題時(shí)回頭調(diào)試代價(jià)很高。4.3 實(shí)驗(yàn)評(píng)估指標(biāo)、基線與對(duì)比方法評(píng)估階段最怕的是“只報(bào)一個(gè)數(shù)字”。強(qiáng)化學(xué)習(xí)調(diào)度器的表現(xiàn)受隨機(jī)性影響很大同一套訓(xùn)練配置換一個(gè)隨機(jī)種子結(jié)果可能差10%以上。所以我的習(xí)慣是用至少5個(gè)不同隨機(jī)種子訓(xùn)練取平均值和標(biāo)準(zhǔn)差。核心評(píng)估指標(biāo)建議同時(shí)關(guān)注四個(gè)維度指標(biāo)說明平均makespan整個(gè)工作流從開始到全部完成的時(shí)間越低越好約束滿足率所有測(cè)試工作流中滿足截止時(shí)間和預(yù)算約束的比例資源利用率平均每個(gè)資源的有效工作時(shí)間占比平均綜合成本所有工作流調(diào)度消耗的資源費(fèi)用基線上至少要對(duì)比單個(gè)低層策略比如純HEFT、隨機(jī)策略選擇每次隨機(jī)挑低層策略、以及一個(gè)傳統(tǒng)的離線搜索方案比如遺傳算法搜索策略序列。這樣對(duì)比出來能清楚看出強(qiáng)化學(xué)習(xí)超啟發(fā)式的優(yōu)勢(shì)到底來自“動(dòng)態(tài)切換策略”這一點(diǎn)而不是純靠運(yùn)氣或疊加了某個(gè)特別強(qiáng)的低層策略。看結(jié)果時(shí)我特別推薦做一次“同場(chǎng)景對(duì)比”把某個(gè)具體工作流的狀態(tài)追蹤圖拿出來看看智能體在關(guān)鍵決策點(diǎn)選了哪個(gè)低層策略為什么選它。這不是發(fā)論文必須的但能幫你理解智能體到底學(xué)到了什么也能避免“指標(biāo)好看但策略完全不合理”的假象。5. 調(diào)試與踩坑跑訓(xùn)練時(shí)最常遇到的幾個(gè)問題5.1 獎(jiǎng)勵(lì)稀疏與收斂緩慢我在這個(gè)方向上的第一個(gè)實(shí)驗(yàn)就栽在獎(jiǎng)勵(lì)稀疏上。那時(shí)獎(jiǎng)勵(lì)設(shè)計(jì)成“整個(gè)工作流跑完后計(jì)算完工時(shí)間與未違反約束的獎(jiǎng)勵(lì)”結(jié)果前500個(gè)回合里智能體收到的幾乎全是零偶爾有一兩個(gè)正獎(jiǎng)勵(lì)Q值更新基本是靠運(yùn)氣。訓(xùn)練曲線看起來就像一條水平直線完全沒有學(xué)習(xí)跡象。后來我把獎(jiǎng)勵(lì)改成單步密集形式每一步調(diào)度完成后計(jì)算這一步選擇的時(shí)間收益和成本收益配合約束懲罰。這樣智能體每走一步都能收到反饋。另外我給每個(gè)回合加了一個(gè)“漸進(jìn)式獎(jiǎng)勵(lì)”每成功調(diào)度一個(gè)任務(wù)給一個(gè)小正數(shù)獎(jiǎng)勵(lì)否則不給。這樣即使是失敗回合智能體也能在路徑上獲得部分正反饋訓(xùn)練信號(hào)密度明顯提高。5.2 狀態(tài)維度不定與圖編碼問題工作流的任務(wù)數(shù)量每次實(shí)驗(yàn)里都不一樣DAG結(jié)構(gòu)也不同但如果我的狀態(tài)輸入是全連接網(wǎng)絡(luò)的固定維度向量就繞不開“怎么把不同長度的信息塞進(jìn)固定維度”的問題。一開始我用的是手工特征聚合例如統(tǒng)計(jì)剩余任務(wù)數(shù)、關(guān)鍵路徑長度占比、資源平均負(fù)載、預(yù)算消耗比例等把所有信息壓縮成十幾個(gè)數(shù)值。這個(gè)方案跑是能跑但信息丟失嚴(yán)重任務(wù)之間的依賴結(jié)構(gòu)基本被抹平了智能體看不出哪些任務(wù)是關(guān)鍵路徑上必須優(yōu)先保障的。后來我換成了圖神經(jīng)網(wǎng)絡(luò)編碼。先對(duì)每個(gè)任務(wù)節(jié)點(diǎn)做嵌入得到每個(gè)任務(wù)的向量表示再用注意力池化把整個(gè)圖的表示壓縮成一個(gè)固定維度的全局向量。這個(gè)向量再和資源狀態(tài)向量拼接進(jìn)入全連接網(wǎng)絡(luò)。換了這個(gè)方案后收斂速度有可感知的提升。實(shí)現(xiàn)上不需要自己寫GNN用一個(gè)兩三層的消息傳遞層就行代碼量并不夸張。5.3 約束懲罰系數(shù)怎么標(biāo)定獎(jiǎng)懲參數(shù)的標(biāo)定是所有強(qiáng)化學(xué)習(xí)項(xiàng)目中最需要手感的環(huán)節(jié)。懲罰系數(shù)太小智能體會(huì)無視約束太大智能體會(huì)變得極度保守什么動(dòng)作都不敢做導(dǎo)致整體性能斷崖式下降。我調(diào)試時(shí)用過一個(gè)相對(duì)系統(tǒng)的辦法先固定其他參數(shù)把懲罰系數(shù)從0開始逐步增大每換一個(gè)值做一輪短訓(xùn)練觀察約束違反率和平均性能的折線圖。經(jīng)驗(yàn)上當(dāng)懲罰系數(shù)增大到違反率降到個(gè)位數(shù)百分比時(shí)繼續(xù)加大就沒有意義了。另一個(gè)技巧是讓懲罰系數(shù)跟著訓(xùn)練進(jìn)度動(dòng)態(tài)變化訓(xùn)練初期把系數(shù)設(shè)小讓智能體先探索策略空間訓(xùn)練后期把系數(shù)調(diào)大引導(dǎo)它專注于滿足約束。這種課程式訓(xùn)練思路在實(shí)踐中效果不錯(cuò)。5.4 訓(xùn)練不穩(wěn)定與隨機(jī)性控制深度強(qiáng)化學(xué)習(xí)的訓(xùn)練曲線劇烈震蕩是常態(tài)但震蕩到完全看不出趨勢(shì)就有問題了。我踩過的一個(gè)典型坑是目標(biāo)網(wǎng)絡(luò)更新頻率設(shè)得太頻繁導(dǎo)致當(dāng)前網(wǎng)絡(luò)總是追著目標(biāo)網(wǎng)絡(luò)跑兩者一起共振Loss值像過山車一樣上下顛簸。后來把同步頻率從50步改成200步并配合梯度裁剪訓(xùn)練明顯穩(wěn)定了很多。工作流生成器的隨機(jī)性也會(huì)放大訓(xùn)練波動(dòng)。如果每回合生成的工作流差異過大智能體在同一狀態(tài)下看到的回報(bào)方差會(huì)很高。我建議訓(xùn)練時(shí)把工作流生成參數(shù)固定下來比如任務(wù)數(shù)量范圍、依賴密度分布都固定只改變具體結(jié)構(gòu)測(cè)試階段再用另一組更分散的工作流檢驗(yàn)泛化能力。這樣能保證訓(xùn)練過程可控測(cè)試結(jié)果可信。6. 一些擴(kuò)展思路和實(shí)操建議6.1 從離線訓(xùn)練到在線調(diào)度訓(xùn)練好模型之后一個(gè)很自然的擴(kuò)展是把它嵌入真實(shí)的調(diào)度系統(tǒng)做在線調(diào)度。但這里要注意離線訓(xùn)練時(shí)的環(huán)境模型總會(huì)和真實(shí)情況有偏差。比如真實(shí)任務(wù)的實(shí)際執(zhí)行時(shí)間不是事先確定的它會(huì)受資源爭(zhēng)搶、網(wǎng)絡(luò)抖動(dòng)影響。一個(gè)穩(wěn)妥的落地方式是采用“人類留一手”的混合模式智能體每步給出推薦的低層策略但系統(tǒng)會(huì)加一道約束校驗(yàn)器凡是違反硬約束的推薦直接拒絕退回最近的可行策略。這道保險(xiǎn)絲能大幅提升系統(tǒng)的安全性避免因?yàn)槟P褪д`把整個(gè)工作流搞出約束邊界。6.2 遷移性與泛化的進(jìn)一步探索如果已經(jīng)跑通了固定場(chǎng)景下的調(diào)度接下來可以思考泛化問題。訓(xùn)練時(shí)只見過一種資源類型配置測(cè)試時(shí)換一批資源類型是不是還能表現(xiàn)良好工作流結(jié)構(gòu)從密集依賴變成稀疏依賴模型能不能適應(yīng)圍繞這些問題的探索思路包括訓(xùn)練時(shí)用域隨機(jī)化讓工作流生成器和資源模型都在一定范圍內(nèi)隨機(jī)變動(dòng)強(qiáng)制智能體學(xué)習(xí)更泛化的策略或者引入元學(xué)習(xí)的思路在不同調(diào)度場(chǎng)景之間訓(xùn)練一個(gè)“學(xué)會(huì)學(xué)習(xí)”的高層策略使它在新場(chǎng)景下能快速適應(yīng)。這個(gè)方向做起來工作量會(huì)大不少但也是這個(gè)題目最有科研增量空間的地方。6.3 給正在做課題的同學(xué)的幾點(diǎn)建議最后聊幾句實(shí)在的。如果你正在準(zhǔn)備這個(gè)方向的課題我建議先從復(fù)現(xiàn)經(jīng)典超啟發(fā)式調(diào)度開始跑通HEFT和Min-Min的基線再逐步加入強(qiáng)化學(xué)習(xí)模塊。別試圖一步到位實(shí)現(xiàn)“最強(qiáng)算法”。寫論文或做項(xiàng)目匯報(bào)時(shí)也不要只給一組最終數(shù)據(jù)。把訓(xùn)練曲線、約束違反率變化、不同低層策略的使用頻率分布都整理出來這些過程性觀察往往比最終指標(biāo)更能說明問題。評(píng)審人最關(guān)心的其實(shí)是兩個(gè)問題為什么這樣做有效以及在哪些條件下會(huì)失效。這些信息需要你在實(shí)驗(yàn)里不斷觀察和記錄。我在實(shí)際操作中的一個(gè)體會(huì)是強(qiáng)化學(xué)習(xí)超啟發(fā)式的價(jià)值不在于每一步都選到最優(yōu)調(diào)度策略而在于它能在不同場(chǎng)景之間靈活切換避免了固定策略在復(fù)雜約束下“一招鮮吃遍天”的尷尬。哪怕最終只是因?yàn)閯?dòng)態(tài)切換帶來了10%的性能提升這套思路在調(diào)度這個(gè)具體問題里也足以證明自己的價(jià)值了。