Microsoft Quantum Development Kit (QDK) を使用して Azure Quantum targets で実行する Qiskit プログラムを送信できます。 QDK の組み込みのスパース シミュレーターを使用して、ローカル コンピューターで Qiskit プログラムを実行することもできます。 QDK では、Qiskit のバージョン 1 とバージョン 2 の両方がサポートされています。
この記事では、Visual Studio Code (VS Code) の Jupyter Notebook から QDK Python ライブラリを使用して Qiskit プログラムを実行する方法について説明します。
Note
量子コンピューター targetで実行するジョブを送信する前に、シミュレーター targetで量子プログラムを実行することをお勧めします。 各 Azure Quantum プロバイダーには、1 つ以上の無料シミュレーター targetsが用意されています。
前提条件
Qiskit ジョブを Azure Quantum に送信し、ローカル スパース シミュレーターで Qiskit プログラムを実行するには、次のものが必要です。
Azure サブスクリプションの Azure Quantum ワークスペース。 ワークスペースを作成するには、Azure Quantum ワークスペースの作成に関するページを参照してください。
Python がインストールされているローカル Python環境 (バージョン 3.10 以降)。
Pythonと Jupyter 拡張機能がインストールされている Visual Studio Code (VS Code)。
qdkPythonのエクストラを含むazureqiskitライブラリ、およびipykernelパッケージ。pip install --upgrade "qdk[azure,qiskit]" ipykernel
Quantum ワークスペース内の Azure Quantum target にジョブを送信する
Azure Quantum targetで実行する Qiskit プログラムを送信するには、次の手順に従います。
VS Code で、[ 表示 ] メニューを開き、[ コマンド パレット] を選択します。
「新しい Jupyter Notebookを作成」と入力して選択します。 空の Jupyter Notebook ファイルが新しいタブで開きます。
ノートブックの最初のセルに、Qiskit 回線を記述します。 たとえば、次の回線を使用します。
from qiskit import QuantumCircuit # Create a Quantum circuit that acts 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()Azure Quantum ワークスペースに接続します。
from qdk.azure import Workspace workspace = Workspace(resource_id="") # Add the resource ID of your workspaceワークスペースから Qiskit プログラムを実行できるプロバイダーを取得し、各プロバイダーで使用可能な targets を印刷します。
from qdk.azure.qiskit import AzureQuantumProvider provider = AzureQuantumProvider(workspace) for backend in provider.backends(): print("- " + backend.name)ジョブを送信する target を使用して Azure Quantum バックエンドを設定します。 たとえば、次のコードは、Rigetti シミュレーターでプログラムを実行するバックエンドを設定します。
backend = provider.get_backend('rigetti.sim.qvm')Azure Quantum target でプログラムを実行し、結果を取得します。 次のコードは、指定した target でプログラムの 1,000 ショットを実行し、結果を格納します。
job = backend.run(circuit, shots=1000) result = job.result() print(result)
ジョブの結果を確認する
result オブジェクトには、各ショットの測定結果、可能な各測定の合計数と確率など、ジョブの結果に関する情報が含まれます。
測定結果のヒストグラムを作成するには、回線を get_counts メソッドに渡し、plot_histogram モジュールから qiskit.visualization 関数にカウントを渡します。 次のコードは、 counts オブジェクトを再フォーマットして、可能なすべての測定結果を表示します。
from qiskit.visualization import plot_histogram
print("Job ID:", job.job_id())
counts = result.get_counts(circuit)
print('Counts:', counts)
# Reformat counts to include all possible measurement outcomes, even those with zero counts
full_counts = {format(n, "03b"): 0 for n in range(8)}
full_counts.update(counts)
plot_histogram(full_counts)
Note
Qiskit の plot_histogram 関数を使用するには、Matplotlib をインストールする必要があります。
pip install matplotlib
Qiskit のジョブ結果: 量子ビット損失を伴うプログラムのケース
一部の種類の量子ハードウェアでは、プログラムの実行中に量子ビットの損失が発生する可能性があります。 Qiskit プログラムのショット中に量子ビット損失が発生した場合、そのショットは Azure Quantum ジョブの結果から削除されます。 たとえば、200 ショットのうち10回で量子ビット損失が発生した場合、ジョブ結果の測定総数は190個にしかなりません。
量子ビット損失が発生したショットを含むすべてのショットの生の結果は、 results オブジェクトで引き続き使用できます。 次のコードは、両方の結果セットを取得します。
# Get results only for shots without qubit loss
print('Counts:', result.results[0].data.counts)
print('Probabilities:', result.results[0].data.probabilities)
print('Memory:', result.results[0].data.memory)
# Get the raw total shot results
print('Raw counts:', result.results[0].data.raw_counts)
print('Raw probabilities:', result.results[0].data.raw_probabilities)
print('Raw memory:', result.results[0].data.raw_memory)
量子ビット損失がないジョブまたは targets の場合、既定の結果と生の結果は同じです。
Note
Qiskit ジョブの結果の memory 属性は、各ショットの測定結果の一覧です。
QDK スパース シミュレーターでジョブを実行する
QDK には、Azure Quantum にジョブを送信する代わりに、ローカル コンピューターで Qiskit プログラムを実行するために使用できるスパース シミュレーターが組み込まれています。 スパース シミュレーターで Qiskit プログラムを実行するには、 QSharpBackend を使用してバックエンド オブジェクトのインスタンスを作成します。
from qsharp.interop.qiskit import QSharpBackend
backend = QSharpBackend()
job = backend.run(circuit)
counts = job.result().get_counts()
print(counts)