CUDA刷新:GPU計算生態系統
CUDA Refresher: The GPU Computing Ecosystem
這是CUDA Refresher系列的第三篇文章,其目標是刷新CUDA中的關鍵概念、工具和優化,以供初級或中級開發人員使用。
易於編程和性能的巨大飛躍是CUDA平台被廣泛采用的關鍵原因之一。CUDA平台成功的第二大原因是擁有廣泛而豐富的生態系統。
與任何新平台一樣,CUDA的成功依賴於CUDA生態系統可用的工具、庫、應用程序和合作伙伴。任何新的計算平台都需要開發人員將應用程序移植到新的平台。至這樣做,開發人員需要最先進的工具和開發環境。
在應用程序開始擴展之后,在數據中心級別需要更多的工具。英偉達致力於為開發者和企業提供最先進的工具和生態系統服務。
Figure 1: CUDA Ecosystem: The building blocks to make the CUDA platform the best developer choice.
英偉達最近宣布了最新的A100架構和DGX A100系統的基礎上,這一新的架構。新的A100 GPU還配備了豐富的生態系統。
圖1顯示了在15年多的時間里進化的更廣泛的生態系統組成部分。在這篇文章中,將詳細介紹每個生態系統組件。
Programming languages and APIs
NVIDIA發布了CUDA工具包,提供了使用C/C++編程語言的開發環境。使用此工具包,可以在gpu上開發、優化和部署應用程序。NVIDIA還提供了一個PGI工具包來使用Fortran語言編程。
還有許多第三方工具鏈可用:
· PyCUDA—Use CUDA API operations from a Python interface. 使用來自Python接口的CUDA API操作。
· Altimesh Hybridizer—Generate CUDA C source code from .NET assemblies (MSIL) or Java archives (java bytecode). 從.NET程序集(MSIL)或Java存檔(Java字節碼)生成CUDAC源代碼。
· OpenACC—Use directives to program GPUs and compiler-generated CUDA code before executing on CUDA GPUs. 使用指令對gpu進行編程,並在對CUDA gpu執行之前編譯生成的CUDA代碼。
· OpenCL—Use low-level API operations to program CUDA GPUs. 使用低級API操作來編程CUDA gpu。
Alea-GPU—Program CUDA GPUs with the .NET framework. 使用.NET框架的Alea GPU程序CUDA GPU。
Libraries
庫對於為任何編程環境中廣泛使用的公共例程提供性能下降是必不可少的。針對目標計算架構進行了很好的優化,並且具有較高的軟件質量。還節省了應用程序開發時間,並提供了開始使用GPU加速的最簡單方法。
NVIDIA在CUDA平台上提供了一個稱為CUDA-X的層,CUDA-X是一個庫、工具和技術的集合。GPU加速CUDA庫支持跨多個領域的加速下降,如線性代數、圖像和視頻處理、深度學習和圖形分析。對於開發自定義算法,可以使用與常用語言和數字包以及已發布的開發API操作的可用集成。
NVIDIA CUDA工具包附帶了大量常用庫。許多合作伙伴還在CUDA平台上貢獻了許多庫。以下是一些廣泛使用的庫的列表:
· Mathematical libraries: cuBLAS, cuRAND, cuFFT, cuSPARSE, cuTENSOR, cuSOLVER
· Parallel algorithm libraries: nvGRAPH, Thrust
· Image and video libraries: nvJPEG, NPP, Optical Flow SDK
· Communication libraries: NVSHMEM, NCCL
· Deep learning libraries: cuDNN, TensorRT, Jarvis, DALI
· Partner libraries: OpenCV, FFmpeg, ArrayFire, MAGMA
Profiling and debugging tools分析和調試工具
任何編程體系結構的重要元素之一是編寫、調試和優化程序的健壯而高效的工具。CUDA生態系統是健壯的,NVIDIA花費了大量的精力來確保擁有快速、輕松、高效地編寫所需的所有工具。
以下是CUDA分析和調試工具的預覽:
NVIDIA Nsight這是一個低開銷的分析、跟蹤和調試工具。提供了一個基於GUI的環境,可以跨NVIDIA平台(如大型多GPU x86服務器、Quadro工作站等)進行擴展。
CUDA GDB這是linuxgdb的一個擴展,提供了一個基於控制台的調試接口,可以從命令行使用。CUDA GDB可以在本地系統或任何遠程系統上使用。基於GUI的插件也可用,例如DDD、EMACS或Nsight Eclipse Edition。
CUDA-Memcheck是一個必備的工具,通過檢查並發運行的數千個線程來洞察內存訪問問題。
還有許多第三方解決方案,包括:
Datacenter tools and cluster management數據中心工具和群集管理
NVIDIA gpu為應用程序提供了巨大的加速,這些應用程序進一步擴展到大量的gpu。許多科學應用,如分子動力學和量子化學,以及人工智能應用,都需要一個gpu集群來將應用性能擴展到通過高速網絡連接的數千個gpu。現代數據中心使用NVIDIA GPUs和Mellanox高速互連來擴展應用程序以大規模擴展性能。
需要一個復雜的生態系統才能在數據中心輕松部署。企業需要工具來輕松管理和運行這些密集的數據中心。英偉達與生態系統合作伙伴密切合作,為開發人員和DevOps提供AI和HPC軟件生命周期每一步的軟件工具。
以下是英偉達為加強這一生態系統所做的一些努力:
· Container registry
· Scheduling and orchestration
· Cluster management tools
· Monitoring tools
Containers
容器是輕松部署應用程序的現代方式。NVIDIA提供NVIDIA NGC的所有深度學習和HPC容器。NVIDIA對這些容器進行了測試、維護和優化。NGC還提供了托管第三方容器的方法。組織也可以選擇擁有私有容器存儲庫。
調度和編排
調度和編排是數據中心管理和操作的另一個重要方面。Kubernetes是現代流行的容器編排系統,用於自動化應用程序部署、擴展和管理。NVIDIA GPUs上的Kubernetes使用GPU加速功能擴展了行業標准的容器編排平台。Kubernetes為NVIDIA GPU資源調度提供了最先進的支持。
群集管理工具
主要的標准集群管理工具都支持NVIDIA gpu。一些例子包括Bright Cluster, Ganglia, StackIQ, and Altair PBS Works作品。
監視工具
NVIDIA還提供了一套稱為DCGM的工具,用於管理和監視集群環境中的gpu。NVIDIA還公開了一個基於API的接口,通過nvmlapi監視gpu。在這些工具的幫助下,數據中心運營團隊可以持續執行主動健康監測、全面診斷、系統警報和治理策略,包括電源和時鍾管理。這些工具可以單獨使用,也可以與任何行業標准工具套件集成使用。還可以使用NVML API操作構建自己的工具。
CUDA ecosystem and GPU-accelerated applications
在2006年CUDA發布之后,開發人員已經在CUDA上移植了許多應用程序。
第一批開始移植應用程序的開發人員是科學界。這個社區移植了許多標准應用程序,以及自行開發的代碼。具有內在並行性的應用程序,如圖像和視頻處理,是移植到CUDA的第一個用例之一。
深度學習是另一個大規模並行性有助於加速應用程序的例子。目前幾乎每個深度學習框架都使用CUDA/GPU計算來加速深度學習訓練和推理。
NVIDIA維護一個目錄,列出所有GPU加速應用程序。這個列表只是GPU計算加速的應用程序的一個子集。很多申請都是內部的,不在這份名單上。
GPUs everywhere
CUDA的廣泛采用要求每個需要GPU來開發CUDA代碼和端口應用程序的開發人員。多年前,NVIDIA決定在NVIDIA設計的每個GPU都將支持CUDA架構:
用於游戲和筆記本電腦的GeForce GPU
專業可視化的Quadro GPU
數據中心GPU
嵌入式soc的Tegra
跨所有產品線的單一計算體系結構和CUDA的向后兼容性使該平台成為開發人員的選擇。可以訪問筆記本電腦和PC、工作站、服務器和嵌入式設備中的GPU,並在任何地方運行相同的CUDA代碼。地球上的每一個雲服務提供商都為CUDA支持的gpu供電。
Summary
NVIDIA致力於為CUDA開發者提供廣泛而豐富的生態系統支持。一個龐大的工程師團隊一直在努力確保能得到所有正確的工具。以下是CUDA開發人員可以利用的優勢:
使用豐富的編程語言支持和開發環境工具(如調試器、探查器等)開發CUDA代碼。
通過優化、測試和維護庫來降低應用程序的加速。
使用經過優化和測試的容器及其在NVIDIA NGC上的可用性,易於部署。
支持在集群環境中擴展應用程序的工具。
使用CUDA加速了更廣泛的應用。