python监测GPU使用

参考:
https://stackoverflow.com/questions/67707828/how-to-get-every-seconds-gpu-usage-in-python

自己测试

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt
import torchvision
from torchvision import transforms
# 加载数据import subprocess as sp
import os
from threading import Thread , Timer
import sched, timedef get_gpu_memory():output_to_list = lambda x: x.decode('ascii').split('\n')[:-1]ACCEPTABLE_AVAILABLE_MEMORY = 1024COMMAND = "nvidia-smi --query-gpu=memory.used --format=csv"try:memory_use_info = output_to_list(sp.check_output(COMMAND.split(),stderr=sp.STDOUT))[1:]except sp.CalledProcessError as e:raise RuntimeError("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))memory_use_values = [int(x.split()[0]) for i, x in enumerate(memory_use_info)]# print(memory_use_values)return memory_use_valuesdef print_gpu_memory_every_5secs():"""This function calls itself every 5 secs and print the gpu_memory."""file = open("./GPU_usage.csv", "a+")Timer(5.0, print_gpu_memory_every_5secs).start()#print(get_gpu_memory())mem = get_gpu_memory()[0]print("{}".format(mem), file=file)print_gpu_memory_every_5secs()transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize(mean=0.5, std=0.5)])train_ds = torchvision.datasets.MNIST('data/',train=True,transform=transform,download= True)
dataloader = torch.utils.data.DataLoader(train_ds, batch_size=256, shuffle=True,num_workers=4,pin_memory=True)
print(len(dataloader))
# 定义生成器
class Generator(nn.Module):def __init__(self):super(Generator,self).__init__()self.linear1 = nn.Linear(100, 256*7*7) self.bn1 = nn.BatchNorm1d(256*7*7)self.deconv1 = nn.ConvTranspose2d(256, 128,kernel_size=(3,3),stride=1,  padding=1  )   # 得到128*7*7的图像self.bn2 = nn.BatchNorm2d(128)self.deconv2 = nn.ConvTranspose2d(128, 64,kernel_size=(4,4),stride=2,padding=1  # 64*14*14)self.bn3 = nn.BatchNorm2d(64)self.deconv3 = nn.ConvTranspose2d(64, 1,kernel_size=(4, 4),stride=2,padding=1  # 1*28*28)def forward(self, x):x = F.relu(self.linear1(x))x = self.bn1(x)x = x.view(-1, 256, 7, 7)x = F.relu(self.deconv1(x))x = self.bn2(x)x = F.relu(self.deconv2(x))x = self.bn3(x)x = torch.tanh(self.deconv3(x))return x# 定义判别器
# input:1,28,28
class Discriminator(nn.Module):def __init__(self):super(Discriminator, self).__init__()self.conv1 = nn.Conv2d(1, 64, kernel_size=3, stride=2) # 第一层不适用bn  64,13,13self.conv2 = nn.Conv2d(64, 128, kernel_size=3, stride=2) #128,6,6self.bn = nn.BatchNorm2d(128)self.fc = nn.Linear(128*6*6, 1) # 输出一个概率值def forward(self, x):x = F.dropout2d(F.leaky_relu(self.conv1(x)))x = F.dropout2d(F.leaky_relu(self.conv2(x)))  # (batch, 128,6,6)x = self.bn(x)x = x.view(-1, 128*6*6)   # (batch, 128,6,6)--->  (batch, 128*6*6)x = torch.sigmoid(self.fc(x))return x# 初始化模型
device = 'cuda' if torch.cuda.is_available() else 'cpu'
gen = Generator().to(device)
dis = Discriminator().to(device)# 损失计算函数
loss_function = torch.nn.BCELoss()# 定义优化器
d_optim = torch.optim.Adam(dis.parameters(), lr=1e-5)
g_optim = torch.optim.Adam(gen.parameters(), lr=1e-4)def generate_and_save_images(model, epoch, test_input):predictions = np.squeeze(model(test_input).cpu().numpy()) fig = plt.figure(figsize=(4, 4))for i in range(predictions.shape[0]):plt.subplot(4, 4, i + 1)plt.imshow((predictions[i] + 1) / 2, cmap='gray')  plt.axis("off")plt.show()test_input = torch.randn(16, 100, device=device)# 开始训练
D_loss = []
G_loss = []
# 训练循环
for epoch in range(10):d_epoch_loss = 0g_epoch_loss = 0count = len(dataloader)# 对全部的数据集做一次迭代for step, (img, _) in enumerate(dataloader):img = img.to(device)  size = img.shape[0]    # 返回img的第一维的大小random_noise = torch.randn(size, 100, device=device)  d_optim.zero_grad()  # 将上述步骤的梯度归零real_output = dis(img)  # 对判别器输入真实的图片,real_output是对真实图片的预测结果d_real_loss = loss_function(real_output,torch.ones_like(real_output, device=device))d_real_loss.backward() #求解梯度# 得到判别器在生成图像上的损失gen_img = gen(random_noise)fake_output = dis(gen_img.detach())  d_fake_loss = loss_function(fake_output,torch.zeros_like(fake_output, device=device))d_fake_loss.backward()d_loss = d_real_loss + d_fake_lossd_optim.step()  # 优化# 得到生成器的损失g_optim.zero_grad()fake_output = dis(gen_img)g_loss = loss_function(fake_output,torch.ones_like(fake_output, device=device))g_loss.backward()g_optim.step()with torch.no_grad():d_epoch_loss += d_loss.item()  g_epoch_loss += g_loss.item()with torch.no_grad():d_epoch_loss /= countg_epoch_loss /= countD_loss.append(d_epoch_loss)G_loss.append(g_epoch_loss)generate_and_save_images(gen, epoch, test_input)print('Epoch:', epoch)
plt.plot(D_loss, label='D_loss')
plt.plot(G_loss, label='G_loss')
plt.legend()
plt.show()
print("done")

最终的结果如下

在这里插入图片描述

这个和
在这里插入图片描述
是差不多的,

但是目前这个做法有一个问题,就是我的主程序停止了,print_GPU_memory()函数还在跑,只能自己手动关闭,这个我不知道怎么解决

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/230995.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何设置Linux终端提示信息

如何设置Linux终端提示信息 1 方法一:只能在VSCode或者Pycharm终端显示提示信息2 方法二:只能在MobaXterm等远程软件上显示提示3 方法三:避免用户没看到上面的提示,上面两种都设置一下 在使用远程终端时,由于多用户使用…

抖音、视频号流行的 Bokeh(虚化) 效果是怎么实现的?

未经作者(微信ID:Byte-Flow)允许,禁止转载 文章首发于公众号:字节流动 什么是 bokeh 效果? Bokeh 效果是指照片中背景模糊而主体清晰的一种摄影效果。这种效果是通过使用大光圈的镜头来实现的,使得光圈外的景物失去焦点,呈现出一种柔和、虚化的效果。 Bokeh 效果的质量…

java后端自学总结

自学总结 MessageSource国际化接口总结 MessageSource国际化接口 今天第一次使用MessageSource接口,比较意外遇到了一些坑 messageSource是spring中的转换消息接口,提供了国际化信息的能力。MessageSource用于解析 消息,并支持消息的参数化和国际化。 S…

使用Ray创建高效的深度学习数据管道

大家好,用于训练深度学习模型的GPU功能强大但价格昂贵。为了有效利用GPU,开发者需要一个高效的数据管道,以便在GPU准备好计算下一个训练步骤时尽快将数据传输到GPU,使用Ray可以大大提高数据管道的效率。 1.训练数据管道的结构 首…

【leetcode】64. 最小路径和

题目 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例 1: 输入:grid [[1,3,1],[1,5,1],[4,2,1]] 输出&…

【vue】ant-design-vue的树结构实现节点增删改查

根据业务需要,实现树结构的节点新增编辑删除功能,主要逻辑是利用树节点的scopedSlots属性对其进行自定义改造,监听悬停事件在节点右侧出现增删改对应图标,点击图标出现弹窗表单对内容进行修改,具体代码如下&#xff1a…

【嵌入式Linux开发一路清障-连载04】虚拟机VirtualBox7.0安装Ubuntu22.04后挂载Windows平台共享文件夹

虚拟机安装Ubuntu22.04后挂载Windows平台共享文件夹 障碍07-虚拟机VirtualBox7.0完装完Ubuntu22.04后,无法成功挂载Windows平台中共享文件夹,无法访问电脑中的各类重要文件,我该怎么办?一、问题的模样:VirtualBox7.0设…

基于YOLOv5的人群计数系统设计系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介系统概述系统功能核心技术系统架构系统优势 二、功能三、系统四. 总结  总结 一项目简介 基于YOLOv5的人群计数系统设计是一个非常有趣且具有挑战性的项目…

使用vue脚手架创建vue项目

Vue是一个流行的前端框架,可以用简洁的语法和组件化的思想开发单页面应用。Vue脚手架是一个官方提供的命令行工具,它可以帮你快速搭建和配置vue项目的基本结构和依赖。 本文介绍如何使用vue脚手架创建一个vue2项目,并选择一些常用的功能和插件…

鸿蒙开发已成新趋势

随着华为鸿蒙操作系统的快速崭露头角,鸿蒙开发已然成为当前技术领域的热门新趋势。本文将深入探讨鸿蒙开发的重要性和独特优势,并详细介绍一些关键的鸿蒙开发技术和工具,以及它们对开发者个人和整个行业带来的深远影响。 首先,鸿蒙…

极速整理文件!Python自动化办公新利器

更多资料获取 📚 个人网站:ipengtao.com 当涉及到自动化办公和文件整理,Python确实是一个强大的工具。在这篇博客文章中,我将深入探讨《极速整理文件!Python自动化办公新利器》这个话题,并提供更加丰富和全…

滴滴打车崩了!全过程

滴滴发布致歉10元补偿券,文末可领取 。 事情发生于 2023年11月27日晚~28日中午,滴滴打车服务出现大面积故障,登上微博热搜。 许多用户在使用滴滴出行时遇到了无法叫车、订单异常等问题,导致大量用户滞留在外,出行受阻…