Microsoft Quantum Development Kit (QDK) Python パッケージを使用して、Q#、OpenQASM、Qiskit、Cirq、および PennyLane プログラムを Azure Quantum に送信します。
この記事では、サポートされている各量子言語またはフレームワークのジョブ送信の例を示します。
Pythonコードを必要としない対話型のQ#またはOpenQASMワークフローについては、「VS CodeのQDK拡張機能を使用してジョブを送信する」を参照してください。
前提条件
アクティブなサブスクリプションを持つ Azure アカウント。
あるAzure Quantumワークスペース。 作成するには、「Azure Quantum ワークスペースを作成する」を参照してください。
Python 3.10 以降。
Jupyter Notebook を使用する場合は、Jupyter 環境 (VS Code用の Jupyter 拡張機能やipykernel パッケージなど)。
quantum
拡張機能を使用してAzure CLIをインストールします。
az extension add --upgrade --name quantum
最新バージョンの qdkPython パッケージを azure と jupyter 追加でインストールします。
pip install --upgrade "qdk[azure,jupyter]"
Qiskit または Cirq プログラムを送信する場合は、cirq と qiskit の追加機能をインストールしてください。
pip install --upgrade "qdk[qiskit,cirq]"
Azure Quantum ワークスペースに接続する
ジョブを送信する前に、 Azure Quantum ワークスペースに接続する必要があります。
qdk.azure モジュールは、Azure Quantumワークスペースに接続するWorkspace オブジェクトを提供します。 ワークスペースに接続するには、次の手順に従います。
Azure CLI を使用してサインインする
まだサインインしていない場合は、Jupyter ノートブックを開く前にターミナルからAzureにサインインします。
az login
ターミナルからサインインしない場合は、 Python経由で Quantum ワークスペースに接続するたびに認証する必要があります。 アカウントが複数のサブスクリプションにアクセスできる場合は、 Azure Quantum ワークスペースを含むサブスクリプションを設定します。
az account set --subscription <subscription-id>
セッションの有効期限が切れたとき、または別のAzure アカウントを使用する場合は、az loginをもう一度実行します。
ワークスペースのリソース ID を取得する
-
Azure portal にサインインする
- ジョブを送信する Quantum ワークスペースに移動します。
- [ 概要 ] ページで、 リソース ID を見つけてコピーします。
ワークスペースに接続する
Quantum ワークスペースに接続するには、コピーしたリソース ID を持つ Workspace オブジェクトを作成します。
from qdk.azure import Workspace
workspace = Workspace(resource_id="") # Add your resource ID
接続を確認し、ワークスペースで使用可能な targets を表示します。
for target in workspace.get_targets():
print(target.name)
その他の接続と認証オプションについては、「Azure Quantum ワークスペースに接続する」を参照してください。
Note
次の例では、 シミュレーター targetsにジョブを送信します。 ワークスペースで使用できる targets は、構成されているプロバイダーによって異なります。
プログラムを準備して送信する
量子言語またはフレームワークのタブを選択します。
qdk.qsharp モジュールを使用して、Q#コードを定義または読み込み、エントリ ポイントをQIRにコンパイルし、QIRをAzure Quantumtargetに送信します。
Q# プログラムを定義してコンパイルする
Azure Quantum
targetがサポートするQIRtarget プロファイルを使用してQ#を初期化します。
from qdk import qsharp, TargetProfile
qsharp.init(target_profile=TargetProfile.Base)
QIR
target プロファイルの詳細については、QDKのAzure QuantumQIRtargetプロファイルを参照してください。
Q#操作を定義します。 たとえば、次の RandomBit 操作を使用します。
qsharp.eval("""
operation RandomBit() : Result {
use q = Qubit();
H(q);
return MResetZ(q);
}
""")
ローカル シミュレーターで操作をテストします。
print(qsharp.run("RandomBit()", shots=10))
操作をQIRにコンパイルします。
from qdk.qsharp import compile
program = compile("RandomBit()")
Q# ジョブを送信する
ワークスペースから互換性のある target を選択します。
target = workspace.get_targets("rigetti.sim.qvm")
コンパイル済みプログラムを送信します。
job = target.submit(program, "qsharp-job", shots=100)
print("Job ID:", job.id)
ジョブが完了するまで待ち、その結果を取得します。
job.wait_until_completed()
print("Status:", job.details.status)
results = job.get_results()
print(results)
qdk.openqasm モジュールを使用して 3 つのソース コードOpenQASMコンパイルしてQIRし、QIRをAzure Quantumtargetに送信します。
OpenQASM プログラムを定義してコンパイルする
Python文字列としてOpenQASM回線を定義します。
qasm_source = """
OPENQASM 3.0;
include "stdgates.inc";
bit[2] c;
qubit[2] q;
h q[0];
cx q[0], q[1];
c = measure q;
"""
プログラムをQIRにコンパイルします。
from qdk.openqasm import compile
program = compile(qasm_source)
OpenQASM ジョブを送信する
コンパイル済みプログラムを受け入れる target を選択します。
target = workspace.get_targets("ionq.simulator")
コンパイル済みプログラムを送信します。
job = target.submit(program, "openqasm-job", shots=100)
print("Job ID:", job.id)
ジョブが完了するまで待機し、その結果を取得します。
job.wait_until_completed()
print("Status:", job.details.status)
results = job.get_results()
print(results)
パラメーター化された OpenQASM プログラムの場合は、ジョブを送信する前に入力値をバインドします。
QDKのOpenQASMの詳細については、QDKでのOpenQASMプログラムの開発を参照してください。
qdk.azure モジュールのAzureQuantumProviderを使用して、Qiskit ジョブをAzure Quantum プロバイダーに送信します。 プロバイダー オブジェクトは、互換性のある Azure Quantumtargets を一覧表示し、ジョブと結果 Qiskit 返します。
Qiskit回線を作成する
from qiskit import QuantumCircuit
circuit = QuantumCircuit(3, 3)
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.measure([0, 1, 2], [0, 1, 2])
Qiskit ジョブを送信する
ワークスペースから Azure Quantum プロバイダー オブジェクトを作成します。
from qdk.azure.qiskit import AzureQuantumProvider
provider = AzureQuantumProvider(workspace)
Qiskit回線を受け入れるバックエンドを一覧表示します。
for backend in provider.backends():
print(backend.name)
バックエンドを選択し、回線を送信します。
backend = provider.get_backend("rigetti.sim.qvm")
job = backend.run(circuit, shots=100)
print("Job ID:", job.job_id())
print("Status:", job.status())
ジョブが完了するまで待ち、 Qiskit 結果を取得します。
result = job.result()
counts = result.get_counts(circuit)
print(counts)
Qiskit アダプターは、Azure Quantum入力形式を処理し、プロバイダーの応答をQiskit結果に変換します。
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.azure モジュールのAzureQuantumServiceを使用して、Cirq ジョブをAzure Quantum プロバイダーに送信します。 サービス オブジェクトは互換性のある Azure Quantumtargets を一覧表示し、 Cirqネイティブまたはプロバイダーネイティブの結果を返します。
Cirq回線を作成する
import cirq
q0, q1 = cirq.LineQubit.range(2)
circuit = cirq.Circuit(
cirq.H(q0),
cirq.CX(q0, q1),
cirq.measure(q0, q1, key="result"),
)
Cirq ジョブを送信する
Azure Quantum サービス オブジェクトを作成します。
from qdk.azure.cirq import AzureQuantumService
service = AzureQuantumService(workspace)
targets回線を受け付けるCirqを一覧表示します。
for target in service.targets():
print(target.name)
非同期ジョブを作成します。
job = service.create_job(
program=circuit,
repetitions=100,
target="ionq.simulator",
)
print("Status:", job.status())
ジョブが完了するまで待ち、その結果を取得します。
result = job.results()
print(result)
結果の形式は、プロバイダーと targetによって異なります。 プロバイダーの結果オブジェクトの中には、 cirq.Result オブジェクトに変換できるものもあります。
PennyLane量子ノードをOpenQASMに変換し、OpenQASMをコンパイルしてQIRし、QIRをAzure Quantumtargetに送信します。
PennyLane回線を作成する
次の回路は、パラメーター化された回路です。
RYゲートの効果は、theta角度によって異なります。
import pennylane as qml
device = qml.device("default.qubit", wires=2)
@qml.qnode(device)
def circuit(theta):
qml.Hadamard(wires=0)
qml.CNOT(wires=[0, 1])
qml.RY(theta, wires=1)
return qml.expval(qml.PauliZ(1))
回路を次の値に変換します。 QIR
パラメーター化された回路を特定のパラメーター値の OpenQASM に変換します。
theta = 0.3
qasm_source = qml.to_openqasm(circuit)(theta)
互換性のあるtarget プロファイルを使用してQIRするようにOpenQASMをコンパイルします。
from qdk import TargetProfile
from qdk.openqasm import compile
program = compile(qasm_source, TargetProfile.Base)
PennyLane ジョブを送信する
互換性のある target を選択し、 QIRを送信します。
target = workspace.get_targets("rigetti.sim.qvm")
job = target.submit(program, "pennylane-job", shots=100)
print("Job ID:", job.id)
ジョブが完了するまで待ち、その結果を取得します。
job.wait_until_completed()
print("Status:", job.details.status)
results = job.get_results()
print(results)
結果の形式は、プロバイダーと targetによって異なります。
Azure Quantumは、送信されたQIRPennyLane量子ノードの結果を返しません。
関連するコンテンツ