2020 年 6 月,我們發(fā)布了第一個(gè) NVIDIA 顯示驅(qū)動(dòng)程序,該驅(qū)動(dòng)程序?yàn)?Windows Insider Program ( WIP )預(yù)覽用戶啟用了 Windows Subsystem for Linux ( WSL ) 2 中的 GPU 加速功能。當(dāng)時(shí),這仍然是一個(gè)早期預(yù)覽,功能有限。一年后,隨著我們穩(wěn)步增加新功能,我們也一直專注于優(yōu)化 CUDA 驅(qū)動(dòng)程序,以在 WSL2 上提供最佳性能。
WSL 是 Windows 10 的一項(xiàng)功能,它使您能夠直接在 Windows 上運(yùn)行本機(jī) Linux 命令行工具,而不需要雙啟動(dòng)環(huán)境的復(fù)雜性。在內(nèi)部, WSL 是一個(gè)與 Microsoft Windows 操作系統(tǒng)緊密集成的容器化環(huán)境。 WSL2 使您能夠與傳統(tǒng) Windows 桌面和現(xiàn)代商店應(yīng)用程序一起運(yùn)行 Linux 應(yīng)用程序。有關(guān) WSL 上 CUDA 的更多信息,請(qǐng)參閱 在 Linux 2 的 Windows 子系統(tǒng)上宣布 CUDA 。
在本文中,我們將重點(diǎn)介紹 WSL2 上 CUDA 性能的當(dāng)前狀態(tài)、已經(jīng)進(jìn)行的各種以性能為中心的優(yōu)化,以及未來的展望。
WSL 性能的當(dāng)前狀態(tài)
在過去的幾個(gè)月里,我們一直在通過分析和優(yōu)化 NVIDIA 和 Microsoft 方面的多個(gè)關(guān)鍵驅(qū)動(dòng)程序路徑來調(diào)整 WSL2 上 CUDA 驅(qū)動(dòng)程序的性能。在本文中,我們將詳細(xì)介紹我們?yōu)檫_(dá)到當(dāng)前性能水平所做的工作。在我們開始之前,這里是 WSL2 在幾個(gè)基準(zhǔn)上的當(dāng)前狀態(tài)。
在 WSL2 上,所有 GPU 操作都通過 VMBUS 序列化并發(fā)送到主機(jī)內(nèi)核接口。 WSL2 最常見的性能問題之一是上述操作的開銷。我們知道,開發(fā)人員想知道,與直接在本機(jī) Linux 上運(yùn)行工作負(fù)載相比,在 WSL2 中運(yùn)行工作負(fù)載是否有任何開銷。有區(qū)別嗎?這項(xiàng)開銷大嗎?
圖 1 。 Blender 基準(zhǔn)測試結(jié)果( WSL2 與 Native ,結(jié)果以秒為單位,越低越好) 。
對(duì)于 Blender 基準(zhǔn)測試, WSL2 性能與本機(jī) Linux 相當(dāng)或接近(在 1% 以內(nèi))。因?yàn)?Blender 循環(huán)將長時(shí)間運(yùn)行的內(nèi)核推送到 GPU 上,所以 WSL2 的開銷在這些基準(zhǔn)上都是不可見的。
圖 2 。 Rodinia 基準(zhǔn)測試套件結(jié)果( WSL2 與本機(jī)比較,結(jié)果以秒為單位,越低越好)。
談到 Rodinia 基準(zhǔn)測試套件(圖 2 ),我們?cè)诘谝淮螁?dòng)對(duì) WSL2 的支持時(shí)已經(jīng)取得了很大的成績。
新的驅(qū)動(dòng)程序可以執(zhí)行得更好,甚至可以達(dá)到接近粒子過濾器測試的本機(jī)執(zhí)行時(shí)間。它也最終縮小了心肌細(xì)胞基準(zhǔn)的差距。這對(duì)于 Myocyte 基準(zhǔn)測試尤其重要,與本機(jī) Linux 相比, WSL2 的早期結(jié)果慢了 10 倍。 Myocyte 在 WSL2 上特別難,因?yàn)檫@個(gè)基準(zhǔn)由許多非常小的順序提交(小于微秒)組成,使其成為順序啟動(dòng)延遲微基準(zhǔn)。這是我們正在調(diào)查的一個(gè)領(lǐng)域,以實(shí)現(xiàn)完全的性能對(duì)等。
圖 3 。 GenomeWorks CUDA 對(duì)齊器示例執(zhí)行時(shí)間( WSL2 與本機(jī)比較,結(jié)果以秒為單位,越低越好) 。
對(duì)于 GenomeWorks 基準(zhǔn)測試(圖 3 ),我們使用 CUDA 對(duì)齊器進(jìn)行 GPU 加速成對(duì)對(duì)齊。為了顯示性能開銷的最壞情況,這里的基準(zhǔn)測試運(yùn)行是使用由短時(shí)間運(yùn)行的內(nèi)核組成的樣本數(shù)據(jù)集完成的。由于內(nèi)核啟動(dòng)有多短,您可以觀察 WSL2 上的啟動(dòng)延遲開銷。但是,即使對(duì)于這個(gè)最壞的示例,性能也等于或超過本機(jī)速度的 90% 。我們的期望是,對(duì)于數(shù)據(jù)集大小通常較大的實(shí)際用例,性能將接近本機(jī)性能。
要探索內(nèi)核大小和 WSL2 性能之間的關(guān)鍵權(quán)衡,請(qǐng)查看下一個(gè)基準(zhǔn)測試。
圖 4 。 PyTorch MNIST 每個(gè)歷元的采樣時(shí)間,具有不同的批大小( WSL2 與本機(jī),結(jié)果以秒為單位,越低越好) 。
圖 4 顯示了 PyTorch MNIST 測試,這是一個(gè)專門設(shè)計(jì)的小型玩具機(jī)器學(xué)習(xí)示例,它強(qiáng)調(diào)了讓 GPU 保持忙碌以在 WSL2 上達(dá)到令人滿意的性能是多么重要。與本機(jī) Linux 一樣,工作負(fù)載越小,啟動(dòng) GPU 進(jìn)程的開銷越可能導(dǎo)致性能下降。這種降級(jí)在 WSL2 上更為明顯,與本機(jī) Linux 相比,其擴(kuò)展性也有所不同。
隨著對(duì) WSL2 驅(qū)動(dòng)程序的不斷改進(jìn),對(duì)于非常小的工作負(fù)載,這種伸縮性差異應(yīng)該越來越不明顯。在 WSL2 和本機(jī) Linux 上避免這些陷阱的最佳方法是盡可能使 GPU 保持忙碌。
表 1 。用于基準(zhǔn)測試的系統(tǒng)配置和軟件版本
。
表 2 。使用的基準(zhǔn)測試名稱以及每個(gè)測試的簡要說明
。
啟動(dòng)延遲優(yōu)化
啟動(dòng)延遲是一些本機(jī) Linux 應(yīng)用程序與 WSL2 之間性能差異的主要原因之一。這里有兩個(gè)重要指標(biāo):
GPU 內(nèi)核啟動(dòng)延遲: 通過 CUDA 調(diào)用啟動(dòng)內(nèi)核并由 GPU 啟動(dòng)執(zhí)行所需的時(shí)間。
端到端開銷 (啟動(dòng)延遲加上同步開銷):通過 CUDA 調(diào)用啟動(dòng)內(nèi)核并在 CPU 上等待其完成所需的總時(shí)間,不包括內(nèi)核運(yùn)行時(shí)本身。
當(dāng)推送到 GPU 上的工作負(fù)載明顯大于延遲本身時(shí),啟動(dòng)延遲通常可以忽略不計(jì)。多虧了 CUDA 原語(如流和圖),您可以讓 GPU 保持忙碌,并可以利用這些 API 的異步特性來克服任何延遲問題。但是,當(dāng)發(fā)送到 GPU 的工作負(fù)載的執(zhí)行時(shí)間接近啟動(dòng)延遲時(shí),它很快就會(huì)成為一個(gè)主要的性能瓶頸。啟動(dòng)延遲將充當(dāng)啟動(dòng)速率限制器,這將導(dǎo)致內(nèi)核執(zhí)行性能下降。
本機(jī) Windows 上的啟動(dòng)延遲
在深入探討在 WSL2 上啟動(dòng)延遲是一個(gè)需要克服的重大障礙之前,我們先解釋一下本機(jī) Windows 上 CUDA 內(nèi)核的啟動(dòng)路徑。 CUDA Windows 驅(qū)動(dòng)程序中實(shí)現(xiàn)了兩種不同的啟動(dòng)模型:一種用于數(shù)據(jù)包調(diào)度,另一種用于硬件加速 GPU 調(diào)度。
分組調(diào)度
在數(shù)據(jù)包調(diào)度中,操作系統(tǒng)負(fù)責(zé)大部分的調(diào)度工作。然而,為了補(bǔ)償提交模型和顯著的啟動(dòng)開銷, CUDA 驅(qū)動(dòng)程序總是嘗試基于各種啟發(fā)式方法批處理一定數(shù)量的內(nèi)核啟動(dòng)。圖 5 顯示,在數(shù)據(jù)包調(diào)度模式下,操作系統(tǒng)調(diào)度提交,并針對(duì)給定上下文對(duì)提交進(jìn)行序列化。這意味著一次提交的所有工作必須在下一次提交的任何工作開始之前完成。
為了提高數(shù)據(jù)包調(diào)度模式下的吞吐量, CUDA 驅(qū)動(dòng)程序嘗試在一次提交中聚合一些啟動(dòng),即使它們?cè)趦?nèi)部跨多個(gè) GPU 隊(duì)列調(diào)度。這種啟發(fā)式方法有助于解決錯(cuò)誤依賴性和并行性問題,還可以減少提交的數(shù)據(jù)包數(shù)量,減少調(diào)度開銷時(shí)間。
圖 5 。 WDDM 數(shù)據(jù)包調(diào)度模型概述及其在 CUDA 驅(qū)動(dòng)程序中的使用 。
在這個(gè)提交模型中,當(dāng)工作負(fù)載受啟動(dòng)延遲限制時(shí),您會(huì)看到性能達(dá)到極限。您可以通過查詢具有較小掛起工作負(fù)載的流的狀態(tài),強(qiáng)制發(fā)布未完成的提交。在這種情況下,除了必須處理潛在的錯(cuò)誤依賴項(xiàng)外,它還面臨著高調(diào)度開銷。
硬件加速 GPU 調(diào)度
最近,微軟推出了一種稱為硬件加速 GPU 調(diào)度的新模式。使用此模型,可以直接為給定上下文公開硬件隊(duì)列,并且用戶模式驅(qū)動(dòng)程序(在本例中為 CUDA )全權(quán)負(fù)責(zé)管理工作提交和工作項(xiàng)之間的依賴關(guān)系。它消除了將多個(gè)內(nèi)核啟動(dòng)批處理到單個(gè)提交中的需要,使您能夠采用與本地 Linux 驅(qū)動(dòng)程序相同的策略,在本地 Linux 驅(qū)動(dòng)程序中,工作提交幾乎是即時(shí)的(圖 6 )。
圖 6 。 CUDA 驅(qū)動(dòng)程序中使用的 WDDM 硬件調(diào)度模型概述 。
這種基于硬件調(diào)度的提交模型消除了錯(cuò)誤的依賴性,避免了緩沖的需要。它還通過將以前在 CPU 上處理的一些操作系統(tǒng)調(diào)度任務(wù)卸載到 GPU 來減少開銷。
在 WSL2 上利用硬件加速 GPU 調(diào)度
為什么這些日程安排細(xì)節(jié)很重要?傳統(tǒng)上,本機(jī) Windows 應(yīng)用程序設(shè)計(jì)為隱藏較高的延遲。然而,對(duì)于本機(jī) Linux 應(yīng)用程序來說,啟動(dòng)延遲從來不是一個(gè)因素,在本機(jī) Linux 應(yīng)用程序中,延遲影響性能的閾值比 Windows 上的閾值小一個(gè)數(shù)量級(jí)。
當(dāng)這些相同的 Linux 應(yīng)用程序在 WSL2 中運(yùn)行時(shí),啟動(dòng)延遲變得更加突出。在這里,硬件加速 GPU 調(diào)度的好處可以抵消延遲導(dǎo)致的性能損失,因?yàn)?CUDA 在 WSL2 和本機(jī) Windows 上采用了與本機(jī) Linux 相同的提交策略。我們強(qiáng)烈建議在運(yùn)行 WSL2 時(shí)切換到硬件加速 GPU 調(diào)度模式。
即使使用硬件加速的 GPU 調(diào)度,向 GPU 提交工作仍然是通過調(diào)用操作系統(tǒng)完成的,就像在數(shù)據(jù)包調(diào)度中一樣。不僅提交,而且在某些情況下,同步 MIG ht 還必須進(jìn)行一些操作系統(tǒng)調(diào)用以進(jìn)行錯(cuò)誤檢測。在 WSL2 上對(duì)操作系統(tǒng)的每次此類調(diào)用都涉及跨越 WSL2 邊界,通過 VMBUS 到達(dá)主機(jī)內(nèi)核模式。這可能很快成為驅(qū)動(dòng)程序的單一瓶頸(圖 7 )。同時(shí)進(jìn)行小批量 GPU 工作的 Linux 應(yīng)用程序可能仍然不能很好地運(yùn)行。
圖 7 。 WSL2 上提交路徑的概述以及額外開銷的各個(gè)位置 。
異步提交以減少啟動(dòng)延遲
我們找到了一個(gè)解決方案,通過 Microsoft 更改提交調(diào)用的異步性來減輕 WSL 上額外的啟動(dòng)延遲。通過利用此調(diào)用,您可以在提交過程中開始重疊其他操作,并以這種方式隱藏額外的 WSL 開銷。由于 submit 調(diào)用的新異步特性,啟動(dòng)延遲現(xiàn)在可與本機(jī) Windows 媲美。
圖 8 。 WSL2 和本機(jī) Windows 上啟動(dòng)延遲的微基準(zhǔn) 。
盡管在同步路徑中進(jìn)行了優(yōu)化,但與本機(jī) Windows 相比,在提交時(shí)啟動(dòng)和同步的總開銷仍然更高。點(diǎn) 1 的 VMBUS 開銷導(dǎo)致了這一點(diǎn),而不是同步路徑本身(圖 7 )。這種影響可以在圖 8 中看到,在圖 8 中,我們測量了一次發(fā)射的開銷,然后是同步。 VMBUS 引起的額外延遲是顯而易見的。
使提交調(diào)用異步并不一定完全消除啟動(dòng)延遲成本。相反,它使您能夠通過同時(shí)執(zhí)行其他操作來抵消它。例如,一個(gè)應(yīng)用程序可以在一個(gè)流上通過管道進(jìn)行多次啟動(dòng),前提是內(nèi)核啟動(dòng)足夠長,可以覆蓋額外的延遲。在這種情況下,這一成本可以被隱藏起來,并設(shè)計(jì)成只有在一系列提交的開始時(shí)才可見。
簡而言之,我們已經(jīng)并將繼續(xù)改進(jìn)和優(yōu)化 WSL2 的性能。盡管有到目前為止提到的所有優(yōu)化,但如果應(yīng)用程序在 GPU 上沒有管道化足夠的工作負(fù)載,或者更糟糕的是,如果工作負(fù)載太小,那么本機(jī) Linux 和 WSL2 之間的性能差距將開始出現(xiàn)。這也是為什么 WSL2 和本機(jī) Linux 之間的比較具有挑戰(zhàn)性,并且在不同的基準(zhǔn)測試中差異很大。
假設(shè)應(yīng)用程序正在進(jìn)行足夠多的流水線工作,以隱藏延遲開銷,并在應(yīng)用程序的整個(gè)生命周期內(nèi)保持 GPU 忙碌。使用當(dāng)前的一組優(yōu)化,性能很可能接近甚至與本機(jī) Linux 應(yīng)用程序相當(dāng)。
當(dāng)應(yīng)用程序提交的 GPU 工作負(fù)載不足以克服該延遲時(shí),本機(jī) Linux 和 WSL2 之間的性能差距將開始出現(xiàn)。間隔與總延遲和一次推送的工作大小之間的差異成正比。
這也是為什么,盡管在這方面做了很多改進(jìn),我們?nèi)詫⒗^續(xù)關(guān)注減少延遲,使其越來越接近本機(jī) Linux 。
新的分配優(yōu)化
我們關(guān)注的另一個(gè)領(lǐng)域是內(nèi)存分配。與啟動(dòng)延遲(只要應(yīng)用程序在 GPU 上啟動(dòng)工作,啟動(dòng)延遲就會(huì)影響性能)不同,內(nèi)存分配主要影響程序的啟動(dòng)、加載和卸載階段。
這并不意味著它不重要;遠(yuǎn)非如此。即使與僅提交 GPU 上的工作相比,這些操作并不頻繁,但相關(guān)的驅(qū)動(dòng)程序開銷通常要高出一個(gè)數(shù)量級(jí)。一次分配幾兆字節(jié)最終需要幾毫秒才能完成。
為了優(yōu)化此路徑,我們的主要方法之一是在 CUDA 中啟用異步分頁操作。這種功能在 Windows 顯示驅(qū)動(dòng)程序模型中已經(jīng)使用了一段時(shí)間,但 CUDA 驅(qū)動(dòng)程序直到現(xiàn)在才使用它。此策略的主要優(yōu)點(diǎn)是,您可以退出分配調(diào)用,并將控制權(quán)交還給用戶代碼。您不必等待昂貴的 GPU 操作完成,例如更新頁表。相反,等待被推遲到引用分配的下一個(gè)操作。
這不僅可以改善 CPU 和 GPU 工作之間的重疊,而且還可以完全消除等待。如果分頁操作提前完成, CUDA 驅(qū)動(dòng)程序可以通過監(jiān)聽映射的圍欄值來避免發(fā)出 OS 調(diào)用以等待分頁操作。在 WSL2 上,這一點(diǎn)尤為重要。只要避免調(diào)用主機(jī)內(nèi)核模式,就可以避免 VMBUS 開銷。
圖 9 。在 CUDA 驅(qū)動(dòng)程序中完成的分配異步映射概述。
我們到了嗎?
在過去的幾個(gè)月里,我們?cè)?WSL2 性能方面取得了長足的進(jìn)步,現(xiàn)在我們看到許多基準(zhǔn)測試的結(jié)果與本機(jī) Linux 相當(dāng)或接近。這并不意味著我們已經(jīng)達(dá)到了目標(biāo),我們將停止優(yōu)化驅(qū)動(dòng)程序。一點(diǎn)也不!
首先,微軟目前正在研究硬件調(diào)度的未來優(yōu)化, MIG ht 使我們能夠?qū)?dòng)開銷降至最低。同時(shí),在這些功能完全開發(fā)之前,我們將繼續(xù)優(yōu)化 WSL 上的 CUDA 驅(qū)動(dòng)程序,并為本機(jī) Windows 提供建議。
其次,我們將關(guān)注通過某種特殊形式的內(nèi)存拷貝快速高效地分配內(nèi)存。我們還將很快開始研究 WSL2 上更好的多 GPU 功能和優(yōu)化,以使更密集的工作負(fù)載能夠快速運(yùn)行。
WSL2 是 NVIDIA 完全受支持的平臺(tái),它將獲得 CUDA 為其所有其他受支持平臺(tái)所努力提供的相同功能和性能重點(diǎn)。我們的目的是使 WSL2 性能更好并適合開發(fā)。我們還將使其成為一個(gè) CUDA 平臺(tái),它對(duì)每個(gè)用例都有吸引力,性能盡可能接近任何本機(jī) Linux 系統(tǒng)。
最后,但并非最不重要的一點(diǎn)是,我們衷心感謝開發(fā)人員社區(qū)在過去一年中迅速采用 GPU 加速 WSL2 預(yù)覽、報(bào)告問題并不斷提供反饋。通過與我們分享我們 MIG ht 在其他方面錯(cuò)過的性能用例,您幫助我們發(fā)現(xiàn)了潛在的問題,并在性能方面取得了長足的進(jìn)步。如果沒有您堅(jiān)定不移的支持, WSL2 上的 GPU 加速將不會(huì)達(dá)到今天的水平。我們期待著與社區(qū)進(jìn)一步合作,努力實(shí)現(xiàn) CUDA 在 WSL2 上的未來里程碑。
要訪問驅(qū)動(dòng)程序安裝程序和文檔,請(qǐng)注冊(cè) NVIDIA 開發(fā)人員計(jì)劃 和 Microsoft Windows Insider 程序 。
以下資源包含有助于您了解 CUDA 如何使用 WSL2 的寶貴信息,包括如何開始運(yùn)行應(yīng)用程序和深入學(xué)習(xí)容器:
WSL 上的 CUDA 下載頁面
WSL 用戶指南上的 CUDA
在 Linux 2 的 Windows 子系統(tǒng)上宣布 CUDA
GPU 在 Linux 的 Windows 子系統(tǒng)中加速了 ML 培訓(xùn)
什么是 WSL ?
使用 WSL2 ( Linux 的 Windows 子系統(tǒng))在 Microsoft Windows 10 上運(yùn)行 RAPIDS
關(guān)于作者
Raphael Boissel 領(lǐng)導(dǎo) Windows 平臺(tái)的 CUDA 工程。他擁有法國工程學(xué)院 EPITA 計(jì)算機(jī)科學(xué)碩士學(xué)位。
Arthy Sundaram 是 CUDA 平臺(tái)的技術(shù)產(chǎn)品經(jīng)理。她擁有哥倫比亞大學(xué)計(jì)算機(jī)科學(xué)碩士學(xué)位。她感興趣的領(lǐng)域是操作系統(tǒng)、編譯器和計(jì)算機(jī)體系結(jié)構(gòu)。
審核編輯:郭婷
-
cpu
+關(guān)注
關(guān)注
68文章
10901瀏覽量
212759 -
gpu
+關(guān)注
關(guān)注
28文章
4768瀏覽量
129257 -
Linux
+關(guān)注
關(guān)注
87文章
11342瀏覽量
210216
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論