Sampler dengan REST API
Langkah-langkah dalam topik ini menjelaskan cara menjalankan dan mengonfigurasi beban kerja dengan REST API, dan menunjukkan cara memanggilnya dalam program pilihanmu.
Dokumentasi ini menggunakan modul Python requests untuk mendemonstrasikan Qiskit Runtime REST API. Namun, alur kerja ini dapat dieksekusi menggunakan bahasa atau framework apa pun yang mendukung bekerja dengan REST API. Lihat dokumentasi referensi API untuk detailnya.
1. Inisialisasi akun
Karena Qiskit Runtime Sampler adalah layanan terkelola, kamu perlu menginisialisasi akunmu terlebih dahulu. Kamu kemudian bisa memilih perangkat yang ingin digunakan untuk menjalankan kalkulasimu.
Temukan detail tentang cara menginisialisasi akun, melihat backend yang tersedia, dan bekerja dengan token di Siapkan untuk menggunakan IBM Quantum Platform dengan REST API.
2. Buat circuit QASM
Kamu butuh setidaknya satu circuit sebagai input ke primitif Sampler.
Definisikan quantum circuit 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];
'''
Cuplikan kode yang diberikan di bawah mengasumsikan bahwa qasm_string telah ditranspile ke string baru resulting_qasm.
3. Jalankan quantum circuit menggunakan Sampler V2 API
Job-job di bawah menggunakan primitif Qiskit Runtime V2. SamplerV2 mengambil satu atau lebih primitive unified bloc (PUB) sebagai input. Setiap PUB adalah tuple yang berisi satu circuit dan data yang di-broadcast ke circuit tersebut, yang bisa berupa beberapa parameter, dan mengembalikan satu hasil per 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. Periksa status job dan dapatkan hasil
Selanjutnya, teruskan 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 hasil 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. Bekerja dengan opsi Qiskit Runtime
Teknik mitigasi error memungkinkan pengguna memitigasi error circuit dengan memodelkan noise perangkat pada saat eksekusi. Ini biasanya menghasilkan overhead pra-pemrosesan kuantum yang berkaitan dengan pelatihan model, dan overhead pasca-pemrosesan klasik untuk memitigasi error dalam hasil mentah menggunakan model yang dihasilkan.
Teknik mitigasi error yang dibangun ke dalam primitif adalah opsi resilience tingkat lanjut. Untuk menentukan opsi ini, gunakan opsi resilience_level saat mengirimkan job-mu.
Sampler V2 tidak mendukung penentuan tingkat resilience. Namun, kamu bisa mengaktifkan atau menonaktifkan metode mitigasi/suppression error individual.
Contoh-contoh berikut mendemonstrasikan opsi default untuk dynamical decoupling dan twirling. Temukan lebih banyak opsi dan detail lebih lanjut di topik Teknik mitigasi dan suppression error.
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}")
Circuit berparameter
1. Inisialisasi akun
Karena Qiskit Runtime adalah layanan terkelola, kamu perlu menginisialisasi akunmu terlebih dahulu. Kamu kemudian bisa memilih perangkat yang ingin digunakan untuk menjalankan kalkulasimu.
Temukan detail tentang cara menginisialisasi akun, melihat backend yang tersedia, dan membatalkan token di topik ini.
2. Definisikan 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. Buat quantum circuit dan tambahkan gate 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. Hasilkan kode QASM 3
qasm_str = dumps(isa_circuit)
print("Generated QASM 3 code:")
print(qasm_str)
5. Jalankan quantum circuit menggunakan 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. Periksa status job dan dapatkan hasil
Selanjutnya, teruskan 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 hasil 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']
Langkah selanjutnya
- Ada beberapa cara untuk menjalankan beban kerja, tergantung kebutuhanmu: mode job, mode sesi, dan mode batch. Pelajari cara bekerja dengan mode sesi dan mode batch di topik mode eksekusi. Perhatikan bahwa pengguna Open Plan tidak dapat mengirimkan job sesi.
- Pelajari cara menginisialisasi akunmu dengan REST API.
- Berlatih dengan primitif dengan mengerjakan pelajaran Cost function di IBM Quantum Learning.
- Pelajari cara transpile secara lokal di bagian Transpile.