如何从远程计算机运行CUDA/OpenGL互操作(粒子)示例

4
我正在尝试从主机Ubuntu机器远程运行CUDA粒子示例到一台远程Ubuntu机器。我遵循了这个教程: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实现的吗,还是完全不同的错误?


1
你尝试过X11转发吗?我认为在任何情况下都不会起作用。普通的X应用程序(具有适当的机器配置)可以使用X11转发远程运行,但是像粒子示例这样的CUDA / OpenGL互操作应用程序需要CUDA侧和OpenGL堆栈之间的交互,而普通的X11转发会话不支持。这可以通过适当设置TurboVNC与VirtualGL等远程实用程序来管理(作为一个可能的示例),但设置有些复杂。 - Robert Crovella
TurboVNC/VirtualGL方法有些复杂,可能并不是唯一的选择。如果这对你来说真的很重要,你可以尝试其他VNC风格的远程控制解决方案,比如NoMachine NX。 - Robert Crovella
是的,我使用了ssh -X命令,并且得到了原帖中的第二个错误。(我对Unix系统还比较新,所以可能会出错。)谢谢,我会尝试使用NoMachine NX。 - w0rldeat3r
1个回答

15

我将提供详细答案,因为我刚刚通过此项工作。 但是,在继续这条路之前,我建议您尝试像NoMachine NX这样的解决方案,它应该已经内置了一些这种功能。 这可能可以满足您的需求。

使用VirtualGL和TurboVNC的组合,即使是针对无头工作站,也可以访问远程工作站以获取图形桌面访问,并且还可以访问CUDA和OpenGL加速。以下说明相当特定于特定的机器配置(例如linux操作系统等)。因此,如果进行更改,它们很可能会打破,您将不得不弄清楚有何不同。对于CentOS 6.x,这应该是一个相当好的配方;对于其他方法,则仅是指南。此配方大多假定只添加了单个Tesla/CUDA GPU。如果要配置多个GPU,则应该是可能的,但仅有一个将用于OpenGL加速-只需要在xorg.conf中配置一个。

  1. 可以使用没有显示输出的Tesla卡(例如K40c)。在这种情况下,它假定您拥有另一张显示卡进行初始远程工作站设置步骤。此其他显示卡可以是任何卡,并且在设置后可以将机器转换为“无头”使用。如果您正在使用其他显示GPU进行设置,则最初可以将Tesla或CUDA GPU从系统中移出。

  2. 安装Linux操作系统。我在本测试中使用了CentOS 6.2。如果您使用的是CentOS/RHEL 6.x操作系统,则这里描述的内容应该基本按照要求工作。如果您使用不同的操作系统,则可能有所不同。如果是这样,请注意,这些说明仅供参考,而非配方。在安装CentOS 6.2期间,选择“软件开发工作站”选项,以获取我们需要的大部分图形和开发位。在设置过程中,您应该会收到提示,请求创建一个普通用户名(除root外)。我们将称其为myuser

  3. 禁用Nouveau。对于CentOS 6.x,这些步骤将能够达到目的(已root)

  4. echo -e "blacklist nouveau\noptions nouveau modeset=0"  > /etc/modprobe.d/disable-nouveau.conf
    dracut --force
    
  5. 关机并安装你想用于CUDA和/或OpenGL加速的特斯拉或其他CUDA GPU。重新启动机器,希望在步骤3中使用的Linux显示屏仍然会出现。如果你使用的是特斯拉(即非显示)卡,则不应该有任何问题,但如果你使用其他CUDA显示能力GPU(GeForce / Quadro),此时可能会移动X显示到刚刚安装的GPU上。

  6. 安装CUDA 7。我使用runfile安装程序方法,并对所有问题都选择了“是”(包括安装OpenGL库)并接受所有默认路径。如果你使用其他CUDA版本或其他安装方法,结果可能会有所不同。

  7. 安装VirtualGL和TurboVNC:

  8. 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
    

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

  9. 在终端会话中以root用户身份运行nvidia-xconfig命令,以建立初始的/etc/X11/xorg.conf文件,然后修改"Device"部分以添加类似于以下内容的行:

    BusID    "PCI:1:0:0"
    

    请确认 PCI 地址与您的 GPU 匹配(使用 lspcinvidia-smi -a 命令进行确认)。对于无头操作,您可能想要在 "Screen" 部分添加如下行,但我认为这并非必需(即使是对于无头操作):

    Option         "UseDisplayDevice" "none"
    

    本答案末尾提供了完整的xorg.conf示例。

  10. ~/.vnc/xstartup.turbovnc文件中,以myuser身份,在该行之后:

    unset SESSION_MANAGER
    

    添加以下行:

    unset DBUS_SESSION_BUS_ADDRESS
    
  11. myuser的身份,使用GNOME桌面工具(System...Preferences...Startup Applications),添加启动应用程序,如下所示:

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

    这里的:5有点随意,你可以使用其他数字,比如:2,但不要使用:0。余下的内容假设您选择了:5。您还需要在终端会话中(再次作为myuser)运行此行,以设置/配置vncserver以供使用。第一次运行它时,可能会提示您输入密码。请记住这个密码 - 您以后需要用到它进行客户端访问。

  13. 对于无头/无人值守使用,有两种可能的选项。

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

      [daemon]
      AutomaticLoginEnable=true
      AutomaticLogin=myuser
      

    我知道有些人可能认为自动登录存在安全风险。如果是这种情况,你应该使用下面的备选方法:

    • 停止X服务器
    • 以root身份运行vglserver_config
    • 选择选项1
    • 对于3个问题都回答n(这样可以工作,但是也存在安全问题。你可能希望查阅文档,并探索管理必要用户组和尝试除了n之外的其他选择。)
    • 选择X退出
    • 重新启动X服务器

    没有自动登录,你需要一种启动vncserver进行远程访问的方法,因为我们在第9步添加的启动应用程序将不会生效。一个方法是在启动后通过SSH连接到机器并作为myuser启动vncserver:

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

    您可以探索各种自动运行应用程序的方法。这里有许多可能的方法,最好只需针对您的操作系统进行谷歌搜索。

    如果您尚未这样做,您可能需要构建CUDA示例。该方法在上面步骤5链接的入门指南文档中有详细介绍。对于一些CUDA图形示例(如simpleGL),您可能需要确保安装了合适的glut提供程序,例如freeglut。

    在关闭电源之前,您可能还想修改远程工作站防火墙。为了我的目的,我只是禁用了它(System...Administration...Firewall...Disable)。TurboVNC使用的特定端口默认情况下将被防火墙阻止。如果您希望使用防火墙但打开这些端口,则可能是可能的,但超出了此说明书的范围。

    现在已配置完成您的远程工作站。如果您执行了以上所有更改,则可以切换到“无头”操作,并且如果添加了xorg无显示选项,则实际上可以在下次重启时切换到“无头”模式。在重新启动之前,您可能需要记下远程工作站的IP地址。如果您正在进行“无头”操作,则配置静态IP可能很方便。假设您观察到远程工作站的IP地址为192.168.1.104。那么现在是重新启动远程工作站的时候了。

    在客户机上,您应该安装适合您操作系统的TurboVNC客户端。运行TurboVNC客户端“Viewer”应用程序,并提供附加有:5的IP地址作为要连接的机器:

    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,则应该能够从vglrun命令中省略-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不能用于此目的,它仅限于计算。 据我所知,大多数其他NVIDIA CUDA可用的GPU都应该可用于此目的。 cc2.0之前具有计算能力的GPU不能与本文中描述的CUDA 7驱动程序一起使用。

    另外,这个NVIDIA白皮书也会很有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接