問題總結與解決方案
核心問題
在使用 Linux 系統時,多進程并行計算中加載模型到 GPU 時出現錯誤:
_MODEL = SentenceTransformer(
model_path,
device = "cuda" if torch.cuda.is_available() else "cpu"
)
根本原因:
- CUDA 上下文隔離問題:
- Linux 默認使用
fork
方式創建子進程 - 父進程的 CUDA 上下文被子進程繼承,但無法正確訪問
- 導致子進程嘗試初始化 CUDA 時失敗
- PyTorch 多進程限制:
- PyTorch 不支持在
fork
創建的子進程中直接使用 CUDA - 模型加載代碼在子進程執行時會引發沖突
解決方案
使用 spawn
方式啟動多進程,徹底解決 CUDA 上下文問題:
# 在 train.py 的 __main__ 開頭添加
if __name__ == "__main__":import multiprocessingmultiprocessing.set_start_method('spawn')# 關鍵修復# 原有代碼...
經驗總結:Linux 多進程+GPU 組合需特別注意上下文隔離問題,
spawn
是最可靠的解決方案。在涉及 CUDA 操作的多進程場景中,應優先采用此方案而非默認的fork
方式。