Lewati ke konten utama

Mulai dengan Qiskit Functions

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-catalog qiskit-ibm-runtime
# This cell is hidden from users
# It gets these details programmatically so we can test this notebook
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit.circuit.random import random_circuit
from qiskit_ibm_catalog import QiskitFunctionsCatalog

service = QiskitRuntimeService()
instance = service.active_account()["instance"]
backend_name = service.least_busy().name
catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")
qesem_function = catalog.load("qedma/qesem")
circuit = random_circuit(num_qubits=2, depth=2, seed=42)
observable = "Z" * circuit.num_qubits

Pengguna Plan Premium, Flex, dan On-Prem (melalui IBM Quantum Platform API) bisa mulai menggunakan IBM Qiskit Functions secara gratis, atau bisa memperoleh lisensi dari salah satu mitra yang telah berkontribusi fungsi ke katalog.

Minta uji coba gratis untuk Qiskit Functions pihak ketiga

Untuk meminta uji coba gratis, buka Qiskit Functions Catalog, lalu jelajahi panel detail. Klik Request a free trial dan isi informasi yang dibutuhkan oleh partner Functions, termasuk AccessGroupId IBM Cloud:

  1. Buka IBM Cloud IAM.

  2. Verifikasi kelayakan.

    • Ganti akunmu di bilah menu pada header ke akun dengan format berikut: XXXXXXX - [Organization Name]

    • Pastikan organisasinya sama dengan yang terkait dengan akun Premium kamu.

    • Jika kamu melihat "[Your Name]'s Account", berarti kamu menggunakan akun pribadi kamu, yang tidak memenuhi syarat untuk akses premium.

  3. Temukan ID grup akses kamu.

    • Klik nama grup.

    • Klik Details.

    • Salin ID grup akses. ID tersebut harus dimulai dengan AccessGroup-.

Instal klien Qiskit Functions Catalog

  1. Untuk mulai menggunakan Qiskit Functions, instal klien IBM Qiskit Functions Catalog:

    pip install qiskit-ibm-catalog
  2. Ambil API key kamu dari IBM Quantum Platform dashboard, lalu aktifkan virtual environment Python kamu. Lihat instruksi instalasi jika kamu belum menyiapkan virtual environment.

    If you are working in a trusted Python environment (such as on a personal laptop or workstation), use the save_account() method to save your credentials locally. (Skip to the next step if you are not using a trusted environment, such as a shared or public computer, to authenticate to IBM Quantum Platform.)

    Instance yang kamu gunakan untuk mengautentikasi harus memiliki akses Qiskit Functions yang diaktifkan. Untuk mengonfigurasinya pada instance yang sudah ada, lihat Mengonfigurasi akses Qiskit Functions pada suatu instance.

    Untuk menggunakan save_account(), jalankan python di shell kamu, lalu masukkan yang berikut:

    from qiskit_ibm_catalog import QiskitFunctionsCatalog

    QiskitFunctionsCatalog.save_account(channel="ibm_quantum_platform", token="<your-token>", instance="<instance-crn>")

    Ketik exit(). Mulai sekarang, setiap kali kamu perlu melakukan autentikasi ke layanan, kamu bisa memuat kredensialmu dengan yang berikut:

    from qiskit_ibm_catalog import QiskitFunctionsCatalog
    catalog = QiskitFunctionsCatalog()

    Contohnya:

# Load saved credentials
from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")

Avoid executing code on an untrusted machine or an external cloud Python environment to minimize security risks. If you must use an untrusted environment (on, for example, a public computer), change your API key after each use by deleting it on the IBM Cloud API keys page to reduce risk. Learn more in the Managing user API keys topic. To initialize the service in this situation, use this code:

from qiskit_ibm_catalog import QiskitFunctionsCatalog

# After using the following code, delete your API key on the
# IBM Quantum Platform home dashboard
catalog = QiskitFunctionsCatalog(token="<YOUR_API_KEY>") # Use the 44-character
# API_KEY you created and saved from the IBM Quantum Platform Home dashboard
Lindungi API key kamu

Jangan pernah menyertakan key kamu di kode sumber, skrip Python, atau file notebook. Saat membagikan kode dengan orang lain, pastikan API key kamu tidak disematkan langsung di dalam skrip Python. Sebagai gantinya, bagikan skrip tanpa key dan berikan instruksi untuk menyiapkannya secara aman.

Jika kamu tidak sengaja membagikan key kamu kepada seseorang atau menyertakannya di version control seperti Git, segera cabut key kamu dengan menghapusnya di halaman IBM Cloud API keys untuk mengurangi risiko. Pelajari lebih lanjut di topik Managing user API keys.

Lihat daftar functions yang bisa kamu akses

Setelah melakukan autentikasi, kamu bisa melihat daftar functions dari Qiskit Functions Catalog yang bisa kamu akses:

catalog.list()
[QiskitFunction(qunova/hivqe-chemistry),
QiskitFunction(global-data-quantum/quantum-portfolio-optimizer),
QiskitFunction(algorithmiq/tem),
QiskitFunction(qedma/qesem),
QiskitFunction(multiverse/singularity),
QiskitFunction(ibm/circuit-function),
QiskitFunction(q-ctrl/optimization-solver),
QiskitFunction(colibritd/quick-pde),
QiskitFunction(q-ctrl/performance-management),
QiskitFunction(kipu-quantum/iskay-quantum-optimizer)]

Jalankan functions yang diaktifkan

Setelah objek catalog dibuat instance-nya, kamu bisa memilih function dengan menggunakan catalog.load("<provider/function-name>"):

qesem_function = catalog.load("qedma/qesem")

Setiap Qiskit Function memiliki input, opsi, dan output kustom. Periksa halaman dokumentasi khusus untuk function yang ingin kamu jalankan untuk informasi lebih lanjut. Secara default, semua pengguna hanya bisa menjalankan satu function job dalam satu waktu:

from qiskit.quantum_info import SparsePauliOp

avg_magnetization = SparsePauliOp.from_sparse_list(
[("Z", [q], 1 / 5) for q in range(5)], num_qubits=5
)

job = qesem_function.run(
pubs=[(circuit, [avg_magnetization, observable])],
backend_name=backend_name, # example: "ibm_fez"
# options = {
# "estimate_time_only": "empirical",
# "default_precision": 0.2, # Default precision is applied to all pubs that don't have a precision specified, see API reference for more details
# "max_execution_time": 3600, # You can specify a maximum QPU time in seconds, see API reference for more details
# "transpilation_level": "standard", # "minimal_with_layout_opt" for minimal transpilation, see API reference for more details
# "parallel_execution": True, # True for parallel execution, see API reference for more details
# },
)
job.job_id
'7f08c9d5-471b-4da2-92e7-4f2cb94c23a8'
tips

run() memeriksa sisa kapasitas dan akses backend kamu sebelum mengirimkan job. Jika instance kamu kehabisan kapasitas, atau backend yang kamu tentukan tidak dapat diakses, run() langsung memunculkan error alih-alih membiarkan job gagal di antrean. Saat kapasitas rendah, run() mengeluarkan peringatan. Berikan suppress_low_usage_warning=True untuk mematikannya.

job = qesem_function.run(
pubs=[(circuit, [avg_magnetization, observable])],
backend_name=backend_name, # example: "ibm_fez"
suppress_low_usage_warning=True,
# options = {
# "estimate_time_only": "empirical",
# "default_precision": 0.2, # Default precision is applied to all pubs that don't have a precision specified, see API reference for more details
# "max_execution_time": 3600, # You can specify a maximum QPU time in seconds, see API reference for more details
# "transpilation_level": "standard", # "minimal_with_layout_opt" for minimal transpilation, see API reference for more details
# "parallel_execution": True, # True for parallel execution, see API reference for more details
# },
)

Periksa status job

Dengan job_id Qiskit Function kamu, kamu bisa memeriksa status job yang sedang berjalan. Ini mencakup status berikut:

  • QUEUED: Program remote berada di antrean Qiskit Function. Prioritas antrean didasarkan pada seberapa banyak kamu telah menggunakan Qiskit Functions.

  • INITIALIZING: Program remote sedang dimulai; ini mencakup menyiapkan environment remote dan menginstal dependensi.

  • RUNNING: Program sedang berjalan. Ini juga mencakup beberapa status yang lebih detail jika didukung oleh function tertentu.

    • RUNNING: MAPPING: Function sedang memetakan input klasik kamu ke input kuantum.

    • RUNNING: OPTIMIZING_FOR_HARDWARE: Function sedang mengoptimalkan untuk QPU yang dipilih. Ini bisa mencakup transpilasi circuit, karakterisasi QPU, backpropagation observable, dan lain sebagainya.

    • RUNNING: WAITING_FOR_QPU: Function telah mengirimkan job ke IBM Quantum Compute Service, dan sedang menunggu di antrean.

    • RUNNING: EXECUTING_QPU: Function memiliki Quantum Compute job yang aktif.

    • RUNNING: POST_PROCESSING: Function sedang melakukan post-processing hasil, yang bisa mencakup mitigasi error, memetakan hasil kuantum ke klasik, dan lain sebagainya.

  • DONE: Program sudah selesai, dan kamu bisa mengambil data hasil dengan job.result().

  • ERROR: Program berhenti berjalan karena adanya masalah. Gunakan job.result() untuk mendapatkan pesan error.

  • CANCELED: Program dibatalkan oleh pengguna, layanan, atau server.

job.status()
'QUEUED'

Ambil hasil

Setelah program DONE, kamu bisa menggunakan job.result() untuk mengambil hasilnya. Format output ini bervariasi untuk setiap function, jadi pastikan untuk mengikuti dokumentasi khusus:

result = job.result()
print(result)
PrimitiveResult([PubResult(data=DataBin(evs=np.ndarray(<shape=(), dtype=float64>), stds=np.ndarray(<shape=(), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(), dtype=float64>)), metadata={'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32})], metadata={'dynamical_decoupling': {'enable': True, 'sequence_type': 'XX', 'extra_slack_distribution': 'middle', 'scheduling_method': 'alap'}, 'twirling': {'enable_gates': False, 'enable_measure': True, 'num_randomizations': 'auto', 'shots_per_randomization': 'auto', 'interleave_randomizations': True, 'strategy': 'active-accum'}, 'resilience': {'measure_mitigation': True, 'zne_mitigation': False, 'pec_mitigation': False}, 'version': 2})

Kamu juga bisa membatalkan job kapan saja:

job.cancel()
'Job has been stopped.'

Akses Quantum Compute job yang terkait

Qiskit Function bisa mengirimkan satu atau lebih Quantum Compute job ke QPU saat berjalan. Untuk mengambil ID dari runtime job tersebut, gunakan job.runtime_jobs(). Kamu bisa menggunakan ID ini untuk mengambil objek runtime job dari instance QiskitRuntimeService, atau untuk menemukan workload di dashboard IBM Quantum® Platform.

runtime_job_ids = job.runtime_jobs()
runtime_job_ids

Jika sebuah function mengelompokkan runtime job-nya ke dalam session atau batch, gunakan job.runtime_sessions() untuk melihat daftar ID session. Berikan satu ID session ke job.runtime_jobs() untuk mengembalikan hanya runtime job dalam session tersebut:

sessions = job.runtime_sessions()
if sessions:
session_runtime_jobs = job.runtime_jobs(runtime_session=sessions[0])
print(session_runtime_jobs)
else:
print("No runtime sessions for this job.")
catatan

Daftar yang dikembalikan bisa kosong. Sebuah function hanya melaporkan runtime job-nya ketika ia mengirimkannya melalui runtime service yang diterima function tersebut saat runtime, dan beberapa function tidak mengirimkan runtime job secara langsung.

Lihat log job

Gunakan job.logs() untuk mengambil output log yang dihasilkan oleh function saat berjalan. Log berguna untuk melacak progres dan untuk debugging job yang berakhir dalam status ERROR.

print(job.logs().splitlines())

Untuk job yang berjalan lama dan menghasilkan banyak baris log, gunakan job.filtered_logs() untuk mengembalikan hanya baris yang kamu inginkan. Berikan ekspresi reguler ke include untuk menyimpan baris yang cocok, atau ke exclude untuk menghapus baris yang cocok:

print(job.filtered_logs(include="iteration"))

Lihat daftar Qiskit Functions job yang sudah pernah dijalankan

Kamu bisa menggunakan jobs() untuk melihat daftar semua job yang dikirimkan ke Qiskit Functions:

old_jobs = catalog.jobs()
old_jobs
[<Job | f6c29f49-4d5f-4fff-aca6-2e9a115b9763>,
<Job | 7f08c9d5-471b-4da2-92e7-4f2cb94c23a8>,
<Job | 62fe9176-d1e5-467e-b2bd-7a3f3c7be4e5>,
<Job | af525b2e-16b1-45a1-80bb-dbd94ce30258>,
<Job | b95a7a57-c1ad-4958-b7ac-953e4e1ee824>,
<Job | 7bfa33da-0f17-4e67-84b6-f556f7eeb436>,
<Job | ca46c191-9eb9-4de6-bfa7-b60d7eb29b5e>,
<Job | 6ac0ba93-3831-43fb-9fb9-760da2225e06>,
<Job | f0e38071-060d-47e8-988d-9cc1f69358e3>,
<Job | 629cf110-e490-4675-8a07-f6d298d166b0>]

Untuk mempersempit hasil, berikan filter. Filter berdasarkan function dengan function, berdasarkan status dengan status, dan berdasarkan tanggal pengiriman dengan created_after. Jelajahi halaman hasil dengan limit dan offset:

recent_errors = catalog.jobs(
function=qesem_function,
status="ERROR",
created_after="2024-01-01T00:00:00Z",
limit=5,
)
recent_errors

Jika kamu sudah memiliki ID job untuk job tertentu, kamu bisa mengambil job tersebut dengan catalog.job():

# First, get the most recent job that has been executed.
latest_job = old_jobs[0]

# We can also get that same job with `catalog.job`
job_by_id = catalog.job(latest_job.job_id)

# Verify that the job is the same using both retrieval methods.
assert job_by_id.job_id == latest_job.job_id

# Print the job_id for this job.
print(job_by_id.job_id)
f6c29f49-4d5f-4fff-aca6-2e9a115b9763

Ambil pesan error

Jika status program adalah ERROR, gunakan job.error_message() untuk mengambil pesan error sebagai berikut:

job.error_message()
qiskit.exceptions.QiskitError: 'Workflow execution failed -- https://docs.quantum.ibm.com/errors#9999'

Langkah selanjutnya

Rekomendasi