Lewati ke konten utama

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.

catatan

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

catatan

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

Rekomendasi
  • 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.