共用方式為


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

瞭解如何使用 azure-quantumPython 套件提交 Cirq 量子線路。 您可以使用 Azure Quantum 開發套件 (QDK) 和 Visual Studio Code (VS Code) 中的 Jupyter Notebook 從本機電腦將 Cirq 線路提交至 Azure Quantum。

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

必要條件

如需安裝詳細資料,請參閱 設定 QDK 擴充功能

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

  • 具備安裝了Python 的Python環境。

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

  • Azure Quantum azure-quantum 套件,附帶 cirq 額外元件,以及 qdkipykernel 套件。

    python -m pip install --upgrade "azure-quantum[cirq]" qdk ipykernel 
    

    注意

    如果未偵測到 Jupyter Python 核心 ipykernel ,則 VS Code 會提示您安裝它。

建立新的 Jupyter Notebook

  1. 在 VS Code 中,開啟 [檢視] 功能表,然後選擇 [命令面板]。
  2. 輸入並選取 [建立:新增 Jupyter Notebook]。
  3. 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. 複製欄位中的參數。

新增數據格,並使用您的帳戶資訊來建立 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可能不會列出,只有那些可以接受 Cirq 或 OpenQASM 電路的targets才會顯示。

print(service.targets())
[<Target name="quantinuum.qpu.h2-1", avg. queue time=0 s, Degraded>,
<Target name="quantinuum.sim.h2-1sc", avg. queue time=1 s, Available>,
<Target name="quantinuum.sim.h2-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 線路。 此電路使用 IonQ 硬體系統中原生的 X 門的平方根。

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 上執行作業之前,您應該先估計執行的成本。

如需最新的定價詳細數據,請參閱 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_job 將傳回 Job 物件,您可以在作業成功執行後使用該物件來取得結果。

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