如何 运行 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
.
中只需要配置一个
此设置可以使用没有显示输出的 Tesla 卡完成(例如 K40c。K20 变体是一种特殊情况,但是 - 请参见下面的注释 *)。在这种情况下,它假设您有另一个显示卡用于初始远程工作站设置步骤。这个其他的显示卡可以是任何卡,设置好后就可以转换机器"headless"使用了。如果您使用不同的显示 GPU 进行设置,您可以先将 Tesla 或 CUDA GPU 排除在系统之外。
安装您的 Linux OS。我用 CentOS 6.2 来测试。如果你使用 CentOS/RHEL 6.x OS,事情应该很像这里描述的那样适合你。如果您使用不同的 OS,一切都可能会有所不同。如果是这样,这些说明只是指南,而不是食谱。在安装 CentOS 6.2 期间,select "Software Development Workstation" 选项,以获得我们需要的大部分图形和开发位。在安装过程中应该会提示您创建一个普通用户名(root 除外)。我们称之为 myuser
.
禁用 Nouveau。在 CentOS 6.x 上,这些步骤将达到目的 as root:
echo -e "blacklist nouveau\noptions nouveau modeset=0" > /etc/modprobe.d/disable-nouveau.conf
dracut --force
关闭电源,然后安装您要用于 CUDA and/or OpenGL 加速的 Tesla 或其他 CUDA GPU。重新启动机器。希望 linux 显示仍会出现在您在第 3 步中使用的同一显示器上。如果您使用的是 Tesla(即非显示)卡,应该没有任何问题,但如果您使用的是一些其他支持 CUDA 显示的 GPU(GeForce/Quadro),此时 X 显示可能移动到您刚刚安装的 GPU。
安装CUDA 7。我使用了 运行 文件安装程序方法,select 对 所有 问题(包括 OpenGL 库的安装)输入了 yes 并接受所有默认路径。如果您使用其他一些 CUDA 版本或其他安装方法,您的结果可能会有所不同。
安装 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
我不认为这些版本有什么特别之处,但是如果您使用不同的版本,您的结果可能会有所不同。
运行 nvidia-xconfig
(从终端会话)作为 root 建立初始 /etc/X11/xorg.conf
文件,然后修改 "Device" 部分以添加如下一行:
BusID "PCI:1:0:0"
PCI 地址与您的 GPU 匹配的位置(用 lspci
或 nvidia-smi -a
确认)对于无头操作,您可以选择在 "Screen" 部分添加这样一行,但我认为没有必要(即使是无头操作):
Option "UseDisplayDevice" "none"
一个完整的示例 xorg.conf
出现在这个答案的末尾。
as myuser
, in ~/.vnc/xstartup.turbovnc
, 在此行之后:
unset SESSION_MANAGER
添加以下行:
unset DBUS_SESSION_BUS_ADDRESS
as myuser
,如下添加启动应用程序,使用gnome桌面实用程序(System...Preferences...Startup Applications)
/opt/TurboVNC/bin/vncserver :5 -depth 24
这里的:5
有点随意,可以用:2
等其他数字,但不要用:0
。其余部分假定您已在此处 selected :5
。您还需要从终端会话中 运行 这一行(仅一次,再次为 myuser
),以便 setup/configure vncserver 使用。第一次 运行 时,它可能会提示您输入密码。请记住此密码 - 稍后您将需要它来访问客户端。
对于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.
相关的 google 搜索
如果您还没有这样做,您可能想要构建 CUDA 示例。上述步骤 5 中链接的入门指南文档中介绍了该方法。您可能需要确保为某些 CUDA 图形示例(例如 simpleGL
.
安装了合适的过剩提供程序,例如 freeglut
在关机之前,您可能还想修改远程工作站防火墙。出于我的目的,我只是禁用它(系统...管理...防火墙...禁用)。 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 会有用。
我正在尝试从主机 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
.
此设置可以使用没有显示输出的 Tesla 卡完成(例如 K40c。K20 变体是一种特殊情况,但是 - 请参见下面的注释 *)。在这种情况下,它假设您有另一个显示卡用于初始远程工作站设置步骤。这个其他的显示卡可以是任何卡,设置好后就可以转换机器"headless"使用了。如果您使用不同的显示 GPU 进行设置,您可以先将 Tesla 或 CUDA GPU 排除在系统之外。
安装您的 Linux OS。我用 CentOS 6.2 来测试。如果你使用 CentOS/RHEL 6.x OS,事情应该很像这里描述的那样适合你。如果您使用不同的 OS,一切都可能会有所不同。如果是这样,这些说明只是指南,而不是食谱。在安装 CentOS 6.2 期间,select "Software Development Workstation" 选项,以获得我们需要的大部分图形和开发位。在安装过程中应该会提示您创建一个普通用户名(root 除外)。我们称之为
myuser
.禁用 Nouveau。在 CentOS 6.x 上,这些步骤将达到目的 as root:
echo -e "blacklist nouveau\noptions nouveau modeset=0" > /etc/modprobe.d/disable-nouveau.conf dracut --force
关闭电源,然后安装您要用于 CUDA and/or OpenGL 加速的 Tesla 或其他 CUDA GPU。重新启动机器。希望 linux 显示仍会出现在您在第 3 步中使用的同一显示器上。如果您使用的是 Tesla(即非显示)卡,应该没有任何问题,但如果您使用的是一些其他支持 CUDA 显示的 GPU(GeForce/Quadro),此时 X 显示可能移动到您刚刚安装的 GPU。
安装CUDA 7。我使用了 运行 文件安装程序方法,select 对 所有 问题(包括 OpenGL 库的安装)输入了 yes 并接受所有默认路径。如果您使用其他一些 CUDA 版本或其他安装方法,您的结果可能会有所不同。
安装 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
我不认为这些版本有什么特别之处,但是如果您使用不同的版本,您的结果可能会有所不同。
运行
nvidia-xconfig
(从终端会话)作为 root 建立初始/etc/X11/xorg.conf
文件,然后修改 "Device" 部分以添加如下一行:BusID "PCI:1:0:0"
PCI 地址与您的 GPU 匹配的位置(用
lspci
或nvidia-smi -a
确认)对于无头操作,您可以选择在 "Screen" 部分添加这样一行,但我认为没有必要(即使是无头操作):Option "UseDisplayDevice" "none"
一个完整的示例
xorg.conf
出现在这个答案的末尾。as
myuser
, in~/.vnc/xstartup.turbovnc
, 在此行之后:unset SESSION_MANAGER
添加以下行:
unset DBUS_SESSION_BUS_ADDRESS
as
myuser
,如下添加启动应用程序,使用gnome桌面实用程序(System...Preferences...Startup Applications)/opt/TurboVNC/bin/vncserver :5 -depth 24
这里的
:5
有点随意,可以用:2
等其他数字,但不要用:0
。其余部分假定您已在此处 selected:5
。您还需要从终端会话中 运行 这一行(仅一次,再次为myuser
),以便 setup/configure vncserver 使用。第一次 运行 时,它可能会提示您输入密码。请记住此密码 - 稍后您将需要它来访问客户端。对于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.
相关的 google 搜索
如果您还没有这样做,您可能想要构建 CUDA 示例。上述步骤 5 中链接的入门指南文档中介绍了该方法。您可能需要确保为某些 CUDA 图形示例(例如
simpleGL
. 安装了合适的过剩提供程序,例如 freeglut
在关机之前,您可能还想修改远程工作站防火墙。出于我的目的,我只是禁用它(系统...管理...防火墙...禁用)。 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 会有用。