Qiskit を使用して回線を Azure Quantum に送信する方法
パッケージを使用して Qiskit 量子回線を送信する azure-quantum
Python 方法について説明します。 Qiskit 回線を Azure Quantum に送信するには、パッケージが組み込まれている azure-quantum
Python 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
パッケージ、およびqsharp
ipykernel
パッケージ。python -m pip install --upgrade azure-quantum[qiskit] qsharp ipykernel
注意
Jupyter Python カーネル
ipykernel
が検出されない場合、VS Code によってインストールするように求められます。
新しい Jupyter Notebook を作成します
- VS Code で、[コマンド パレットの表示>] を選択し、[作成: 新しいJupyter Notebook] を選択します。
- 右上で、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 ワークスペースに移動し、ヘッダーから各値をコピーします。
新しいセルを追加し、アカウント情報を使用して作成 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_counts
と plot_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}
ジョブ コストを見積もる
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}
重要
1 つのジョブで複数の回路を送信することは現在サポートされていません。 回避策として、backend.run
メソッドを呼び出して各回路を非同期に送信し、その後、各ジョブの結果を取得できます。 例:
jobs = []
for circuit in circuits:
jobs.append(backend.run(circuit, shots=N))
results = []
for job in jobs:
results.append(job.result())
前提条件
- アクティブなサブスクリプションが含まれる Azure アカウント。 Azure アカウントをお持ちでない場合は、無料で登録し、 従量課金制サブスクリプションにサインアップします。
- Azure Quantum ワークスペース。 詳細については、「Azure Quantum ワークスペースを作成する」を参照してください。
ワークスペースに新しいノートブックを作成する
- Azure portal にログインし、前の手順で作成した新しいワークスペースを選択します。
- 左側のブレードで、[ノートブック] を選択します。
- [マイ ノートブック] をクリックし、[新規追加] をクリックします。
- ファイルの名前 (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 シミュレーターで実行する
シミュレーターで回線を実行するには、次のコードを追加します。 この例では、 の run
target メソッドを使用してジョブを送信し、ジョブの状態を監視します。
# 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_counts
と plot_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}
ジョブ コストを見積もる
実際の量子ハードウェアまたは 量子処理装置 (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}
重要
1 つのジョブで複数の回路を送信することは現在サポートされていません。 回避策として、backend.run
メソッドを呼び出して各回路を非同期に送信し、その後、各ジョブの結果を取得できます。 次に例を示します。
jobs = []
for circuit in circuits:
jobs.append(backend.run(circuit, shots=N))
results = []
for job in jobs:
results.append(job.result())
次のステップ
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示