REST API を使ったサンプル
このトピックの手順では、REST API を使用してワークロードを実行および構成する方法について説明し、任意のプログラムからそれらを呼び出す方法を示します。
このドキュメントでは、 Pythonrequests モジュールを使用して、 IBM Quantum Compute ServiceのREST APIについて解説します。 ただし、このワークフローは、REST API の操作をサポートするあらゆる言語やフレームワークを使用して実行することができます。 詳細については、 APIリファレンスを参照してください。
1. アカウントを初期化する
まず、アカウントを初期化する必要があります。 その後、計算を実行するデバイスを選択できます。
「REST API を使用した IBM Quantum Platform の設定 」のセクションで、アカウントの初期化方法、利用可能なバックエンドの確認方法、およびトークンの取り扱い方法の詳細をご確認ください。
2. QASM回路を作成する
サンプラープリミティブの入力として、少なくとも1つの回路が必要です。
QASM量子回路を定義する:
qasm_string='''
OPENQASM 3;
include "stdgates.inc";
qreg q[2];
creg c[2];
x q[0];
cx q[0], q[1];
c[0] = measure q[0];
c[1] = measure q[1];
'''以下のコードスニペットは、が新しい文字列に qasm_string トランスパイル resulting_qasmされていることを前提としています。
3. Samplerの V2 APIを使用して量子回路を実行する
以下のジョブでは、 IBM QuantumV2 のプリミティブを使用しています。 SamplerV2 1つ以上のプリミティブ統合ブロック(PUB)を入力として受け取る。 各 PUB は、1つの回路と、その回路にブロードキャストされるデータ(複数のパラメータを含む場合がある)を含むタプルであり、 PUB ごとに1つの結果を返します。
import requests
url = 'https://quantum.cloud.ibm.com/api/v1/jobs'
auth_id = "Bearer <YOUR_BEARER_TOKEN>"
crn = "<SERVICE-CRN>"
backend = "<BACKEND_NAME>"
headers = {
'Content-Type': 'application/json',
'Authorization':auth_id,
'Service-CRN': crn
}
job_input = {
'program_id': 'sampler',
"backend": backend,
"params": {
# primitive unified blocs (PUBs) containing one circuit each:
"pubs": [[resulting_qasm],[resulting_qasm,None,500]]
}}
response = requests.post(url, headers=headers, json=job_input)
if response.status_code == 200:
job_id = response.json().get('id')
print("Job created:",response.text)
else:
print(f"Error: {response.status_code}")4. ジョブのステータスを確認し、結果を取得する
次に、APIに job_id を渡します:
response_status_singlejob= requests.get(url+'/'+job_id, headers=headers)
response_status_singlejob.json().get('state')出力
>>> Job ID: 58223448-5100-4dec-a47a-942fb30edced
>>> Job Status: JobStatus.RUNNING求人検索結果を表示:
response_result= requests.get(url+'/'+job_id+'/results', headers=headers)
res_dict=response_result.json()
# Get results for the first PUB
counts=res_dict['results'][0]['data']['c']['samples']
print(counts[:20])出力
['0x3', '0x0', '0x2', '0x1', '0x0', '0x3', '0x0', '0x3', '0x1', '0x2', '0x2', '0x0', '0x2', '0x0', '0x3', '0x3', '0x2', '0x0', '0x1', '0x0']5. 「 IBM Quantum 」のコンピュートサービスのオプションを活用する
エラー軽減技術により、ユーザーは実行時のデバイスノイズをモデル化することで、回路エラーを軽減することができます。 これにより、通常、モデルの学習に関連する量子側の前処理オーバーヘッドと、生成されたモデルを用いて生データの誤差を補正するための古典側の後処理オーバーヘッドが発生することになる。
プリミティブに組み込まれたエラー軽減技術は、高度な耐障害性オプションです。 これらのオプションを指定するには、ジョブを送信する際に オプション resilience_level を使用してください。
V2 サンプラーでは、回復力のレベルを指定することはできません。 ただし、個々のエラー軽減/抑制手法については、有効化または無効化することができます。
以下の例は、動的デカップリングとツイリングのデフォルト設定を示しています。 その他のオプションや詳細については、「 エラーの軽減および抑制手法 」のトピックをご覧ください。
動的デカップリング
import requests
url = 'https://quantum.cloud.ibm.com/api/v1/jobs'
auth_id = "Bearer <YOUR_BEARER_TOKEN>"
crn = "<SERVICE-CRN>"
backend = "<BACKEND_NAME>"
headers = {
'Content-Type': 'application/json',
'Authorization':auth_id,
'Service-CRN': crn
}
job_input = {
'program_id': 'sampler',
"backend": backend,
"params": {
# primitive unified blocs (PUBs) containing one circuit each:
"pubs": [[resulting_qasm]],
"options": {
"dynamical_decoupling": {
"enable": True,
"sequence_type": 'XpXm',
"extra_slack_distribution": 'middle',
"scheduling_method": 'alap',
},
},
}
}
response = requests.post(url, headers=headers, json=job_input)
if response.status_code == 200:
job_id = response.json().get('id')
print("Job created:",response.text)
else:
print(f"Error: {response.status_code}")くるくる回る
import requests
url = 'https://quantum.cloud.ibm.com/api/v1/jobs'
auth_id = "Bearer <YOUR_BEARER_TOKEN>"
crn = "<SERVICE-CRN>"
backend = "<BACKEND_NAME>"
headers = {
'Content-Type': 'application/json',
'Authorization':auth_id,
'Service-CRN': crn
}
job_input = {
'program_id': 'sampler',
"backend": backend,
"params": {
# primitive unified blocs (PUBs) containing one circuit each:
"pubs": [[resulting_qasm]],
"options": {
"twirling": {
"enable_gates": True,
"enable_measure": True,
"num_randomizations": "auto",
"shots_per_randomization": "auto",
"strategy": "active-accum",
},
},
}
}
response = requests.post(url, headers=headers, json=job_input)
if response.status_code == 200:
job_id = response.json().get('id')
print("Job created:",response.text)
else:
print(f"Error: {response.status_code}")パラメータ化回路
1. アカウントを初期化する
まず、アカウントを初期化する必要があります。 その後、計算を実行するデバイスを選択できます。
このトピックでは、アカウントの初期化方法、利用可能なバックエンドの確認方法、およびトークンの無効化方法について詳しく説明しています。
2. パラメータを定義する
import requests
import qiskit_ibm_runtime
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.qasm3 import dumps
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit import transpile
service = QiskitRuntimeService(channel='ibm_quantum')
backend = service.backend("<SPECIFY BACKEND>")
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
theta = Parameter('theta')
phi = Parameter('phi')
# In case we want to pass a dictionary:
parameter_values = {'theta': 1.57, 'phi': 3.14} 3. 量子回路を作成し、パラメータ化ゲートを追加する
qc = QuantumCircuit(2)
# Add parameterized gates
qc.rx(theta, 0)
qc.ry(phi, 1)
qc.cx(0, 1)
qc.measure_all()
# Draw the original circuit
qc.draw('mpl')
# Get an ISA circuit
isa_circuit = pm.run(qc)4. QASM 3 コードを生成する
qasm_str = dumps(isa_circuit)
print("Generated QASM 3 code:")
print(qasm_str)5. Samplerの V2 APIを使用して量子回路を実行する
import requests
url = 'https://quantum.cloud.ibm.com/api/v1/jobs'
auth_id = "Bearer <YOUR_BEARER_TOKEN>"
crn = "<SERVICE-CRN>"
backend = "<BACKEND_NAME>"
headers = {
'Content-Type': 'application/json',
'Authorization':auth_id,
'Service-CRN': crn
}
job_input = {
'program_id': 'sampler',
"backend": backend,
"params": {
# Choose one option: direct parameter transfer or through a dictionary
# # primitive unified blocs (PUBs) containing one circuit each:
#"pubs": [[qasm_str,[1,2],500]],
# primitive unified blocs (PUBs) containing one circuit each:
"pubs": [[qasm_str,parameter_values,500]],
}}
response = requests.post(url, headers=headers, json=job_input)
if response.status_code == 200:
job_id = response.json().get('id')
print(f"Job created: {response.text}")
else:
print(f"Error: {response.status_code}")print(response.text)6. ジョブのステータスを確認し、結果を取得する
次に、APIに job_id を渡します:
response_status_singlejob = requests.get(f"{url}/{job_id}", headers=headers)
response_status_singlejob.json().get('state')出力
{'status': 'Completed'}求人検索結果を表示:
response_result = requests.get(f"{url}/{job_id}/results", headers=headers)
res_dict=response_result.json()
# Get results for the first PUB
counts=res_dict['results'][0]['data']['c']['samples']
print(counts[:20])出力
['0x1', '0x2', '0x1', '0x2', '0x1', '0x2', '0x0', '0x2', '0x1', '0x1', '0x2', '0x2', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1']