نقل الكود إلى Qiskit Serverless
يحصل Qiskit Serverless على ترقية، وميزاته تتطور بسرعة. خلال مرحلة التطوير هذه، يمكنك الاطلاع على ملاحظات الإصدار وأحدث الوثائق في صفحة Qiskit Serverless على GitHub.
يوضّح المثال التالي كيفية نقل كود موجود مسبقًا للاستفادة من Qiskit Serverless.
يفترض الكود التالي أنك قد حفظت بيانات اعتمادك مسبقًا. إن لم تكن قد فعلت ذلك، اتّبع التعليمات الواردة في صفحة إعداد حساب IBM Cloud الخاص بك للمصادقة باستخدام مفتاح API الخاص بك.
تحديث التجربة
في نسخة Serverless، أنشئ خدمة التشغيل باستخدام get_runtime_service() (من qiskit_serverless) بدلاً من QiskitRuntimeService()، بحيث تُتبَّع مهام وجلسات خدمة IBM Quantum® Compute Service التي يُطلقها مقابل مهمة Qiskit Serverless الأصلية. راجع كتابة أول برنامج Qiskit Serverless لك للتفاصيل.
- 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, get_runtime_service
# احصل على معاملات البرنامج
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(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 = get_runtime_service()
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())
Upload to Qiskit Serverless
Follow the instructions on the Introduction to Qiskit Functions page to authenticate with your API key.
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 والحوسبة الفائقة المتمحورة حول الكم لاستكشاف الكيمياء الكمية.