• <xmp id="om0om">
  • <table id="om0om"><noscript id="om0om"></noscript></table>
  • 計算機視覺/視頻分析

    cuTENSOR 2.0:應用程序和性能

    雖然 第 1 部分 專注于使用全新的 NVIDIA cuTENSOR 2.0 CUDA 數學庫,但本文將介紹其他使用模式,特別是 Python 和 Julia 的使用。我們還將展示基于基準測試的 cuTENSOR 性能在多個應用領域中的表現。

    本文探討了 cuTENSOR 2.0 的應用程序和性能基準測試。有關更多信息,請參閱系列的第一篇文章:cuTENSOR 2.0:用于加速張量計算的全面指南.

    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),性能提升尤為顯著。

    Average speedup of cuTENSOR 2.0.0 over cuTENSOR 1.7.0 across a wide range of tensor contractions.
    圖 1.cuTENSOR 2.0 速度提升 1.7 倍。
    左: 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 的加速效果更大,這并不令人驚訝,因為這些縮減過程更復雜。它們通常會導致偏差縮減,因此需要專用核函數,這些核函數無法通過固定的預構建核函數有效地解決問題。

    Diagram shows speedups due to just-in-time compilation for various data types, such as bf16, fp16, fp32, and complex(fp32)+tf32.
    圖 2.借助 JIT 實現 cuTENSOR 2.0 加速

    量子電路模擬

    本小節概述了 cuTENSOR 為基于張量網絡的 53 位 Sycamore 量子電路提供的張量網絡量子電路模擬性能提升。

    我們基于兩種不同的切割選擇演示了張量網絡收縮的性能,以限制最大中間張量的大小為 16 GB 或 32 GB。這種不同的收縮路徑(張量合并順序)。有關更多信息,請參閱 經典模擬量子優勢電路

    理想情況下,您希望盡可能少切割模式,以減少浮點運算 (FLOP),但這也會增加所需的內存,從而使某些切割選項變得不可行。

    具體來說,由于增加的內存需求,PyTorch 無法適用于更好的切割選項,從而產生 32 GB 中間張量。相比之下,cuTENSOR 不受同樣的限制,因為它的直接收縮內核不需要任何輔助內存。

    我們在所有框架中對張量模式進行了相同的訂閱,以確保做出公平的比較。有關更多信息,請參閱 中間張量模式順序的重要性在現代 GPU 上使用張量網絡方法實現高效的量子電路模擬

    Speedup of cuTENSOR over pyTorch for different compute types (FP32 and TF32) as well as two different contraction paths leading to larger intermediate tensors (16GB and 32GB).?
    圖 3. NVIDIA H100 上的 3-qubit 20-cycle Sycamore QC 模擬 (圖片由 NVIDIA 的 Henry Gu 提供)

    圖 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) 三重核心的獨立驅動程序。

    Speedup of cuTENSOR on an NVIDIA H100 over an OpenMP-based implementation.
    圖 4.在 NVIDIA H100 GPU 上使用 72 個線程在 72 核 NVIDIA Grace 系統上運行 (CCSD (T)) 模擬時,cuTENSOR 加速的 27 個最耗時的張量收縮 (圖片由 NVIDIA 的 Jeff Hammond 提供)

    開始使用 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).

    ?

    0

    標簽

    人人超碰97caoporen国产