REST APIを使用した実行モード
Qiskit primitiveのワークロードは、REST APIを使用して3つの実行モードのいずれかで実行できます。ニーズに応じて、ジョブ、セッション、バッチから選択してください。このトピックではこれらのモードについて説明します。
このドキュメントでは、Qiskit Runtime REST APIのデモンストレーションにPythonのrequestsモジュールを使用しています。ただし、このワークフローはREST APIをサポートする任意の言語やフレームワークを使用して実行できます。詳細については、APIリファレンスドキュメントを参照してください。
REST APIを使用したジョブモード
ジョブモードでは、コンテキストマネージャーなしでEstimatorまたはSamplerの単一のprimitive requestが行われます。いくつかの例については、EstimatorおよびSamplerを使用した量子回路の実行方法を参照してください。
REST APIを使用したセッションモード
セッションは、量子コンピューターで複数ジョブの反復ワークロードを効率的に実行できるQiskit Runtimeの機能です。セッションを使用すると、各ジョブを個別にキューに入れることによる遅延を回避できます。これは、古典リソースと量子リソース間の頻繁な通信を必要とする反復タスクで特に便利です。セッションの詳細については、ドキュメントを参照してください。
Open Planのユーザーはセッションジョブを送信できません。
セッションを開始する
まず、セッションを作成してセッションIDを取得します。
import json
import requests
sessionsUrl = "https://quantum.cloud.ibm.com/api/v1/sessions"
auth_id = "Bearer <YOUR_BEARER_TOKEN>"
backend = "<BACKEND_NAME>"
crn = "<SERVICE-CRN>"
headersList = {
"Accept": "application/json",
"Content-Type": "application/json",
"Authorization": auth_id,
"Service-CRN": crn
}
payload = json.dumps({
"backend": backend,
"mode": 'dedicated',
})
response = requests.request("POST", sessionsUrl, data=payload, headers=headersList)
sessionId = response.json()['id']
print(response.json())
Output
{'id': 'crw9s7cdbt40008jxesg'}
セッションを閉じる
すべてのジョブが完了したら、Sessionを閉じることをお勧めします。これにより、後続のユーザーの待ち時間が短縮されます。
closureURL="https://quantum.cloud.ibm.com/api/v1/sessions/"+sessionId+"/close"
headersList = {
"Accept": "application/json",
"Authorization": auth_id,
"Service-CRN": crn
}
closure_response = requests.request(
"DELETE",
closureURL,
headers=headersList
)
print("Session closure response ok?:",closure_response.ok,closure_response.text)
Output
Session closure response ok?: True
REST APIを使用したバッチモード
または、リクエストペイロードでmodeを指定することでバッチジョブを送信できます。すべてのジョブを最初から提供できる場合、バッチモードは処理時間の短縮に役立ちます。バッチモードについては、実行モードの概要ガイドで詳しく説明しています。
import json
import requests
sessionsUrl = "https://quantum.cloud.ibm.com/api/v1/sessions"
headersList = {
"Accept": "application/json",
"Authorization": auth_id,
"Service-CRN": crn,
'Content-Type': 'application/json'
}
payload = json.dumps({
"backend": backend,
"instance": "hub1/group1/project1",
"mode": "batch"
})
response = requests.request("POST", sessionsUrl, data=payload, headers=headersList)
sessionId = response.json()['id']
セッションで送信されるジョブの例
セッションが設定されると、セッションIDを指定することで、1つ以上のSamplerまたはEstimatorジョブを同じセッションに送信できます。
PUB内の<parameter values>は、単一のパラメーターまたはパラメーターのリストのいずれかを指定できます。また、numpyのブロードキャストもサポートしています。
セッションモードでのEstimatorジョブ
- 1 circuit, 4 observables
- 1 circuit, 4 observables, 2 parameter sets
- 2 circuits, 2 observables
job_input = {
'program_id': 'estimator',
"backend": backend,
"session_id": sessionId, # This specifies the previously created Session
"params": {
"pubs": [[resulting_qasm, [obs1, obs2, obs3, obs4]]], #primitive unified blocs (PUBs) containing one circuit each.
"options":{
"transpilation":{"optimization_level": 1},
"twirling": {"enable_gates": True,"enable_measure": True},
# "dynamical_decoupling": {"enable": True, "sequence_type": "XpXm"}, #(optional)
},
}
}
job_input = {
'program_id': 'estimator',
"backend": backend,
"session_id": sessionId, # This specifies the previously created Session
"params": {
"pubs": [[resulting_qasm, [[obs1], [obs2], [obs3], [obs4]], [[vals1], [vals2]]]], #primitive unified blocs (PUBs) containing one circuit each
"options":{
"transpilation":{"optimization_level": 1},
"twirling": {"enable_gates": True,"enable_measure": True},
# "dynamical_decoupling": {"enable": True, "sequence_type": "XpXm"}, #(optional)
},
}
}
job_input = {
'program_id': 'estimator',
"backend": backend,
"session_id": sessionId, # This specifies the previously created Session
"params": {
"pubs": [[resulting_qasm, obs1],[resulting_qasm, obs2]], #primitive unified blocs (PUBs) containing one circuit each
"options":{
"transpilation":{"optimization_level": 1},
"twirling": {"enable_gates": True,"enable_measure": True},
# "dynamical_decoupling": {"enable": True, "sequence_type": "XpXm"}, #(optional)
},
}
}
セッションモードでのSamplerジョブ
- 1 circuit, no parameters
- 1 circuit, 3 parameter sets
- 2 circuits, 1 parameter set
job_input = {
'program_id': 'sampler',
"backend": backend,
"session_id": sessionId, # This specifies the previously created Session
"params": {
"pubs": [[resulting_qasm]], #primitive unified blocs (PUBs) containing one circuit each
"options":{
"transpilation":{"optimization_level": 1},
"twirling": {"enable_gates": True,"enable_measure": True},
# "dynamical_decoupling": {"enable": True, "sequence_type": "XpXm"}, #(optional)
},
}
}
job_input = {
'program_id': 'sampler',
"backend": backend,
"session_id": sessionId, # This specifies the previously created Session
"params": {
"pubs": [[resulting_qasm, [vals1, vals2, vals3]]], #primitive unified blocs (PUBs) containing one circuit each
"options":{
"transpilation":{"optimization_level": 1},
"twirling": {"enable_gates": True,"enable_measure": True},
# "dynamical_decoupling": {"enable": True, "sequence_type": "XpXm"}, #(optional)
},
}
}
job_input = {
'program_id': 'sampler',
"backend": backend,
"session_id": sessionId, # This specifies the previously created Session
"params": {
"pubs": [[resulting_qasm, [val1]],[resulting_qasm,None,100]], #primitive unified blocs (PUBs) containing one circuit each
"options":{
"transpilation":{"optimization_level": 1},
"twirling": {"enable_gates": True,"enable_measure": True},
# "dynamical_decoupling": {"enable": True, "sequence_type": "XpXm"}, #(optional)
},
}
}
次のステップ
- REST APIを使用した詳細なSamplerとEstimatorのprimitivesの例を確認してください。
- V2 primitivesへの移行をお読みください。
- IBM Quantum® Learningのコスト関数レッスンでprimitivesを使って練習してください。
- Transpileセクションでローカルでのトランスパイル方法を学んでください。