如何在C++中的cudaDeviceReset()之后重用tensorflow?

2024-04-17

我正在使用 C++ 开发一个大型 CUDA 应用程序,该应用程序运行各种模型,需要完全释放所有 GPU 内存,否则其他操作将失败。

我能够在关闭所有 tf​​ 会话并运行 cudaDeviceReset() 后释放所有内存,但之后我无法运行任何新的张量流代码,并且会话创建将返回 nullptrs。我之前和之后都尝试过 cudaDeviceSynchronize() ,认为这会有所帮助,但我没有运气。

我认为对 InitMain 的调用会重新初始化张量流,但如果我在重置后再次调用,似乎不会。是否有一个特定的入口点我可以调用来基本上“重新开始”并使 TensorFlow 再次能够使用 GPU 并生成会话?

我使用的是 C++,而不是 Python。下面的示例显示了我运行 cudeDeviceReset() 然后尝试用 C++ 打开新的 TensorFlow 会话后 TensorFlow 所显示的内容。

2018-10-04 17:01:19.225505: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1435] Adding visible gpu devices: 0
2018-10-04 17:01:19.326074: I tensorflow/core/common_runtime/gpu/gpu_device.cc:923] Device interconnect StreamExecutor with strength 1 edge matrix:
2018-10-04 17:01:19.326091: I tensorflow/core/common_runtime/gpu/gpu_device.cc:929]      0 
2018-10-04 17:01:19.326095: I tensorflow/core/common_runtime/gpu/gpu_device.cc:942] 0:   N 
2018-10-04 17:01:19.326215: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1053] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 9446 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:01:00.0, compute capability: 6.1)
2018-10-04 17:01:19.326554: E tensorflow/stream_executor/cuda/cuda_driver.cc:785] failed to memset memory: CUDA_ERROR_INVALID_VALUE
2018-10-04 17:01:19.326593: E tensorflow/core/common_runtime/direct_session.cc:154] Failed precondition: Failed to memcopy into scratch buffer for device 0

它可能是相关的,但第一次运行在开始时有额外的行,就好像一次性初始化可能已经运行一样。第二轮缺少这些线条。下面是第一个的样子。

2018-10-04 17:01:17.253809: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:898] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2018-10-04 17:01:17.254173: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1356] Found device 0 with properties: 
name: GeForce GTX 1080 Ti major: 6 minor: 1 memoryClockRate(GHz): 1.6325
pciBusID: 0000:01:00.0
totalMemory: 10.92GiB freeMemory: 9.76GiB
2018-10-04 17:01:17.254185: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1435] Adding visible gpu devices: 0
2018-10-04 17:01:17.413712: I tensorflow/core/common_runtime/gpu/gpu_device.cc:923] Device interconnect StreamExecutor with strength 1 edge matrix:
2018-10-04 17:01:17.413733: I tensorflow/core/common_runtime/gpu/gpu_device.cc:929]      0 
2018-10-04 17:01:17.413737: I tensorflow/core/common_runtime/gpu/gpu_device.cc:942] 0:   N 
2018-10-04 17:01:17.413888: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1053] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 9446 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:01:00.0, compute capability: 6.1)

我至少已经弄清楚如何正确释放内存,并且 nvidia-smi 显示我的应用程序在重置后按预期删除内存,但如果我之后无法执行任何操作,它仍然没有用。

我有一个关于我使用哪个代码来建立会话的问题。我没有使用任何自定义会话选项。

tensorflow::NewSession(tensorflow::SessionOptions());

基本的复制是简单地将图形加载到会话中,关闭会话和图形,释放指针,调用 cudaDeviceReset() 并再次尝试打开另一个会话,这将抛出 nullptrs 和上述错误消息。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在C++中的cudaDeviceReset()之后重用tensorflow? 的相关文章

随机推荐

  • Symfony:解析 web.xml 时出现 InvalidArgumentException

    最近 我将 Symfony 系统移动到另一台服务器 从那时起就出现错误 技术细节是 Windows Server 2012 上的 apache 2 4 服务器 apache可以通过本地网络访问的文件服务器 当我移动 Symfony 页面时
  • ERC721:转账调用者不是所有者也不是批准的

    我有一个 nftToken 合约 可以将代币铸造到 msg sender 然后我在市场合约中有一个函数 可以将 nft 从所有者转移到市场合约 但是 我收到一条错误消息 ERC721 转账调用者不是所有者也不是批准的 这是我的 nftCon
  • ReplaceAll 性能秘诀是什么? [HTML 转义]

    我花了一些时间寻找转义 html 字符串的最佳方法 并发现了一些相关讨论 讨论1 https stackoverflow com questions 24816 escaping html strings with jquery 讨论2 h
  • Android获取recyclerview项目和位置上选定的文本部分

    在我的适配器中 可以选择显示弹出窗口的项目 例如copy cut或等等 现在我怎样才能获得所选的文本部分recyclerView项目和位置 我阅读了更多有关找到此解决方案的文档 但我不知道该怎么做 这是我的适配器 我想获取文本和位置的选定部
  • Python .localize 和 tzinfo 之间的日期时间差异

    为什么这两行会产生不同的结果 gt gt gt import pytz gt gt gt from datetime import datetime gt gt gt local tz pytz timezone America Los A
  • UICollectionView cellForItemAt indexPath 在 iOS 10 中跳过行索引

    I have UICollectionView具有水平滚动和分页功能 当我第一次滚动到下一页或上一页或从左到右更改滚动方向时 indexPath row 的值cellForItemAtIndexPath改变了 3 而不是 1 然后它就可以正
  • css 100%宽度div不占据父级的整个宽度

    我在一个页面上有两个 div 一个带有背景的网格容器和一个需要放置在另一个网格中心的内部网格 我的CSS html body margin 0 padding 0 width 100 grid container background f8
  • 什么是“3D语法”?

    在编写 Racket 宏的上下文中 3D 语法 是什么意思 这句话我听过好几次了 包含一次对宏的引用I正在写作 但那是不久前的事了 我修复了它 现在我不记得我最初做错了什么 另外 是 3D 语法吗always坏的 或者是像eval 如果你认
  • 是否可以将 CSS Scroll Snap 应用于 HTML 标签而不是 Body 标签

    CSS Scroll Snap 允许浏览器捕捉滚动到容器中的元素 要将相同的逻辑应用于垂直页面滚动 我发现它必须应用于而不是 见下文 这不是一个主要问题 但它确实有效地创建了一个滚动区域而不是使用窗口滚动 虽然这看起来不错 但它有一些副作用
  • 在 Xcode Interface Builder 中对场景进行排序

    所以我不知道该怎么称呼它 但它是 Xcode 中 Storyboard Editor 左侧的那个栏 显示所有不同的场景 我喜欢使用故事板 但我对它们最大的不满是场景以完全随机的方式组织在该列表中 每次我向故事板添加新的视图控制器时 它都会被
  • 阻止 Chrome 扩展程序在我的网站上运行

    作为一名网络开发人员 有什么方法可以阻止用户的 Chrome 扩展应用到我的网站吗 即标题 元标记等等 此外 如果有的话 是否还有一种方法可以将特定扩展列入白名单 这是不可能的 在网络服务器端 您只能控制浏览器允许您控制的内容 简单来说 这
  • Derby 还是 MySQL 或者...?

    对于什么类型的需求 您会选择 Apache Derby 或 Java DB 而不是 MySQL 反之亦然 我环顾四周 人们只是比较两者 但没有人谈论何时考虑每一个 我正在使用 Glassfish Java Restlet MySQL 开发一
  • sql从多个记录中仅选择最新的

    我有一个名为 客户年龄 的表 如下所示 ID 1 2 3 4 5 6 7 8 9 NAME JIM JIM JIM NICK NICK NICK Paul Paul Paul VALUE 20 13 12 10 20 8 4 24 14 我
  • 我们可以让 selenium webdriver 在运行时等待用户点击网页链接而不使用隐式等待吗?

    我正在使用 Firefox 驱动程序和 java 并尝试从网站上抓取一些数据 其中涉及人工交互 我必须要求用户输入搜索字符串 然后相应地用户必须通过人眼分析来选择打开哪个搜索结果 我们的努力只是为了通过脚本让一些零碎的东西更快地工作 我的问
  • 检查记录是否存在数据库 - 错误显示

    如何检查用户名或电子邮件是否存在 然后将错误消息放入错误数组中 现在我有 sql SELECT username email FROM users WHERE username username OR email email query m
  • 如何在 ios、swift 中生成公钥/私钥对,如下所示

    这就是我生成公钥 私钥对的方式 var statusCode OSStatus var publicKey SecKey var privateKey SecKey let publicKeyAttribute NSObject NSObj
  • 扫描仪无法读取整个句子 - 扫描仪类的 next() 和 nextLine() 之间的区别

    我正在编写一个程序 允许用户输入数据然后输出它 它的 3 4 正确 但当它到达输出地址时 它只打印一个单词 让我们只说 Archbishop Street 的 Archbishop 我该如何解决 import java util class
  • 静态初始化顺序惨败

    我在一本书中读到有关 SIOF 的内容 它给出了一个例子 file1 cpp extern int y int x y 1 file2 cpp extern int x int y x 1 现在我的问题是 在上面的代码中 会发生以下情况吗
  • 为什么 CAP_NET_RAW 不能与 SO_BINDTODEVICE 一起使用?

    我有以下简单的测试程序来创建 UDP 套接字并将其绑定到特定接口SO BINDTODEVICE这样我就可以bind it so INADDR ANY专门接收该接口上的 UDP 广播 filename bindtest c include
  • 如何在C++中的cudaDeviceReset()之后重用tensorflow?

    我正在使用 C 开发一个大型 CUDA 应用程序 该应用程序运行各种模型 需要完全释放所有 GPU 内存 否则其他操作将失败 我能够在关闭所有 tf 会话并运行 cudaDeviceReset 后释放所有内存 但之后我无法运行任何新的张量流