目前,我正在尝试增加 GKE 中 NVIDIA P100 GPU 的配额限制。当我使用限制名称过滤配额时,我得到两种类型的选项 - NVIDIA P100 GPU和承诺的 NVIDIA P100 GPU。这两者有什么区别?
我有一台 NVidia GeForce GTX 770,希望将其 CUDA 功能用于我正在进行的项目。我的机器运行的是 Windows 10 64 位。
我已遵循提供的 CUDA Toolkit 安装指南:https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/。
安装驱动程序后,我打开示例解决方案(使用 Visual Studio 2019)并构建deviceQuery和bandwidthTest示例。这是输出:
设备查询:
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.3\bin\win64\Debug\deviceQuery.exe Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
Detected 1 CUDA Capable device(s)
Device 0: "NVIDIA GeForce GTX 770"
CUDA Driver Version / Runtime Version 11.3 / 11.3
CUDA Capability Major/Minor version number: 3.0
Total amount of global memory: 2048 MBytes (2147483648 bytes)
(008) Multiprocessors, (192) CUDA Cores/MP: 1536 …Run Code Online (Sandbox Code Playgroud) 我使用 PyTorch 在我的自定义数据集上训练了 YOLO-v3 tiny。为了比较推理时间,我尝试了 CPU 上的 onnxruntime 以及 PyTorch GPU 和 PyTorch CPU。平均运行时间约为:
onnxruntime cpu: 110 ms - CPU 使用率: 60%
Pytorch GPU: 50 ms
Pytorch CPU: 165 ms - CPU 使用率: 40%
并且所有模型都使用批量大小 1。
但是,我不明白 onnxruntime 与 PyTorch CPU 相比如何更快,因为我没有使用 onnxruntime 的任何优化选项。我刚刚用过这个:
onnx_model = onnxruntime.InferenceSession('model.onnx')
onnx_model.run(None,{onnx_model.get_inputs()[0].name: input_imgs })
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释为什么在没有任何优化的情况下速度更快吗?以及为什么使用 onnxruntime 时 CPU 使用率更高。有什么办法可以让它保持下去吗?
提前致谢。
我是ubuntu用户。我使用以下泊坞窗图像,tensorflow/tensorflow:nightly-gpu
如果我尝试运行这个命令
$ docker run -it --rm --gpus all tensorflow/tensorflow:nightly-gpu bash
Run Code Online (Sandbox Code Playgroud)
存在权限被拒绝错误。
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:545: container init caused: Running hook #0:: error running hook: exit status 1, stdout: , stderr: nvidia-container-cli: mount error: open failed: /sys/fs/cgroup/devices/user.slice/devices.allow: permission denied: unknown.
Run Code Online (Sandbox Code Playgroud)
当然,如果我正在使用 ,我可以运行此命令sudo,但我想在gpu不使用 的情况下使用sudo。
有什么好的解决办法吗?请问有什么线索吗?
此表显示了支持任何给定图像格式用于不同用途(例如采样、传输、作为深度和模板缓冲区等)的 GPU 的百分比。如果您查看它,您会发现支持许多最常见的格式对于采样和深度缓冲区使用等用途,百分比显示为 99% 或 100%,而对 TRANSFER_SRC 和 TRANSFER_DST 的支持为 78%。我想知道为什么会这样,因为几乎任何格式都应该能够传输以进行读取和写入。上传用作纹理的图像时,不需要将 TRANSFER_DST 位设置为标志吗?同样,这是否意味着存在支持 R8G8B8A8_UINT 之类的 GPU(显然是 100%),但只有 78% 支持传输它们?这对我来说没有意义。奇怪的是,其中许多对 TRANSFER_SRC 和 TRANSFER_DST 的支持显示为 78%,而 BLIT_SRC 和 BLIT_DST 显示为 100%。我遵循的教程展示了使用复制命令和 TRANSFER_DST 上传纹理以将图像复制到 GPU,例如从暂存缓冲区复制图像时。
在 CPU 上使用 PyTorch Lightning 时,一切正常。然而,当使用 GPU 时,我得到一个RuntimeError: Expected all tensors to be on the same device.
问题似乎来自于使用未传递给 GPU 的子模型列表的模型:
class LambdaLayer(LightningModule):
def __init__(self, fun):
super(LambdaLayer, self).__init__()
self.fun = fun
def forward(self, x):
return self.fun(x)
class TorchModel(LightningModule):
def __init__(self):
super(TorchModel, self).__init__()
self.cat_layers = [TorchCatEmbedding(cat) for cat in columns_to_embed]
self.num_layers = [LambdaLayer(lambda x: x[:, idx:idx+1]) for _, idx in numeric_columns]
self.ffo = TorchFFO(len(self.num_layers) + sum([embed_dim(l) for l in self.cat_layers]), y.shape[1])
self.softmax = torch.nn.Softmax(dim=1)
model = TorchModel()
trainer = Trainer(gpus=-1) …Run Code Online (Sandbox Code Playgroud) 我遇到了 K8S+DinD 问题:
could not select device driver "nvidia" with capabilities: [[gpu]]完全错误
http://localhost:2375/v1.40/containers/long-hash-string/start: Internal Server Error ("could not select device driver "nvidia" with capabilities: [[gpu]]")
Run Code Online (Sandbox Code Playgroud)
execK8S pod 内的 DinD 映像nvidia-smi不可用。
一些调试,似乎是由于 DinD 缺少 Nvidia-docker-toolkit,当我直接在本地笔记本电脑 docker 上运行相同的作业时,我遇到了相同的错误,我通过安装nvidia-docker2 sudo apt-get install -y nvidia-docker2修复了相同的错误。
我想也许我可以尝试将 nvidia-docker2 安装到 DinD 19.03 (docker:19.03-dind),但不知道该怎么做?通过多阶段 docker 构建?
非常感谢!
更新:
吊舱规格:
spec:
containers:
- name: dind-daemon
image: docker:19.03-dind
Run Code Online (Sandbox Code Playgroud) 我在 GPU 上训练了一个 SentenceTransformer 模型并保存了它。现在我想在另一台没有 GPU 的机器上使用它,但我找不到将它加载到 CPU 上的方法。
from sentence_transformers import SentenceTransformer
model_name = 'all-MiniLM-L6-v2'
model = SentenceTransformer(model_name, device='cuda')
Run Code Online (Sandbox Code Playgroud) 张量核心可以通过 CUDA 中的 WMMA 接口以编程方式访问(请参阅https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#wmma和https://developer.nvidia.com/博客/programming-tensor-cores-cuda-9/)。最近,在 Ampere 一代卡中,Nvidia 宣布能够使用稀疏矩阵执行稀疏张量运算,如下所示:https ://developer.nvidia.com/blog/acceleating-inference-with-sparsity-using-ampere-和-tensorrt/
所呈现的格式似乎采用元素对及其在四个元素段(2 位索引)内的顺序。然而,查看wmma 文档,我找不到任何提及这一点的内容,也找不到如何访问这些特殊的张量核心操作。AFAICT 的该功能的公告页面也没有说明这一点。
如何访问 cuda 中的稀疏张量核心功能?
假设我们有一个调用一些函数的内核,例如:
__device__ int fib(int n) {
if (n == 0 || n == 1) {
return n;
} else {
int x = fib(n-1);
int y = fib(n-2);
return x + y;
}
return -1;
}
__global__ void fib_kernel(int* n, int *ret) {
*ret = fib(*n);
}
Run Code Online (Sandbox Code Playgroud)
内核fib_kernel将调用 function fib(),该函数在内部将调用两个fib()函数。假设GPU有80个SM,我们正好启动80个线程来进行计算,并传入n10个。我知道会有大量的重复计算,这违反了数据并行性的思想,但我想更好地理解线程的堆栈管理。
根据Cuda PTX 的文档,它声明如下:
GPU 维护每个线程的执行状态,包括程序计数器和调用堆栈
堆栈位于本地内存中。当线程执行内核时,它们的行为是否与CPU中的调用约定一样?换句话说,是不是对于每个线程,对应的栈都会动态增长和收缩呢?
每个线程的堆栈都是私有的,其他线程无法访问。有没有一种方法可以手动检测编译器/驱动程序,以便堆栈分配在全局内存中,而不是本地内存中?
有没有一种方法可以让线程获取当前的程序计数器、帧指针值?我认为它们存储在一些特定的寄存器中,但 PTX 文档没有提供访问这些寄存器的方法。我可以知道我必须修改什么(例如驱动程序或编译器)才能获取这些寄存器吗?
如果我们将输入增加到fib(n)10000,很可能会导致堆栈溢出,有办法处理吗?问题2的答案或许可以解决这个问题。任何其他想法将不胜感激。