我想使用 Numba 或类似的 Python CUDA 包访问各种 NVidia GPU 规范。可用设备内存、二级缓存大小、内存时钟频率等信息。
通过阅读这个问题,我了解到我可以通过 Numba 的 CUDA 设备接口访问一些信息(但不是全部)。
from numba import cuda
device = cuda.get_current_device()
attribs = [s for s in dir(device) if s.isupper()]
for attr in attribs:
print(attr, '=', getattr(device, attr))
Run Code Online (Sandbox Code Playgroud)
测试机上的输出:
ASYNC_ENGINE_COUNT = 4
CAN_MAP_HOST_MEMORY = 1
COMPUTE_CAPABILITY = (5, 0)
MAX_BLOCK_DIM_X = 1024
MAX_BLOCK_DIM_Y = 1024
MAX_BLOCK_DIM_Z = 64
MAX_GRID_DIM_X = 2147483647
MAX_GRID_DIM_Y = 65535
MAX_GRID_DIM_Z = 65535
MAX_SHARED_MEMORY_PER_BLOCK = 49152
MAX_THREADS_PER_BLOCK = 1024
MULTIPROCESSOR_COUNT = 3
PCI_BUS_ID = …Run Code Online (Sandbox Code Playgroud) FFMPEG 几个月前推出了新版本的 FFMPEG,其中包含新的过滤器“overlay_cuda”,该过滤器与“overlay”相同,但使用 Nvidia 卡来应用它。
我在FFMPEG网站上找到了该过滤器的描述,但没有如何使用它的示例。我发现的唯一示例来自开发人员提交,但是将视频或照片放在另一个视频上。
我在普通覆盖过滤器之前使用宽度两倍的 nullsrc 图像来执行此操作,但现在我不知道如何使用此过滤器。
提交描述: https: //patchwork.ffmpeg.org/project/ffmpeg/patch/20200318071955.2329-1-yyyaroslav@gmail.com/ ffmpeg 文档网页:https: //ffmpeg.org/ffmpeg-filters.html#overlay_005fcuda-1
我希望你可以帮助我。
更新:
我做了这个 FFmpeg 命令:
ffmpeg -y -loglevel info \
-i $video_1 \
-hwaccel cuda -hwaccel_output_format cuda -i $video_2 \
-filter_complex \
" \
[0:v]pad=w=2*iw:h=ih:x=0:y=0,hwupload_cuda[base];
[base][1:v]overlay_cuda=x=800:y=0" \
-an -c:v h264_nvenc overlay_test.mp4
Run Code Online (Sandbox Code Playgroud)
但我收到此错误消息:
[overlay_cuda @ 0x55fdec4b2ec0] Can't overlay nv12 on yuv420p
[Parsed_overlay_cuda_2 @ 0x55fdec4b2d80] Failed to configure output pad on Parsed_overlay_cuda_2
Error reinitializing filters!
Failed to inject frame into filter network: Invalid …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 ffmpeg 对 UHD HDR 视频流进行色调映射(和调整大小)。以下命令:
ffmpeg -vsync 0 -hwaccel cuda -init_hw_device opencl=ocl -filter_hw_device ocl
-threads 1 -extra_hw_frames 3 -c:v hevc_cuvid -resize 1920x1080 -i "INPUT.hevc"
-vf "hwupload,
tonemap_opencl=tonemap=mobius:param=0.01:desat=0:r=tv:p=bt709:t=bt709:m=bt709:format=nv12,
hwdownload,format=nv12,hwupload_cuda"
-c:v hevc_nvenc -b:v 8M "OUTPUT.hevc"
Run Code Online (Sandbox Code Playgroud)
似乎有效(RTX 3080 上大约 200 FPS)。然而,我注意到它仍然使用一个 CPU 核心,并且 GPU 使用率据报告仅为 60-70%。当我只在没有任何滤镜的情况下调整大小时,我会在 100% GPU 使用率下获得大约 400FPS 的速度。
我怀疑最后的hwdownload,format=nv12,hwupload_cuda语句有问题,因为这增加了通过主内存的绕道。我尝试只使用hwupload_cuda而不使用hwdownload(就像这里建议的那样: https: //stackoverflow.com/a/55747785/929037在本答案末尾附近的过滤器示例中),但后来出现以下错误:
Impossible to convert between the formats supported by the filter 'Parsed_tonemap_opencl_1' and the filter 'auto_scaler_0'
Error reinitializing filters!
Failed to inject …Run Code Online (Sandbox Code Playgroud) NVIDIA 最近宣布其显卡支持 OpenCL 3.0。我有 NVIDIA Geforce MX150 卡,并且已将 CUDA 工具包更新至版本 11.3,驱动程序为 465.19.01。我已经安装了 clinfo 工具,它显示有关 OpenCL 平台和设备的所有信息。当我运行它时,它显示:
我在这里有点困惑。设备版本和设备 OpenCL C 版本有什么区别?我是否能够在我的卡上运行 OpenCL 3.0 代码,或者它仍然支持 OpenCL 1.2 规范?
我正在尝试从视频中提取帧并将它们保存到内存(RAM)中。使用CPU编码,我没有任何问题:
ffmpeg -i input -s 224x224 -pix_fmt bgr24 -vcodec rawvideo -an -sn -f image2pipe -
Run Code Online (Sandbox Code Playgroud)
但当我尝试使用某些 NVIDIA GPU 编码时,我总是会得到嘈杂的图像。我尝试使用不同的命令,但在 Windows 和 Ubuntu 上结果始终相同。
ffmpeg -hwaccel cuda -i 12.mp4 -s 224x224 -f image2pipe - -vcodec rawvideo
Run Code Online (Sandbox Code Playgroud)
将 JPG 保存到磁盘上后,我没有任何问题。
ffmpeg -hwaccel cuvid -c:v h264_cuvid -resize 224x224 -i {input_video} \
-vf thumbnail_cuda=2,hwdownload,format=nv12 {output_dir}/%d.jpg
Run Code Online (Sandbox Code Playgroud)
我有用于测试这些命令的 python 代码:
import cv2
import subprocess as sp
import numpy
IMG_W = 224
IMG_H = 224
input = '12.mp4'
ffmpeg_cmd = [ 'ffmpeg','-i', input,'-s', '224x224','-pix_fmt', 'bgr24', '-vcodec', 'rawvideo', …Run Code Online (Sandbox Code Playgroud) 我倾向于在 python 代码运行期间收集 GPU 状态。我需要import nvidia_smi在我的代码中执行此操作。但即使通过安装它pip install nvidia_smi遇到此错误:
No module named 'nvidia_smi'
任何想法?
我按照官方文档https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html中的说明安装 nvidia-docker2
每当我运行他们的测试示例时:
sudo docker run --rm --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
Run Code Online (Sandbox Code Playgroud)
我仍然收到错误:
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]]. 3
Run Code Online (Sandbox Code Playgroud)
我重启了还是没有效果。
我使用的是 Ubuntu 22.04,并且我的 nvidia 驱动程序已更新。Nvidia-smi 在机器上工作但无法使用 docker 工作
编辑(已解决):最后我发现发生了什么事。重新安装时,它可以工作,但是如果重新启动,它又会回到之前不工作的状态。
这是由于使用“snapd”安装了另一个 docker 服务,所以我必须完全清除 docker:
sudo snap remove docker在我可以“重新安装所有内容”之后,它最终稳定下来,即使在重新启动后也是如此
我想将 nvidia 运行时添加到我的 docker 中。请注意,我正在运行 Windows 11。Windows 上的 Docker Desktop v.4.24.2 集成在 WSL 2 NVIDIA 驱动程序 545.84 上
我将所有内容安装为 nvidia-container-toolkit 并在运行 ubuntu 22.04 LTS 的 wsl 中我能够运行
docker run --gpus all --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 -it --rm -v .:/app nvcr.io/nvidia/pytorch:22.07-py3
Run Code Online (Sandbox Code Playgroud)
它实际上为我的 GPU 加载了它需要的一切。我知道这一点是因为我能够在 jupyter 笔记本中执行
import torch
for i in range(torch.cuda.device_count()):
print(torch.cuda.get_device_properties(i).name)
Run Code Online (Sandbox Code Playgroud)
它显示了我的 GPU (RTX 2080 SUPER)
但如果我想使用标志 --runtime=nvidia 它说
docker:来自守护进程的错误响应:未知或无效的运行时名称:nvidia。请参阅“docker run --help”。
我想在 docker compose 中使用它:
version: '3'
services:
pytorch_container:
image: nvcr.io/nvidia/pytorch:22.07-py3
command: ["bash"]
volumes:
- .:/app
runtime: …Run Code Online (Sandbox Code Playgroud) 我正在尝试在CUDA做类似的事情:
char_sig=code[k][1] & 0b00000010;
Run Code Online (Sandbox Code Playgroud)
并且NVCC编译器一直给我错误预期";"
相同的代码适用于GCC C编译器.我注意到问题是将二进制值设置为0b00000010,还有其他一些NVCC预期的表示法吗?
在cuda示例中,当他们分配网格大小时,我有一个共同的习惯.以下是一个例子:
int
main(){
...
int numElements = 50000;
int threadsPerBlock = 1024;
int blocksPerGrid =(numElements + threadsPerBlock - 1) / threadsPerBlock;
vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, numElements);
...
}
__global__ void
vectorAdd(const float *A, const float *B, float *C, int numElements)
{
int i = blockDim.x * blockIdx.x + threadIdx.x;
if (i < numElements)
{
C[i] = A[i] + B[i];
}
}
Run Code Online (Sandbox Code Playgroud)
我很好奇的是blocksPerGrid的初始化.我不明白为什么会这样
int blocksPerGrid = (numElements + threadsPerBlock - 1) / threadsPerBlock;
Run Code Online (Sandbox Code Playgroud)
而不是直截了当
int blocksPerGrid = numElements / threadsPerblock;
Run Code Online (Sandbox Code Playgroud)
这似乎是一种很常见的习惯.我在各种项目中看到过.他们都是这样做的.我是cuda的新手.欢迎任何解释或背后的知识.