Langkau ke kandungan utama
Projek ini dalam fasa beta. Jumpa pepijat? Buat isu GitHub. Ada soalan atau idea? Tanya dalam Discussions — kami suka dengar maklum balas anda!
Bagaimana kualiti terjemahan pada halaman ini?

Estimator dengan REST API

Versi pakej

Kod pada halaman ini dibangunkan menggunakan keperluan berikut. Kami mengesyorkan anda guna versi ini atau yang lebih baharu.

qiskit[all]~=2.3.0

Langkah-langkah dalam topik ini menerangkan cara menjalankan dan mengkonfigurasi beban kerja dengan REST API, serta menunjukkan cara memanggilnya dalam mana-mana program pilihan anda.

nota

Dokumentasi ini menggunakan modul Python requests untuk mendemonstrasikan REST API. Walau bagaimanapun, aliran kerja ini boleh dilaksanakan menggunakan sebarang bahasa atau rangka kerja yang menyokong REST API. Rujuk dokumentasi rujukan API untuk maklumat lanjut.

1. Mulakan akaun​

Oleh sebab Estimator ialah perkhidmatan terurus, anda perlu memulakan akaun anda dulu. Kemudian anda boleh pilih peranti yang ingin anda gunakan untuk mengira nilai jangkaan.

Cari butiran tentang cara memulakan akaun, melihat Backend yang tersedia, dan membatalkan token dalam topik ini.

2. Cipta Circuit QASM​

Anda perlukan sekurang-kurangnya satu Circuit sebagai input kepada primitif Estimator.

Takrifkan Circuit kuantum QASM. Contohnya:

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];
'''

Coretan kod berikut menganggap bahawa qasm_string telah ditranspil kepada rentetan baharu resulting_qasm.

3. Jalankan Circuit kuantum menggunakan Estimator V2 API​

nota

Kerja-kerja berikut menggunakan primitif IBM Quantum. Kedua-dua Sampler dan Estimator menerima satu atau lebih primitive unified blocs (PUBs) sebagai input. Setiap PUB ialah tuple yang mengandungi satu Circuit dan data yang dipancarkan (broadcast) ke Circuit tersebut, yang boleh terdiri daripada pelbagai observable dan parameter. Setiap PUB mengembalikan satu keputusan.

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': 'estimator',
"backend": backend,
"params": {
"pubs": [ #primitive unified blocs (PUBs) containing one circuit each.
[resulting_qasm, # QASM circuit
{"IIZII": 1, "XIZZZ": 2.3}, # Observable
None # parameter values
]]
}}

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-942fb30edcad
>>> Job Status: JobStatus.RUNNING

Dapatkan keputusan kerja:

response_result= requests.get(url+'/'+job_id+'/results', headers=headers)

res_dict=response_result.json()

estimator_result=res_dict['results']
print(estimator_result)

Output

[{'data': {'evs': 0.7428980350102542, 'stds': 0.029884014518789213, 'ensemble_standard_error': 0.03261147170624149}, 'metadata': {'shots': 10016, 'target_precision': 0.01, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}}]

5. Bekerja dengan pilihan​

Teknik pengurangan ralat membolehkan pengguna mengurangkan ralat Circuit dengan memodelkan hingar peranti pada masa pelaksanaan. Ini biasanya menghasilkan overhed pra-pemprosesan kuantum berkaitan latihan model, dan overhed pasca-pemprosesan klasik untuk mengurangkan ralat dalam keputusan mentah dengan menggunakan model yang dijana.

Teknik pengurangan ralat yang terbina dalam primitif ialah pilihan resilience lanjutan. Untuk menentukan pilihan ini, gunakan pilihan resilience_level semasa menghantar kerja anda.

Contoh-contoh berikut menunjukkan pilihan lalai untuk dynamical decoupling, twirling, dan TREX + ZNE. Cari lebih banyak pilihan dan butiran lanjut dalam topik Teknik pengurangan dan penindasan ralat.

TREX + ZNE​

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': 'estimator',
"backend": backend,
"params": {
"pubs": [ #primitive unified blocs (PUBs) containing one circuit each
[resulting_qasm, # QASM circuit
{"IIZII": 1, "XIZZZ": 2.3}, # Observable
None # parameter values
]]
"options": {
"resilience": {
"measure_mitigation": True,
"zne_mitigation": True,
"zne": {
"extrapolator":["exponential", "linear"],
"noise_factors":[1, 3, 5],
},
},
},
}
}

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}")

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': 'estimator',
"backend": backend,
"params": {
"pubs": [ #primitive unified blocs (PUBs) containing one circuit each
[resulting_qasm, # QASM circuit
{"IIZII": 1, "XIZZZ": 2.3}, # Observable
None # parameter values
]]
"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': 'estimator',
"backend": backend,
"params": {
"pubs": [ #primitive unified blocs (PUBs) containing one circuit each
[resulting_qasm, # QASM circuit
{"IIZII": 1, "XIZZZ": 2.3}, # Observable
None # parameter values
]]
"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. Mulakan akaun​

Anda perlu memulakan akaun anda dulu. Kemudian anda boleh pilih peranti yang ingin anda gunakan untuk menjalankan pengiraan anda.

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')
parameter_values = {'theta': 1.57, 'phi': 3.14} # In case we want to pass a dictionary

3. Cipta Circuit kuantum dan tambah 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. Jana kod QASM 3​

qasm_str = dumps(isa_circuit)
print("Generated QASM 3 code:")
print(qasm_str)

5. Jalankan Circuit kuantum menggunakan Estimator 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': 'estimator',
"backend": backend,
"params": {
# Choose one option: direct parameter transfer or through a dictionary
#"pubs": [[qasm_str,[1,2],500]], # primitive unified blocs (PUBs) containing one circuit each.
"pubs": [[qasm_str,parameter_values,500]], # primitive unified blocs (PUBs) containing one circuit each.
}}

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​

Cadangan
  • Terdapat beberapa cara untuk menjalankan beban kerja, bergantung pada keperluan anda: job mode, session mode, dan batch mode. Ketahui cara bekerja dengan session mode dan batch mode dalam topik mod pelaksanaan. Perhatikan bahawa pengguna Open Plan tidak boleh menghantar kerja Session.
  • Ketahui cara memulakan akaun anda dengan REST API.
  • Berlatih dengan primitif melalui pelajaran Fungsi kos dalam IBM Quantum® Learning.
  • Ketahui cara mentranspil secara tempatan dalam bahagian Transpile.