據(jù)中心節(jié)能:DQN三維協(xié)同調度實踐)
做數(shù)據(jù)中心調度的人大概都有過這種困擾手里掌握著幾十上百臺服務器的運行數(shù)據(jù)CPU利用率、機柜溫度、空調功率、實時電價全都擺在屏幕上可到了做決策時卻不知道該先調誰、調多少才算最優(yōu)。早年間我還在用閾值規(guī)則硬懟設定溫度超過32度就加大制冷CPU超過80%就遷移任務結果往往是冷熱不均、電費翻倍調度員忙成救火隊員。后來把問題換成電力-熱力-算力三維協(xié)同的視角再引入深度強化學習里的DQN算法用Matlab搭出一套智能調度原型才算摸到了門道。這篇博文就是把我從問題建模、馬爾可夫決策過程設計、DQN訓練到Matlab代碼落地的完整思路捋一遍也會把踩過的坑和調參經驗一并分享適合正在做數(shù)據(jù)中心節(jié)能調度、剛入門強化學習或者想把算法從論文搬到工程實驗里的讀者。1. 先理解三維協(xié)同在調度里到底指什么1.1 數(shù)據(jù)中心能耗的真實分布很多人一提數(shù)據(jù)中心節(jié)能第一反應就是把服務器功耗降下來。但真正拆開電表看IT設備的耗電只占一部分空調制冷和供配電損耗加起來通常占整個數(shù)據(jù)中心總能耗的三到四成。也就是說就算服務器不動冷卻系統(tǒng)照樣在燒電。更麻煩的是兩套系統(tǒng)互相耦合任務跑得多服務器發(fā)熱大空調負載就得跟著加電價高峰時段還可能撞在一起。以前我把IT調度和制冷調度分開優(yōu)化測出來的省電數(shù)據(jù)很漂亮一聯(lián)動就露餡成本反而上升。所以在三維協(xié)同框架里電力、熱力、算力不是三個平行的話題而是一條因果鏈算力負載決定了服務器功耗和產熱產熱決定了冷卻需求冷卻功率和IT功耗疊加成總用電成本電價信號又反過來決定哪些時間段該多算、哪些時間段該少算。調度算法必須能感知這條鏈上的每一個環(huán)節(jié)才能做出全局最優(yōu)的決策。1.2 三維協(xié)同的數(shù)學化表達我把這個系統(tǒng)建模成一個離散時間、帶約束的馬爾可夫決策過程(MDP)。時間片設為15分鐘每個時隙內觀察系統(tǒng)狀態(tài)選擇一個動作然后獲得成本和狀態(tài)轉移。這里有幾個關鍵設計決策電力側采用分時電價模型目前國內多數(shù)工商業(yè)場景都執(zhí)行峰谷分時電價峰段電價通常是谷段的2到3倍。把電價作為環(huán)境狀態(tài)的一部分調度策略就要學會在電價低時把任務提前算完在電價高時減少新任務進入。熱力側用簡化的傳熱模型描述機柜溫度變化溫度不僅受本機柜IT負載影響還受相鄰機柜和環(huán)境溫度影響??照{系統(tǒng)有最大供冷功率限制溫度超過安全閾值會產生懲罰。算力側任務以隊列形式到達每個時隙可以選擇將任務分配到某個服務器并執(zhí)行也可以暫時留在隊列。任務有最大可容忍延遲排隊時間超過期限就算違約。這三個子系統(tǒng)的模型在Matlab里不要做得太精細先線性化、先抓住主要耦合關系夠用就行。我見過不少項目一開始就把流體力學細節(jié)和芯片級功耗都塞進去結果模型本身比調度問題還復雜強化學習根本訓不動。工程上合理的做法是從帶通解的簡化模型開始驗證算法有效后再逐步加復雜度。1.3 為什么選擇DQN而不是直接上優(yōu)化器這類調度問題如果寫成混合整數(shù)規(guī)劃理論上可以用求解器跑出最優(yōu)解。但實際場景里狀態(tài)量有十幾個維動作組合又是離散的任務分配、冷卻擋位、服務器開關機求解器在幾十個時間片規(guī)模下還能跑拉到全天96個時隙、上百臺服務器就變成天文數(shù)字。傳統(tǒng)的啟發(fā)式算法如最早截止期優(yōu)先調度加閾值制冷控制速度快但不會主動利用電價低峰特性對非線性耦合也缺乏全局視角。DQN恰好填補這個空白它不需要環(huán)境模型模型我們只是用來做仿真器能接受高維度狀態(tài)輸入輸出的是離散動作的Q值天然適配每15分鐘做一次開關機決策、冷卻擋位切換這類場景。而且Matlab的仿真環(huán)境和可視化做得直觀適合先驗證算法邏輯再遷移到真實平臺。當然DQN不是萬能的如果動作空間包含連續(xù)變量比如冷卻水流量連續(xù)調節(jié)那就得換DDPG或TD3這個后面再展開。2. 狀態(tài)空間、動作空間和獎勵函數(shù)的設計2.1 狀態(tài)空間怎么定義才不冗余狀態(tài)設計的原則是夠用且不冗余不是說變量越多越好。我最初把每臺服務器的歷史利用率也塞進狀態(tài)維度一下子沖到30多網(wǎng)絡訓練時間翻倍性能還變差。后來重新梳理因果鏈最終保留了10個狀態(tài)量狀態(tài)變量物理含義備注任務隊列長度Q當前等待調度的任務數(shù)相對值方便歸一化隊列平均等待時長W反映延遲壓力用于違約懲罰判斷各服務器CPU利用率 U_i每臺服務器負載水平一維向量維度等于服務器數(shù)機柜溫度 T_i對應機柜出風溫度與熱力模型耦合空調總制冷功率 P_c當前冷卻系統(tǒng)用電可觀測實時電價 price當前時隙電價來自分時電價曲線外部環(huán)境溫度 T_out影響制冷效率可設為常量或隨時間變化狀態(tài)歸一化非常重要。我踩過的最大的坑就是原始狀態(tài)直接喂網(wǎng)絡結果大量利用率的數(shù)值都在0.5~0.8電價卻在0.3~1.5之間波動溫度又是30~40網(wǎng)絡梯度被大數(shù)值變量主導收斂特別慢。Matlab里有normalize函數(shù)但要注意不能一次性歸一化后直接用于在線推理得記錄訓練集的min和max推理時用同樣的映射。2.2 動作空間與離散化策略DQN要求動作空間是離散的而調度問題天然包含連續(xù)量比如任務分配比例、冷卻功率所以需要人為離散化。我最終把動作設計成三種子動作的笛卡爾積任務分配策略任務分配給哪臺服務器每臺服務器一個離散選項。冷卻擋位調節(jié)制冷功率設定為低/中/高三擋避免連續(xù)功率帶來的動作爆炸。服務器開關機每臺服務器可以選擇關機或開機。這樣動作數(shù) 服務器數(shù) × 3 × 2如果服務器是5臺動作空間就是30。我實際實驗里用5臺服務器和30個離散動作DQN訓練還比較穩(wěn)定。如果動作空間超過100建議考慮動作分支架構dueling DQN 分支輸出否則全連接網(wǎng)絡輸出層太大訓練效率和穩(wěn)定性都扛不住。有一點要特別提醒服務器開關機動作會讓狀態(tài)轉移變成非完全馬爾可夫的因為服務器從關機到開機存在啟動時間理論上需要把正在啟動的服務器也納入狀態(tài)。為了簡化我在環(huán)境里規(guī)定關機動作后至少間隔兩個時間片才能重新開機并把服務器狀態(tài)作為記憶的一部分體現(xiàn)在仿真器里這樣MDP假設依然近似成立。2.3 獎勵函數(shù)成本的負數(shù)加上懲罰DQN訓練的目標是最大化累計獎勵調度場景下自然應該把負成本作為獎勵。但單純負成本太稀疏需要加入懲罰項加速學習。我的獎勵函數(shù)構造如下reward - (c_elec c_switch c_sla c_temp) c_elec price * (sum(P_idle P_dynamic*u_i) P_cool) * dt c_switch beta * sum(激活開關機動作的服務器數(shù)量) c_sla gamma * max(0, 任務等待時間 - 最大容忍時間) c_temp lambda * sum(max(0, T_i - T_max))各項的含義c_elec當前時隙總電費包含IT設備空載功耗、動態(tài)功耗和冷卻功耗。c_switch對頻繁開關機動作的懲罰避免策略抖動β一般取0.1~0.3。c_sla任務違約懲罰γ較大比如1.0讓算法優(yōu)先滿足服務約束。c_temp溫度超限懲罰λ也要設得比較重因為過熱會損壞設備。這個獎勵函數(shù)看起來簡單但細想是有講究的。如果把電價項權重設得太高算法會傾向于讓所有服務器都關機來省電然后任務瘋狂違約訓練出來一個看起來很省電、實際完全不能用的策略。為了平衡我實驗時會記錄純省電策略和純履約策略下的單步獎勵范圍然后反推權重讓兩個方向的最壞情況都不至于壓過對方。2.4 仿真環(huán)境的狀態(tài)轉移邏輯Matlab實現(xiàn)里環(huán)境仿真器其實就是一個函數(shù)輸入是當前狀態(tài)和動作輸出是下一狀態(tài)和獎勵。我習慣寫成[next_state, reward, done] env_step(state, action, params)。內部邏輯根據(jù)動作更新服務器開關狀態(tài)和冷卻擋位。任務隊列并入新到達任務將部分任務分配給指定服務器執(zhí)行更新各服務器利用率。調用熱力模型更新機柜溫度。計算各項成本與懲罰得到獎勵。檢查是否達到仿真終點例如96個時隙跑完。熱力模型我用的是一階熱平衡方程某一時刻溫度變化率等于產熱功率減去散熱功率再乘以熱容倒數(shù)。Matlab里用歐拉前向差分更新就行時間步長15分鐘穩(wěn)定性沒問題。真正要小心的是不能讓溫度狀態(tài)出現(xiàn)負值或者超出物理范圍否則后期仿真的數(shù)值會崩掉。3. DQN算法的核心機制與Matlab代碼實現(xiàn)3.1 DQN為什么能穩(wěn)定訓練兩個關鍵機制如果只用一個普通神經網(wǎng)絡做Q值擬合訓練震蕩會非常嚴重。原因很簡單網(wǎng)絡在更新時目標值也是同一個網(wǎng)絡算出來的參數(shù)一變目標就跟著變模型在追一個移動靶子。DQN的兩個核心機制就是為了解決這個移動靶問題。第一個是經驗回放Experience Replay。把每一步的(state, action, reward, next_state, done)存進經驗池訓練時隨機采樣一個小批量打破數(shù)據(jù)的時間相關性避免網(wǎng)絡對近期經驗過擬合。第二個是目標網(wǎng)絡Target Network。維護一個參數(shù)更新比較滯后的目標網(wǎng)絡每隔C步才從當前網(wǎng)絡同步權重用它來計算TD目標讓訓練目標在一段時間內保持穩(wěn)定。在Matlab里實現(xiàn)經驗池我直接用一個結構體數(shù)組加頭尾指針簡單不花哨。經驗池容量設成20000~50000采樣批量64目標網(wǎng)絡同步周期C設為200步這些是我試過比較穩(wěn)的參數(shù)。容量設太大比如100萬會導致早期經驗占太多學習效率低容量設太小則回放樣本高度相關效果還不如在線學習。3.2 神經網(wǎng)絡結構與Matlab代碼網(wǎng)絡結構我用的三層全連接輸入層10個節(jié)點對應10維狀態(tài)隱藏層分別64和32激活函數(shù)ReLU輸出層30個節(jié)點對應30個離散動作。Matlab里有現(xiàn)成的強化學習工具箱可以構造DQN智能體但我更推薦手寫訓練循環(huán)因為后面要調獎勵權重、觀察中間值手寫控制力更強。% 定義Q網(wǎng)絡 state_dim 10; action_dim 30; hidden 64; % 使用Deep Learning Toolbox的函數(shù)構建網(wǎng)絡 lgraph layerGraph([ imageInputLayer([state_dim 1 1], Normalization, none, Name, state_in) fullyConnectedLayer(hidden, Name, fc1) reluLayer(Name, relu1) fullyConnectedLayer(hidden/2, Name, fc2) reluLayer(Name, relu2) fullyConnectedLayer(action_dim, Name, fc_out) ]); % 注imageInputLayer要求輸入為[w h 1]格式這里把狀態(tài)向量當1xN的圖像注意Matlab的imageInputLayer對單通道輸入有自己的尺寸要求習慣上把狀態(tài)向量當做一個寬為N、高為1、通道為1的圖像來定義。也可以用featureInputLayer但我在R2021a下測試過featureInputLayer與rlVectorQValueFunction結合更順滑不過手寫訓練時不必執(zhí)著于某個API能完成前向計算和梯度反向傳播就行。前向Q值計算和反向傳播我優(yōu)先用dlnetwork對象方便dlgradient自動求導% 將layerGraph轉為dlnetwork net dlnetwork(lgraph); targetNet dlnetwork(lgraph); % 目標網(wǎng)絡初始相同 % 前向計算 Q(s) state dlarray(single(s_state), CB); Q_vals forward(net, state, Outputs, fc_out); Q_max_next max(forward(targetNet, state_next, Outputs, fc_out));3.3 訓練主循環(huán)訓練主循環(huán)結構非常傳統(tǒng)每個時間步在仿真器里采一個經驗存進經驗池每4步做一次小批量訓練每200步同步一次目標網(wǎng)絡。我自己寫的訓練主循環(huán)核心代碼如下for ep 1:maxEps state env_reset(); done false; while ~done % epsilon-greedy動作選擇 if rand() epsilon action randi(action_dim); else Q_all predict_Q(net, state); [~, action] max(Q_all); end % 執(zhí)行動作獲得轉移 [next_state, reward, done] env_step(state, action, env_params); % 存入經驗池 buffer_add(buffer, state, action, reward, next_state, done); state next_state; % 每4步訓練一次 if mod(t, 4) 0 buffer.size batchSize [s_b, a_b, r_b, s_next_b, done_b] buffer_sample(buffer, batchSize); train_dqn(net, targetNet, s_b, a_b, r_b, s_next_b, done_b, gamma, lr); end % 每200步同步目標網(wǎng)絡 if mod(t, 200) 0 targetNet net; end % epsilon線性衰減 epsilon max(epsilon_min, epsilon * epsilon_decay); t t 1; end end這里有個細節(jié)Matlab的forward和predict用法在深度學習工具箱里很靈活但每次前向都要構造dlarray訓練速度遠不如Python的PyTorch。想要加速可以利用Matlab的并行計算工具箱把環(huán)境仿真和網(wǎng)絡訓練分別放到不同的worker上或者減少批量訓練的頻率。我在實驗中把每4步訓練一次改成每8步訓練一次損失下降曲線穩(wěn)定很多電費優(yōu)化率還稍微提升了這說明訓練頻率過高也會導致策略在局部振蕩。3.4 超參數(shù)參考表超參數(shù)推薦范圍我的最終取值調參心得學習率1e-4~1e-35e-4過大會震蕩過小收斂慢也回不到最優(yōu)折扣因子γ0.9~0.990.95太大則算法短視太小則只看眼前ε初值0.5~1.00.8先充分探索再逐步利用ε最小值0.01~0.10.01保證后期仍有一點探索經驗池容量20000~5000030000容量不夠會讓目標網(wǎng)絡失去意義批量大小32~12864大批量訓練更穩(wěn)定但更慢目標網(wǎng)絡同步周期100~500200太頻繁等于沒有目標網(wǎng)絡隱藏層節(jié)點數(shù)64~12864狀態(tài)量不多時不需太寬這些參數(shù)不是死數(shù)關鍵是理解每個參數(shù)調節(jié)背后的物理直覺。比如折扣因子γ如果調大意味著策略更看重長期成本這跟電價峰谷周期長度有關電價周期是一天24小時96個時隙那γ0.99可能比0.95更合適因為未來20個時隙的影響都不能忽視。我最終在γ0.95和0.99之間選擇的依據(jù)是累計獎勵的方差γ越大方差越大訓練初期越不穩(wěn)定。4. 實驗設計、對比基線與結果解讀4.1 實驗場景與數(shù)據(jù)集生成實驗的場景參數(shù)必須貼近實際否則驗證結果沒有說服力。我用5臺規(guī)格相近的服務器每臺服務器空閑功耗150W滿負載功耗400W最高算力容量按單位任務計算。任務到達率用泊松過程模擬平均每小時到達16~24個任務每個任務需要1到3個單位的CPU資源。電價曲線采用典型的分時三段制峰時1.2元/度、平時0.7元/度、谷時0.3元/度峰值時段為上午10點到下午14點和傍晚18點到22點。外部環(huán)境溫度設置為25~35攝氏度的日變化曲線模擬夏季工況。每5次仿真使用相同隨機種子生成同一套任務到達序列確保不同策略對比的公平性。Matlab里用rng(seed)控制隨機數(shù)這個是實驗復現(xiàn)的底線。4.2 對比基線的選擇做實驗最忌諱只跟隨機策略比較說服力太弱。我選了三個有實際參考意義的基線隨機策略每個時隙隨機選動作。這個基線一般主要用來驗證環(huán)境仿真器沒有bug。閾值啟發(fā)式策略當隊列長度超過閾值時把任務分配給利用率最低的服務器機柜溫度超過35度時冷卻調高擋位。這是很多現(xiàn)場還在用的傳統(tǒng)做法。貪心策略每個時隙選擇當前Q值最高的動作即DQN去掉了探索環(huán)節(jié)直接利用。這個對比能看出離線訓練出的策略到底好不好用。此外如果環(huán)境允許還可以加一個理想化求解策略即用混合整數(shù)規(guī)劃求解器在小規(guī)模問題上求最優(yōu)解作為性能上界。我這里只有5臺服務器動作空間30用求解器算96個時隙的最優(yōu)解可行于是我也加了這個參照。4.3 結果分析與深層機制剖析實驗結果顯示DQN策略在總電費上比閾值啟發(fā)式策略節(jié)省了17%左右比隨機策略節(jié)省40%以上跟理想最優(yōu)解的差距縮小到6%以內。最有意思的是電費節(jié)約的構成我原本以為主要省在制冷功率的調節(jié)結果拆解后發(fā)現(xiàn)最大一部分來自任務轉移——DQN學會了在電價低的夜間把能推遲的任務安排給服務器白天高峰時段只處理緊急任務服務器關機數(shù)量白天明顯多于夜間。這個現(xiàn)象背后是DQN通過獎勵函數(shù)逐步學到了電價差這個時間維度的特征這恰恰是傳統(tǒng)閾值策略做不到的。閾值策略只關心當前隊列長度和溫度完全沒有對電價會在未來幾個時隙上漲的預判能力。溫度表現(xiàn)同樣滿足預期。DQN策略把機柜溫度控制在35度以下的概率約為98.7%略低于理想最優(yōu)策略的99.2%但遠高于貪心策略的91.3%。貪心策略的問題在于訓練結束后我把探索完全關掉網(wǎng)絡對某些狀態(tài)下Q值的變化很敏感偶發(fā)情況下會做出極端動作比如氣溫較高時關機過多導致剩余服務器超載可見探索噪聲在訓練中的正則化作用對策略魯棒性也有貢獻。收斂性上DQN在3000個episode左右開始穩(wěn)定累計獎勵曲線波動幅度從±40%收窄到±8%。有趣的是我最初設置的訓練episode是一萬但測試發(fā)現(xiàn)2500~4000個episode之間策略性能基本不再提升過早停止會差一些訓練過頭也不見得更好有些子優(yōu)動作會慢慢占據(jù)上風所以實踐里我建議訓練中保存多個checkpoint最后用驗證集上的表現(xiàn)挑選最優(yōu)模型而不是簡單取最后一個episode的結果。5. 工程實現(xiàn)中的常見問題與調試手記5.1 獎勵函數(shù)的稀疏與數(shù)值爆炸第一個常見問題是獎勵數(shù)值范圍跨度太大。電費一檔可能是幾十塊錢溫度懲罰一算出來就是上百萬神經網(wǎng)絡損失直接爆表。這個問題的解法不是簡單歸一化而是讓獎勵項量級盡量一致。我重新設計權重后把各項單步獎勵控制在[-10, 0]區(qū)間訓練穩(wěn)定性立竿見影。這里有個實操技巧寫完獎勵函數(shù)先跑一次不訓練的隨機策略把每項獎勵的分布打印出來看數(shù)量級用這個分布去定權重比憑感覺靠譜得多。5.2 Q值過估計問題DQN的Q值天然存在高估傾向因為max操作符會累積噪聲。我在實驗初期也觀察到訓練后期網(wǎng)絡輸出的Q值比實際累計獎勵大好幾倍但最優(yōu)動作仍然正確所以這個問題沒有立刻影響策略。但如果Q值高估到一定程度次優(yōu)動作也可能被誤選尤其當兩個動作的真實Q值非常接近時。緩解手段有兩個一個是把目標網(wǎng)絡換成Double DQN用當前網(wǎng)絡選擇最佳動作、目標網(wǎng)絡計算該動作的Q值另一個是我實際用的——降低目標網(wǎng)絡的同步頻率給目標值一個冷卻期。如果項目時間充裕建議直接上Double DQN改動量只有3~5行代碼性價比很高。5.3 Matlab訓練效率低下的應對思路Matlab訓練深度網(wǎng)絡的速度確實比C或Python慢我在入門階段也為此困擾過。但仔細分析后發(fā)現(xiàn)大部分時間花在dlarray創(chuàng)建和環(huán)境仿真的串行執(zhí)行上。三個優(yōu)化立竿見影第一狀態(tài)和獎勵盡量用MATLAB原生數(shù)組操作不要在循環(huán)里反復調用zeros和dlarray第二把env_step改成向量化計算一次仿真所有服務器溫度同步更新避免逐臺服務器for循環(huán)第三嘗試用MATLAB Coder把環(huán)境仿真轉成MEX如果項目周期允許這一步能帶來接近5倍的加速。另一個思路是用并行工具箱做多智能體并行訓練——既然算法是獨立環(huán)境的可以開8個worker并行采樣再集中訓練效果類似Ape-X架構的簡化版。這個方案我實驗過收斂速度大約提升3倍代價是實現(xiàn)復雜度增加不少。5.4 訓練不收斂時先檢查環(huán)境還是先檢查算法我給初學者的建議是如果損失值完全不下降90%的問題在環(huán)境仿真器。比如獎勵函數(shù)寫錯符號、狀態(tài)轉移邏輯存在bug、狀態(tài)歸一化用了全局統(tǒng)計量導致分布偏移這些錯誤會讓算法覺得同一個狀態(tài)同一動作一會兒好一會兒壞網(wǎng)絡很難學會任何東西。一個快速診斷方法固定一個狀態(tài)和動作重復執(zhí)行1000次打印輸出的獎勵和下一狀態(tài)人工校驗是否與物理直覺一致。我自己的仿真器曾經在熱力模型更新時用錯了一層括號位置導致溫度永遠不變當時查了兩天才發(fā)現(xiàn)就是因為沒有做這個單步檢測。還有一個更隱蔽的問題是動作不可逆。如果在同一狀態(tài)多次執(zhí)行同一動作得到完全不同的結果而狀態(tài)里又沒有記錄引起差異的隱藏變量那MDP假設就不成立DQN會怎么訓都收斂不了。我在環(huán)境里加入服務器啟動延遲的隱藏狀態(tài)來處理這個問題不過這相當于變相把動作的效果延遲了同時也會影響Q值的信用分配。在實際項目中遇到這類情況最簡單的緩解手段是把動作執(zhí)行后N個時隙內的觀測直接拼接到狀態(tài)里讓網(wǎng)絡能夠看到動作的滯后效應。6. 從仿真到落地的幾條實在建議寫到這里我的核心經驗已經基本講完最后補充幾條從仿真原型往實際調度平臺遷移時的個人體會。在真實數(shù)據(jù)中心不要指望訓練出來的DQN策略直接接管控制權。我見過太多項目在仿真里跑得飛快一上線就翻車原因是仿真模型跟物理世界存在誤差服務器實際功耗非線性的部分比線性模型復雜得多冷卻系統(tǒng)還有惰性和延遲。穩(wěn)妥的落地路徑是把強化學習策略當成一個優(yōu)化建議器它輸出每個時隙的傾向性動作再由人工或者規(guī)則層做安全校驗只有落在安全區(qū)間內的動作才被采納。等到累計足夠多的真實數(shù)據(jù)后再微調仿真器參數(shù)縮小sim-to-real gap。模型泛化也是要注意的。在單一電價曲線、單一任務分布下訓練好的DQN換一個場景大概率性能驟降。我在測試中發(fā)現(xiàn)如果把電價曲線改成節(jié)假日/工作日的規(guī)律性波動原先訓練好的網(wǎng)絡前幾個episode表現(xiàn)很差但通過遷移學習用小學習率在少量新數(shù)據(jù)上微調很快就能恢復性能。這說明DQN學到的是調度規(guī)律而不是死板動作表只是規(guī)律會依賴電價波動的具體形態(tài)。落地時建議保留在線微調通道每周用真實運行數(shù)據(jù)做一次增量訓練。最后如果你在做的場景動作空間含連續(xù)變量比如水泵頻率、冷凍水溫度設定DQN就不合適了可以考慮DDPG或TD3這類actor-critic連續(xù)控制算法。但從我這個項目的經驗看很多看似連續(xù)的控制量其實可以按擋位離散化只要擋位分得夠細DQN的性能損失并不大而實現(xiàn)和調試的代價卻低了一個數(shù)量級。調度這件事從來不是算法越復雜越好而是越貼合物理約束越好希望這篇分享能幫你少走幾步彎路。