Cirq を使用して回線を Azure Quantum に送信する方法
パッケージを使用して Cirq 量子回路を送信する azure-quantum
Python 方法について説明します。 パッケージが組み込まれている azure-quantum
Python Azure Quantum ノートブックを使用するか、ローカル コンピューターから Azure Quantum に Cirq 回線を送信できます。
詳細については、量子回路に関するページを参照してください。
前提条件
インストールの詳細については、VS Code への QDK のインストールを参照してください。
Azure サブスクリプションの Azure Quantum ワークスペース。 ワークスペースを作成するには、Azure Quantum ワークスペースの作成に関するページを参照してください。
Python Pip がPythonインストールされている環境。
Azure Quantum Development Kit、Jupyter 拡張機能がインストールされている VS CodePython。
[cirq] タグを持つ Azure Quantum
azure-quantum
パッケージ、およびqsharp
ipykernel
パッケージ。python -m pip install --upgrade azure-quantum[cirq] qsharp ipykernel
Note
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 ワークスペースのリソース ID と場所がプログラムに必要になります。
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 キュー時刻や可用性など、回線を実行できるワークスペース内のすべてを一覧表示します。
Note
targetsワークスペース内のすべてが一覧に表示されない場合があります。Cirq 回線または OpenQASM 回線を受け入れることができるものだけがtargetsここに表示されます。
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 回路を作成して実行します。 この回路では、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────────
a を target 選択してプログラムを実行する
IonQ シミュレーターで実行する
これで、Azure Quantum サービスを使用してプログラムを実行し、結果を取得できます。 次のセルは、100 ショットで回路を実行するジョブを (既定の IonQ シミュレーターに) 送信し、ジョブが完了するまで待機し、結果を返します。
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 portal にログインし、前の手順のワークスペースを選択します。
- 左側のブレードで、[ノートブック] を選択します。
- [マイ ノートブック] をクリックし、[新規追加] をクリックします。
- ファイルの名前 (Cirq.ipynb など) を入力し、[ファイルの作成] をクリックします。
新しいノートブックを開くと、サブスクリプションとワークスペースの情報に基づいて、最初のセルのコードが自動的に作成されます。
from azure.quantum import Workspace
workspace = Workspace (
resource_id = "", # Add your resource_id
location = "" # Add your workspace location (for example, "westus")
)
Note
特に記載がない限り、コンパイルの問題が発生しないように、各セルは作成した順序で実行する必要があります。
セルの左側にある三角形の [再生] アイコンをクリックして、このコードを実行します。
必要なインポートを読み込む
まず、追加のモジュールをインポートする必要があります。
[+ コード] をクリックして新しいセルを追加した後、次のコードを追加して実行します。
from azure.quantum.cirq import AzureQuantumService
Azure Quantum サービスに接続する
次に、前の AzureQuantumService
セルのオブジェクトを workspace
使用してオブジェクトを作成し、Azure Quantum ワークスペースに接続します。 次のコードを使用して新しいセルを追加します。
provider = AzureQuantumService(workspace)
単純な回路を定義する
次に、単純な 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────────
すべてを一覧表示する targets
このメソッドを targets()
使用して、現在の targets キュー時刻や可用性など、回線を実行できるワークスペース内のすべてを一覧表示します。
Note
targetsワークスペース内のすべてが一覧に表示されない場合があります。Cirq 回線または OpenQASM 回線を受け入れることができるものだけがtargetsここに表示されます。
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>
Note
完全な一覧 target は、ワークスペースによって異なる場合があります。
a を 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 のハードウェア プロセッサ (量子プロセッサ ユニット (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
)
Note
QPU で回路を実行するために必要な時間は、現在のキュー時間によって異なります。 ワークスペースの [プロバイダー] ブレードを選択すると、a 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
Note
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
重要
1 つのジョブで複数の回路を送信することは現在サポートされていません。 回避策として、backend.run
メソッドを呼び出して各回路を非同期に送信し、その後、各ジョブの結果を取得できます。 次に例を示します。
jobs = []
for circuit in circuits:
jobs.append(backend.run(circuit, shots=N))
results = []
for job in jobs:
results.append(job.result())