如何使用 Cirq 至 Azure Quantum 提交線路
瞭解如何使用 azure-quantum
Python 套件提交 Cirq 量子線路。 您可以使用具有內 azure-quantum
Python 建套件的 Azure Quantum 筆記本,或從本機計算機將 Cirq 線路提交至 Azure Quantum。
如需詳細資訊,請參閱 量子電路。
必要條件
如需安裝詳細數據,請參閱 在 VS Code 上安裝 QDK。
Azure 訂用帳戶中的 Azure Quantum 工作區。 若要建立工作區,請參閱 建立 Azure Quantum 工作區。
Python已安裝 Python 和 Pip 的環境。
已安裝 Azure Quantum Development Kit 和 PythonJupyter 擴充功能的 VS Code。
具有 [cirq] 標籤的 Azure Quantum
azure-quantum
套件,以及qsharp
和ipykernel
套件。python -m pip install --upgrade azure-quantum[cirq] 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 azure.quantum.cirq import AzureQuantumService
聯機到 Azure Quantum 服務
若要連線到 Azure Quantum 服務,您的程式將需要資源識別碼和 Azure Quantum 工作區的位置。
登入您的 Azure 帳戶、 https://portal.azure.com、
選取您的 Azure Quantum 工作區,然後流覽至 [ 概觀]。
複製欄位中的參數。
新增數據格,並使用您的帳戶資訊來建立 Workspace
和 AzureQuantumService
物件,以聯機到您的 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 上執行作業之前,您應該先估計執行的成本。
如需最新的定價詳細數據,請參閱 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
必要條件
- 具有有效訂用帳戶的 Azure 帳戶。 如果您沒有 Azure 帳戶,請免費註冊並註冊 隨用隨付訂用帳戶。
- Azure Quantum 工作區。 如需詳細資訊,請參閱 建立 Azure Quantum 工作區。
在工作區中建立新的筆記本
- 登入 Azure 入口網站,然後從上一個步驟中選取工作區。
- 在左側刀鋒視窗中,選取 [筆記本]。
- 按一下 [我的筆記本] ,然後按一下 [新增]。
- 輸入檔案的名稱,例如 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) 上執行作業之前,您應該先估計執行的成本。
如需最新的定價詳細數據,請參閱 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_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
注意
函 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())