考虑以下网络:
%%time
import torch
from torch.autograd import grad
import torch.nn as nn
import torch.optim as optim
class net_x(nn.Module):
def __init__(self):
super(net_x, self).__init__()
self.fc1=nn.Linear(1, 20)
self.fc2=nn.Linear(20, 20)
self.out=nn.Linear(20, 400) #a,b,c,d
def forward(self, x):
x=torch.tanh(self.fc1(x))
x=torch.tanh(self.fc2(x))
x=self.out(x)
return x
nx = net_x()
#input
val = 100
t = torch.rand(val, requires_grad = True) #input vector
t = torch.reshape(t, (val,1)) #reshape for batch
#method
dx = torch.autograd.functional.jacobian(lambda t_: nx(t_), t)
Run Code Online (Sandbox Code Playgroud)
这输出
CPU times: user 11.1 s, sys: 3.52 ms, total: 11.1 s
Wall time: …Run Code Online (Sandbox Code Playgroud) 我有使用 nvidia/cuda:10.2-cudnn7-devel-ubuntu18.04 构建的应用程序的基础映像。我必须在具有 cuda 版本的集群中运行该应用程序
NVIDIA-SMI 460.32.03 驱动程序版本:460.32.03 CUDA 版本:11.2。
我的应用程序没有为我提供 GPU 训练模型的正确预测结果(它返回基本分数作为预测输出)。但是,它能够为 CPU 训练模型返回准确的预测结果。所以,我推测它是两者之间的CUDA版本不兼容问题。我想知道 CUDA 版本 11.2 是否可以与符合 CUDA 10.2 的应用程序良好配合。
linux_user@server_machine:~/spatial/tuning_neighbors_7$ python3 *hyper*.py
Traceback (most recent call last):
File "tuner_hyperband.py", line 209, in <module>
load_data_k(
File "tuner_hyperband.py", line 127, in load_data_k
tz = tf.convert_to_tensor(data_z, np.float32)
File "/home/linux_user/.local/lib/python3.8/site-packages/tensorflow/python/util/traceback_utils.py", line 153, in error_handler
raise e.with_traceback(filtered_tb) from None
File "/home/linux_user/.local/lib/python3.8/site-packages/tensorflow/python/framework/constant_op.py", line 106, in convert_to_eager_tensor
return ops.EagerTensor(value, ctx.device_name, dtype)
tensorflow.python.framework.errors_impl.InternalError: Failed copying input tensor from /job:localhost/replica:0/task:0/device:CPU:0 to /job:localhost/replica:0/task:0/device:GPU:0 in order to run _EagerConst: Dst tensor is not initialized.
linux_user@server_machine:~/spatial/tuning_neighbors_7$
Run Code Online (Sandbox Code Playgroud)
造成这个错误的主要原因是什么?
是因为磁盘空间不足吗?
是因为 RAM 内存低吗?
是因为 GPU 占用了吗?
如何解决这个问题?
看来我误解了本地内存,认为访问速度很快,并且在内核中分配一个大数组可以利用它,这将是一件好事。然而,经过一番谷歌搜索后,看起来本地内存实际上是全局内存的一部分,因此访问速度会很慢。所以现在我试图准确理解当我在内核中分配一个大数组时会发生什么。考虑到寄存器非常有限,数组肯定无法容纳在该空间中。剩余部分是否会溢出并写入本地分配的全局内存空间?它的各个部分是否根据需要移入和移出寄存器?如果我必须在内核中多次读写它,那么它是否以某种方式缓存,可以减轻它是全局内存的事实?线程实际可以使用多少内存来动态分配数组,这个限制只是全局内存量除以线程数吗?
如果这对你答案中的数字很重要,我正在使用 V100。谢谢!
在 CUDA 编程指南的共享内存部分中,它指出 warp 的共享内存访问不是序列化的,而是广播读取的。
然而,它没有说明如果整个块请求相同的内存地址会发生什么。warp 之间的访问是串行的还是 CUDA 可以广播到整个块。
我的案例的演示代码
// Assume 1024 sized int array
__global__ add_from_shared(int* i, int* j, int* out)
{
__shared__ int shmem[1024];
shmem[threadIdx.x] = i[threadIdx.x];
...
Do some stuff
...
// Is the shared memory call here serilized between warps or is it a broadcast over the entire block?
j[threadIdx.x] += shmem[0];
}
Run Code Online (Sandbox Code Playgroud)
谢谢
这个问题可以与我的另一个问题相关查看。
我尝试并行运行多个机器学习进程(使用 bash)。这些是使用 PyTorch 编写的。在一定数量的并发程序(我的例子中是 10 个)之后,我收到以下错误:
RuntimeError: Unable to find a valid cuDNN algorithm to run convolution
Run Code Online (Sandbox Code Playgroud)
正如这个答案中提到的,
...发生这种情况的原因可能是达到了 VRAM 内存限制(从错误消息来看,这相当不直观)。
对于我的 PyTorch 模型训练案例,减小批量大小有帮助。您可以尝试此操作,或者减小模型大小以消耗更少的 VRAM。
我尝试了此处提到的解决方案,以强制执行每个进程的 GPU 内存使用限制,但此问题仍然存在。
对于单个进程或较少数量的进程,不会出现此问题。由于同一时刻只有一个上下文运行,为什么这会导致内存问题?
使用/不使用 MPS 时都会出现此问题。我认为 MPS 可能会出现这种情况,但其他情况则不然,因为 MPS 可能会并行运行多个进程。
好的,我们有队列,我们将命令缓冲区提交到队列,我们将渲染通道记录到命令缓冲区,我们将子通道添加到渲染通道。为什么这么复杂。据我所知,我们可以使用子通道来有效地同步我们的命令,并且我们可以一次性将整个队列发送到 GPU。但为什么要使用命令缓冲区和渲染通道。这还不是全部,还有命令池来创建命令缓冲区。为什么我需要多个队列,每个队列有多个命令缓冲区,每个队列有多个渲染通道,每个队列有多个子通道。
命令池对于多线程很有用。好的。所以我可以在我的线程中创建命令缓冲区,为什么我需要两个。如果我可以在子通道中完成所有操作,为什么我需要两个渲染通道,我是否遗漏了一些东西?
需要明确的是,我正在为我的引擎围绕 Vulkan 制作一个包装器或抽象,并试图掌握这些概念。也许这才是真正的问题,我试图在没有足够知识的情况下抽象一切并进行纯粹的 Vulkan 项目,但在我看来,这种方式更容易学习。
我尝试在网上寻找一些解释,但没有任何可以满足我的需要。
int4和int2数组的内存布局是怎样的?认为,
int4 M[2];
M[0]=0xA;
M[1]=0x5;
Run Code Online (Sandbox Code Playgroud)
我应该在包含 M(0) 和 M(1) 的单个字节中看到什么?是0xA5还是0x5A?我知道 int4 不是 C/C++ 类型,但某些编译器必须处理它,因为 Nvidia 和 AMD GPU 支持它。
有什么办法可以通过我的GPU运行Eclipse以获得更快的结果,因为我的处理器太慢了
我的GPU模型是NVIDIA GeForce GT 635M,在NVIDIA网站上,据说该GPU支持CUDA。我可以在此GPU中使用TensorFlow或PyTorch或任何其他种类的深度学习平台吗?