Sampler gamit ang REST API
Ang mga hakbang sa paksang ito ay naglalarawan kung paano magpatakbo at mag-configure ng mga workload gamit ang REST API, at nagpapakita kung paano ilunsad ang mga ito sa anumang programa ng iyong pagpili.
Ang dokumentasyong ito ay gumagamit ng Python na module na requests para ipakita ang Qiskit Runtime REST API. Gayunpaman, maaaring isagawa ang workflow na ito gamit ang anumang wika o framework na sumusuporta sa paggawa gamit ang mga REST API. Sumangguni sa dokumentasyon ng API reference para sa mga detalye.
1. I-initialize ang account
Dahil ang Qiskit Runtime Sampler ay isang managed na serbisyo, kailangan mo munang i-initialize ang iyong account. Maaari kang pumili ng device na gusto mong gamitin para patakbuhin ang iyong mga kalkulasyon.
Hanapin ang mga detalye kung paano i-initialize ang iyong account, tingnan ang mga available na backend, at gumana gamit ang mga token sa I-set up para gamitin ang IBM Quantum Platform gamit ang REST API.
2. Lumikha ng QASM circuit
Kailangan mo ng kahit isang circuit bilang input sa Sampler primitive.
Tukuyin ang isang QASM quantum circuit:
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];
'''
Ang mga snippet ng code na ibinibigay sa ibaba ay ipinapalagay na ang qasm_string ay na-transpile sa isang bagong string na resulting_qasm.
3. Patakbuhin ang quantum circuit gamit ang Sampler V2 API
Ang mga job sa ibaba ay gumagamit ng Qiskit Runtime V2 primitives. Ang SamplerV2 ay tumatanggap ng isa o higit pang primitive unified bloc (PUB) bilang input. Ang bawat PUB ay isang tuple na naglalaman ng isang circuit at ng data na ina-broadcast sa circuit na iyon, na maaaring maraming parameter, at nagbabalik ng isang resulta bawat PUB.
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. Suriin ang status ng job at makuha ang mga resulta
Susunod, ipasa ang job_id sa API:
response_status_singlejob= requests.get(url+'/'+job_id, headers=headers)
response_status_singlejob.json().get('state')
Output
>>> Job ID: 58223448-5100-4dec-a47a-942fb30edced
>>> Job Status: JobStatus.RUNNING
Makuha ang mga resulta ng job:
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])
Output
['0x3', '0x0', '0x2', '0x1', '0x0', '0x3', '0x0', '0x3', '0x1', '0x2', '0x2', '0x0', '0x2', '0x0', '0x3', '0x3', '0x2', '0x0', '0x1', '0x0']
5. Gumana gamit ang mga opsyon ng Qiskit Runtime
Ang mga teknik ng error mitigation ay nagpapahintulot sa mga gumagamit na mapagaan ang mga error ng circuit sa pamamagitan ng pag-modelo ng noise ng device sa oras ng execution. Karaniwang nagdudulot ito ng overhead sa quantum pre-processing na may kaugnayan sa pagsasanay ng modelo, at overhead sa classical post-processing para mapagaan ang mga error sa mga raw na resulta sa pamamagitan ng paggamit ng nabuong modelo.
Ang mga teknik ng error mitigation na built-in sa mga primitive ay mga advanced na opsyon ng resilience. Para tukuyin ang mga opsyon na ito, gamitin ang opsyon na resilience_level kapag nagsusumite ng iyong job.
Hindi sinusuportahan ng Sampler V2 ang pagtukoy ng mga antas ng resilience. Gayunpaman, maaari mong i-on o i-off ang mga indibidwal na pamamaraan ng error mitigation / suppression.
Ang mga sumusunod na halimbawa ay nagpapakita ng mga default na opsyon para sa dynamical decoupling at twirling. Hanapin ang higit pang mga opsyon at karagdagang detalye sa paksa ng Mga teknik ng error mitigation at suppression.
Dynamical decoupling
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}")
Twirling
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}")
Mga parametrized na circuit
1. I-initialize ang account
Dahil ang Qiskit Runtime ay isang managed na serbisyo, kailangan mo munang i-initialize ang iyong account. Maaari kang pumili ng device na gusto mong gamitin para patakbuhin ang iyong mga kalkulasyon.
Hanapin ang mga detalye kung paano i-initialize ang iyong account, tingnan ang mga available na backend, at i-invalidate ang mga token sa paksang ito.
2. Tukuyin ang mga parameter
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. Lumikha ng quantum circuit at magdagdag ng mga parametrized na gate
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. Bumuo ng QASM 3 code
qasm_str = dumps(isa_circuit)
print("Generated QASM 3 code:")
print(qasm_str)
5. Patakbuhin ang quantum circuit gamit ang 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. Suriin ang status ng job at makuha ang mga resulta
Susunod, ipasa ang job_id sa API:
response_status_singlejob = requests.get(f"{url}/{job_id}", headers=headers)
response_status_singlejob.json().get('state')
Output
{'status': 'Completed'}
Makuha ang mga resulta ng job:
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])
Output
['0x1', '0x2', '0x1', '0x2', '0x1', '0x2', '0x0', '0x2', '0x1', '0x1', '0x2', '0x2', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1']
Mga susunod na hakbang
- Mayroong ilang paraan para magpatakbo ng mga workload, depende sa iyong mga pangangailangan: job mode, session mode, at batch mode. Matuto kung paano gumana gamit ang session mode at batch mode sa paksa ng mga execution mode. Tandaan na ang mga gumagamit ng Open Plan ay hindi makakapagsumite ng mga session job.
- Matuto kung paano i-initialize ang iyong account gamit ang REST API.
- Magsanay sa mga primitive sa pamamagitan ng paggawa ng Cost function lesson sa IBM Quantum Learning.
- Alamin kung paano mag-transpile nang lokal sa seksyon ng Transpile.