نقل الكود إلى Qiskit Serverless
نصيحة
يحصل Qiskit Serverless على ترقية، وميزاته تتطور بسرعة. خلال مرحلة التطوير هذه، يمكنك الاطلاع على ملاحظات الإصدار وأحدث الوثائق في صفحة Qiskit Serverless على GitHub.
يوضّح المثال التالي كيفية نقل كود موجود مسبقًا للاستفادة من Qiskit Serverless.
ملاحظة
يفترض الكود التالي أنك قد حفظت بيانات اعتمادك مسبقًا. إن لم تكن قد فعلت ذلك، اتّبع التعليمات الواردة في صفحة إعداد حساب IBM Cloud الخاص بك للمصادقة باستخدام مفتاح API الخاص بك.
تحديث التجربة
- Local Experiment
- Serverless
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit.circuit.random import random_circuit
qc_random = [(random_circuit(20, 20, measure=True)) for _ in range(30)]
optimization_level = 3
service = QiskitRuntimeService(channel="ibm_quantum_platform")
backend = service.get_backend(backend_name)
pass_manager = generate_preset_pass_manager(
optimization_level=optimization_level, backend=backend
)
# @distribute_task(target={"cpu": 1})
def transpile_parallel(circuit, pass_manager):
"""Distributed transpilation for an abstract circuit into an ISA circuit for a given backend."""
isa_circuit = pass_manager.run(circuit)
return isa_circuit
transpiled_circuits = [
transpile_parallel(circuit, pass_manager)
for circuit in circuits
]
print(transpiled_circuits)
# transpile_remote.py
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_serverless import get_arguments, save_result, distribute_task, get
from qiskit_ibm_runtime import QiskitRuntimeService
# Get program arguments
arguments = get_arguments()
circuits = arguments.get("circuits")
backend_name = arguments.get("backend_name")
optimization_level = arguments.get("optimization_level")
pass_manager = generate_preset_pass_manager(
optimization_level=optimization_level, backend=backend_name
)
# Distribute task across workers
@distribute_task(target={"cpu": 1})
def transpile_parallel(circuit, pass_manager):
"""Distributed transpilation for an abstract circuit into an ISA circuit for a given backend."""
isa_circuit = pass_manager.run(circuit)
return isa_circuit
try:
# Get backend
service = QiskitRuntimeService()
backend = service.get_backend(backend_name)
# run distributed tasks as async function
# we get task references as a return type
sample_task_references = [
transpile_parallel(circuit, pass_manager)
for circuit in circuits
]
# now we need to collect results from task references
results = get(sample_task_references)
# Return results
save_result({
"transpiled_circuits": results
})
except Exception as e:
# Exception handling
import traceback
print(traceback.format_exc())
الرفع إلى Qiskit Serverless
اتّبع التعليمات الواردة في صفحة مقدمة إلى Qiskit Functions للمصادقة باستخدام مفتاح API الخاص بك.
from qiskit_ibm_catalog import QiskitServerless, QiskitFunction
# Authenticate to the remote cluster and submit the pattern for remote execution.
serverless = QiskitServerless()
transpile_remote_demo = QiskitFunction(
title="transpile_remote_serverless",
entrypoint="transpile_remote.py",
working_dir="./source_files/",
)
serverless.upload(transpile_remote_demo)
الناتج
'transpile_remote_serverless'
التشغيل عن بُعد في Qiskit Serverless
from qiskit.circuit.random import random_circuit
from qiskit_ibm_runtime import QiskitRuntimeService
# Setup inputs
qc_random = [(random_circuit(20, 20, measure=True)) for _ in range(30)]
backend = "ibm_brisbane"
optimization_level = 3
# Running program
transpile_remote_serverless = serverless.load('transpile_remote_serverless')
job = transpile_remote_serverless.run(
circuits=qc_random,
backend=backend,
optimization_level=optimization_level
)
job.job_id
الناتج
'727e921d-512d-4b7d-af97-fe29e93ce7ea'
الخطوات التالية
توصيات
- اقرأ ورقة بحثية استخدم فيها الباحثون Qiskit Serverless والحوسبة الفائقة المتمحورة حول الكم لاستكشاف الكيمياء الكمية.