Primii pași cu Qiskit Functions
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"qiskit": "qiskit", "qiskit_ibm_catalog": "qiskit-ibm-catalog", "qiskit_ibm_runtime": "qiskit-ibm-runtime"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
# 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
Utilizatorii planurilor Premium, Flex și On-Prem (prin IBM Quantum Platform API) pot începe să folosească IBM Qiskit Functions gratuit sau pot achiziționa o licență de la unul dintre partenerii care au contribuit cu o funcție la catalog.
Solicită o perioadă de probă gratuită pentru Qiskit Functions de la terți
Pentru a solicita o perioadă de probă gratuită, navighează la Qiskit Functions Catalog și explorează panoul de detalii. Fă clic pe Request a free trial și completează informațiile solicitate de partenerul Functions, inclusiv AccessGroupId din IBM Cloud:
-
Navighează la IBM Cloud IAM.
-
Verifică eligibilitatea.
-
Comută contul din bara de meniu din antet la unul cu următorul format:
XXXXXXX - [Organization Name] -
Asigură-te că organizația este aceeași cu cea asociată contului tău Premium.
-
Dacă vezi "[Your Name]'s Account", folosești contul tău personal, care nu este eligibil pentru acces premium.
-
-
Găsește ID-ul grupului tău de acces.
-
Fă clic pe un nume de grup.
-
Fă clic pe Details.
-
Copiază ID-ul grupului de acces. Ar trebui să înceapă cu
AccessGroup-.
-
Instalează clientul Qiskit Functions Catalog
-
Pentru a începe să folosești Qiskit Functions, instalează clientul IBM Qiskit Functions Catalog:
pip install qiskit-ibm-catalog -
Preia cheia ta API din IBM Quantum Platform dashboard și activează mediul tău virtual Python. Consultă instrucțiunile de instalare dacă nu ai deja configurat un mediu virtual.
Dacă lucrezi într-un mediu Python de încredere (cum ar fi pe un laptop sau o stație de lucru personală), folosește metoda
save_account()pentru a-ți salva acreditările local. (Sari la pasul următor dacă nu folosești un mediu de încredere, cum ar fi un computer partajat sau public, pentru a te autentifica în IBM Quantum Platform.)Instanța cu care te autentifici trebuie să aibă activat accesul la Qiskit Functions. Pentru a-l configura pe o instanță existentă, consultă Configurarea accesului la Qiskit Functions pe o instanță.
Pentru a folosi
save_account(), ruleazăpythonîn shell-ul tău, apoi introdu următoarele:from qiskit_ibm_catalog import QiskitFunctionsCatalogQiskitFunctionsCatalog.save_account(channel="ibm_quantum_platform", token="<your-token>", instance="<instance-crn>")Tastează
exit(). De acum înainte, ori de câte ori trebuie să te autentifici la serviciu, poți încărca credențialele cu următoarele:from qiskit_ibm_catalog import QiskitFunctionsCatalogcatalog = QiskitFunctionsCatalog()De exemplu:
# Load saved credentials
from qiskit_ibm_catalog import QiskitFunctionsCatalog
catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")
Evită să execuți cod pe o mașină care nu este de încredere sau pe un mediu Python cloud extern, pentru a minimiza riscurile de securitate. Dacă trebuie să folosești un mediu care nu este de încredere (de exemplu, un computer public), schimbă-ți cheia API după fiecare utilizare, ștergând-o din pagina IBM Cloud API keys, pentru a reduce riscul. Află mai multe în subiectul Managing user API keys. Pentru a inițializa serviciul în această situație, folosește acest cod:
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
Nu include niciodată cheia în codul sursă, scripturile Python sau fișierele notebook. Când distribui cod altora, asigură-te că cheia ta API nu este inclusă direct în scriptul Python. În schimb, distribuie scriptul fără cheie și oferă instrucțiuni pentru configurarea ei în siguranță.
Dacă distribui accidental cheia ta cuiva sau o incluzi într-un sistem de control al versiunilor precum Git, revocă imediat cheia ștergând-o pe pagina IBM Cloud API keys pentru a reduce riscul. Află mai multe în subiectul Managing user API keys.
Listează funcțiile la care ai acces
După ce te autentifici, poți lista funcțiile din Qiskit Functions Catalog la care ai acces:
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)]
Rulează funcțiile activate
După ce un obiect catalog a fost instanțiat, poți selecta o funcție folosind catalog.load("<provider/function-name>"):
qesem_function = catalog.load("qedma/qesem")
Fiecare Qiskit Function are intrări, opțiuni și ieșiri personalizate. Consultă paginile de documentație specifice pentru funcția pe care vrei să o rulezi pentru mai multe informații. În mod implicit, toți utilizatorii pot rula doar un job de funcție la un moment dat:
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'
run() verifică capacitatea rămasă și accesul la backend înainte de a trimite jobul. Dacă instanța ta nu mai are capacitate sau backend-ul pe care l-ai numit nu este accesibil, run() generează imediat o eroare, în loc să lase jobul să eșueze în coadă. Când capacitatea este scăzută, run() emite un avertisment. Transmite suppress_low_usage_warning=True pentru a-l dezactiva.
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
# },
)
Verifică starea jobului
Cu job_id-ul funcției tale Qiskit, poți verifica starea joburilor care rulează. Aceasta include următoarele stări:
-
QUEUED: Programul de la distanță se află în coada Qiskit Function. Prioritatea în coadă se bazează pe cât de mult ai folosit Qiskit Functions. -
INITIALIZING: Programul de la distanță pornește; aceasta include configurarea mediului de la distanță și instalarea dependențelor. -
RUNNING: Programul rulează. Aceasta include, de asemenea, mai multe stări detaliate, dacă sunt acceptate de funcții specifice.-
RUNNING: MAPPING: Funcția mapează în prezent intrările tale clasice la intrări cuantice. -
RUNNING: OPTIMIZING_FOR_HARDWARE: Funcția optimizează pentru QPU-ul selectat. Aceasta poate include transpilarea circuitului, caracterizarea QPU-ului, retropropagarea observabilelor și așa mai departe. -
RUNNING: WAITING_FOR_QPU: Funcția a trimis un job către IBM Quantum Compute Service și așteaptă în coadă. -
RUNNING: EXECUTING_QPU: Funcția are un job Quantum Compute activ. -
RUNNING: POST_PROCESSING: Funcția post-procesează rezultatele, ceea ce poate include atenuarea erorilor, maparea rezultatelor cuantice la cele clasice și așa mai departe.
-
-
DONE: Programul s-a finalizat și poți prelua datele rezultatului cujob.result(). -
ERROR: Programul s-a oprit din cauza unei probleme. Foloseștejob.result()pentru a obține mesajul de eroare. -
CANCELED: Programul a fost anulat de un utilizator, de serviciu sau de server.
job.status()
'QUEUED'
Preia rezultatele
După ce un program este DONE, poți folosi job.result() pentru a prelua rezultatul. Acest format de ieșire variază în funcție de fiecare funcție, așa că asigură-te că urmezi documentația specifică:
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})
De asemenea, poți anula un job în orice moment:
job.cancel()
'Job has been stopped.'
Accesează joburile Quantum Compute asociate
O Qiskit Function poate trimite unul sau mai multe joburi Quantum Compute către un QPU în timp ce rulează. Pentru a prelua ID-urile acelor joburi de runtime, folosește job.runtime_jobs(). Poți folosi aceste ID-uri pentru a prelua obiectele joburilor de runtime dintr-o instanță QiskitRuntimeService, sau pentru a găsi sarcinile pe dashboard-ul IBM Quantum® Platform.
runtime_job_ids = job.runtime_jobs()
runtime_job_ids
Dacă o funcție își grupează joburile de runtime în sesiuni sau loturi, folosește job.runtime_sessions() pentru a lista ID-urile sesiunilor. Transmite un ID de sesiune către job.runtime_jobs() pentru a returna doar joburile de runtime din acea sesiune:
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.")
Lista returnată poate fi goală. O funcție își raportează joburile de runtime doar atunci când le trimite prin serviciul runtime pe care funcția îl primește în timpul execuției, iar unele funcții nu trimit direct joburi de runtime.
Vizualizează jurnalele jobului
Folosește job.logs() pentru a prelua ieșirea jurnalului pe care o produce o funcție în timp ce rulează. Jurnalele sunt utile pentru urmărirea progresului și pentru depanarea unui job care se termină într-o stare ERROR.
print(job.logs().splitlines())
Pentru un job de lungă durată care produce multe linii de jurnal, folosește job.filtered_logs() pentru a returna doar liniile dorite. Transmite o expresie regulată către include pentru a păstra liniile care se potrivesc sau către exclude pentru a elimina liniile care se potrivesc:
print(job.filtered_logs(include="iteration"))
Listează joburile Qiskit Functions rulate anterior
Poți folosi jobs() pentru a lista toate joburile trimise către 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>]
Pentru a restrânge rezultatele, transmite filtre. Filtrează după funcție cu function, după stare cu status și după data trimiterii cu created_after. Parcurge rezultatele cu limit și offset:
recent_errors = catalog.jobs(
function=qesem_function,
status="ERROR",
created_after="2024-01-01T00:00:00Z",
limit=5,
)
recent_errors
Dacă ai deja ID-ul jobului pentru un anumit job, poți prelua jobul cu 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
Preia mesajele de eroare
Dacă starea unui program este ERROR, folosește job.error_message() pentru a prelua mesajul de eroare astfel:
job.error_message()
qiskit.exceptions.QiskitError: 'Workflow execution failed -- https://docs.quantum.ibm.com/errors#9999'
Pași următori
-
Explorează funcțiile de circuit pentru a construi algoritmi și aplicații noi, fără a fi nevoie să gestionezi transpilarea sau tratarea erorilor.
-
Explorează funcțiile de aplicație pentru a rezolva sarcini specifice unui domeniu, cu intrări și ieșiri clasice.
-
Consultă documentația de referință API pentru Qiskit Functions.
-
Pentru experiență practică, încearcă câteva tutoriale care demonstrează Qiskit Functions.