Modos de execução usando REST API
Você pode executar suas cargas de trabalho primitivas do Qiskit usando REST APIs em um dos três modos de execução, dependendo das suas necessidades: job, session e batch. Este tópico explica esses modos.
Esta documentação utiliza o módulo Python requests para demonstrar a REST API do Qiskit Runtime. No entanto, esse fluxo de trabalho pode ser executado usando qualquer linguagem ou framework que suporte o trabalho com REST APIs. Consulte a documentação de referência da API para mais detalhes.
Modo job com REST API
No modo job, uma única requisição primitiva do Estimator ou do Sampler é feita sem um gerenciador de contexto. Veja como executar um Circuit quântico usando Estimator e Sampler para alguns exemplos.
Modo session com REST API
Uma session é um recurso do Qiskit Runtime que permite executar de forma eficiente cargas de trabalho iterativas com múltiplos jobs em computadores quânticos. O uso de sessions ajuda a evitar atrasos causados pelo enfileiramento de cada job separadamente, o que pode ser especialmente útil para tarefas iterativas que exigem comunicação frequente entre recursos clássicos e quânticos. Mais detalhes sobre Sessions podem ser encontrados na documentação.
Usuários do Plano Open não podem enviar jobs em session.
Iniciar uma session
Comece criando uma session e obtendo um ID de session.
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())
Saída
{'id': 'crw9s7cdbt40008jxesg'}
Encerrar uma session
É uma boa prática encerrar uma Session quando todos os jobs estiverem concluídos. Isso reduzirá o tempo de espera para os próximos usuários.
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)
Saída
Session closure response ok?: True
Modo batch com REST API
Alternativamente, você pode enviar um job em batch especificando o mode no payload da requisição. O modo batch pode ajudar a reduzir o tempo de processamento se todos os jobs puderem ser fornecidos desde o início. Saiba mais sobre o modo batch no guia de introdução aos modos de execução.
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']
Exemplos de jobs enviados em uma session
Uma vez que uma session esteja configurada, um ou mais jobs do Sampler ou do Estimator podem ser enviados para a mesma session especificando o ID da session.
Os <valores de parâmetro> em um PUB podem ser um único parâmetro ou uma lista de parâmetros. Também suporta broadcasting do numpy.
Jobs do Estimator no modo session
- 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)
},
}
}
Jobs do Sampler no modo session
- 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)
},
}
}
Próximos passos
- Revise exemplos detalhados das primitivas Sampler e Estimator usando REST API.
- Leia Migrar para primitivas V2.
- Pratique com primitivas trabalhando na lição de função de custo no IBM Quantum® Learning.
- Aprenda como transpilar localmente na seção Transpile.