1. 程式人生 > >解決GPU視訊記憶體未釋放問題

解決GPU視訊記憶體未釋放問題

# 前言 今早我想用多塊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) 轉載請註明出處: 歡迎討論和交