如何使用 Qiskit 將線路提交至 Azure Quantum

瞭解如何使用 azure-quantumPython 套件提交 Qiskit 量子線路。 您可以使用具有內 azure-quantumPython 建套件的 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 KitPythonJupyter 擴充功能的 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

  1. 在 VS Code 中,選取 [檢視>命令選擇區],然後選取 [建立:新增 Jupyter Notebook]。
  2. 在右上方,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 工作區,然後複製標頭的值。

如何從 Azure Quantum 工作區擷取資源標識碼和位置

新增數據格,並使用您的帳戶資訊來建立 WorkspaceAzureQuantumProvider 物件,以聯機到您的 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_countsplot_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}

IonQ 模擬器上的 Qiskit 線路結果

預估工作成本

在 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}

IonQ QPU 上的 Qiskit 線路結果

重要

目前不支援在單一作業上提交多個線路。 因應措施是您可以呼叫 backend.run 方法來異步提交每個線路,然後擷取每個作業的結果。 例如:

jobs = []
for circuit in circuits:
    jobs.append(backend.run(circuit, shots=N))

results = []
for job in jobs:
    results.append(job.result())

必要條件

在工作區中建立新的筆記本

  1. 登入 Azure 入口網站,然後選取您在上一個步驟中建立的工作區。
  2. 在左側刀鋒視窗中,選取 [筆記本]。
  3. 按一下 [我的筆記本],然後按一下 [新增]。
  4. 輸入檔案的名稱,例如 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_countsplot_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}

IonQ 模擬器上的 Qiskit 線路結果

預估工作成本

在實際的量子硬體上執行作業,或 量子處理單位 (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}

IonQ QPU 上的 Qiskit 線路結果

重要

目前不支援在單一作業上提交多個線路。 因應措施是您可以呼叫 backend.run 方法來異步提交每個線路,然後擷取每個作業的結果。 例如:

jobs = []
for circuit in circuits:
    jobs.append(backend.run(circuit, shots=N))

results = []
for job in jobs:
    results.append(job.result())

後續步驟