Python環境中在線訓練機器學習模型所遇到的問題及解決方案

我最近開發個智能控制系統,包括實時數據采集、預測、策略優化等功能,最近增加在線學習功能,也就是在線進行模型訓練,在線進行模型訓練時出現了問題,現象為:

控制臺報:

  • cmdstanpy - INFO - Chain [1] start processing
  • 所有任務、線程停止,Web服務登錄無法訪問
  • 后臺的python進行仍在,CPU資源降低到10%以下(訓練時都在70%到90%)

環境信息:

  • CentOS操作系統
  • Python 3.8
  • apscheduler 任務管理
  • python 線程
  • python 進程 multiprocessing
  • Flask提供Web服務
  • 機器學習使用Scikit-learn,時序預測使用Prophet

1. 原因分析

1.1. 我的初步分析

直接原因是我在線學習功能設計忽略了資源爭用的情景,只考慮到在線訓練是偶爾發生的事。

1.2. 根本原因分析

再看看DeepSeek給出分析原因:

(1) CPU 資源耗盡

  • Scikit-learn 和 Prophet 默認會占用所有可用的 CPU 核心(尤其是 n_jobs=-1 時)。
  • 多線程任務(如 Flask 請求、APScheduler)因 CPU 爭搶被餓死。

(2) 內存不足(OOM)

  • 大規模數據訓練時,內存被占滿,觸發系統 OOM Killer 殺死進程或頻繁換頁(Swapping),導致卡頓。

(3) Python 的 GIL(全局解釋器鎖)

  • Prophet 和 Scikit-learn 的部分計算是 C++ 并行的,但 Python 線程仍受 GIL 限制,導致線程調度阻塞。

(4) 磁盤/文件 I/O 阻塞

  • Prophet 會生成臨時文件(如 Stan 模型的編譯緩存),高負載時磁盤 I/O 成為瓶頸。

(5) 線程死鎖

  • 如果任務之間有共享資源的鎖競爭(如數據庫連接、文件讀寫),可能導致死鎖。

2. 解決方案

2.1. 啟動子進程進行訓練

我在進行在線機器學習訓練時,使用“multiprocessing.Process”,啟動進程進行訓練。

在使用 multiprocessing.Process 啟動子進程進行機器學習訓練時,確實可以避免 GIL 鎖競爭 和 主線程阻塞 的問題。

2.1.1. 解決方案(兼容 Windows + Flask)

方法 1:將多進程代碼封裝到單獨模塊

(1) 創建獨立模塊 train_worker.py
# train_worker.py
from multiprocessing import Process, Queue
# 啟動多進程訓練
def run_train(model_type, model_param):"""子進程實際執行的函數"""if model_type == '24h':return LoadMLPModelTrain(model_param)elif model_type == 'realtime':return LoadRealTimeMLPModelTrain(model_param)def _worker_proc(q: Queue, model_type, model_param):"""替代 lambda 的全局函數"""result = run_train(model_type, model_param)  # 調用實際訓練函數q.put(result)def async_train(model_type, model_param):"""Flask 調用的接口"""result_queue = Queue()p = Process(target=_worker_proc,  # 使用全局函數而非 lambdaargs=(result_queue, model_type, model_param))p.start()ret = result_queue.get()  # 阻塞等待結果p.join()return ret

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901916.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901916.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901916.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【教程】無視硬件限制強制升級Windows 11

轉載請注明出處:小鋒學長生活大爆炸[xfxuezhagn.cn] 如果本文幫助到了你,歡迎[點贊、收藏、關注]哦~ 1、下載升級工具:https://github.com/builtbybel/Flyby11/releases 2、解壓后打開軟件: 3、拖入win11.iso或者自動下載&#xf…

麥科信汽車診斷示波器在機車維修領域中的應用實例

麥科信汽車診斷示波器在機車維修領域中的應用實例 “Micsig SATO1004的錯誤幀統計功能與歷史波形存儲,讓我們在診斷間歇性CAN故障時有了決定性武器。這不僅是工具升級,更是維修理念的革新。” — Ian Coffey, Mototek技術總監(歐洲ECU診…

【IDEA2020】 解決開發時遇到的一些問題

目錄 一、批量更新數據庫數據 逐條更新 Db.updateEntitiesBatch() 二、Error running&#xff0c;Command line is too long. Shorten command line 報錯場景 報錯分析 解決方法 一、批量更新數據庫數據 逐條更新 List<UserModel> ums userMapper.selectListBy…

算法01-最小生成樹prim算法

最小生成樹prim算法 題源&#xff1a;代碼隨想錄卡哥的題 鏈接&#xff1a;https://kamacoder.com/problempage.php?pid1053 時間&#xff1a;2025-04-18 難度&#xff1a;4? 題目&#xff1a; 1. 題目描述&#xff1a; 在世界的某個區域&#xff0c;有一些分散的神秘島嶼&…

cpolar 內網穿透 實現公網可以訪問本機

1、登錄網站&#xff0c;升級成專業版&#xff0c;測試的話建議選一個月付費&#xff0c;選擇預留 2、保留的TCP地址增加一條記錄&#xff0c;描述可以自己取 3、驗證&#xff0c;生成一個Authtocken碼 4、在安裝目錄下&#xff0c;打開CMD命令&#xff0c;復制上面的碼運行aut…

c#內存泄露的原因和解決辦法

內存泄漏的原因 不正確的對象引用&#xff1a;最常見的原因是對象不再需要時未被垃圾回收器回收。例如&#xff0c;如果一個對象被一個不再使用的變量引用&#xff0c;它將不會被垃圾回收。事件訂閱者未取消&#xff1a;如果訂閱了一個事件但沒有在對象不再需要時取消訂閱&…

TDengine Restful 接口API

簡介 為支持各種不同類型平臺的開發&#xff0c;TDengine 提供符合 RESTful 設計標準的 API&#xff0c;即 REST API。為最大程度降低學習成本&#xff0c;不同于其他數據庫 REST API 的設計方法&#xff0c;TDengine 直接通過 HTTP POST 請求 BODY 中包含的 SQL 語句來操作數…

【Contiki】Contiki process概述

00. 目錄 文章目錄 00. 目錄01. 進程類型02. 進程結構03. 事件04. 進程調度函數05. 程序實例06. process實現07. 附錄 01. 進程類型 進程類型主要有**協同式&#xff08;cooperative&#xff09;和搶占式&#xff08;preemptive&#xff09;**兩種。 協同式進程&#xff0c;要…

哪種電腦更穩定?Mac?Windows?還是云電腦? 實測解密

隨著科技的發展進步&#xff0c;電腦已成為當下各類群體的必備產品之一&#xff0c;它的妙用有很多&#xff0c;無論是學生黨、打工人還是已經退休的人群或都離不開它的存在。然而&#xff0c;電腦雖好卻也差異很大、不同品牌、不同系統、不同配置、不同價位的統統都會有區別。…

華為openEuler操作系統全解析:起源、特性與生態對比

華為openEuler操作系統全解析&#xff1a;起源、特性與生態對比 一、起源與發展歷程 openEuler&#xff08;歐拉操作系統&#xff09;是華為于2019年開源的Linux發行版&#xff0c;其前身為華為內部研發的服務器操作系統EulerOS。EulerOS自2010年起逐步發展&#xff0c;支持華…

第 7 期:DDPM 采樣提速方案:從 DDPM 到 DDIM

本期關鍵詞:采樣加速、DDIM 推導、可控性提升、偽逆過程、代碼實戰 前情回顧:DDPM 的采樣瓶頸 在前幾期中,我們構建了一個完整的 DDPM 生成流程。但是你可能已經發現: 生成一張圖像太慢了!!! 原因是: DDPM 要在 T 個時間步中一步步地去噪,從 x_T → x_0。而通常 T 至…

chrome中的copy xpath 與copy full xpath的區別

學過測試或者爬蟲的&#xff0c;都感覺獲取網頁元素&#xff0c;使用xpath最方便 但其中有一些細節可能會使你摸不清頭腦 比如有時候copy xpath會定位不準確&#xff0c;而使用copy full xpath就可以定位 1、copy xpath&#xff08;相對路徑定位&#xff09; 優點&#xff…

學習海康VisionMaster之中線查找

一&#xff1a;進一步學習了 今天學習下VisionMaster中的中線查找&#xff0c;這個就是字面意思&#xff0c;輸入兩條直線&#xff0c;輸出兩條直線的中線 二&#xff1a;開始學習 1&#xff1a;什么是中線查找&#xff1f;今天這個比較簡單&#xff0c;其實這個模塊算是一個幾…

深入淺出 Multi-Head Attention:原理 + 例子 + PyTorch 實現

本文帶你一步步理解 Transformer 中最核心的模塊&#xff1a;多頭注意力機制&#xff08;Multi-Head Attention&#xff09;。從原理到實現&#xff0c;配圖 舉例 PyTorch 代碼&#xff0c;一次性說清楚&#xff01; 什么是 Multi-Head Attention&#xff1f; 簡單說&#x…

常用 Git 命令詳解

Git 是一個強大的版本控制工具&#xff0c;廣泛用于軟件開發和團隊協作中。掌握 Git 命令可以幫助開發者更高效地管理代碼版本和項目進度。本文將介紹一些常用的 Git 命令&#xff0c;并提供示例以幫助你更好地理解和應用這些命令。 目錄 常用命令 git clonegit stashgit pul…

NO.96十六屆藍橋杯備戰|圖論基礎-多源最短路|Floyd|Clear And Present Danger|災后重建|無向圖的最小環問題(C++)

多源最短路&#xff1a;即圖中每對頂點間的最短路徑 floyd算法本質是動態規劃&#xff0c;?來求任意兩個結點之間的最短路&#xff0c;也稱插點法。通過不斷在兩點之間加?新的點&#xff0c;來更新最短路。 適?于任何圖&#xff0c;不管有向?向&#xff0c;邊權正負&…

電流模式控制學習

電流模式控制 電流模式控制&#xff08;CMC&#xff09;是開關電源中廣泛使用的一種控制策略&#xff0c;其核心思想是通過內環電流反饋和外環電壓反饋共同調節占空比。相比電壓模式控制&#xff0c;CMC具有更快的動態響應和更好的穩定性&#xff0c;但也存在一些固有缺點。 …

MATLAB 控制系統設計與仿真 - 36

魯棒工具箱定義了個新的對象類ureal,可以定義在某個區間內可變的變量。 函數的調用格式為&#xff1a; p ureal(name,nominalvalue) % name為變量名,nominalValue為標稱值&#xff0c;默認變化值為/-1 p ureal(name,nominalvalue,PlusMinus,plusminus) p ureal(name,nomin…

LeetCode -- Flora -- edit 2025-04-17

1.最長連續序列 128. 最長連續序列 給定一個未排序的整數數組 nums &#xff0c;找出數字連續的最長序列&#xff08;不要求序列元素在原數組中連續&#xff09;的長度。 請你設計并實現時間復雜度為 O(n) 的算法解決此問題。 示例 1&#xff1a; 輸入&#xff1a;nums [1…

Sql刷題日志(day3)

一、筆試 1、min(date_time)&#xff1a;求最早日期 2、mysql中distinct不能與order by 連用&#xff0c;可以用group by去重 二、面試 1、SQL中如何利用replace函數統計給定重復字段在字符串中的出現次數 (length(all_string)-length(all_string,目標字符串,))/length(ta…