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

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

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

注意

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

前提条件

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

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

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

  • Azure Quantum Development Kit、、Pythonおよび Jupyter 拡張機能がインストールされている VS Code。

  • [qiskit] タグを含む Azure Quantum azure-quantum パッケージ、および qsharpipykernel パッケージ。

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

    注意

    Jupyter Python カーネル ipykernel が検出されない場合、VS Code によってインストールするように求められます。

新しい Jupyter Notebook を作成します

  1. VS Code で、[コマンド パレットの表示>] を選択し、[作成: 新しいJupyter Notebook] を選択します。
  2. 右上で、VS Code によって、ノートブック用に選択された の Python バージョンと仮想 Python 環境が検出されて表示されます。 複数 Python の環境がある場合は、右上のカーネル ピッカーを使用してカーネルを選択する必要がある場合があります。 環境が検出されなかった場合は、セットアップ情報については 、「VS Code の Jupyter Notebooks 」を参照してください。

必要なインポートを読み込む

ノートブックの最初のセルで、次のコードを実行して、必要なインポートを読み込みます。

import azure.quantum
from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from azure.quantum.qiskit import AzureQuantumProvider

Azure Quantum サービスに接続する

Azure Quantum サービスに接続するには、リソース ID と Azure Quantum ワークスペースの場所が必要です。 Azure アカウント (https://portal.azure.com) にログインして、Azure Quantum ワークスペースに移動し、ヘッダーから各値をコピーします。

Azure Quantum ワークスペースからリソース ID と場所を取得する方法

新しいセルを追加し、アカウント情報を使用して作成 Workspace し、 AzureQuantumProvider オブジェクトを使用して Azure Quantum ワークスペースに接続します。

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

provider = AzureQuantumProvider(workspace)

すべてのバックエンドを一覧表示する

これで、ワークスペースで使用できるすべての量子コンピューティング バックエンドを出力できます。

print("This workspace's targets:")
for backend in provider.backends():
    print("- " + backend.name())
This workspace's targets:
- ionq.qpu
- ionq.qpu.aria-1
- ionq.simulator
- microsoft.estimator
- quantinuum.hqs-lt-s1
- quantinuum.hqs-lt-s1-apival
- quantinuum.hqs-lt-s2
- quantinuum.hqs-lt-s2-apival
- quantinuum.hqs-lt-s1-sim
- quantinuum.hqs-lt-s2-sim
- quantinuum.qpu.h1-1
- quantinuum.sim.h1-1sc
- quantinuum.sim.h1-1e
- rigetti.sim.qvm
- rigetti.qpu.ankaa-2

単純な回路を実行する

最初に、簡単な Qiskit 回路を作成して実行します。

# Create a Quantum Circuit acting on the q register
circuit = QuantumCircuit(3, 3)
circuit.name = "Qiskit Sample - 3-qubit GHZ circuit"
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.measure([0,1,2], [0, 1, 2])

# Print out the circuit
circuit.draw()
     ┌───┐          ┌─┐      
q_0: ┤ H ├──■───────┤M├──────
     └───┘┌─┴─┐     └╥┘┌─┐   
q_1: ─────┤ X ├──■───╫─┤M├───
          └───┘┌─┴─┐ ║ └╥┘┌─┐
q_2: ──────────┤ X ├─╫──╫─┤M├
               └───┘ ║  ║ └╥┘
c: 3/════════════════╩══╩══╩═
                     0  1  2 

を target 選択してプログラムを実行する

IonQ シミュレーターで実行する

実際のハードウェアで実行する前に、シミュレーターで回線をテストしてみましょう。 IonQ Simulator バックエンドに接続するオブジェクトを作成Backendするには、 を使用get_backendします。

simulator_backend = provider.get_backend("ionq.simulator")

IonQ バックエンドでは、ハードウェアで最適に実行されるようにコンパイルされている定義されたゲートセットのゲートがサポートされています。 回線にこの一覧にないゲートが含まれている場合は、Qiskit によって提供される関数を使用してtranspile、サポートされている gateset にトランスパイルする必要があります。

from qiskit import transpile
circuit = transpile(circuit, simulator_backend)

transpile 関数は、指定されたバックエンドでサポートされているゲートにゲートが分解される新しい回線オブジェクトを返します。

これで、Azure Quantum サービスを使用してプログラムを実行し、結果を取得できます。 次のセルは、100 ショットで回路を実行するジョブを送信します。

job = simulator_backend.run(circuit, shots=100)
job_id = job.id()
print("Job id", job_id)
Job id 00000000-0000-0000-0000-000000000000

ジョブが完了するまで待って結果を返すには、次のように実行します。

result = job.result()
print(result)
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='00000000-0000-0000-0000-000000000000', success=True, results=[ExperimentResult(shots=100, success=True, meas_level=2, data=ExperimentResultData(counts={'000': 50, '111': 50}, probabilities={'000': 0.5, '111': 0.5}), header=QobjExperimentHeader(meas_map='[0, 1, 2]', name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits='3', qiskit='True'))])

この結果は Qiskit パッケージにネイティブなオブジェクトであるため、Qiskit の result.get_countsplot_histogram を使用して結果を視覚化できます。 可能性のあるすべてのビット文字列ラベルが表示されるようにするには、それらを counts に追加します。

counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
{'000': 50, '001': 0, '010': 0, '011': 0, '100': 0, '101': 0, '110': 0, '111': 50}

IonQ シミュレーターでの Qiskit 回路の結果

ジョブ コストを見積もる

QPU でジョブを実行する前に、実行するコストを見積もることができます。 QPU でジョブを実行するコストを見積もるには、estimate_cost メソッドを使用できます。

backend = provider.get_backend("ionq.qpu")
cost = backend.estimate_cost(circuit, shots=1024)

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

これにより、見積もりコストが米国ドルで出力されます。

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

IonQ の QPU で実行する

実際のハードウェア ( 量子プロセッサ ユニット (QPU)) に接続するには、 メソッドに の target"ionq.qpu" 名前を get_backend 指定します。

qpu_backend = provider.get_backend("ionq.qpu")

Azure Quantum で実行する回線を送信し、結果を取得し、 を実行 plot_histogram して結果をプロットします。

Note

QPU で回路を実行するために必要な時間は、現在のキュー時間によって異なる場合があります。

# Submit the circuit to run on Azure Quantum
job = qpu_backend.run(circuit, shots=1024)
job_id = job.id()
print("Job id", job_id)

# Get the job results (this method waits for the Job to complete):
result = job.result()
print(result)
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
Job id 00000000-0000-0000-0000-000000000000
Job Status: job has successfully run
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='00000000-0000-0000-0000-000000000000', success=True, results=[ExperimentResult(shots=1024, success=True, meas_level=2, data=ExperimentResultData(counts={'0': 505, '1': 6, '2': 1, '3': 1, '4': 1, '5': 10, '6': 11, '7': 488}, probabilities={'0': 0.4932, '1': 0.0059, '2': 0.001, '3': 0.001, '4': 0.001, '5': 0.0098, '6': 0.0117, '7': 0.4766}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits='3', qiskit='True'))])
{'000': 505, '001': 6, '010': 1, '011': 1, '100': 1, '101': 10, '110': 11, '111': 488}

IonQ の QPU における Qiskit 回路の結果

重要

1 つのジョブで複数の回路を送信することは現在サポートされていません。 回避策として、backend.run メソッドを呼び出して各回路を非同期に送信し、その後、各ジョブの結果を取得できます。 例:

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

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

前提条件

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

  1. Azure portal にログインし、前の手順で作成した新しいワークスペースを選択します。
  2. 左側のブレードで、[ノートブック] を選択します。
  3. [マイ ノートブック] をクリックし、[新規追加] をクリックします。
  4. ファイルの名前 (Qiskit.ipynb など) を入力し、[ファイルの作成] をクリックします。

新しいノートブックが開くと、サブスクリプションとワークスペースの情報に基づいて、最初のセルのコードが自動的に作成されます。

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

Note

特に記載がない限り、コンパイルの問題が発生しないように、各セルは作成した順序で実行する必要があります。

セルの左側にある三角形の [再生] アイコンをクリックして、このコードを実行します。

必要なインポートを読み込む

まず、追加のモジュールをインポートする必要があります。

[+ コード] をクリックして新しいセルを追加した後、次のコードを追加して実行します。

from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from azure.quantum.qiskit import AzureQuantumProvider

Azure Quantum サービスに接続する

次に、前の AzureQuantumProvider セルの オブジェクトを Workspace 使用してオブジェクトを作成し、Azure Quantum ワークスペースに接続します。 以下のコードを使用して新しいセルを追加します。

provider = AzureQuantumProvider(workspace)

単純な回路を定義する

新しいセルに circuit オブジェクトを作成します。 この例は、単純な量子ランダム ビット ジェネレーターです。 回路を定義して表示するための次のコードを追加します。

# Create a Quantum Circuit acting on the q register
circuit = QuantumCircuit(3, 3)
circuit.name = "Qiskit Sample - 3-qubit GHZ circuit"
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.measure([0, 1, 2], [0, 1, 2])

# Print out the circuit
circuit.draw()
     ┌───┐          ┌─┐      
q_0: ┤ H ├──■───────┤M├──────
     └───┘┌─┴─┐     └╥┘┌─┐   
q_1: ─────┤ X ├──■───╫─┤M├───
          └───┘┌─┴─┐ ║ └╥┘┌─┐
q_2: ──────────┤ X ├─╫──╫─┤M├
               └───┘ ║  ║ └╥┘
c: 3/════════════════╩══╩══╩═
                     0  1  2 

すべてを一覧表示する targets

ワークスペースで使用可能なすべての量子コンピューティング targets(バックエンド) を表示できるようになりました。 新しいセルを追加し、次の行を実行します。

print("This workspace's targets:")
for backend in provider.backends():
    print("- " + backend.name())
This workspace's targets:
- ionq.qpu
- ionq.simulator
- ionq.qpu.aria-1
- microsoft.estimator
- quantinuum.qpu.h1-1
- quantinuum.sim.h1-1sc
- quantinuum.sim.h1-1e
- rigetti.sim.qvm
- rigetti.qpu.ankaa-2

を target 選択してプログラムを実行する

実際の量子ハードウェアで実行する前にコードを確認するには、IonQ 量子シミュレーター ionq.simulator を使用できます。

新しいセルを追加し、IonQ 量子シミュレーターを表す オブジェクトを作成します target。

# Get IonQ quantum simulator target:
simulator_backend = provider.get_backend("ionq.simulator")

IonQ シミュレーターで実行する

シミュレーターで回線を実行するには、次のコードを追加します。 この例では、 の runtarget メソッドを使用してジョブを送信し、ジョブの状態を監視します。

# Submit the circuit to run on Azure Quantum
job = simulator_backend.run(circuit, shots=100)
job_id = job.id()
print("Job id", job_id)

ジョブが正常に実行されたら、ジョブの結果を取得して表示します。

# Get the job results:
result = job.result()
print(result)
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='7d909574-98d4-11ec-b382-00155d957f5d', success=True, results=[ExperimentResult(shots=100, success=True, meas_level=2, data=ExperimentResultData(counts=defaultdict(<class 'int'>, {'000': 50, '111': 50}), probabilities=defaultdict(<class 'int'>, {'000': 0.5, '111': 0.5})), header=QobjExperimentHeader(meas_map='[0, 1, 2]', name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits='3', qiskit='True'))])

この result 型は Qiskit パッケージにネイティブなオブジェクトであるため、Qiskit の result.get_countsplot_histogram を使用して結果を視覚化できます。 可能性のあるすべてのビット文字列ラベルが表示されるようにするには、それらを counts に追加します。

counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
{'000': 50, '001': 0, '010': 0, '011': 0, '100': 0, '101': 0, '110': 0, '111': 50}

IonQ シミュレーターでの Qiskit 回路の結果

ジョブ コストを見積もる

実際の量子ハードウェアまたは 量子処理装置 (QPU) でジョブを実行する前に、実行にかかるコストを見積もることができます。

まず、使用可能なプロバイダーの一覧を再度取得します。

print("This workspace's targets:")
for backend in provider.backends():
    print("- " + backend.name())
This workspace's targets:
- ionq.qpu
- ionq.simulator
- ionq.qpu.aria-1
- microsoft.estimator
- quantinuum.qpu.h1-1
- quantinuum.sim.h1-1sc
- quantinuum.sim.h1-1e
- rigetti.sim.qvm
- rigetti.qpu.ankaa-2

次に、IonQ 量子コンピューターを表すオブジェクトを作成します。

qpu_backend = provider.get_backend("ionq.qpu")

QPU でジョブを実行するコストを見積もるには、 の メソッドを使用して新しいセルを追加して estimate_cost 実行します target。

cost = qpu_backend.estimate_cost(circuit, shots=100)

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

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

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

IonQ の QPU で実行する

IonQ シミュレーターでジョブを正常に実行し、QPU コストを見積もったら、ハードウェアで回線を実行します。

Note

QPU で回路を実行するために必要な時間は、現在のキュー時間によって異なります。 ワークスペースの [プロバイダー] ブレードを選択すると、 の平均キュー時間targetを表示できます。

前に API 検証コントロールで使用したのと同じ run メソッドおよび演算を使用して、ジョブを送信して監視します。

# Submit the circuit to run on Azure Quantum
job = qpu_backend.run(circuit, shots=1024)
job_id = job.id()
print("Job id", job_id)

ジョブが完了したら、前と同じようにジョブの結果を取得し、グラフに表示します。

result = job.result()
print(result)
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
Job id 910b5ac8-98cd-11ec-b3ba-00155d5528cf
Job Status: job has successfully run
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='Job id 54e8c740-98d9-11ec-b382-00155d957f5d', success=True, results=[ExperimentResult(shots=1024, success=True, meas_level=2, data=ExperimentResultData(counts={'0': 505, '1': 6, '2': 1, '3': 1, '4': 1, '5': 10, '6': 11, '7': 488}, probabilities={'0': 0.4932, '1': 0.0059, '2': 0.001, '3': 0.001, '4': 0.001, '5': 0.0098, '6': 0.0117, '7': 0.4766}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits='3', qiskit='True'))])
{'000': 505, '001': 6, '010': 1, '011': 1, '100': 1, '101': 10, '110': 11, '111': 488}

IonQ の QPU における Qiskit 回路の結果

重要

1 つのジョブで複数の回路を送信することは現在サポートされていません。 回避策として、backend.run メソッドを呼び出して各回路を非同期に送信し、その後、各ジョブの結果を取得できます。 次に例を示します。

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

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

次のステップ