Przejdź do głównej treści

Zdalne uruchamianie pierwszego zadania Qiskit Serverless

Wersje pakietów

Kod na tej stronie został opracowany przy użyciu poniższych wymagań. Zalecamy używanie tych wersji lub nowszych.

qiskit[all]~=1.4.0
qiskit-ibm-runtime~=0.36.1
qiskit-ibm-catalog~=0.4

Ta sekcja przedstawia, jak używać qiskit-ibm-catalog do wyświetlania listy programów dostępnych w Qiskit Serverless, przekazywania do nich danych wejściowych, zdalnego uruchamiania, sprawdzania statusu oraz pobierania wyników i logów.

Upewnij się, że uwierzytelniłeś się w Qiskit Serverless przy użyciu swojego klucza API (patrz Wdrożenie na IBM Quantum Platform w celu uzyskania instrukcji).

Wyświetlanie listy dostępnych programów

Możesz użyć QiskitServerless.list(), aby pobrać listę dostępnych programów do uruchomienia za pomocą Qiskit Serverless. Zawiera ona wcześniej przesłany program transpile_remote_serverless.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-catalog qiskit-ibm-runtime
from qiskit_ibm_catalog import QiskitServerless

serverless = QiskitServerless()
next(
program
for program in serverless.list()
if program.title == "transpile_remote_serverless"
)
QiskitFunction(transpile_remote_serverless)

Uruchamianie przesłanego programu i przekazywanie danych wejściowych

Najpierw skonfiguruj dane wejściowe. Twój program ma trzy dane wejściowe: circuits, backend i optimization_level. Możesz użyć random_circuit, aby utworzyć 30 losowych Circuit:

from qiskit.circuit.random import random_circuit

qc_random = [(random_circuit(4, 4, measure=True, seed=i)) for i in range(10)]
qc_random[0].draw(output="mpl", idle_wires=False)

Wynik poprzedniej komórki kodu

Następnie użyj QiskitRuntimeService i least_busy, aby wybrać backend:

from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
print(backend.name)

Ustaw poziom optymalizacji:

optimization_level = 3

Wybierz swój program za pomocą serverless.load('PROGRAM_NAME'):

transpile_remote_serverless = serverless.load("transpile_remote_serverless")

Następnie przekaż swoje dane wejściowe i uruchom program w sposób pythoniczny:

job = transpile_remote_serverless.run(
circuits=qc_random,
backend=backend.name,
optimization_level=optimization_level,
)
job.job_id
'118256c5-bbb0-4ea8-9e9f-51aac2220aef'

Sprawdzanie statusu zadania

Mając job_id Qiskit Serverless, możesz sprawdzić status uruchomionych zadań. Obejmuje to następujące statusy:

  • QUEUED: Zdalny program jest w kolejce Qiskit Serverless. Priorytet kolejki jest obecnie oparty na tym, jak dużo używałeś Qiskit Serverless
  • INITIALIZING: Zdalny program jest uruchamiany; obejmuje to konfigurację zdalnego środowiska i instalację zależności
  • RUNNING: Program jest uruchomiony. Na tym etapie, jeśli masz wyjścia print() w swoim programie, możesz pobrać logi za pomocą job.logs()
  • DONE: Program jest zakończony i możesz pobrać dane zapisane w save_result() za pomocą job.results()

Możesz również ustawić bardziej szczegółowe statusy zadań w sekcji Zarządzanie zasobami obliczeniowymi i danymi Qiskit Serverless.

job.status()
'QUEUED'
# This cell is hidden from users, it checks the job status
assert _ in ["QUEUED", "INITIALIZING", "RUNNING", "DONE"] # noqa: F821
wskazówka

Obecnie tabela zadań IBM Quantum odzwierciedla tylko zadania Qiskit Runtime. Użyj job.status(), aby zobaczyć aktualny status swojego zadania Qiskit Serverless.

Udało ci się uruchomić swój pierwszy program Qiskit Serverless!

Pobieranie logów i wyników

Jak wspomniano wcześniej, gdy program ma status RUNNING, możesz użyć job.logs(), aby pobrać logi utworzone z wyjść print():

logs = job.logs()
print(logs)
No logs yet.

W dowolnym momencie możesz również anulować zadanie:

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

Gdy program ma status DONE, możesz użyć job.results(), aby pobrać wynik zapisany w save_result():

# We can't get results from a cancelled job, so we'll fetch a completed one instead
completed_job = next(
job for job in serverless.jobs() if job.status() == "DONE"
)
completed_job.result()
{'transpiled_circuits': [<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93eca64810>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec5e5310>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec5d5310>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec58b490>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec57d310>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec535950>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec523c90>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec60a990>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec5527d0>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec4152d0>]}

Wyświetlanie listy wcześniej uruchomionych zadań z Qiskit Serverless

Możesz użyć jobs(), aby wyświetlić listę wszystkich zadań przesłanych do Qiskit Serverless:

old_jobs = serverless.jobs()
old_jobs
[<Job | 118256c5-bbb0-4ea8-9e9f-51aac2220aef>,
<Job | e9a36469-7d6b-4f00-bf91-78709ebdbbff>,
<Job | 4efd601b-8f61-4c8e-b14a-0b8a9c649dc0>,
<Job | 87cd22c7-8eb9-4606-bdb4-befe946e9e9b>,
<Job | be9a6dfd-0830-4250-aa60-acdd05bb8818>,
<Job | 479513dd-6a76-4c3e-ba49-bb21351b9a05>,
<Job | f9c20c31-be46-41b3-97ac-99f7be61f89e>,
<Job | 37fa2489-4449-4bfb-974e-9d9a9ec3cc21>,
<Job | b754c4e8-6817-48db-9bb9-74c151d6349a>,
<Job | 78bc6744-b417-48cb-8e01-59bb63bcc2be>]

Kolejne kroki

Zalecenia