当前位置:   article > 正文

实时监测GPU的显存和显存清理小功能学习_nvidia-smi 过滤显存

nvidia-smi 过滤显存

目录

一、pynvml库的简单使用

二、显存清理


          在跑神经网络训练或者推理的时候,有的时候很有必要实时监测一下显存的状态。NVIDIA显卡在终端管理界面,使用命令:watch -n 3 nvidia-smi可以指定每隔几秒中来显示一下显卡信息。当然NVIDIA也是开发了python库,很方便的实时查看GPU信息。

一、pynvml库的简单使用

这个pynvml库是NVIDIA为自己家显卡开发的一个获取显卡当前信息的python包。我们一般比较关注的就是显卡实时的显存量信息、温度信息和电源信息,这个库都有相应的接口来实现实时查看的功能,非常方便。直接上代码:

  1. pynvml.nvmlInit()#初始化
  2. pynvml.nvmlDeviceGetCount()#设备数量
  3. pynvml.nvmlDeviceGetHandleByIndex(i)#显卡句柄
  4. pynvml.nvmlDeviceGetName(handle)#显卡名称
  5. memo_info = pynvml.nvmlDeviceGetMemoryInfo(handle)#显存信息
  6. memo_info.total#总显存
  7. memo_info.free#空余显存
  8. memo_info.used#已经使用的显存
  9. pynvml.nvmlDeviceGetTemperature(handle, 0)#温度
  10. pynvml.nvmlDeviceGetFanSpeed(handle)#风扇速度
  11. pynvml.nvmlDeviceGetPowerState(handle)#电源状态
  1. import torch
  2. import pynvml
  3. pynvml.nvmlInit()#初始化
  4. #设备情况
  5. deviceCount = pynvml.nvmlDeviceGetCount()
  6. print('显卡数量:',deviceCount)
  7. for i in range(deviceCount):
  8. handle = pynvml.nvmlDeviceGetHandleByIndex(i)
  9. gpu_name = pynvml.nvmlDeviceGetName(handle)
  10. print('GPU %d is :%s'%(i,gpu_name))
  11. #显存信息
  12. memo_info = pynvml.nvmlDeviceGetMemoryInfo(handle)
  13. print("GPU %d Memory Total: %.4f G"%(i,memo_info.total/1024/1024/1000) )
  14. print("GPU %d Memory Free: %.4f G"%(i,memo_info.free/1024/1024/1000))
  15. print("GPU %d Memory Used: %.4f G"%(i,memo_info.used/1024/1024/1000))
  16. #温度
  17. Temperature = pynvml.nvmlDeviceGetTemperature(handle, 0)
  18. print("Temperature is %.1f C" %(Temperature))
  19. #风扇转速
  20. speed = pynvml.nvmlDeviceGetFanSpeed(handle)
  21. print("Fan speed is ",speed)
  22. #电源状态
  23. power_ststus = pynvml.nvmlDeviceGetPowerState(handle)
  24. print("Power ststus", power_ststus)
  25. #关闭
  26. pynvml.nvmlShutdown()

结果如下:

二、显存清理

  1. ......
  2. other codes
  3. ......
  4. del(model)
  5. torch.cuda.empty_cache()

有的时候需要程序运行过程中把显存清理掉,就可以采用上面的代码,完整代码如下:

  1. import torch
  2. import pynvml
  3. from transformers import BertModel
  4. def get_gpu_memory(handle):
  5. meminfo = pynvml.nvmlDeviceGetMemoryInfo(handle)
  6. free = meminfo.free/1024/1024/1000
  7. return free
  8. if __name__ == "__main__":
  9. pynvml.nvmlInit()
  10. handle = pynvml.nvmlDeviceGetHandleByIndex(0)
  11. print('初始显存:%.4f G'%get_gpu_memory(handle))
  12. model = BertModel.from_pretrained('./output/training_patent_sbert-Chinese-BERT-wwm2019-10-09_10-42-20_with_20K_Trains/0_BERT/')
  13. device = torch.device('cuda:0')
  14. model.to(device)
  15. print('加载Bert模型后,剩余显存:%.4f G' % get_gpu_memory(handle))
  16. dummy_tensor_4 = torch.randn(370, 60, 510, 510).float().to(device)
  17. print('加载数据转到GPU上后,剩余显存:%.4f G'%get_gpu_memory(handle))
  18. # 然后释放
  19. dummy_tensor_4 = dummy_tensor_4.cpu()
  20. print('把GPU上的数据转移到CPU上,剩余显存:%.4f G'%get_gpu_memory(handle))
  21. torch.cuda.empty_cache()
  22. print('torch.cuda.empty_cache清理显存后,显存是:%.4f G' % get_gpu_memory(handle))
  23. del(model)
  24. print('del(model)清理显存后,显存是:%.4f G'%get_gpu_memory(handle))
  25. pynvml.nvmlShutdown() # 最后关闭管理工具

结果如下:

 

观察显存变化,模型和数据放到GPU上会占用显存,data.cpu()并不会主动释放显存,需要使用torch.cuda.empty_cache()才能释放显存。然后这里是不能够把模型占用的显存释放出来,采用torch.cuda.empty_cache()和del(model)都没有生效。

今日的学习就到这里了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/421204
推荐阅读
相关标签
  

闽ICP备14008679号