如何使用 Qiskit 將線路提交至 Azure Quantum
瞭解如何使用 azure-quantum
Python 套件提交 Qiskit 量子線路。 您可以使用具有內 azure-quantum
Python 建套件的 Azure Quantum 筆記本,或從本機計算機將 Qiskit 線路提交至 Azure Quantum。
如需詳細資訊,請參閱 量子電路。
必要條件
如需安裝詳細數據,請參閱 在 VS Code 上安裝 QDK。
Azure 訂用帳戶中的 Azure Quantum 工作區。 若要建立工作區,請參閱 建立 Azure Quantum 工作區。
Python已安裝 Python 和 Pip 的環境。
已安裝 Azure Quantum Development Kit 和 PythonJupyter 擴充功能的 VS Code。
具有 [qiskit] 卷標的 Azure Quantum
azure-quantum
Python 套件。python -m pip install --upgrade azure-quantum[qiskit] qsharp ipykernel
重要
請確定您有最新版本的 Qiskit。 如需詳細資訊,請參閱 更新 azure-quantum Python 套件。
注意
如果未偵測到 Jupyter Python 核心
ipykernel
,VS Code 會提示您安裝它。
建立新的 Jupyter Notebook
- 在 VS Code 中,選取 [檢視]>[命令選擇區],然後選取 [建立:新增 Jupyter Notebook]。
- 在右上方,VS Code 會偵測並顯示針對筆記本選取的 Python 和 虛擬 Python 環境版本。 如果您有多個 Python 環境,您可能需要使用右上方的核心選擇器來選取核心。 如果未偵測到任何環境,請參閱 VS Code 中的 Jupyter Notebook 以取得設定資訊。
載入必要的匯入
在筆記本的第一個數據格中,執行下列程式代碼以載入必要的匯入:
import azure.quantum
from azure.quantum import Workspace
from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from azure.quantum.qiskit import AzureQuantumProvider
聯機到 Azure Quantum 服務
若要連線到 Azure Quantum 服務,您需要 Azure Quantum 工作區的資源識別碼和位置。
登入您的 Azure 帳戶、 https://portal.azure.com、
選取您的 Azure Quantum 工作區,然後流覽至 [ 概觀]。
複製欄位中的參數。
在筆記本中新增數據格,並使用您的帳戶資訊來建立 Workspace
和 AzureQuantumProvider
物件,以聯機到您的 Azure Quantum 工作區。
workspace = Workspace(
resource_id = "", # Add the resourceID of your workspace
location = "" # Add the location of your workspace (for example "westus")
)
provider = AzureQuantumProvider(workspace)
列出所有後端
您現在可以列印工作區上所有可用的量子運算後端:
print("This workspace's targets:")
for backend in provider.backends():
print("- " + backend.name())
This workspace's targets:
- ionq.qpu
- ionq.qpu.aria-1
- ionq.simulator
- microsoft.estimator
- quantinuum.hqs-lt-s1
- quantinuum.hqs-lt-s1-apival
- quantinuum.hqs-lt-s2
- quantinuum.hqs-lt-s2-apival
- quantinuum.hqs-lt-s1-sim
- quantinuum.hqs-lt-s2-sim
- quantinuum.qpu.h1-1
- quantinuum.sim.h1-1sc
- quantinuum.sim.h1-1e
- rigetti.sim.qvm
執行簡單的線路
首先,建立簡單的 Qiskit 線路來執行。
# Create a Quantum Circuit acting on the q register
circuit = QuantumCircuit(3, 3)
circuit.name = "Qiskit Sample - 3-qubit GHZ circuit"
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.measure([0,1,2], [0, 1, 2])
# Print out the circuit
circuit.draw()
┌───┐ ┌─┐
q_0: ┤ H ├──■───────┤M├──────
└───┘┌─┴─┐ └╥┘┌─┐
q_1: ─────┤ X ├──■───╫─┤M├───
└───┘┌─┴─┐ ║ └╥┘┌─┐
q_2: ──────────┤ X ├─╫──╫─┤M├
└───┘ ║ ║ └╥┘
c: 3/════════════════╩══╩══╩═
0 1 2
target選取 以執行程式
在 IonQ 模擬器上執行
在實際硬體上執行之前,讓我們在模擬器中測試線路。 用來 get_backend
建立 Backend
物件以連線到 IonQ 模擬器後端:
simulator_backend = provider.get_backend("ionq.simulator")
IonQ 後端支援來自已定義 網關集的閘道,這些閘道集會編譯為在硬體上以最佳方式執行。 如果您的線路包含不在此清單中的閘道,您必須使用 transpile
Qiskit 所提供的函式,將轉譯成支援的 gateset
:
from qiskit import transpile
circuit = transpile(circuit, simulator_backend)
Transpile 函式會傳回新的線路物件,其中閘道會分解成指定後端支援的閘道。
您現在可以透過 Azure Quantum 服務執行程式,並取得結果。 下列數據格會提交一個作業,該作業會執行具有 100 次拍攝的線路:
job = simulator_backend.run(circuit, shots=8)
job_id = job.id()
print("Job id", job_id)
Job id 00000000-0000-0000-0000-000000000000
若要等候作業完成並傳回結果,請執行:
result = job.result()
print(result)
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='00000000-0000-0000-0000-000000000000', success=True, results=[ExperimentResult(shots=8, success=True, meas_level=2, data=ExperimentResultData(counts={'000': 4, '111': 4}, memory=['000', '000', '000', '000', '111', '111', '111', '111'], probabilities={'000': 0.5, '111': 0.5}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits=3, metadata={}), status=JobStatus.DONE, name='Qiskit Sample - 3-qubit GHZ circuit')], date=None, status=None, header=None, error_data=None)
因為結果是 Qiskit 套件原生的物件,所以您可以使用 Qiskit 的 result.get_counts
,並將 plot_histogram
結果可視化。 若要確定所有可能的位字串標籤都已表示,請將這些標籤新增至 counts
。
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
{'000': 4, '001': 0, '010': 0, '011': 0, '100': 0, '101': 0, '110': 0, '111': 4}
您也可以使用 函 get_memory()
式來顯示作業中的個別拍攝數據
result.get_memory(circuit)
['000', '000', '000', '000', '111', '111', '111', '111']
注意
在 IonQ targets上,如果您提交有奇數投籃的作業,結果會四捨五入為下一個偶數。 例如,如果您指定 9 次拍攝,結果會顯示 8 次拍攝的數據。
預估作業成本
在 QPU 上執行作業之前,您應該估計執行的成本。
如需最新的定價詳細數據,請參閱 IonQ 定價,或透過下列方式在工作區的 [提供者] 索引卷標中尋找您的工作區並檢視定價選項: aka.ms/aq/myworkspaces。
在 IonQ QPU 上執行
若要連線到實際硬體(量子處理器單元 (QPU),只需將 的名稱target"ionq.qpu.aria-1"
get_backend
提供給 方法:
qpu_backend = provider.get_backend("ionq.qpu.aria-1")
提交線路以在 Azure Quantum 上執行、取得結果,然後執行 plot_histogram
以繪製結果。
注意
在 QPU 上執行線路所需的時間可能會因目前的佇列時間而有所不同。
# Submit the circuit to run on Azure Quantum
job = qpu_backend.run(circuit, shots=100)
job_id = job.id()
print("Job id", job_id)
# Get the job results (this method waits for the Job to complete):
result = job.result()
print(result)
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
Job id 00000000-0000-0000-0000-000000000000
Job Status: job has successfully run
Result(backend_name='ionq.qpu.aria-1', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='00000000-0000-0000-0000-000000000000', success=True, results=[ExperimentResult(shots=1024, success=True, meas_level=2, data=ExperimentResultData(counts={'0': 505, '1': 6, '2': 1, '3': 1, '4': 1, '5': 10, '6': 11, '7': 488}, probabilities={'0': 0.4932, '1': 0.0059, '2': 0.001, '3': 0.001, '4': 0.001, '5': 0.0098, '6': 0.0117, '7': 0.4766}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits='3', qiskit='True'))])
{'000': 505, '001': 6, '010': 1, '011': 1, '100': 1, '101': 10, '110': 11, '111': 488}
重要
目前不支援在單一作業上提交多個線路。 因應措施是呼叫 backend.run
方法以異步方式提交每個線路,然後擷取每個作業的結果。 例如:
jobs = []
for circuit in circuits:
jobs.append(backend.run(circuit, shots=N))
results = []
for job in jobs:
results.append(job.result())
必要條件
- 具有有效訂用帳戶的 Azure 帳戶。 如果您沒有 Azure 帳戶,請免費註冊並註冊 隨用隨付訂用帳戶。
- Azure Quantum 工作區。 如需詳細資訊,請參閱 建立 Azure Quantum 工作區。
在工作區中建立新的筆記本
- 登入 Azure 入口網站,然後選取您在上一個步驟中建立的工作區。
- 在左側刀鋒視窗中,選取 [筆記本]。
- 按一下 [我的筆記本] ,然後按一下 [新增]。
- 輸入檔案的名稱,例如 Qiskit.ipynb,然後按兩下 [ 建立檔案]。
當您的新筆記本開啟時,會根據您的訂用帳戶和工作區資訊自動建立第一個儲存格的程式碼。
from azure.quantum import Workspace
workspace = Workspace (
resource_id = "", # Add your resource_id
location = "" # Add your workspace location (for example, "westus")
)
注意
除非另有說明,否則您應該在建立數據格時依序執行每個數據格,以避免發生任何編譯問題。
按兩下單元格左邊的三角形「播放」圖示,以執行程式碼。
載入必要的匯入
首先,您必須匯入一些額外的模組。
單擊 [+ 程式代碼 ] 以新增儲存格,然後新增並執行下列程式代碼:
from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from azure.quantum.qiskit import AzureQuantumProvider
聯機到 Azure Quantum 服務
接下來,使用Workspace
上一個AzureQuantumProvider
單元格中的 物件來建立 物件,以聯機到您的 Azure Quantum 工作區。 使用下列程式代碼新增儲存格:
provider = AzureQuantumProvider(workspace)
定義簡單的線路
在新儲存格中,建立 circuit
物件。 此範例是簡單的量子隨機位產生器。 新增下列程式代碼來定義及顯示線路:
# Create a Quantum Circuit acting on the q register
circuit = QuantumCircuit(3, 3)
circuit.name = "Qiskit Sample - 3-qubit GHZ circuit"
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.measure([0, 1, 2], [0, 1, 2])
# Print out the circuit
circuit.draw()
┌───┐ ┌─┐
q_0: ┤ H ├──■───────┤M├──────
└───┘┌─┴─┐ └╥┘┌─┐
q_1: ─────┤ X ├──■───╫─┤M├───
└───┘┌─┴─┐ ║ └╥┘┌─┐
q_2: ──────────┤ X ├─╫──╫─┤M├
└───┘ ║ ║ └╥┘
c: 3/════════════════╩══╩══╩═
0 1 2
全部列出 targets
您現在可以顯示工作區中可用的所有量子運算 targets或後端。 新增儲存格並執行下列這一行:
print("This workspace's targets:")
for backend in provider.backends():
print("- " + backend.name())
This workspace's targets:
- ionq.simulator
- ionq.qpu.aria-1
- microsoft.estimator
- quantinuum.qpu.h1-1
- quantinuum.sim.h1-1sc
- quantinuum.sim.h1-1e
- rigetti.sim.qvm
target選取 以執行程式
若要在實際量子硬體上執行程式碼之前先檢查程式代碼,您可以使用 IonQ 量子模擬器 。 ionq.simulator
新增數據格並建立 物件來代表 IonQ 量子模擬器 target:
# Get IonQ quantum simulator target:
simulator_backend = provider.get_backend("ionq.simulator")
在 IonQ 模擬器上執行
若要在模擬器上執行線路,請新增下列程序代碼。 這個範例會使用 run
的 target 方法來提交您的作業,然後監視作業狀態。
# Submit the circuit to run on Azure Quantum
job = simulator_backend.run(circuit, shots=8)
job_id = job.id()
print("Job id", job_id)
當作業成功執行時,取得作業結果並加以顯示:
# Get the job results:
result = job.result()
print(result)
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='00000000-0000-0000-0000-000000000000', success=True, results=[ExperimentResult(shots=8, success=True, meas_level=2, data=ExperimentResultData(counts={'000': 4, '111': 4}, memory=['000', '000', '000', '000', '111', '111', '111', '111'], probabilities={'000': 0.5, '111': 0.5}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits=3, metadata={}), status=JobStatus.DONE, name='Qiskit Sample - 3-qubit GHZ circuit')], date=None, status=None, header=None, error_data=None)
因為此 result
類型是 Qiskit 套件原生的物件,因此您可以使用 Qiskit 的 result.get_counts
,並將 plot_histogram
結果可視化。 若要確定所有可能的位字串標籤都已表示,請將這些標籤新增至 counts
。
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
{'000': 4, '001': 0, '010': 0, '011': 0, '100': 0, '101': 0, '110': 0, '111': 4}
您也可以使用 函 get_memory()
式來顯示作業中的個別拍攝數據
result.get_memory(circuit)
['000', '000', '000', '000', '111', '111', '111', '111']
注意
在 IonQ targets上,如果您提交有奇數投籃的作業,結果會四捨五入為下一個偶數。 例如,如果您指定 9 次拍攝,結果會顯示 8 次拍攝的數據。
預估作業成本
在實際量子硬體或 量子處理器 (QPU) 上執行作業之前,您應該先估計執行的成本。
如需最新的定價詳細數據,請參閱 IonQ 定價,或在工作區的 [提供者] 刀鋒視窗中尋找您的工作區並檢視定價選項。
在 IonQ QPU 上執行
在 IonQ 模擬器上成功執行作業並估計 QPU 成本之後,就可以在硬體上執行線路。
注意
在 QPU 上執行線路所需的時間會根據目前的佇列時間而有所不同。 您可以選取工作區的 [提供者] 刀鋒視窗,以檢視 的平均佇列時間target。
使用您先前搭配 API 驗證程式使用的相同 run
方法和作業,以提交和監視您的作業:
# Submit the circuit to run on Azure Quantum
job = qpu_backend.run(circuit, shots=100)
job_id = job.id()
print("Job id", job_id)
當作業完成時,如前所示取得作業結果,並將其顯示在圖表中:
result = job.result()
print(result)
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
Job id 910b5ac8-98cd-11ec-b3ba-00155d5528cf
Job Status: job has successfully run
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='Job id 54e8c740-98d9-11ec-b382-00155d957f5d', success=True, results=[ExperimentResult(shots=1024, success=True, meas_level=2, data=ExperimentResultData(counts={'0': 505, '1': 6, '2': 1, '3': 1, '4': 1, '5': 10, '6': 11, '7': 488}, probabilities={'0': 0.4932, '1': 0.0059, '2': 0.001, '3': 0.001, '4': 0.001, '5': 0.0098, '6': 0.0117, '7': 0.4766}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits='3', qiskit='True'))])
{'000': 505, '001': 6, '010': 1, '011': 1, '100': 1, '101': 10, '110': 11, '111': 488}
重要
目前不支援在單一作業上提交多個線路。 因應措施是呼叫 backend.run
方法以異步方式提交每個線路,然後擷取每個作業的結果。 例如:
jobs = []
for circuit in circuits:
jobs.append(backend.run(circuit, shots=N))
results = []
for job in jobs:
results.append(job.result())