遠端離屏渲染
我的研究實驗室最近添加了一個伺服器,它有一個強大的 NVIDIA 顯卡,我們想用它來進行科學計算。由於它不是工作站,我們必須通過 ssh 連接遠端執行我們的作業。我們的大多數應用程序都需要對螢幕外緩衝區進行 opengl 渲染,然後在 CUDA 中對結果進行圖像分析。
我最初的調查表明 X11 轉發是一個壞主意,因為 opengl 渲染將發生在客戶端機器上(或者更確切地說是 X11 伺服器 - 多麼令人困惑的命名約定!)並且在發送我們的大量紋理時會遇到網路瓶頸。我們永遠不需要顯示輸出,所以似乎不需要 X11 轉發,但 Opengl 需要將 $DISPLAY 設置為有效的值,否則我們的應用程序將無法執行。我確信存在這樣做的渲染農場,但它是如何完成的?我認為這可能是一個簡單的 X11 配置問題,但我對它太陌生了,不知道從哪裡開始。
我們正在執行 Ubuntu 伺服器 10.04,沒有安裝 gdm、gnome 等。但是,已安裝 xserver-xorg 軟體包。
我問這個問題已經有一段時間了,所以我想我會提到我們最終使用的解決方案。
劫持本地 X 螢幕
最後,我只是在伺服器的本地 X 螢幕上執行了遠端 opengl 程序。這台機器執行的是 Ubuntu 伺服器版,預設情況下它沒有執行 xserver,所以我必須設置一個 xserver 在啟動時執行(我剛剛安裝了 Ubuntu 的 ubuntu-desktop 軟體包,用大錘殺死了一隻蚊子),然後讓自己以 root 身份使用以下命令訪問 X 螢幕:“export DISPLAY=:0.0; xhost + local:”。然後我可以 ssh 進入機器,呼叫“export DISPLAY=:0.0”,然後正常執行我的 opengl 程序。坐在遠端機器上的任何人都會看到一個視窗彈出並觀看我的程序執行,但我們沒有連接監視器,所以這不是問題。
使用某種形式的螢幕外渲染很重要,因為如果視窗被另一個視窗遮擋,直接從螢幕顏色緩衝區讀取像素可能會導致垃圾數據。由於您看不到 X 螢幕,因此很難知道是否發生了這種情況。離屏渲染(例如幀緩衝對象(fbo)或pbuffers)沒有這個問題。
劫持伺服器的本地 Xscreen 並不是一個理想的解決方案,所以這裡有一些我在此過程中發現的替代方案:
虛擬幀緩衝區
Xvfb 是一個選項,但它對我不起作用,因為 OpenGL 沒有從硬體加速中受益,並且不支持幀緩衝區對象,這是 CUDA 與 OpenGL 互操作性所必需的。儘管如此,這可能是一個可行的選擇,其中劫持本地螢幕是不可接受的,或者使用者無法獲得 xhost 權限。
虛擬GL
從 VirtualGL 網站:
VirtualGL 是一個開源軟體包,它使任何 Unix 或 Linux 遠端顯示軟體能夠執行具有完整 3D 硬體加速的 OpenGL 應用程序。
這正是我想要的,而且看起來很有前途,但是我沒有時間處理新的庫依賴,所以我沒有測試它。我的猜測是,一旦我可以對其進行編譯、安裝和配置,這就是理想的解決方案。這是 VirtualBox 和一些 VNC 伺服器用來支持硬體加速 3D 的。