量子計(jì)算渴望為某些類型的經(jīng)典難題提供更強(qiáng)大的計(jì)算能力和更快的結(jié)果。量子電路模擬對于理解量子計(jì)算和量子算法的發(fā)展至關(guān)重要。在量子電路中,量子器件由 N 量子位組成,通過對量子位應(yīng)用一系列量子門和測量來執(zhí)行計(jì)算。
從數(shù)學(xué)上來說, N 量子比特系統(tǒng)的量子態(tài)可以描述為一個(gè)復(fù)雜的 2 N – 維向量。在經(jīng)典計(jì)算機(jī)上模擬量子電路最直觀的方法是狀態(tài)向量模擬,它將這個(gè)向量與其 2 N 復(fù)雜值直接存儲在內(nèi)存中。該電路通過將向量乘以一系列矩陣來執(zhí)行,這些矩陣對應(yīng)于構(gòu)成該電路的門序列。
然而,隨著狀態(tài)向量的維數(shù)隨著量子位的數(shù)量呈指數(shù)增長,完整描述狀態(tài)的內(nèi)存需求將這種方法限制在 30 – 50 量子位的電路中。基于張量網(wǎng)絡(luò)的替代方法可以模擬更多的量子位,但通常在能夠有效模擬的電路的深度和復(fù)雜性方面受到限制。
NVIDIA cuQuantum SDK 具有用于狀態(tài)向量和張量網(wǎng)絡(luò)方法的庫。在本文中,我們將重點(diǎn)介紹狀態(tài)向量模擬和 cuStateVec 庫。有關(guān)張量網(wǎng)絡(luò)方法庫的更多信息,請參閱 利用 NVIDIA cuTensorNet 進(jìn)行量子電路模擬 。
cuStateVec 圖書館
cuStateVec 庫提供了單個(gè) GPU 原語來加速狀態(tài)向量模擬。由于狀態(tài)向量方法是模擬量子電路的基礎(chǔ),大多數(shù)量子計(jì)算框架和庫都包含自己的狀態(tài)向量模擬器。為了便于與這些現(xiàn)有模擬器集成, cuStateVec 提供了一套 API ,以涵蓋常見用例:
測量
門應(yīng)用
期望值
采樣器
狀態(tài)向量運(yùn)動(dòng)
測量
一個(gè)量子位可以存在于兩個(gè)態(tài)|0》和|1》的疊加中。當(dāng)進(jìn)行測量時(shí),其中一個(gè)值被概率選擇和觀察,另一個(gè)值崩潰。 cuStateVec 測量 API 模擬量子位測量,并支持基于 Z 基產(chǎn)品的測量用例和批量單量子位測量。
門應(yīng)用
量子電路有量子邏輯門來修改和準(zhǔn)備量子態(tài),以觀察理想的結(jié)果。量子邏輯門用酉矩陣表示。 cuStateVec gate 應(yīng)用程序 API 提供了將量子邏輯門應(yīng)用于某些矩陣類型的功能,包括:
稠密的
斜線的
廣義置換
泡利矩陣的矩陣指數(shù)
期望值
在量子力學(xué)中,計(jì)算算符和量子態(tài)的期望值。對于量子電路,我們還計(jì)算了給定電路和量子態(tài)的期望值。 cuStateVec 有一個(gè) API ,可以用較小的內(nèi)存占用計(jì)算期望值。
采樣器
狀態(tài)向量模擬在數(shù)值上將量子態(tài)保留在狀態(tài)向量中。通過計(jì)算每個(gè)狀態(tài)向量元素的概率,您可以有效地多次模擬多個(gè)量子位的測量,而不會破壞量子態(tài)。 cuStateVec sampler API 以較小的內(nèi)存占用在 GPU 上執(zhí)行采樣。
狀態(tài)向量運(yùn)動(dòng)
將狀態(tài)向量放置在 GPU 上,以加速 GPU 的模擬。要在 CPU 上分析模擬結(jié)果,請將生成的狀態(tài)向量復(fù)制到 CPU 。 cuStateVec 提供訪問器 API 來代表用戶執(zhí)行此操作。在復(fù)制過程中,狀態(tài)向量元素的順序可以被重新安排,這樣你就可以將量子位重新排序?yàn)樗璧牧孔游豁樞颉?/p>
谷歌 Cirq / qsim 和 NVIDIA cuStateVec
宣布NVIDIA CuStEVEEC 文庫集成的第一個(gè)項(xiàng)目是 Google’s qsim ,一個(gè)優(yōu)化的模擬器,用于他們的量子計(jì)算框架, Cirq 。 Google Quantum 人工智能團(tuán)隊(duì)通過一個(gè)新的基于 cuStateVec 的 GPU 模擬后端擴(kuò)展了 qsim ,以補(bǔ)充他們的 CPU 和 CUDA 模擬引擎。
使用 cuStateVec 為 Cirq 和 qsim 構(gòu)建說明
要通過 Cirq 啟用 cuStateVec ,請從源代碼編譯 qsim ,并安裝 qsimcirq Python 包提供的 Cirq 綁定。
# Prerequisite: # Download cuQuantum Beta2 from https://developer.nvidia.com/cuquantum-downloads # Extract cuQuantum Beta2 archive and set the path to CUQUANTUM_ROOT $ tar -xf cuquantum-linux-x86_64-0.1.0.30-archive.tar.xz $ export CUQUANTUM_ROOT=`pwd`/cuquantum-linux-x86_64-0.1.0.30-archive $ ln -sf $CUQUANTUM_ROOT/lib $CUQUANTUM_ROOT/lib64 # Clone qsim repository from github and checkout v0.11.1 branch $ git clone https://github.com/quantumlib/qsim.git $ git checkout v0.11.1 # Build and install qsimcirq with cuStateVec $ pip install . # Install cirq $ pip install cirq
在本例中,我們運(yùn)行一個(gè)電路,創(chuàng)建格林伯格 – 霍恩 – 齊林格( GHZ )狀態(tài),并對實(shí)驗(yàn)結(jié)果進(jìn)行采樣。以下 Python 腳本通過調(diào)用三個(gè)不同的模擬器來獲取|0…00>
和|1…11>
中的振幅:
- Cirq 內(nèi)置模擬器
- 基于 CPU 的模擬器共享
- 使用 cuStateVec 加速拆分
我們啟用了兩個(gè)基于 CIRQS 和 77YC 的 CPU 插槽,這兩個(gè)插槽分別用于基于 CPU 的 CPU 模擬器。對于 cuStateVec 加速模擬,我們使用單個(gè) A100 GPU 。
import cirq import qsimcirq n_qubits = 32 qubits = cirq.LineQubit.range(n_qubits) circuit = cirq.Circuit() circuit.append(cirq.H(qubits[0])) circuit.append(cirq.CNOT(qubits[idx], qubits[idx + 1]) \ for idx in range(n_qubits - 1)) # Cirqs = cirq.sim.Simulator() result = s.compute_amplitudes(circuit, [0, 2**n_qubits-1]) print(f'cirq.sim : {result}') # qsim(CPU) options = qsimcirq.QSimOptions(max_fused_gate_size=4, cpu_threads=512) s = qsimcirq.QSimSimulator(options) result = s.compute_amplitudes(circuit, [0, 2**n_qubits-1]) print(f'qsim(CPU) : {result}') # qsim(cuStateVec) options = qsimcirq.QSimOptions(use_gpu=True, max_fused_gate_size=4, gpu_mode=1) s = qsimcirq.QSimSimulator(options) result = s.compute_amplitudes(circuit, [0, 2**n_qubits-1]) print(f'cuStateVec: {result}')
以下控制臺輸出顯示,通過使用 CPU SIMD 指令和 OpenMP 進(jìn)行優(yōu)化, qsim 的 CPU 版本比 Cirq 的模擬器快 5.1x 。通過使用 cuStateVec 版本,模擬速度進(jìn)一步加快,比 Cirq 的模擬器快 30.04 倍,比 qsim 的 CPU 版本快 5.9 倍。
cirq.sim : [0.70710677+0.j 0.70710677+0.j], 87.51 s qsim(CPU) : [(0.7071067690849304+0j), (0.7071067690849304+0j)], 17.04 s cuStateVec: [(0.7071067690849304+0j), (0.7071067690849304+0j)], 2.88 s
績效結(jié)果
下圖顯示了一些常用電路的門應(yīng)用的初步性能結(jié)果。所有量子位計(jì)數(shù)的模擬都會加速。然而,隨著量子位數(shù)量的增加,模擬速度顯著加快,對于最大的電路,模擬速度大約是 10-20 倍。這種性能為探索更大量子電路的開發(fā)和評估提供了機(jī)會。
A100 與 64 核 CPU 上的 Cirq / qsim + cuStateVec
圖 1 。與 64 核 EPYC 7742 CPU 上的 Cirq / qsim 相比,在單個(gè) NVIDIA A100 GPU 上使用 cuStateVec 的流行量子電路的模擬性能
相對于 EPYC 7742 中的 64 個(gè) CPU 內(nèi)核,一個(gè) NVIDIA A100 上的 VQE 加速
圖 2 。與 64 核 EPYC 7742 CPU 上的 Cirq / qsim 相比,在單個(gè) NVIDIA A100 GPU 上使用 cuStateVec 的多個(gè)不同分子的變分量子本征解算器加速
多 GPU 狀態(tài)向量仿真
狀態(tài)向量模擬也非常適合在多個(gè) GPU 上執(zhí)行。大多數(shù)門應(yīng)用是一種完全并行的操作,通過拆分狀態(tài)向量并將其分布在多個(gè) GPU 上來加速。
在大約 30 個(gè)量子位之外,多 GPU 模擬是不可避免的。這是因?yàn)橐粋€(gè)狀態(tài)向量無法適應(yīng)單個(gè) GPU 的內(nèi)存,因?yàn)樗拇笮‰S著附加的量子位呈指數(shù)增長。
當(dāng)多個(gè) GPU 在一個(gè)模擬中協(xié)同工作時(shí),每個(gè) GPU 可以將一個(gè)門并行應(yīng)用于其狀態(tài)向量部分。在大多數(shù)情況下,每個(gè) GPU 只需要本地?cái)?shù)據(jù)來更新狀態(tài)向量,每個(gè) GPU 都可以獨(dú)立應(yīng)用門。
然而,根據(jù)門作用于哪個(gè)模擬量子位, GPU 有時(shí)可能需要存儲在不同 GPU 中的部分狀態(tài)向量來執(zhí)行更新。在這種情況下, GPU 必須交換大部分狀態(tài)向量。這些部分的大小通常為數(shù)百兆字節(jié)或幾千兆字節(jié)。因此,多 GPU 狀態(tài)向量模擬對 GPU 互連的帶寬非常敏感。
DGX A100 完全符合這些要求,八款 NVIDIA A100 GPU 使用 NVLink 提供 600GB / s 的 GPU 到 GPU 直接帶寬。我們選擇了三種 30-32 量子位的常見量子計(jì)算算法,在 DGX A100 上用 cuStateVec 對 Cirq / qsim 進(jìn)行基準(zhǔn)測試:
量子傅里葉變換( QFT )
肖爾算法
梧桐至上電路
與單次 GPU 運(yùn)行相比,在八次 GPU 運(yùn)行中,所有基準(zhǔn)測試都顯示出 4.5 – 7 倍加速之間良好的強(qiáng)縮放行為。
圖 3 。 DGX A100 上流行電路狀態(tài)向量模擬的多重 GPU 縮放
圖 4 。流行量子電路模擬的加速比。在 DGX A100 上測量了 GPU 模擬的性能,并與 EPYC 7742 的兩個(gè)插座的性能進(jìn)行了比較。
與兩個(gè) 64 核 CPU 上的模擬時(shí)間相比, DGX-A100 在 50-90 倍之間提供了令人印象深刻的整體速度提升。
總結(jié)
NVIDIA CuQuin SDK 中的 CuStEVEVEC 庫旨在加速 GPU 上的量子電路的狀態(tài)向量模擬器。谷歌針對 Cirq qsim 的模擬器是首批采用該庫的模擬器之一,該庫對現(xiàn)有程序的 GPU 加速使 Cirq 用戶受益。隨后將集成到更多量子電路框架,包括 IBM 的 Qiskit 軟件。
我們也在擴(kuò)大規(guī)模。基于 cuStateVec 的多 GPU 模擬的初步結(jié)果顯示,關(guān)鍵量子算法的加速比為 50 – 90 倍。我們希望 cuStateVec 成為開創(chuàng)量子計(jì)算新領(lǐng)域的寶貴工具。
關(guān)于作者
Shinya Morino 是NVIDIA 高級解決方案架構(gòu)師,隸屬于NVIDIA 人工智能技術(shù)中心( NVAITC )。他已經(jīng)在 NVAITC 中原型化了一個(gè) GPU 加速狀態(tài)向量模擬器,并正在利用他的知識推動(dòng) cuStateVec 的開發(fā)。新亞擁有日本東京大學(xué)的工程學(xué)博士學(xué)位。
Andreas Hehn 是NVIDIA 的開發(fā)技術(shù)工程師。他幫助客戶使用 GPU 加速他們的科學(xué)工作流程,重點(diǎn)關(guān)注基因組學(xué)、高能物理實(shí)驗(yàn)和量子計(jì)算。安德烈亞斯擁有瑞士蘇黎世 ETH 的物理學(xué)博士學(xué)位,他在那里從事大規(guī)模凝聚態(tài)物理模擬。
Leo Fang 是NVIDIA 的高級工程師,專注于 HPC 、量子計(jì)算和 Python 軟件。 2017 年,他在杜克大學(xué)獲得物理學(xué)博士學(xué)位。在加入 NVIDIA 之前,他是布魯克海文國家實(shí)驗(yàn)室計(jì)算科學(xué)倡議的助理計(jì)算科學(xué)家。他也是許多開源項(xiàng)目的定期貢獻(xiàn)者,包括 CuPy 、 mpi4py 、 conda forge 和 Python 數(shù)據(jù) API 標(biāo)準(zhǔn)聯(lián)盟。
審核編輯:郭婷
-
NVIDIA
+關(guān)注
關(guān)注
14文章
5309瀏覽量
106454 -
gpu
+關(guān)注
關(guān)注
28文章
4949瀏覽量
131283 -
API
+關(guān)注
關(guān)注
2文章
1620瀏覽量
64066
發(fā)布評論請先 登錄
milvus向量數(shù)據(jù)庫的主要特性和應(yīng)用場景

RISC-V架構(gòu)下的編譯器自動(dòng)向量化

數(shù)字地與模擬地的區(qū)別及原理介紹
Redis 8 向量搜索實(shí)測:輕松擴(kuò)展至 10 億向量

案例 基于CFD仿真的潛航器不同航行狀態(tài)下阻力特性模擬與評估

《AI Agent 應(yīng)用與項(xiàng)目實(shí)戰(zhàn)》閱讀心得3——RAG架構(gòu)與部署本地知識庫
云數(shù)據(jù)庫是哪種數(shù)據(jù)庫類型?
基于有源RFID集裝器具狀態(tài)記錄系統(tǒng)的介紹與應(yīng)用

科技云報(bào)到:大模型時(shí)代下,向量數(shù)據(jù)庫的野望
自研創(chuàng)新 數(shù)智未來 2024中國數(shù)據(jù)庫技術(shù)大會盛大召開

TI模擬前端(AFE)被動(dòng)均衡的介紹及相關(guān)考慮

觸發(fā)器的無效狀態(tài)怎么判斷
什么是IO模擬量模塊?

評論