Sampler dengan REST API
Langkah-langkah dalam topik ini menerangkan cara menjalankan dan mengkonfigurasi beban kerja dengan REST API, serta menunjukkan cara memanggilnya dalam mana-mana program yang kamu pilih.
Dokumentasi ini menggunakan modul Python requests untuk menunjukkan REST API Qiskit Runtime. Walau bagaimanapun, aliran kerja ini boleh dilaksanakan menggunakan mana-mana bahasa atau rangka kerja yang menyokong kerja dengan REST API. Rujuk dokumentasi rujukan API untuk butiran.
1. Mulakan akaun
Oleh sebab Qiskit Runtime Sampler adalah perkhidmatan terurus, kamu perlu memulakan akaun kamu terlebih dahulu. Kamu kemudian boleh memilih peranti yang ingin kamu gunakan untuk menjalankan pengiraan.
Cari butiran tentang cara memulakan akaun, melihat backend yang tersedia, dan bekerja dengan token dalam Sediakan untuk menggunakan IBM Quantum Platform dengan REST API.
2. Cipta litar QASM
Kamu memerlukan sekurang-kurangnya satu litar sebagai input kepada primitif Sampler.
Takrifkan litar kuantum 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];
'''
Petikan kod yang diberikan di bawah mengandaikan bahawa qasm_string telah ditranspil ke rentetan baru resulting_qasm.
3. Jalankan litar kuantum menggunakan API Sampler V2
Kerja-kerja di bawah menggunakan primitif V2 Qiskit Runtime. SamplerV2 mengambil satu atau lebih primitive unified bloc (PUB) sebagai input. Setiap PUB adalah tuple yang mengandungi satu litar dan data yang disiarkan kepada litar tersebut, yang boleh terdiri daripada berbilang parameter, dan mengembalikan satu keputusan bagi setiap 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. Semak status kerja dan dapatkan keputusan
Seterusnya, hantar job_id ke 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
Dapatkan keputusan kerja:
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. Bekerja dengan pilihan Qiskit Runtime
Teknik pengurangan ralat membolehkan pengguna mengurangkan ralat litar dengan memodelkan hingar peranti pada masa pelaksanaan. Ini biasanya mengakibatkan overhed pra-pemprosesan kuantum berkaitan dengan latihan model, dan overhed pasca-pemprosesan klasik untuk mengurangkan ralat dalam keputusan mentah menggunakan model yang dijana.
Teknik pengurangan ralat yang terbina dalam primitif adalah pilihan ketahanan lanjutan. Untuk menentukan pilihan ini, gunakan pilihan resilience_level apabila menghantar kerja kamu.
Sampler V2 tidak menyokong penentuan tahap ketahanan. Walau bagaimanapun, kamu boleh menghidupkan atau mematikan kaedah pengurangan / penindasan ralat individu.
Contoh-contoh berikut menunjukkan pilihan lalai untuk dynamical decoupling dan twirling. Cari lebih banyak pilihan dan butiran lanjut dalam topik Teknik pengurangan dan penindasan ralat.
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}")
litar berparameter
1. Mulakan akaun
Oleh sebab Qiskit Runtime adalah perkhidmatan terurus, kamu perlu memulakan akaun kamu terlebih dahulu. Kamu kemudian boleh memilih peranti yang ingin kamu gunakan untuk menjalankan pengiraan.
Cari butiran tentang cara memulakan akaun, melihat backend yang tersedia, dan membatalkan token dalam topik ini.
2. Takrifkan 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. Cipta litar kuantum dan tambah get berparameter
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. Jana kod QASM 3
qasm_str = dumps(isa_circuit)
print("Generated QASM 3 code:")
print(qasm_str)
5. Jalankan litar kuantum menggunakan API Sampler 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": {
# 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. Semak status kerja dan dapatkan keputusan
Seterusnya, hantar job_id ke API:
response_status_singlejob = requests.get(f"{url}/{job_id}", headers=headers)
response_status_singlejob.json().get('state')
Output
{'status': 'Completed'}
Dapatkan keputusan kerja:
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']
Langkah seterusnya
- Terdapat beberapa cara untuk menjalankan beban kerja, bergantung kepada keperluan kamu: mod kerja, mod sesi, dan mod batch. Pelajari cara bekerja dengan mod sesi dan mod batch dalam topik mod pelaksanaan. Perlu diingat bahawa pengguna Pelan Terbuka tidak boleh menghantar kerja sesi.
- Pelajari cara memulakan akaun kamu dengan REST API.
- Berlatih dengan primitif melalui pelajaran Fungsi kos dalam IBM Quantum Learning.
- Pelajari cara untuk mentranspil secara tempatan dalam bahagian Transpile.