我正在使用 Google Colab 进行深度学习,我知道他们会随机将 GPU 分配给用户。我希望能够查看在任何给定会话中分配给我的 GPU。有没有办法在 Google Colab 笔记本中做到这一点?
请注意,如果有帮助,我正在使用 Tensorflow。
我正在开发一个对象检测项目,并希望使用我的 GPU 处理该项目。我已经完成了NVIDIA 设置教程,一切正常。我的对象检测代码最初适用于 CPU,但是当我添加这两行代码时:
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)
Run Code Online (Sandbox Code Playgroud)
显示的输出:
无法找到 zlibwapi.dll。请确保它在您的库路径中!
我已经从cuDNN 网站下载了 zlibwapi.dll zip 文件,解压缩并将整个文件夹添加到我的环境变量路径中。该文件夹名为“zlib123dllx64”,包含“dll_x64”文件夹和“static_x64”文件夹。“zlibwapi.dll”位于“dll_x64”文件夹内。我已在用户和系统路径变量中添加了“zlib123dllx64”文件夹,但它似乎没有解决任何问题。我怎样才能修复这个错误并使GPU与代码一起工作?
我的环境设置:
我正在我的 M1 Mac 上使用 PyTorch 1.13.0 训练模型(我也在每晚构建 torch-1.14.0.dev20221207 上尝试过此操作,但无济于事),并希望使用 MPS 硬件加速。我的项目中有以下相关代码,用于将模型和输入张量发送到 MPS:
device = torch.device("mps" if torch.backends.mps.is_available() else "cpu") # This always results in MPS
model.to(device)
Run Code Online (Sandbox Code Playgroud)
...在我的数据集子类中:
class MyDataset(Dataset):
def __init__(self, df, window_size):
self.df = df
self.window_size = window_size
self.data = []
self.labels = []
for i in range(len(df) - window_size):
x = torch.tensor(df.iloc[i:i+window_size].values, dtype=torch.float, device=device)
y = torch.tensor(df.iloc[i+window_size].values, dtype=torch.float, device=device)
self.data.append(x)
self.labels.append(y)
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
return self.data[idx], self.labels[idx]
Run Code Online (Sandbox Code Playgroud)
这会在我的第一个训练步骤中产生以下回溯:
Traceback (most recent call last):
File …Run Code Online (Sandbox Code Playgroud) 我对GPU没有太多经验,所以请原谅我的无知.如今,GPU被用作GPGPU用于通用编程.但我想知道GPU是否具有内存保护和虚拟化机制.我的意思是,例如,你在GPU上运行两个内核,如果你没有vritualization和内存保护,可以很容易地写入另一个地址.这个问题怎么解决了?是否已经完成了提高GPU上运行的代码可靠性的工作?可以通过一些沙盒机制同时运行两个内核吗?
对于Intel + NVIDIA双GPU"Optimus"设置,应用程序可以NvOptimusEnablement按照OptimusRenderingPolicies.pdf中的说明导出.此选项允许应用程序确保使用高速离散GPU而无需更新配置文件或用户交互,这通常是某些类别的应用程序所需要的.
对于使用AMD GPU的系统是否有相同的技巧(仅限Windows),如果是这样,它是什么?我无法通过谷歌搜索找到任何具体信息; 只有很多人在各种论坛上都没有回答相同的问题,或者有关NVIDIA技巧的文章中有"可能AMD有类似的东西,我不知道"的评论.
长话短说,我已经完成了几个交互式软件的原型.我现在使用pygame(python sdl包装器),一切都在CPU上完成.我现在开始将它移植到C,同时寻找现有的可能性来使用一些GPU功能来从冗余操作中吸收CPU.但是,我找不到一个好的"指南",在我的情况下,我应该选择哪些确切的技术/工具.我只是阅读了大量的文档,它很快就耗尽了我的智力.我不确定它是否可能,所以我很困惑.
在这里,我对我开发的典型应用程序框架做了一个非常粗略的草图,但考虑到它现在使用GPU(注意,我几乎没有关于GPU编程的实用知识).仍然重要的是必须精确保留数据类型和功能.这里是:

因此F(A,R,P)是一些自定义函数,例如元素替换,重复等.函数在程序生命周期中可能是恒定的,矩形的形状通常不等于A形状,因此它不是就地计算.所以它们只是根据我的功能生成的.F的例子:A的重复行和列; 用替换表中的值替换值; 将一些瓷砖组成单个阵列; 关于A值等的任何数学函数.如上所述,这一切都可以在CPU上轻松完成,但应用程序必须非常流畅.在纯Python中BTW在添加了几个基于numpy数组的视觉特性后变得无法使用.Cython有助于快速定制功能,但源代码已经是一种沙拉.
题:
这个架构是否反映了一些(标准)技术/ dev.tools?
CUDA是我要找的吗?如果是,那么与我的应用程序结构一致的一些链接/示例将是很好的.
我意识到,这是一个很大的问题,所以如果有帮助,我会提供更多细节.
更新
下面是我的位图编辑器原型的两个典型计算的具体示例.因此编辑器使用索引,数据包括具有相应位掩码的层.我可以确定图层和蒙版的大小与图层大小相同,例如,所有图层的大小相同(1024 ^ 2像素 = 32位值为4 MB).我的调色板就是1024个元素(4个千字节,32 bpp格式).
考虑我现在要做两件事:
第1步.我想将所有图层拼合在一起.假设A1是默认层(背景),层'A2'和'A3'有掩码'm2'和'm3'.在python我写道:
from numpy import logical_not
...
Result = (A1 * logical_not(m2) + A2 * m2) * logical_not(m3) + A3 * m3
Run Code Online (Sandbox Code Playgroud)
由于数据是独立的,我认为它必须与并行块的数量成比例加速.
第2步.现在我有一个数组,并希望用一些调色板"着色"它,所以它将是我的查找表.正如我现在看到的,查找表元素的同时读取存在问题.

但我的想法是,可能只需复制所有块的调色板,因此每个块都可以读取自己的调色板?像这样:

在Vulkan中使用多GPU会不会像制作许多命令队列那样在它们之间划分命令缓冲区?
有两个问题:
我的机器上有3个GTX Titan GPU.我使用cifar10_train.py运行Cifar10中提供的示例并获得以下输出:
I tensorflow/core/common_runtime/gpu/gpu_init.cc:60] cannot enable peer access from device ordinal 0 to device ordinal 1
I tensorflow/core/common_runtime/gpu/gpu_init.cc:60] cannot enable peer access from device ordinal 1 to device ordinal 0
I tensorflow/core/common_runtime/gpu/gpu_init.cc:127] DMA: 0 1
I tensorflow/core/common_runtime/gpu/gpu_init.cc:137] 0: Y N
I tensorflow/core/common_runtime/gpu/gpu_init.cc:137] 1: N Y
I tensorflow/core/common_runtime/gpu/gpu_device.cc:694] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX TITAN, pci bus id: 0000:03:00.0)
I tensorflow/core/common_runtime/gpu/gpu_device.cc:694] Creating TensorFlow device (/gpu:1) -> (device: 1, name: GeForce GTX TITAN, pci bus id: 0000:84:00.0) …Run Code Online (Sandbox Code Playgroud) 我是深度学习的新手,过去 2 天我一直在尝试在我的电脑上安装 tensorflow-gpu 版本,但徒劳无功。我避免安装 CUDA 和 cuDNN 驱动程序,因为由于许多兼容性问题,几个在线论坛不推荐它。由于我之前已经在使用 python 的 conda 发行版,所以我conda install -c anaconda tensorflow-gpu按照他们的官方网站上写的那样去:https : //anaconda.org/anaconda/tensorflow-gpu。
然而,即使在新的虚拟环境中安装了 gpu 版本后(为了避免与基础环境中安装的 pip 库的潜在冲突),由于某种神秘的原因,tensorflow 似乎甚至无法识别我的 GPU。
我运行的一些代码片段(在 anaconda 提示符下)以了解它无法识别我的 GPU:-
1.
>>>from tensorflow.python.client import device_lib
>>>print(device_lib.list_local_devices())
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 7692219132769779763
]
Run Code Online (Sandbox Code Playgroud)
如您所见,它完全忽略了 GPU。
2.
>>>tf.debugging.set_log_device_placement(True)
>>>a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
2020-12-13 10:11:30.902956: I tensorflow/core/platform/cpu_feature_guard.cc:142] This
TensorFlow
binary is optimized with oneAPI Deep Neural Network Library (oneDNN)to …Run Code Online (Sandbox Code Playgroud) OpenGL 和 Vulkan 都允许分别使用glMapBuffer和获取指向部分 GPU 内存的指针vkMapMemory。他们都给void*映射的内存一个。要将其内容解释为某些数据,必须将其强制转换为适当的类型。最简单的示例可能是转换为 afloat*以将内存解释为浮点数或向量或类似数组。
似乎任何类型的内存映射在 C++ 中都是未定义的行为,因为它没有内存映射的概念。但是,这并不是真正的问题,因为该主题超出了 C++ 标准的范围。但是,仍然存在一个问题volatile。
在链接的问题中,指针被额外标记为volatile因为它指向的内存内容可以以编译器在编译期间无法预料的方式进行修改。这似乎是合理的,尽管我很少看到人们volatile在这种情况下使用(更广泛地说,这个关键字现在似乎很少使用)。
同时在这个问题中,答案似乎是使用volatile是不必要的。这是因为他们所说的内存是映射使用的mmap,然后msync可以被视为修改内存,这类似于在 Vulkan 或 OpenGL 中显式刷新它。恐怕这不适用于 OpenGL 和 Vulkan。
如果内存被映射为未映射GL_MAP_FLUSH_EXPLICIT_BIT或根本VK_MEMORY_PROPERTY_HOST_COHERENT_BIT不需要刷新,则内存内容会自动更新。即使通过使用手动刷新内存,vkFlushMappedMemoryRanges或者glFlushMappedBufferRange这些函数实际上都没有将映射指针作为参数,因此编译器也不可能知道它们修改了映射内存的内容。
因此,是否有必要将指向映射 GPU 内存的指针标记为volatile?我知道从技术上讲这都是未定义的行为,但我问的是在实际硬件中实际需要什么。
顺便说一下,无论是Vulkan 规范还是OpenGL 规范都没有提到volatile限定符。
编辑:将内存标记为volatile会导致性能开销吗?