解決GPU視訊記憶體未釋放問題
阿新 • • 發佈:2020-04-04
# 前言
今早我想用多塊GPU測試模型,於是就用了PyTorch裡的`torch.nn.parallel.DistributedDataParallel`來支援用多塊GPU的同時使用(下面簡稱其為**Dist**)。
程式執行時,由於程式中其他部分的程式碼(與Dist無關的程式碼)出現了錯誤,導致程式退出。這次使用Dist時沒有考慮和處理這種程式崩潰的情況,因此在程式退出前沒有用Dist關閉生成的所有程序,最終導致本次程序執行後GPU視訊記憶體未釋放(經觀察,發現是由於沒有用Dist關閉所有程序,導致程式執行後還有一部分程序在執行)。
下面介紹這次我解決該問題的過程。
# 正文
## MVE
Minimal Verifiable Examples,關於本問題的程式程式碼如下:
```python
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](https://images.cnblogs.com/cnblogs_com/chouxianyu/1511971/o_200404000440image-20200404070619631.png)
## 定位佔用GPU視訊記憶體的PID
執行下面的指令
```shell
fuser -v /dev/nvidia*
```
該命令執行後得到下圖所示的結果,可以看到是PID為285448的程序佔用了0號GPU。
下面的圖中忘記打了馬賽克,後來用黑色遮擋了一下資訊,所以USER這一列是看起來是空的。
![image-20200404070704618](https://images.cnblogs.com/cnblogs_com/chouxianyu/1511971/o_200404000522image-20200404070704618.png)
執行下面這條命令,檢視該程序的資訊,可以發現該程序的PPID(其父程序的PID)是1,說明該程序不是我佔用7號GPU的程序生成的,並且現在只有它在使用0號GPU。可以推斷出這個程序是因為程式執行錯誤導致其沒有被關閉,因此可以手動關閉該程序。
```shell
ps -f -p 285448
```
下面的圖中忘記打了馬賽克,後來用黑色遮擋了一下資訊,所以圖中的路徑不是很清晰。
![image-20200404070805983](https://images.cnblogs.com/cnblogs_com/chouxianyu/1511971/o_200404000606image-20200404070805983.png)
先後執行下面這兩條命令,殺掉該程序,再檢視GPU情況,可以看到0號GPU的視訊記憶體已經被釋放,現在的GPU視訊記憶體佔用情況是正常的。
```shell
kill -9 2885448
nvidia-smi
```
![image-20200404070901921](https://images.cnblogs.com/cnblogs_com/chouxianyu/1511971/o_200404000642image-20200404070901921.png)
---
作者:[@臭鹹魚](https://github.com/chouxianyu)
轉載請註明出處:
歡迎討論和交