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

我试图从主机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 

如果我从terminal运行程序,我会得到:

 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和TurboVNC的组合来访问CUDA和OpenGL加速。 下面的说明对于特定的机器配置(例如,linux操作系统等)是非常特定的,所以如果你做了修改,它们很可能会中断,你将不得不弄清楚什么是不同的。 对于CentOS 6.x,这应该是一个相当不错的配方,对于其他方法,这只是一个指导。 这个配方大多假定只添加一个Tesla / CUDA GPU。 如果要配置多个GPU,则应该可以,但只有一个用于OpenGL加速 – 只有一个需要在xorg.conf配置。

  1. 这种设置可以通过一个没有显示输出的Tesla卡完成(例如,K40c,K20是一个特殊的情况,但是见下面的注释*)。 在这种情况下,它假定您有另一个显卡用于初始远程工作站设置步骤。 其他的显示卡可以是任何卡,安装后机器可以转换为“无头”使用。 如果您正在使用不同的显示器GPU进行设置,则可以先将Tesla或CUDA GPU从系统中取出。

  2. 安装你的Linux操作系统。 我使用CentOS 6.2进行这个测试。 如果您使用的是CentOS / RHEL 6.x操作系统,那么您可能会像这里所描述的那样为您工作。 如果您使用不同的操作系统,可能会有所不同。 如果是的话,这些说明只是一个指导,而不是一个配方。 在CentOS 6.2的安装过程中,选择“软件开发工作站”(Software Development Workstation)选项,以获得大部分我们需要的图形和开发位。 在安装过程中应该提示您创建一个普通的用户名(除了root)。 我们将这个称为myuser

  3. 禁用Nouveau。 在CentOS 6.x上,这些步骤将以root身份执行

     echo -e "blacklist nouveau\noptions nouveau modeset=0" > /etc/modprobe.d/disable-nouveau.conf dracut --force 
  4. 关闭电源,然后安装要用于CUDA和/或OpenGL加速的Tesla或其他CUDA GPU。 重新启动机器。 希望linux显示器仍然应该与第3步中使用的显示器相同。如果您使用的是Tesla(即非显示器)卡,但是如果您正在使用某个其他CUDA显示器(GeForce / Quadro),X显示器可能会移动到刚安装的GPU上。

  5. 安装CUDA 7 。 我使用了runfile安装程序方法,并为所有问题(包括安装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. 以root用户身份运行nvidia-xconfig (来自终端会话)来建立一个初始的/etc/X11/xorg.conf文件,然后修改“Device”部分来添加一行:

     BusID "PCI:1:0:0" 

    PCI地址与你的GPU相匹配(使用lspci或者nvidia-smi -a确认)对于无头操作,你可以选择在“Screen”部分添加这样一行,但是我相信这是没有必要的操作):

     Option "UseDisplayDevice" "none" 

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

  8. 作为myuser ,在~/.vnc/xstartup.turbovnc ,在这行之后:

     unset SESSION_MANAGER 

    添加以下行:

     unset DBUS_SESSION_BUS_ADDRESS 
  9. 作为myuser ,使用gnome桌面实用程序(System … Preferences …启动应用程序)添加启动应用程序,如下所示:

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

    在这里:5这里有点武断,你可以使用其他数字,如:2如果你愿意,但不要使用:0 。 其余假设你已经选择:5在这里。 你将要从终端会话中运行这个命令行(只是一次,也是myuser ),以便设置/配置vncserver以供使用。 你第一次运行它,可能会提示你输入密码。 记住这个密码 – 稍后您将需要它用于客户端访问。

  10. 对于无头/无人使用,有两种可能的选择。

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

       [daemon] AutomaticLoginEnable=true AutomaticLogin=myuser 

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

    • 停止X服务器
    • 以root身份运行vglserver_config
    • 选择选项1
    • 回答所有3个问题(这是可行的,但是这里也有安全问题,你可能希望查阅文档 ,并管理必要的用户组,并尝试除3个问题以外的其他选择)。
    • 选择X退出
    • 重新启动X服务器

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

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

    或者您可以探索在机器启动时自动运行应用程序的各种方法。 有这么多可能的方法在这里,最好的,如果你只是做一个谷歌搜索相关的操作系统。

  11. 如果您还没有这样做,您可能需要构建CUDA示例。 该方法在上面的步骤5中链接的入门指南文档中进行了介绍。 您可能需要确保已经为某些CUDA图形样本(例如simpleGL安装了合适的大容量提供程序(例如freeglut)。

  12. 在关闭电源之前,您可能还需要修改远程工作站防火墙。 为我的目的,我只是禁用它(系统管理…防火墙…禁用)。 TurboVNC使用默认情况下将被防火墙阻止的特定端口。 如果你想使用防火墙,但打开这些端口,这应该是可能的,但超出了这个配方的范围。

您的远程工作站现在已配置。 如果你做了上面所有的改变,你可以切换到“无头”操作,如果你添加了xorg no display选项,你实际上可以在下次重启时切换到“无头”状态。 在重新启动之前,您可能需要记下远程工作站的IP地址。 如果您要“无头”,可以使用静态IP进行配置。 假设您观察到远程工作站的IP地址是192.168.1.104。 所以现在是时候重新启动您的远程工作站。

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

 192.168.1.104:5 

连接之后,系统将提示您输入上述步骤9中提供的密码。 此时,与myuser关联的图形桌面应在客户机上打开。 这个图形桌面还没有完全的3D图形加速与之相关联。 为了使用OpenGL的GPU(和CUDA / OpenGL interop),需要运行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 不能用于这个目的 ,它是仅计算的。 AFAIK,其他大多数支持NVIDIA CUDA的GPU应该可以用于这个目的。 具有cc2.0之前的计算能力的GPU不能与本文中描述的CUDA 7驱动程序一起使用。

作为一个额外的参考,这个nvidia白皮书将是有用的。