如何使用 Qiskit 將線路提交至 Azure Quantum
瞭解如何使用 azure-quantum
Python 套件提交 Qiskit 量子線路。 您可以使用具有內 azure-quantum
Python 建套件的 Azure Quantum 筆記本,或從本機計算機將 Qiskit 線路提交至 Azure Quantum。
如需詳細資訊,請參閱量子電路。
注意
2024 年 6 月 30 日之後,將不再支援 Microsoft Quantum Development Kit (傳統 QDK) 。 如果您是現有的 QDK 開發人員,建議您轉換至新的 Azure Quantum Development Kit (Modern QDK) ,以繼續開發量子解決方案。 如需詳細資訊,請參閱 將您的 Q# 程式代碼移轉至新式 QDK。
必要條件
如需安裝詳細數據,請參閱 在 VS Code 上安裝新式 QDK。
Azure 訂用帳戶中的 Azure Quantum 工作區。 若要建立工作區,請參閱建立 Azure Quantum 工作區。
已安裝 PythonPython 和 Pip 的環境。
已安裝 Azure Quantum Development Kit 和 PythonJupyter 擴充功能的 VS Code。
具有 [qiskit] 卷標的 Azure Quantum
azure-quantum
套件,以及qsharp
和 套件ipykernel
。python -m pip install --upgrade azure-quantum[qiskit] qsharp ipykernel
注意
如果未偵測到 Jupyter Python 核心
ipykernel
,VS Code 會提示您安裝它。
建立新的 Jupyter Notebook
- 在 VS Code 中,選取 [檢視>命令選擇區],然後選取 [建立:新增 Jupyter Notebook]。
- 在右上方,VS Code 會偵測並顯示 針對筆記本選取的 Python 和 虛擬 Python 環境版本。 如果您有多個 Python 環境,您可能需要使用右上方的核心選擇器來選取核心。 如果未偵測到任何環境,請參閱 VS Code 中的 Jupyter Notebook 以 取得設定資訊。
載入必要的匯入
在筆記本的第一個數據格中,執行下列程式代碼以載入必要的匯入:
import azure.quantum
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
- rigetti.qpu.ankaa-2
執行簡單電路
首先,建立要執行的簡單 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 後端支援定義的 gateset 閘道,這些閘道會編譯成以最佳方式在硬體上執行。 如果您的線路包含不在這份清單中的閘道,您必須使用 transpile
Qiskit 所提供的函式來轉譯為支援的 gateset
:
from qiskit import transpile
circuit = transpile(circuit, simulator_backend)
轉譯函式會傳回新的線路物件,其中閘道會分解成指定後端支援的閘道。
您已可透過 Azure Quantum 服務執行程式,並取得結果了。 下列儲存格會提交執行 100 觸發電路的工作:
job = simulator_backend.run(circuit, shots=100)
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=100, success=True, meas_level=2, data=ExperimentResultData(counts={'000': 50, '111': 50}, probabilities={'000': 0.5, '111': 0.5}), header=QobjExperimentHeader(meas_map='[0, 1, 2]', name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits='3', qiskit='True'))])
因為結果是 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': 50, '001': 0, '010': 0, '011': 0, '100': 0, '101': 0, '110': 0, '111': 50}
預估工作成本
在 QPU 上執行作業之前,您可以預估執行的成本。 若要預估在 QPU 上執行工作的成本,請使用 estimate_cost
方法:
backend = provider.get_backend("ionq.qpu")
cost = backend.estimate_cost(circuit, shots=1024)
print(f"Estimated cost: {cost.estimated_total}")
列印的預估成本會以美元為單位。
如需最新的定價詳細資料,請參閱 IonQ 定價,或尋找您的工作區,然後透過 aka.ms/aq/myworkspaces,在 [提供者] 索引標籤中,檢視定價選項。
在 IonQ QPU 上執行
若要連線到量子處理器單位 (量子處理器單位 (QPU) ) ,只需將 的名稱target"ionq.qpu"
get_backend
提供給 方法:
qpu_backend = provider.get_backend("ionq.qpu")
提交線路以在 Azure Quantum 上執行、取得結果,然後執行 plot_histogram
以繪製結果。
注意
在 QPU 上執行電路所需的時間,可能因目前的佇列時間而有所不同。
# Submit the circuit to run on Azure Quantum
job = qpu_backend.run(circuit, shots=1024)
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.simulator', 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.qpu
- ionq.simulator
- ionq.qpu.aria-1
- microsoft.estimator
- quantinuum.qpu.h1-1
- quantinuum.sim.h1-1sc
- quantinuum.sim.h1-1e
- rigetti.sim.qvm
- rigetti.qpu.ankaa-2
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=100)
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='7d909574-98d4-11ec-b382-00155d957f5d', success=True, results=[ExperimentResult(shots=100, success=True, meas_level=2, data=ExperimentResultData(counts=defaultdict(<class 'int'>, {'000': 50, '111': 50}), probabilities=defaultdict(<class 'int'>, {'000': 0.5, '111': 0.5})), header=QobjExperimentHeader(meas_map='[0, 1, 2]', name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits='3', qiskit='True'))])
因為此 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': 50, '001': 0, '010': 0, '011': 0, '100': 0, '101': 0, '110': 0, '111': 50}
預估工作成本
在實際的量子硬體上執行作業,或 量子處理單位 (QPU) 之前,您可以預估執行的成本。
首先,請再次取得可用提供者的清單:
print("This workspace's targets:")
for backend in provider.backends():
print("- " + backend.name())
This workspace's targets:
- ionq.qpu
- ionq.simulator
- ionq.qpu.aria-1
- microsoft.estimator
- quantinuum.qpu.h1-1
- quantinuum.sim.h1-1sc
- quantinuum.sim.h1-1e
- rigetti.sim.qvm
- rigetti.qpu.ankaa-2
接著,建立代表 IonQ 量子電腦的物件:
qpu_backend = provider.get_backend("ionq.qpu")
若要估計在 QPU 上執行作業的成本,請使用 estimate_cost
的方法 target新增並執行新的資料格:
cost = qpu_backend.estimate_cost(circuit, shots=100)
print(f"Estimated cost: {cost.estimated_total}")
顯示的預估成本會以美元為單位。
如需最新的定價詳細資料,請參閱 IonQ 定價,或找到您的工作區,並在工作區的 [提供者] 刀鋒視窗中,檢視定價選項。
在 IonQ QPU 上執行
在 IonQ 模擬器上成功執行作業並估計 QPU 成本之後,就可以在硬體上執行線路。
注意
在 QPU 上執行電路所需的時間,會因目前的佇列時間而有所不同。 您可以選取工作區的 [提供者] 刀鋒視窗,以檢視 的平均佇列時間target。
使用之前搭配 API 驗證程式使用的相同 run
方法和作業,提交並監視工作:
# Submit the circuit to run on Azure Quantum
job = qpu_backend.run(circuit, shots=1024)
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())
後續步驟
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應