解決GPU顯存未釋放問題


前言

今早我想用多塊GPU測試模型,於是就用了PyTorch里的torch.nn.parallel.DistributedDataParallel(下面簡稱其為Dist)來支持用多塊GPU的同時使用。

在程序運行時由於程序中一些與Dist無關的代碼出現了錯誤導致程序退出,而如果在程序退出前沒有用Dist關閉生成的所有進程,就會導致程序崩潰后GPU顯存未釋放。筆者觀察發現,由於沒有用Dist關閉所有進程,導致程序結束運行后還有一部分進程在運行,所以顯存未釋放。

下面介紹這次我解決該問題的過程。

正文

MVE

Minimal Verifiable Examples,關於本問題的程序代碼如下:

import torch.distributed as dist

# 一些代碼:定義model等
some code

# 初始化並行訓練
dist.init_process_group(xxxx)  # 函數參數省略
model = torch.nn.parallel.DistributedDataParallel(model, find_unused_parameters=True)

# 一些代碼:訓練、測試模型等
some code  # 我的程序在這個部分出錯且程序直接退出,導致下面的關閉進程的代碼沒有運行

# 關閉所有進程
dist.destroy_process_group()

問題的出現

如下圖所示,程序退出后,並沒有進程在使用0號GPU,但0號GPU的顯存卻被占用。原因是程序退出前沒有用Dist關閉所有進程,一部分進程還在運行,這些進程占用0號GPU的顯存。

占用7號GPU的進程是我的另外一個進程,與本文討論的問題無關。

image-20200404070619631

定位占用GPU顯存的PID

執行下面的指令

fuser -v /dev/nvidia*

該命令執行后得到下圖所示的結果,可以看到是PID為285448的進程占用了0號GPU。

下面的圖中忘記打了馬賽克,后來用黑色遮擋了一下信息,所以USER這一列是看起來是空的。

image-20200404070704618

執行下面這條命令,查看該進程的信息,可以發現該進程的PPID(其父進程的PID)是1,說明該進程不是我占用7號GPU的進程生成的,並且現在只有它在使用0號GPU。可以推斷出這個進程是因為程序運行錯誤導致其沒有被關閉,因此可以手動關閉該進程。

ps -f -p 285448

下面的圖中忘記打了馬賽克,后來用黑色遮擋了一下信息,所以圖中的路徑不是很清晰。

image-20200404070805983

先后執行下面這兩條命令,殺掉該進程,再查看GPU情況,可以看到0號GPU的顯存已經被釋放,現在的GPU顯存占用情況是正常的。

kill -9 2885448
nvidia-smi

image-20200404070901921


作者:@臭咸魚

轉載請注明出處:https://www.cnblogs.com/chouxianyu/

歡迎討論和交流!



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM