如何使用 Cirq 至 Azure Quantum 提交線路

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

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

必要條件

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

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

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

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

  • 具有 [cirq] 標籤的 Azure Quantum azure-quantum 套件,以及 qsharpipykernel 套件。

    python -m pip install --upgrade azure-quantum[cirq] 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 azure.quantum.cirq import AzureQuantumService

聯機到 Azure Quantum 服務

若要連線到 Azure Quantum 服務,您的程式將需要資源識別碼和 Azure Quantum 工作區的位置。

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

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

  3. 複製欄位中的參數。

    Visual Studio Code 的螢幕快照,其中顯示如何展開 Quantum 工作區的概觀窗格。

新增數據格,並使用您的帳戶資訊來建立 WorkspaceAzureQuantumService 物件,以聯機到您的 Azure Quantum 工作區。

workspace = Workspace(  
    resource_id = "", # Add the resourceID of your workspace
    location = "" # Add the location of your workspace (for example "westus")
    )

service = AzureQuantumService(workspace)

全部列出 targets

targets()使用 方法來列出工作區中可執行線路的所有 targets ,包括目前的佇列時間和可用性。

注意

targets您工作區的所有可能不會列出 - 只會targets列出可接受 Cirq 或 OpenQASM 線路的 。

print(service.targets())
[<Target name="quantinuum.qpu.h1-1", avg. queue time=0 s, Degraded>,
<Target name="quantinuum.sim.h1-1sc", avg. queue time=1 s, Available>,
<Target name="quantinuum.sim.h1-1e", avg. queue time=40 s, Available>,
<Target name="ionq.simulator", avg. queue time=3 s, Available>,
<Target name="ionq.qpu.aria-1", avg. queue time=1136774 s, Available>]

建立簡單線路

接下來,建立要執行的簡單 Cirq 線路。 此線路使用 X 閘道的平方根,原生為 IonQ 硬體系統。

import cirq

q0, q1 = cirq.LineQubit.range(2)
circuit = cirq.Circuit(
    cirq.X(q0)**0.5,             # Square root of X
    cirq.CX(q0, q1),              # CNOT
    cirq.measure(q0, q1, key='b') # Measure both qubits
)
print(circuit)
0: ───X^0.5───@───M────────
              │   │
1: ───────────X───M────────

target選取 以執行程式

在 IonQ 模擬器上執行

您現在可以透過 Azure Quantum 服務執行程式,並取得結果。 下列數據格會提交工作(至預設的 IonQ 模擬器),以 100 次拍攝執行線路、等候工作完成,並傳回結果。

result = service.run(program=circuit, repetitions=100, target="ionq.simulator")

這會傳 cirq.Result 回物件。

print(result)
    b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010

預估作業成本

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

cost = service.estimate_cost(
    program=circuit,
    repetitions=100,
    target="ionq.qpu.aria-1"
)

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

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

如需最新的定價詳細數據,請參閱 IonQ 定價,或透過下列方式在工作區的 [提供者] 索引卷標中尋找您的工作區並檢視定價選項: aka.ms/aq/myworkspaces

在 IonQ QPU 上執行

上一個作業在預設模擬器上執行, "ionq.simulator"。 不過,您也可以在 IonQ 的硬體處理器 (量子處理器單元QPU) 上執行它。 若要在 IonQ QPU 上執行,請提供 "ionq.qpu.aria-1" 作為 target 自變數:

result = service.run(
    program=circuit,
    repetitions=100,
    target="ionq.qpu.aria-1",
    timeout_seconds=500 # Set timeout to accommodate queue time on QPU
)

同樣地,這會傳 cirq.Result 回 物件。

print(result)
b=0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111, 0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111

使用作業的異步模型

對於長時間執行的線路,以異步方式執行它們可能很有用。 方法 service.create_jobJob 傳回 物件,您可以在作業成功執行之後取得結果。

job = service.create_job(
    program=circuit,
    repetitions=100,
    target="ionq.simulator"
)

若要檢查工作狀態, 請使用 job.status()

print(job.status())
'completed'

若要等候作業完成,然後取得結果,請使用封鎖呼叫 job.results()

result = job.results()
print(result)
00: 0.5
11: 0.5

請注意,這不會傳 cirq.Result 回 物件。 相反地,它會傳回 IonQ 模擬器特有的結果物件,並使用狀態機率,而不是拍攝數據。

type(result)
cirq_ionq.results.SimulatorResult

若要將這個轉換成 cirq.Result 物件,請使用 result.to_cirq_result()

print(result.to_cirq_result())
b=1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100, 1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100

必要條件

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

  1. 登入 Azure 入口網站,然後從上一個步驟中選取工作區。
  2. 在左側刀鋒視窗中,選取 [筆記本]
  3. 按一下 [我的筆記本] ,然後按一下 [新增]
  4. 輸入檔案的名稱,例如 Cirq.ipynb,然後按兩下 [ 建立檔案]。

當您的新筆記本開啟時,會根據您的訂用帳戶和工作區資訊自動建立第一個儲存格的程式碼。

from azure.quantum import Workspace
workspace = Workspace ( 
  resource_id = "", # Add your resource_id 
  location = ""  # Add your workspace location (for example, "westus") 
)

注意

除非另有說明,否則您應該在建立數據格時依序執行每個數據格,以避免發生任何編譯問題。

按兩下單元格左邊的三角形「播放」圖示,以執行程式碼。

載入必要的匯入

首先,您必須匯入額外的模組。

單擊 [+ 程式代碼 ] 以新增儲存格,然後新增並執行下列程式代碼:

from azure.quantum.cirq import AzureQuantumService

聯機到 Azure Quantum 服務

接下來,使用workspace上一個AzureQuantumService單元格中的 物件來建立 物件,以聯機到您的 Azure Quantum 工作區。 使用下列程式代碼新增儲存格:

provider = AzureQuantumService(workspace)

定義簡單的線路

接下來,建立要執行的簡單 Cirq 線路。 此線路使用 X 閘道的平方根,原生為 IonQ 硬體系統。

import cirq

q0, q1 = cirq.LineQubit.range(2)
circuit = cirq.Circuit(
    cirq.X(q0)**0.5,             # Square root of X
    cirq.CX(q0, q1),              # CNOT
    cirq.measure(q0, q1, key='b') # Measure both qubits
)
print(circuit)
0: ───X^0.5───@───M────────
              │   │
1: ───────────X───M────────

全部列出 targets

targets()使用 方法來列出工作區中可執行線路的所有 targets ,包括目前的佇列時間和可用性。

注意

targets您工作區的所有可能不會列出 - 只會targets列出可接受 Cirq 或 OpenQASM 線路的 。

print("This workspace's targets:")
for target in service.targets():
     print(target)
This workspace's targets:
<Target name="quantinuum.qpu.h1-1", avg. queue time=0 s, Degraded>
<Target name="quantinuum.sim.h1-1sc", avg. queue time=1 s, Available>
<Target name="quantinuum.sim.h1-1e", avg. queue time=40 s, Available>
<Target name="ionq.simulator", avg. queue time=3 s, Available>
<Target name="ionq.qpu.aria-1", avg. queue time=1136774 s, Available>

注意

工作區的完整清單 target 可能不同。

target選取 以執行程式

在 IonQ 模擬器上執行

若要在實際量子硬體上執行線路之前先檢查線路,您可以使用 IonQ 模擬器 ionq.simulator

下列單元格會提交一個作業,該作業會執行具有 100 次拍攝的線路、等候作業完成,並傳回結果。

result = service.run(
    program=circuit,
    repetitions=100,
    target="ionq.simulator"
)

這會傳 cirq.Result 回物件。

print(result)
    b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010

您可以在直方圖中繪製結果:

import pylab as pl

pl.hist(result.data)
pl.ylabel("Counts")
pl.xlabel("Result")

預估作業成本

在實際量子硬體或 量子處理單元 (QPU) 上執行作業之前,您可以預估執行的成本。 若要估計在 QPU 上執行作業的成本,您可以使用 estimate_cost 方法:

cost = service.estimate_cost(
    program=circuit,
    repetitions=100,
    target="ionq.qpu.aria-1"
)

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

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

如需最新的定價詳細數據,請參閱 IonQ 定價,或在工作區的 [提供者] 刀鋒視窗中檢視定價選項。 若要查看目前的點數狀態和使用量,請選取 [點數和配額]。

在 IonQ QPU 上執行

上一個作業在預設模擬器上執行, ionq.simulator。 不過,您也可以在 IonQ 的硬體處理器或 Quantum Processor Unit (QPU) 上執行它。 若要在 IonQ QPU 上執行,請提供 ionq.qpu.aria-1 作為 target 自變數:

result = service.run(
    program=circuit,
    repetitions=100,
    target="ionq.qpu.aria-1",
    timeout_seconds=500 # Set timeout to accommodate queue time on QPU
)

注意

在 QPU 上執行線路所需的時間取決於目前的佇列時間。 您可以選取工作區的 [提供者] 刀鋒視窗,以檢視 的平均佇列時間target。

同樣地,這會傳 cirq.Result 回 物件。

print(result)
    b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010

使用作業的異步模型

對於長時間執行的線路,以異步方式執行它們可能很有用。 方法 service.create_jobJob 傳回 物件,您可以在作業成功執行之後取得結果。

job = service.create_job(
    program=circuit,
    repetitions=100,
    target="ionq.simulator"
)

若要檢查工作狀態, 請使用 job.status()

print(job.status())
'completed'

若要等候作業完成,然後取得結果,請使用封鎖呼叫 job.results()

result = job.results()
print(result)
00: 0.5
11: 0.5

注意

job.results() 式不會傳回 cirq.Result 物件。 相反地,它會傳回 IonQ 模擬器特有的結果物件,並使用狀態機率,而不是拍攝數據。

type(result)
cirq_ionq.results.SimulatorResult

若要將這個轉換成 cirq.Result 物件,請使用 result.to_cirq_result()

print(result.to_cirq_result())
b=1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100, 1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100

重要

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

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

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