量子計算渴望在更快的時間內為目前無法用經典計算解決的問題提供更強大的計算能力。 NVIDIA 最近發布了 cuQuantum SDK ,這是一個用于加速量子信息科學發展的高性能庫。 cuQuantum 最近被用于 打破在 DGX SuperPOD 上運行 MaxCut 量子算法模擬的世界紀錄 ,比以前的工作多了 8 倍的量子位。
cuQuantum 的初始目標應用程序是 量子電路模擬, 的加速,它由兩個主要庫組成:
cuStateVec :加速狀態向量模擬。
在本文中,我們將對這兩個庫進行概述,并對 cuTensorNet 進行更詳細的討論。
為什么要使用 cuStateVec ?
cuQuantum SDK 中的 cuStateVec 庫通過針對模擬器中出現的大多數用例優化 GPU 內核,為基于狀態向量的模擬提供了高性能解決方案。雖然狀態向量法非常適合運行深度量子電路,但即使在當今最大的超級計算機上,也不可能對具有大量量子比特的量子電路進行模擬,這些量子比特呈指數增長。
為什么要使用 cuTensorNet ?
作為替代方案,張量網絡方法是一種將 N 量子位的量子態表示為一系列張量收縮的技術。這使得量子電路模擬器能夠通過交換算法與計算所需的空間來處理具有許多量子位的電路。根據電路拓撲和深度的不同,這也可能會變得非常昂貴。然后,主要的挑戰是有效地計算這些張量收縮。
量子計算渴望在更快的時間內為目前無法用經典計算解決的問題提供更強大的計算能力。 NVIDIA 最近發布了 cuQuantum SDK ,這是一個用于加速量子信息科學發展的高性能庫。 cuQuantum 最近被用于 打破在 DGX SuperPOD 上運行 MaxCut 量子算法模擬的世界紀錄 ,比以前的工作多了 8 倍的量子位。
cuQuantum 的初始目標應用程序是 量子電路模擬, 的加速,它由兩個主要庫組成:
cuStateVec :加速狀態向量模擬。
cuTensorNet :加速張量網絡模擬。
在本文中,我們將對這兩個庫進行概述,并對 cuTensorNet 進行更詳細的討論。
為什么要使用 cuStateVec ?
cuQuantum SDK 中的 cuStateVec 庫通過針對模擬器中出現的大多數用例優化 GPU 內核,為基于狀態向量的模擬提供了高性能解決方案。雖然狀態向量法非常適合運行深度量子電路,但即使在當今最大的超級計算機上,也不可能對具有大量量子比特的量子電路進行模擬,這些量子比特呈指數增長。
為什么要使用 cuTensorNet ?
作為替代方案,張量網絡方法是一種將 N 量子位的量子態表示為一系列張量收縮的技術。這使得量子電路模擬器能夠通過交換算法與計算所需的空間來處理具有許多量子位的電路。根據電路拓撲和深度的不同,這也可能會變得非常昂貴。然后,主要的挑戰是有效地計算這些張量收縮。
cuQuantum SDK 中的 cuTensorNet 庫為這些類型的張量網絡計算提供了高性能解決方案。
cuTensorNet 庫提供 C 和 Python API ,以提供對高性能張量網絡計算的訪問,從而加速量子電路模擬。這些 API 非常靈活,使您能夠控制、探索和研究實現的每一種算法技術。
cuTensorNet 算法描述
在本節中,我們將討論 cuTensorNet 中使用的不同算法和技術。它包括兩個主要組件: pathfinder 和 execution 。
pathfinder 在短時間內提供了一條成本最低的最佳收縮路徑,執行步驟使用高效內核在 GPU 上計算該路徑。這兩個組件相互獨立,可以與提供類似功能的任何其他外部庫進行互操作。
探路者
在高層, cuTensorNet 采用的方法是圍繞基于圖形分區的探路者進行超優化。有關更多信息,請參閱 超優化張量網絡收縮 。
探路者的作用是找到一條收縮路徑,使收縮張量網絡的成本最小化。為了加快這一步,我們開發了許多算法改進和優化,而且這一步還會更快。
尋找最優收縮路徑在很大程度上取決于網絡的大小。網絡越大,尋找最優收縮路徑所需的技術和計算量就越大。
cuTensorNet pathfinder 由三個算法模塊組成。
Simplification :對張量網絡進行預處理以找到所有明顯的直接收縮集的技術。它將它們從網絡中移除,并用其最終張量替換每個集合。其結果是更小的網絡,更容易在以下模塊中處理。
Path computation :探路者組件的核心。它基于一個圖分區步驟,然后是使用重新配置調整和切片技術的第二個步驟。遞歸地調用圖分區來分割網絡并形成收縮路徑(例如,成對收縮樹)。
Hyper-optimizer: 路徑計算模塊上的一個循環,在每次迭代中形成一條收縮路徑。對于每次迭代,超級優化器都會為路徑計算創建不同的參數配置,同時跟蹤找到的最佳路徑。您可以隨意更改或修復這些配置參數。所有配置參數都可以通過cutensornetContractionOptimizerConfigSetAttribute設置。有關更多信息,請參閱 cuTensorNet documentation 。
從第一步生成的路徑可能不接近最優,因此通常會執行重構調整。重構在整體收縮樹中選擇幾個小的子樹,并試圖提高它們的收縮成本,如果可能的話,降低總體成本。
路徑計算模塊的另一個特點是切片技術。切片的主要目標是將網絡收縮過程放入可用的設備內存中。切片通過排除某些張量模式并顯式展開它們的范圍來實現這一點。這將生成許多類似的收縮樹,或 slices ,其中每一個對應于排除模式之一。
收縮路徑或樹不會改變。在這種情況下,只有一些模式被排除在外,每個切片的計算獨立于其他模式。因此,切片可以被認為是為不同設備創建獨立工作的最佳技術之一。
實踐經驗表明,找到最佳收縮路徑對這里使用的每種技術的配置參數的選擇都很敏感。為了提高找到最佳收縮路徑的概率,我們將該模塊封裝在一個超級優化器中。
尋路性能
在考慮探路者的性能時,有兩個相關的指標:找到的路徑的質量和找到該路徑所需的時間。前者如圖 3 所示,以失敗導致的收縮成本來衡量。用于基準測試的電路是谷歌量子人工智能 2019 年量子優勢論文 的隨機量子電路,深度為 12 、 14 和 20 。
與 opt_einsum 庫相比, cuTensorNet 在尋找最佳路徑方面表現良好,在這些電路方面略優于 Cotengra 。
cuTensorNet 也能快速找到高質量的路徑。對于不同深度的懸鈴木量子電路問題,圖 4 繪制了 cuTensorNet 與科滕格拉相比的收縮所需時間。對于網絡中有 3000 多個張量的最復雜問題, cuTensorNet 仍能在 40 秒內找到最佳路徑。
處決
執行組件依賴 cuTENSOR 庫作為后端,以便在 GPU 上高效執行。它包括以下幾個階段:
Planning :執行組件的決策引擎。它分析收縮路徑,決定使用最小工作空間在 GPU 上執行它的最佳方式。它還決定了每個成對收縮使用的最佳內核。
Computation :此階段使用 cuTENSOR 庫計算所有成對收縮。
Autotuning :(可選)基于不同啟發式的不同內核嘗試成對收縮,并選擇最佳內核。
執行性能
圖 5 測量了 cuTensorNet 與 CuPy 在幾個不同電路中收縮執行的加速比。根據賽道的不同, cuTensorNet 提供了約 8-20 倍的收縮執行加速。
cuTensorNet 示例
cuTensorNet 提供了 C 和 Python API ,允許您高效地計算張量網絡收縮,而無需任何關于如何找到最佳收縮路徑或如何在 GPU 上執行收縮的專業知識。
高級 Python API
cuTensorNet 提供高級 Python API ,可與 NumPy 和 PyTorch 張量互操作。例如,張量網絡的einsum
表達式可以在對contract
的單個函數調用中使用。 cuTensorNet 執行所有必需的步驟,結果返回約定的網絡。
import cupy as cp import cuquantum # Compute D_{m,x,n,y} = A_{m,h,k,n} B_{u,k,h} C_{x,u,y} # Create an array of extents (shapes) for each tensor extentA = (96, 64, 64, 96) extentB = (96, 64, 64) extentC = (64, 96, 64) extentD = (96, 64, 96, 64) # Generate input tensor data directly on GPU A_d = cp.random.random(extentA, dtype=cp.float32) B_d = cp.random.random(extentB, dtype=cp.float32) C_d = cp.random.random(extentC, dtype=cp.float32) # Set the pathfinder options options = cuquantum.OptimizerOptions() options.slicing.disable_slicing = 1 # disable slicing options.samples = 100 # number of hyper-optimizer samples # Run the contraction on a CUDA stream stream = cp.cuda.Stream() D_d, info = cuquantum.contract( 'mhkn,ukh,xuy->mxny', A_d, B_d, C_d, optimize=options, stream=stream, return_info=True) stream.synchronize() # Check the optimizer info print(f"{info[1].opt_cost/1e9} GFLOPS")
從這個代碼示例中,您可以看到所有 cuTensorNet 操作都封裝在一個contract API 中。本例的輸出為 14.495514624 GFLOPS :基于路徑查找器找到的收縮路徑估計的浮點操作數。要手動執行相同的步驟,還可以使用 cuQuantum.Network object 。
低級 API
如前所述, C 和 Python API 是以一種直觀的表達方式設計的。您可以調用 pathfinder 函數以獲得優化的路徑,然后調用以使用該路徑在 GPU 上執行收縮。
對于高級用戶, cuTensorNet library API 旨在授予訪問該領域研究可用的所有算法選項的權限。例如,您可以控制 pathfinder 可以嘗試找到最佳收縮路徑的 hyper optimizer 樣本數。
有幾十個參數可以修改或控制。這些都可以通過 helper 函數訪問,并允許簡單功能 API 保持不變。你也可以提供自己的路徑。有關較低級別選項的更多信息以及如何使用它們的示例,請參閱 cuquantum.Network 。
總結
NVIDIA CuQuin SDK 的 CursSnReNET 庫旨在加速 GPU 上的張量網絡計算。在這篇文章中,我們展示了最先進的張量網絡庫對關鍵量子算法的加速。
在改進 cuTensorNet 并通過新的算法改進和多節點、多 GPU 執行來擴展它方面有著廣泛的發展。
cuTensorNet 圖書館的目標是為量子計算領域的突破性發展提供一個有用的工具。有沒有關于如何改進 cuQuantum 庫的反饋和建議?
關于作者
Azzam Haidar 是 NVIDIA 開發 HPC 和量子計算軟件的高級工程師。 2008 年,他在圖盧茲國立理工學院和法國 CERFACS 實驗室獲得計算機科學和應用數學博士學位。在加入 Nvidia 之前,他是諾克斯維爾田納西大學創新計算實驗室的研究主任。
Leo Fang 是NVIDIA 的高級工程師,專注于 HPC 、量子計算和 Python 軟件。 2017 年,他在杜克大學獲得物理學博士學位。在加入 NVIDIA 之前,他是布魯克海文國家實驗室計算科學倡議的助理計算科學家。他也是許多開源項目的定期貢獻者,包括 CuPy 、 mpi4py 、 conda forge 和 Python 數據 API 標準聯盟。
審核編輯:郭婷
-
NVIDIA
+關注
關注
14文章
5026瀏覽量
103284 -
gpu
+關注
關注
28文章
4754瀏覽量
129084 -
API
+關注
關注
2文章
1505瀏覽量
62187
發布評論請先 登錄
相關推薦
評論