如何 运行 CUDA/OpenGL 来自远程机器的互操作(粒子)示例

How to run CUDA/OpenGL interop (particle) sample from a remote machine

我正在尝试从主机 ubuntu 机器 运行 远程 Ubuntu 机器上的 CUDA 粒子样本。 我遵循了本教程: http://devblogs.nvidia.com/parallelforall/remote-application-development-nvidia-nsight-eclipse-edition/ 并且它 运行 在我的主机上,但不在我的远程机器上。

我在 Nsight 中得到以下输出:

CUDA Particles Simulation Starting...

grid: 64 x 64 x 64 = 262144 cells
particles: 16384
No protocol specified
freeglut (/users/path/particles/Debug/particles): failed to open display ':0'
logout

如果我 运行 来自终端的程序,我得到:

CUDA Particles Simulation Starting...

grid: 64 x 64 x 64 = 262144 cells
particles: 16384
CUDA error at ../src/particleSystem_cuda.cu:85  code=79(cudaErrorInvalidGraphicsContext)  "cudaGraphicsGLRegisterBuffer(cuda_vbo_resource, vbo, cudaGraphicsMapFlagsNone)" 

是否可以在我的主机上显示粒子模拟,而在远程系统上进行计算?

是通过X11Forwarding实现的,还是完全不同的错误?

我将提供一个冗长的答案,因为我刚刚解决了这个问题。但是,在继续这条道路之前,我鼓励您尝试像 NoMachine NX 这样的解决方案,它应该已经内置了一些这种功能。它可能会满足您的需求。

您可以访问远程工作站,甚至是无头工作站,以进行图形桌面访问,还可以使用 VirtualGL and TurboVNC 的组合访问 CUDA 和 OpenGL 加速。以下说明非常特定于特定的机器配置(例如 linux OS 等),因此如果您进行更改,它们可能会中断,您将不得不找出不同之处。对于 CentOS 6.x,这应该是一个很好的方法,对于其他方法,它只是一个指南。此配方主要假设只添加一个 Tesla/CUDA GPU。如果您要配置多个 GPU,应该可以,但只有一个会用于 OpenGL 加速 - 在 xorg.conf.

中只需要配置一个
  1. 此设置可以使用没有显示输出的 Tesla 卡完成(例如 K40c。K20 变体是一种特殊情况,但是 - 请参见下面的注释 *)。在这种情况下,它假设您有另一个显示卡用于初始远程工作站设置步骤。这个其他的显示卡可以是任何卡,设置好后就可以转换机器"headless"使用了。如果您使用不同的显示 GPU 进行设置,您可以先将 Tesla 或 CUDA GPU 排除在系统之外。

  2. 安装您的 Linux OS。我用 CentOS 6.2 来测试。如果你使用 CentOS/RHEL 6.x OS,事情应该很像这里描述的那样适合你。如果您使用不同的 OS,一切都可能会有所不同。如果是这样,这些说明只是指南,而不是食谱。在安装 CentOS 6.2 期间,select "Software Development Workstation" 选项,以获得我们需要的大部分图形和开发位。在安装过程中应该会提示您创建一个普通用户名(root 除外)。我们称之为 myuser.

  3. 禁用 Nouveau。在 CentOS 6.x 上,这些步骤将达到目的 as root:

    echo -e "blacklist nouveau\noptions nouveau modeset=0"  > /etc/modprobe.d/disable-nouveau.conf
    dracut --force
    
  4. 关闭电源,然后安装您要用于 CUDA and/or OpenGL 加速的 Tesla 或其他 CUDA GPU。重新启动机器。希望 linux 显示仍会出现在您在第 3 步中使用的同一显示器上。如果您使用的是 Tesla(即非显示)卡,应该没有任何问题,但如果您使用的是一些其他支持 CUDA 显示的 GPU(GeForce/Quadro),此时 X 显示可能移动到您刚刚安装的 GPU。

  5. 安装CUDA 7。我使用了 运行 文件安装程序方法,select 对 所有 问题(包括 OpenGL 库的安装)输入了 yes 并接受所有默认路径。如果您使用其他一些 CUDA 版本或其他安装方法,您的结果可能会有所不同。

  6. 安装 VirtualGL 和 TurboVNC:

    wget http://sourceforge.net/projects/virtualgl/files/2.3.3/VirtualGL-2.3.3.x86_64.rpm/download
    sudo rpm -i VirtualGL-2.3.3.x86_64.rpm
    wget http://sourceforge.net/projects/turbovnc/files/1.2.1/turbovnc-1.2.1.x86_64.rpm/download
    sudo rpm -i turbovnc-1.2.1.x86_64.rpm
    

    我不认为这些版本有什么特别之处,但是如果您使用不同的版本,您的结果可能会有所不同。

  7. 运行 nvidia-xconfig(从终端会话)作为 root 建立初始 /etc/X11/xorg.conf 文件,然后修改 "Device" 部分以添加如下一行:

    BusID    "PCI:1:0:0"
    

    PCI 地址与您的 GPU 匹配的位置(用 lspcinvidia-smi -a 确认)对于无头操作,您可以选择在 "Screen" 部分添加这样一行,但我认为没有必要(即使是无头操作):

    Option         "UseDisplayDevice" "none"
    

    一个完整的示例 xorg.conf 出现在这个答案的末尾。

  8. as myuser, in ~/.vnc/xstartup.turbovnc, 在此行之后:

    unset SESSION_MANAGER
    

    添加以下行:

    unset DBUS_SESSION_BUS_ADDRESS
    
  9. as myuser,如下添加启动应用程序,使用gnome桌面实用程序(System...Preferences...Startup Applications)

    /opt/TurboVNC/bin/vncserver :5 -depth 24
    

    这里的:5有点随意,可以用:2等其他数字,但不要用:0。其余部分假定您已在此处 selected :5。您还需要从终端会话中 运行 这一行(仅一次,再次为 myuser),以便 setup/configure vncserver 使用。第一次 运行 时,它可能会提示您输入密码。请记住此密码 - 稍后您将需要它来访问客户端。

  10. 对于headless/unattended使用,有两种可能的选择。

    • 您可以为 myuser 创建自动登录。作为 root,将 /etc/gdm/custom.conf 编辑为 create/add:

      [daemon]
      AutomaticLoginEnable=true
      AutomaticLogin=myuser
      

    我承认有些人可能认为自动登录是一种安全风险。如果是这种情况,您应该使用下面的备用 ("preferred") 方法:

    • 停止 X 服务器
    • 作为根,运行 vglserver_config
    • select 选项 1
    • 回答 n 所有 3 个问题(这会起作用,但这里也存在安全问题。您可能希望 consult the documentation,并探索管理必要的用户组并与其他人进行试验除了 n 之外的所有 3 个问题的选择。)
    • select X 退出
    • 重新启动 X 服务器

    如果没有自动登录,您将需要一种方法来启动 vncserver 以进行远程访问,因为我们在第 9 步中添加的启动应用程序不会生效。一种方法是在启动后通过 SSH 连接简单地登录到机器,然后 myuser 启动 vncserver:

    /opt/TurboVNC/bin/vncserver :5 -display 24
    

    或者您可以探索在机器启动时自动 运行ning 应用程序的各种方法。这里有很多可能的方法,最好是只进行与 OS.

  11. 相关的 google 搜索
  12. 如果您还没有这样做,您可能想要构建 CUDA 示例。上述步骤 5 中链接的入门指南文档中介绍了该方法。您可能需要确保为某些 CUDA 图形示例(例如 simpleGL.

  13. 安装了合适的过剩提供程序,例如 freeglut
  14. 在关机之前,您可能还想修改远程工作站防火墙。出于我的目的,我只是禁用它(系统...管理...防火墙...禁用)。 TurboVNC 使用默认情况下会被防火墙阻止的特定端口。如果你想使用防火墙但打开这些端口,应该可以,但不在本节的范围内。

您的远程工作站现已配置完毕。如果您进行了上述所有更改,您可以切换到 "headless" 操作,如果您添加了 xorg no display 选项,您实际上可能会在下次重新启动时切换到 "headless"。在重新启动之前,您可能需要记下远程工作站的 IP 地址。如果你要去"headless",用静态IP配置它可能会很方便。假设您观察到远程工作站的 IP 地址是 192.168.1.104。现在是时候重启您的远程工作站了。

在客户端计算机上,您应该安装适合您的 OS 的 TurboVNC 客户端。 运行 TurboVNC 客户端 "Viewer" 应用程序,并提供 IP 附加 :5 作为要连接的机器:

192.168.1.104:5

连接后,系统将提示您输入在上面第 9 步中提供的密码。此时,与 myuser 关联的图形桌面应该会在您的客户端计算机上打开。此图形桌面尚未 具有与其关联的完整 3D 图形加速。为了将 GPU 用于 OpenGL(和 CUDA/OpenGL 互操作),有必要 运行 此类应用程序以 vglrun 为前缀,例如:

vglrun -d :0 glxgears

您在此处指定 :0,因为这是与 GPU 图形加速关联的实际 X 显示(对于已登录的 myuser)。如果您构建了 CUDA 示例,则可以尝试 CUDA/OpenGL 互操作应用程序:

vglrun -d :0 /usr/local/cuda/samples/bin/x86_64/linux/release/simpleGL

在上面的两个例子中,如果您在第 10 步中使用 vglserver_config 配置了 vglserver,那么您应该能够从 vgl运行 中省略 -d :0 开关命令:

vglrun glxgears

仅供参考( - 你很可能不能逐字使用这个xorg文件),这里是一个完整的xorg.conf(不对 vglserver_config 进行任何修改):

# nvidia-xconfig: X configuration file generated by nvidia-xconfig
# nvidia-xconfig:  version 346.46  (buildmeister@swio-display-x86-rhel47-06)  Tue Feb 17 19:10:20 PST 2015

Section "ServerLayout"
    Identifier     "Layout0"
    Screen      0  "Screen0"
    InputDevice    "Keyboard0" "CoreKeyboard"
    InputDevice    "Mouse0" "CorePointer"
EndSection

Section "Files"
    FontPath        "/usr/share/fonts/default/Type1"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Mouse0"
    Driver         "mouse"
    Option         "Protocol" "auto"
    Option         "Device" "/dev/input/mice"
    Option         "Emulate3Buttons" "no"
    Option         "ZAxisMapping" "4 5"
EndSection

Section "InputDevice"
    # generated from data in "/etc/sysconfig/keyboard"
    Identifier     "Keyboard0"
    Driver         "kbd"
    Option         "XkbLayout" "us"
    Option         "XkbModel" "pc105"
EndSection

Section "Monitor"
    Identifier     "Monitor0"
    VendorName     "Unknown"
    ModelName      "Unknown"
    HorizSync       28.0 - 52.0
    VertRefresh     43.0 - 72.0
    Option         "DPMS"
EndSection

Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BusID          "PCI:1:0:0"
EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24
    Option         "UseDisplayDevice" "none"
    SubSection     "Display"
        Depth       24
        Modes      "1024x768"
    EndSubSection
EndSection

疑难解答:

我不打算回答详细的疑难解答问题,因为我无法测试每个配置。但是,如果您的客户端根本无法连接到远程工作站,则可能意味着 vncserver 未正确启动,或者防火墙正在阻止。对于其他类型的故障排除,/var/log/Xorg.0.log 可能会提供一些线索。使用 nvidia-smi 确定您的 CUDA 驱动程序已正确安装。而且一般来说,无头操作很难排除故障,所以如果您可以安排一个具有显示功能的 CUDA GPU 进行初始设置和测试,可能会更容易。您可以稍后切换到无显示 GPU。

注意: * K20m 和 K20Xm 需要使用 nvidia-smi 实用程序正确设置图形操作模式。 K20c cannot be used for this purpose,它是纯计算的。据我所知,大多数其他支持 NVIDIA CUDA 的 GPU 应该可用于此目的。但是,在 cc2.0 之前具有计算能力的 GPU 不能与本文中描述的 CUDA 7 驱动程序一起使用。

作为附加参考,这个 nvidia whitepaper 会有用。