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

瞭解如何使用 azure-quantumPython 套件提交 Qiskit 量子線路。 您可以使用具有內 azure-quantumPython 建套件的 Azure Quantum 筆記本,或從本機計算機將 Qiskit 線路提交至 Azure Quantum。

如需詳細資訊,請參閱 量子電路

必要條件

如需安裝詳細數據,請參閱 在 VS Code 上安裝 QDK。

  • Azure 訂用帳戶中的 Azure Quantum 工作區。 若要建立工作區,請參閱 建立 Azure Quantum 工作區

  • Python已安裝 Python 和 Pip 的環境。

  • 已安裝 Azure Quantum Development KitPythonJupyter 擴充功能的 VS Code。

  • 具有 [qiskit] 卷標的 Azure Quantum azure-quantumPython 套件。

    python -m pip install --upgrade azure-quantum[qiskit] qsharp ipykernel 
    

    重要

    請確定您有最新版本的 Qiskit。 如需詳細資訊,請參閱 更新 azure-quantum Python 套件

    注意

    如果未偵測到 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 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 工作區的資源識別碼和位置。

  1. 登入您的 Azure 帳戶、 https://portal.azure.com

  2. 選取您的 Azure Quantum 工作區,然後流覽至 [ 概觀]。

  3. 複製欄位中的參數。

    Visual Studio Code 的螢幕快照,其中顯示如何展開 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

執行簡單的線路

首先,建立簡單的 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}

IonQ 模擬器上的 Qiskit 電路結果

您也可以使用 函 get_memory() 式來顯示作業中的個別拍攝數據

result.get_memory(circuit)
['000', '000', '000', '000', '111', '111', '111', '111']

注意

在 IonQ targets上,如果您提交有奇數投籃的作業,結果會四捨五入為下一個偶數。 例如,如果您指定 9 次拍攝,結果會顯示 8 次拍攝的數據。

預估作業成本

在 QPU 上執行作業之前,您可以預估執行的成本。 若要估計在 QPU 上執行作業的成本,您可以使用 estimate_cost 方法:

backend = provider.get_backend("ionq.qpu")
cost = backend.estimate_cost(circuit, shots=100)

print(f"Estimated cost: {cost.estimated_total}")

這會列印以美元計算的估計成本。

如需最新的定價詳細數據,請參閱 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}

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

IonQ 模擬器上的 Qiskit 電路結果

您也可以使用 函 get_memory() 式來顯示作業中的個別拍攝數據

result.get_memory(circuit)
['000', '000', '000', '000', '111', '111', '111', '111']

注意

在 IonQ targets上,如果您提交有奇數投籃的作業,結果會四捨五入為下一個偶數。 例如,如果您指定 9 次拍攝,結果會顯示 8 次拍攝的數據。

預估作業成本

在實際量子硬體或 量子處理單位 (QPU) 上執行作業之前,您可以預估執行的成本。

首先,再次取得可用提供者的清單:

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

接下來,建立 物件來代表 IonQ 量子計算機

qpu_backend = provider.get_backend("ionq.qpu.aria-1")

若要估計在 QPU 上執行作業的成本,請使用 的方法來target新增並執行新儲存格estimate_cost

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

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())

下一步