系统挂起后未找到 NVENC 的 CUDA 上下文

系统挂起后未找到 NVENC 的 CUDA 上下文

语境

我最近将 nVidia 驱动程序更新至 375.26,并在我的计算机上重新编译了 FFmpeg N-83180-gcf3affa 和 OBS 17.0.2-5-g43e4a2e(抱歉,如果这些数字没有任何意义,我不太确定哪些版本号是重要的) Debian 机器。对 RAM 进行挂起将导致 OBS 停止工作,唯一的修复方法是重新启动计算机。

如何重现

  1. 运行OBS
  2. 输出配置:

    • 将输出设置为 NVENC H.264 和 .mp4
    • 使用CBR
    • 比特率 = 200K
    • Kf 间隔 = 0
    • 低延迟、高质量预设、主、自动
    • 启用 2 遍编码
    • 显卡 = 0
    • B 帧 = 0
  3. 开始录制并停止以确认其正常工作

  4. 转到登录操作并单击暂停
  5. 重新开机并登录
  6. 开始录制,OBS失败并出现以下错误:

    [h264_nvenc @ 0x3fdd1e0] Failed creating CUDA context for NVENC: 0x3e7
    [h264_nvenc @ 0x3fdd1e0] No NVENC capable devices found
    

系统信息

  • 上面列出的驱动程序/软件版本
  • 显卡:微星GTX 970
  • uname -a:Linux 版本 3.16.0-4-amd64,#1 SMP Debian 3.16.39-1 (2016-12-30)
  • 操作系统:Debian 8.7 杰西

如果 XFCE 4.10 对操作按钮的工作方式有影响,我会使用它。

问题

有什么方法可以避免每次重新启动以避免唤醒计算机后出现此错误?


编辑1

我知道OBS是这个问题的根源。

测试用例1:

  1. 启动电脑,使用ffmpeg的h264_nvenc编码器输出视频文件
  2. 挂起至 RAM
  3. 登录,成功重复步骤1

测试案例2:

  1. 启动电脑,使用OBS使用h264_nvenc录制视频
  2. 辞职OBS
  3. 挂起至 RAM
  4. 登录,成功重复步骤2

测试用例3:

  1. 启动电脑,使用OBS用h264_nvenc录制视频
  2. 挂起至 RAM
  3. 登录,失败并显示Cannot init CUDA

我的猜测是,当录制停止时,OBS 不会关闭其流,它可能会出于性能(?)原因而保留,直到您退出程序?我不知道如何解决这个问题。一旦出现错误,重新启动OBS将不起作用,必须重新启动系统。

看起来 GPU 完全可以很好地处理其他所有任务,尽管如此glxinfonvidia-smi所有nvidia-settings这些都证实 GPU 确实被用来处理其他任务。看来 NVENC 是挂起到 RAM 后唯一出现问题的地方。


编辑2

以下是dmesg日志:https://www.diffchecker.com/wto7KPJZ

选项卡式“原始”是在执行暂停后发生的更改,选项卡式“更改”是在执行我建议的修复后发生的更改。

完整dmesg输出:https://0paste.com/10601#hl

答案1

如果在将系统挂起之前启动(并停止,但这不是必需的)h264_nvenc 流,FFmpeg 仅锁定 CUDA init。如果OBS在挂起之前从未使用h264_nvenc编码器记录任何内容,那么当您再次登录时它会正常工作。

如果OBS在登录后锁定,则可以通过以下方式使用:

  1. 退出OBS
  2. 在终端中运行:

    sudo rmmod nvidia_uvm && sudo modprobe nvidia_uvm
    
  3. 再次打开OBS

  4. ???
  5. 利润

如果卸载nvidia_uvm不起作用,DRM 和模式集模块可能也需要重新加载,尽管我从未遇到过这个问题。

相关内容