اكتب برنامجك الأول مع Qiskit Serverless
إصدارات الحزم
الكود في هذه الصفحة طُوِّر باستخدام المتطلبات التالية. نوصي باستخدام هذه الإصدارات أو ما هو أحدث.
qiskit[all]~=1.3.1
qiskit-ibm-runtime~=0.34.0
qiskit-aer~=0.15.1
qiskit-serverless~=0.18.1
qiskit-ibm-catalog~=0.2
qiskit-addon-sqd~=0.8.1
qiskit-addon-utils~=0.1.0
qiskit-addon-mpf~=0.2.0
qiskit-addon-aqc-tensor~=0.1.2
qiskit-addon-obp~=0.1.0
scipy~=1.15.0
pyscf~=2.8.0
يوضّح هذا المثال كيفية استخدام أدوات qiskit-serverless لإنشاء برنامج تحويل (transpilation) متوازٍ، ثم توظيف qiskit-ibm-catalog لنشر البرنامج على منصة IBM Quantum Platform واستخدامه كخدمة عن بُعد قابلة لإعادة الاستخدام.
مثال: التحويل عن بُعد باستخدام Qiskit Serverless
ابدأ بالمثال التالي الذي يحوِّل circuit بالاعتماد على backend محدد ومستوى تحسين optimization_level مستهدف، ثم أضف عناصر تدريجيًا لنشر حِملك على Qiskit Serverless.
ضع خلية الكود التالية في الملف ./source_files/transpile_remote.py. هذا الملف هو البرنامج الذي سترفعه إلى Qiskit Serverless.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-catalog qiskit-ibm-runtime qiskit-serverless
# This cell is hidden from users, it just creates a new folder
from pathlib import Path
Path("./source_files").mkdir(exist_ok=True)
%%writefile ./source_files/transpile_remote.py
from qiskit.transpiler import generate_preset_pass_manager
def transpile_remote(circuit, optimization_level, backend):
"""Transpiles an abstract circuit into an ISA circuit for a given backend."""
pass_manager = generate_preset_pass_manager(
optimization_level=optimization_level,
backend=backend
)
isa_circuit = pass_manager.run(circuit)
return isa_circuit
Writing ./source_files/transpile_remote.py
إعداد ملفاتك
يتطلّب Qiskit Serverless تنظيم ملفات .py الخاصة بحِملك في مجلد مخصص. الهيكل التالي مثال على الممارسات الجيدة:
serverless_program
├── program_uploader.ipynb
└── source_files
├── transpile_remote.py
└── *.py
يرفع Serverless محتويات source_files لتشغيلها عن بُعد. بعد إعداد هذه الملفات، يمكنك تعديل transpile_remote.py لاسترجاع المدخلات وإرجاع المخرجات.
الحصول على وسيطات البرنامج
يمتلك transpile_remote.py الأوّلي ثلاثة مدخلات: circuits وbackend_name وoptimization_level. يقتصر Serverless حاليًا على قبول المدخلات والمخرجات القابلة للتسلسل (serializable)، لذا لا يمكنك تمرير backend مباشرةً؛ استخدم backend_name كسلسلة نصية بدلًا من ذلك.
%%writefile --append ./source_files/transpile_remote.py
from qiskit_serverless import get_arguments, save_result, distribute_task, get
# Get program arguments
arguments = get_arguments()
circuits = arguments.get("circuits")
backend_name = arguments.get("backend_name")
optimization_level = arguments.get("optimization_level")
Appending to ./source_files/transpile_remote.py
عند هذه النقطة، يمكنك الحصول على الـ backend باستخدام QiskitRuntimeService وإضافة برنامجك الحالي بالكود التالي. يستلزم هذا الكود أن تكون قد حفظت بيانات اعتمادك مسبقًا.
%%writefile --append ./source_files/transpile_remote.py
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.backend(backend_name)
Appending to ./source_files/transpile_remote.py
أخيرًا، يمكنك تشغيل transpile_remote() على جميع الـ circuits الممرَّرة وإرجاع transpiled_circuits كنتيجة:
%%writefile --append ./source_files/transpile_remote.py
results = [
transpile_remote(circuit, 1, backend)
for circuit in circuits
]
save_result({
"transpiled_circuits": results
})
Appending to ./source_files/transpile_remote.py
النشر على منصة IBM Quantum Platform
أنشأ القسم السابق برنامجًا للتشغيل عن بُعد. تقوم خلايا الكود في هذا القسم برفع ذلك البرنامج إلى Qiskit Serverless.
استخدم qiskit-ibm-catalog للمصادقة مع QiskitServerless عبر مفتاح API الخاص بك، الذي يمكنك العثور عليه في لوحة تحكم IBM Quantum، ثم ارفع البرنامج.
يمكنك استخدام save_account() لحفظ بيانات اعتمادك (راجع قسم الإعداد لاستخدام IBM Cloud). لاحظ أن هذا يكتب بيانات اعتمادك في نفس الملف المستخدَم من قِبَل QiskitRuntimeService.save_account().
from qiskit_ibm_catalog import QiskitServerless, QiskitFunction
# Authenticate to the remote cluster and submit the pattern for remote execution
serverless = QiskitServerless()
يضغط Qiskit Serverless محتويات working_dir (في هذه الحالة source_files) في ملف tar، يُرفَع ثم يُحذَف بعد ذلك. يحدِّد entrypoint الملف التنفيذي الرئيسي للبرنامج الذي سيشغّله Qiskit Serverless. علاوةً على ذلك، إذا كان برنامجك يعتمد على تبعيات pip مخصصة، يمكنك إضافتها في مصفوفة dependencies:
transpile_remote_demo = QiskitFunction(
title="transpile_remote_serverless",
entrypoint="transpile_remote.py",
working_dir="./source_files/",
)
serverless.upload(transpile_remote_demo)
QiskitFunction(transpile_remote_serverless)
للتحقق من نجاح الرفع، استخدم serverless.list():
# Get program from serverless.list() that matches the title of the one we uploaded
next(
program
for program in serverless.list()
if program.title == "transpile_remote_serverless"
)
QiskitFunction(transpile_remote_serverless)
# This cell is hidden from users, it checks the program uploaded correctly
assert _.title == "transpile_remote_serverless" # noqa: F821
# This cell is hidden from users, it checks the program executes correctly
from time import sleep
from qiskit import QuantumCircuit
qc = QuantumCircuit(2)
transpile_remote_serverless = serverless.load("transpile_remote_serverless")
job = transpile_remote_serverless.run(
circuits=[qc],
backend="ibm_sherbrooke",
optimization_level=1,
)
while True:
sleep(5)
status = job.status()
if status not in ["QUEUED", "INITIALIZING", "RUNNING", "DONE"]:
raise Exception(
f"Unexpected job status: '{status}'\n"
+ "Here are the logs:\n"
+ job.logs()
)
if status == "DONE":
break
الخطوات التالية
- تعرّف على كيفية تمرير المدخلات وتشغيل برنامجك عن بُعد في موضوع تشغيل أول حِمل عمل لك مع Qiskit Serverless عن بُعد.