次の方法で共有


Cirq を使用して回線を Azure Quantum に送信する方法

パッケージを使用して Cirq 量子回路を送信する azure-quantumPython 方法について説明します。 パッケージが組み込まれている azure-quantumPython Azure Quantum ノートブックを使用するか、ローカル コンピューターから Azure Quantum に Cirq 回線を送信できます。

詳細については、量子回路に関するページを参照してください。

Note

Microsoft Quantum Development Kit (クラシック QDK) は、2024 年 6 月 30 日以降サポートされなくなります。 既存の QDK 開発者の場合は、量子ソリューションの開発を続けるために、新しい Azure Quantum Development Kit (Modern QDK) に移行することをお勧めします。 詳細については、「Q# コードを Modern QDK に移行する」を参照してください

前提条件

インストールの詳細については、「VS Code への Modern QDK のインストール」を参照してください

  • Azure サブスクリプションの Azure Quantum ワークスペース。 ワークスペースを作成するには、Azure Quantum ワークスペースの作成に関するページを参照してください。

  • Python PipPythonインストールされている環境。

  • Azure Quantum Development Kit、Jupyter拡張機能がインストールされている VS CodePython

  • [cirq] タグを持つ Azure Quantum azure-quantum パッケージ、およびqsharpipykernelパッケージ。

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

    Note

    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 ワークスペースのリソース ID と場所がプログラムに必要になります。

  1. Azure アカウントにログインします。 https://portal.azure.com

  2. Azure Quantum ワークスペースを選択し、[概要] に移動します。

  3. フィールド内のパラメーターをコピーします。

    Quantum ワークスペースの概要ウィンドウを展開する方法を示す Visual Studio Code のスクリーンショット。

新しいセルを追加し、アカウント情報を使用して作成 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.qpu", avg. queue time=229 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 でジョブを実行する前に、それを実行するコストを見積もることができます。 QPU でジョブを実行するコストを見積もるには、estimate_cost メソッドを使用できます。

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

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

これにより、推定コストが米ドルで出力されます。

最新の価格の詳細については、IonQ の価格に関するページを参照するか、またはワークスペースを見つけ、そのワークスペースの [プロバイダー] タブで aka.ms/aq/myworkspaces を使用して価格オプションを表示してください。

IonQ の QPU で実行する

前のジョブは、既定のシミュレーターである "ionq.simulator" で実行されました。 ただし、これは IonQ のハードウェア プロセッサ (量子プロセッサ ユニット (QPU)) でも実行できます。 IonQ の QPU で実行するには、"ionq.qpu"target 引数として指定します。

result = service.run(
    program=circuit,
    repetitions=100,
    target="ionq.qpu",
    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 ワークスペースを作成する」を参照してください。

ワークスペースに新しいノートブックを作成する

  1. Azure portal にログインし、前の手順のワークスペースを選択します。
  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") 
)

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.qpu", avg. queue time=229 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)) でジョブを実行する前に、それを実行するコストを見積もることができます。 QPU でジョブを実行するコストを見積もるには、estimate_cost メソッドを使用できます。

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

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

これにより、推定コストが米ドルで出力されます。

最新の価格の詳細については、IonQ の価格に関するページを参照するか、またはワークスペースの [プロバイダー] ブレードで価格オプションを表示してください。 現在のクレジットの状態や使用状況を確認するには、[クレジットとクォータ] を選択します。

IonQ の QPU で実行する

前のジョブは、既定のシミュレーターである ionq.simulator で実行されました。 ただし、これは IonQ のハードウェア プロセッサ (量子プロセッサ ユニット (QPU)) でも実行できます。 IonQ の QPU で実行するには、ionq.qputarget 引数として指定します。

result = service.run(
    program=circuit,
    repetitions=100,
    target="ionq.qpu",
    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())

次のステップ