雖然 第 1 部分 專注于使用全新的 NVIDIA cuTENSOR 2.0 CUDA 數學庫,但本文將介紹其他使用模式,特別是 Python 和 Julia 的使用。我們還將展示基于基準測試的 cuTENSOR 性能在多個應用領域中的表現。
PyTorch 和 TensorFlow
我們提供 Cutensor Python 軟件包,其中包含用于 Einsum 樣式的界面。該包利用 cuTENSOR,可以類似于 PyTorch 和 TensorFlow 的原生 einsum 實現。有關更多信息,請參閱 Installation 部分。
例如,cuTENSOR 可以作為 torch.einsum 使用,如下代碼示例所示:
from cutensor.torch import EinsumGeneral output = EinsumGeneral( 'kc,nchw->nkhw' , input_a, input_b) // similar to torch.einsum(...) |
CuPy
CuPy 最近增加了對 cuTENSOR 2.0 的支持,這使得 Python 開發者能夠輕松利用 cuTENSOR 提升性能。要將 cuTENSOR 作為 CuPy 的后端,請導出 CUPY_ACCELERATORS=cub, cutensor 環境變量并安裝正確的 CuPy 版本。
使用 pip:
pip install cupy-cuda12x cutensor-cu12 |
使用 conda:
conda install -c conda-forge cupy "cutensor>=2" cuda-version=X.Y |
啟用 cuTENSOR 后,它會自動加速 CuPy einsum 函數:
import cupy as cp # tensor contraction can be accelerated by cuTENSOR a = cp.random.random((3, 4, 5)) b = cp.random.random((4, 5, 6)) c = cp.random.random((6, 7)) out = cp.einsum(“abc,bcd,de->ae”, a, b, c) |
此外,CuPy 還可以直接訪問 cuTENSOR 的低級 API,以便表示以下 einsum 函數:
import cupy as cp import cupyx.cutensor as cutensor alpha = 1.0 beta = 0.0 mode_a = ( 'a' , 'b' , 'c' ) mode_b = ( 'b' , 'c' , 'd' ) mode_c = ( 'd' , 'e' ) mode_ab = ( 'a' , 'd' ) mode_abc = ( 'a' , 'e' ) a = cp.random.random((3, 4, 5)) b = cp.random.random((4, 5, 6)) c = cp.random.random((6, 7)) ab = cp.empty((3, 6)) abc = cp.empty((3, 7)) cutensor.contraction(alpha, a, mode_a, b, mode_b, beta, ab, mode_ab) cutensor.contraction(alpha, ab, mode_ab, c, mode_c, beta, abc, mode_abc) |
Julia Lang
CUDA.jl (v5.2.0) 新增了對 cuTENSOR 2.0 的支持,使得 Julia 開發者能夠輕松利用 cuTENSOR 的性能提升。要在 Julia 中使用 cuTENSOR,請安裝 CUDA.jl 包。
安裝 CUDA.jl 后,它會使用 CuTensor 對象自動使用 cuTENSOR 加速收縮。
using CUDA using cuTENSOR dimsA = (3, 4, 5) dimsB = (4, 5, 6) indsA = [ 'a' , 'b' , 'c' ] indsB = [ 'b' , 'c' , 'd' ] A = rand (Float32, (dimsA...,)) B = rand (Float32, (dimsB...,)) dA = CuArray(A) dB = CuArray(B) ctA = CuTensor(dA, indsA) ctB = CuTensor(dB, indsB) ctC = ctA * ctB # cuTENSOR is used to perform the contraction C, indsC = collect(ctC) |
CUDA.jl 還提供了直接訪問 cuTENSOR 的更低級別 API,因此上述收縮也可以表示為:
using CUDA using cuTENSOR dimsA = (3, 4, 5) dimsB = (4, 5, 6) dimsC = (3, 6) indsA = ['a', 'b', 'c'] indsB = ['b', 'c', 'd'] indsC = ['a', 'd'] A = rand(Float32, (dimsA...,)) B = rand(Float32, (dimsB...,)) C = zeros(Float32, (dimsC...,)) dA = CuArray(A) dB = CuArray(B) dC = CuArray(C) alpha = rand(Float32) beta = rand(Float32) opA = cuTENSOR.OP_IDENTITY opB = cuTENSOR.OP_IDENTITY opC = cuTENSOR.OP_IDENTITY opOut = cuTENSOR.OP_IDENTITY comp_type = cuTENSOR.COMPUTE_DESC_TF32 plan = cuTENSOR.plan_contraction(dA, indsA, opA, dB, indsB, opB, dC, indsC, opC, opOut; compute_type=comp_type) dC = cuTENSOR.contract!(plan, alpha, dA, dB, beta, dC) C = collect(dC) |
性能
本節將詳細了解 cuTENSOR 2.0 的性能,并將其與其他工具進行比較。
cuTENSOR 2.0.0 與 1.7.0 的對比
cuTENSOR 2.0.0 的性能比其 1.x 前身有顯著提升,其中關鍵的改進包括以下內容:
- 核函數的改進
- 改進性能模型以選擇最佳內核
- 引入即時編譯支持
圖 1 概述了 cuTENSOR 2.0.0 在 NVIDIA GA100 和 GH100 GPU 上對各種張量收縮的 cuTENSOR 1.7.0 的速度提升情況,其中不包括 JIT。
此圖中顯示的加速速度依賴于 CUTENSOR_ALGO_DEFAULT,它會調用 cuTENSOR 性能模型。值得注意的是,對于 NVIDIA Hopper 架構 (GH100),性能提升尤為顯著。
左: NVIDIA A100 80GB PCIe;右: NVIDIA H100 80 GB PCIe。不同的數據類型采用不同的顏色編碼。
圖 2 僅關注 JIT 編譯帶來的性能提升,即在 NVIDIA GH100 GPU 上比較不使用 JIT 的 cuTENSOR 2.0 與使用 JIT 的 cuTENSOR 2.。
圖 2 將收縮分為兩個獨特的基準測試:
- 類似于 QC是一個基準測試,可以捕捉常見的量子電路模擬中的張量收縮結構,張量平均維度為 19.。
- rand1000 是一個 公共收縮基準測試,它包含隨機收縮,平均張量維度為 4。
對于類似 QC 的基準測試,由于 JIT 的加速效果更大,這并不令人驚訝,因為這些縮減過程更復雜。它們通常會導致偏差縮減,因此需要專用核函數,這些核函數無法通過固定的預構建核函數有效地解決問題。
量子電路模擬
本小節概述了 cuTENSOR 為基于張量網絡的 53 位 Sycamore 量子電路提供的張量網絡量子電路模擬性能提升。
我們基于兩種不同的切割選擇演示了張量網絡收縮的性能,以限制最大中間張量的大小為 16 GB 或 32 GB。這種不同的收縮路徑(張量合并順序)。有關更多信息,請參閱 經典模擬量子優勢電路。
理想情況下,您希望盡可能少切割模式,以減少浮點運算 (FLOP),但這也會增加所需的內存,從而使某些切割選項變得不可行。
具體來說,由于增加的內存需求,PyTorch 無法適用于更好的切割選項,從而產生 32 GB 中間張量。相比之下,cuTENSOR 不受同樣的限制,因為它的直接收縮內核不需要任何輔助內存。
我們在所有框架中對張量模式進行了相同的訂閱,以確保做出公平的比較。有關更多信息,請參閱 中間張量模式順序的重要性 和 在現代 GPU 上使用張量網絡方法實現高效的量子電路模擬。
圖 3 重點介紹了 cuTENSOR 2.0 與 PyTorch 2.1.0 在 Sycamore QC 模擬中的加速情況。總結如下:
- cuTENSOR 2.0 的性能始終優于 PyTorch。
- cuTENSOR 2.0 的性能優于上一代產品 (類似于圖 3)
- 即時編譯可進一步提升性能 (類似于圖 4)
- 與 FP32 相比,TF32 顯著提升了性能。
- 與 PyTorch 相比,速度提升尤為明顯,這是因為 PyTorch 消耗了過多的內存,因此無法使用更具計算效率的收縮路徑。我們比較了 PyTorch 仍然能夠計算的最佳路徑:與 16 GB 中間張量相對應的路徑。
量子化學多體理論
帶有單電子、雙電子和擾動三電子激發 (CCSD (T)) 的耦合簇是一種備受贊譽的量子化學方法,它在計算分子電子結構方面具有極高的準確性,尤其適用于電子相互作用至關重要的系統。在量子化學計算領域,它常被稱為黃金標準,尤其適用于電子相互作用至關重要的系統。
CCSD (T) 方法通過一系列激發級別整合相關電子運動,從而增強了 Hartree-Fock 方法。在此方法中,單電子和雙電子激發通過迭代方式計算,而三電子激發則通過非迭代方式應用偏差修正。
這種方法特別適用于準確預測基態能量、反應能量和屏障高度,尤其是在弱電子相互作用系統中。盡管它具有較高的計算需求,但 CCSD (T) 在準確性和計算成本之間取得了良好平衡,因此在計算化學領域備受歡迎。
圖 4 重點展示了在 NVIDIA H100 GPU 上運行的 cuTENSOR 與在 72 核 NVIDIA Grace CPU 上基于 OpenMP 的實現相比,速度提升的情況。該基準測試使用了 NWChem TCE CCSD (T) 循環驅動核函數,這是 NWChem Tensor Contraction Engine (TCE) 模塊中 CCSD (T) 三重核心的獨立驅動程序。
開始使用 cuTENSOR 2.0
如果您有關于 cuTENSOR 的功能請求,例如計算例程或不同的計算或數據類型,請聯系我們 Math-Libs-Feedback@nvidia.com.
開始使用 cuTENSOR 2.0 詳細了解 cuTENSOR 2.0。訪問 開發者論壇 獲取更多討論和資源。
[1] Huang, Cupjin, et al. “Classical simulation of quantum supremacy circuits.” arXiv preprint arXiv:2005.06787 (2020).
[2] Springer, Charara, Hoehnerbach. SIAM CSE’23, “The Importance of Middle Tensor Mode Order.”
[3] Pan, Feng, et al. “Efficient Quantum Circuit Simulation by Tensor Network Methods on Modern GPU.” arXiv preprint arXiv:2310.03978 (2023).
?