انتقل إلى المحتوى الرئيسي

اكتب برنامجك الأول مع Qiskit Serverless

Package versions

الكود في هذه الصفحة طُوِّر باستخدام المتطلبات التالية. نوصي باستخدام هذه الإصدارات أو ما هو أحدث.

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 على ترقية وتتغيّر ميزاته بسرعة. خلال مرحلة التطوير هذه، يمكنك الاطلاع على ملاحظات الإصدار وأحدث التوثيقات في صفحة Qiskit Serverless على GitHub.

يوضّح هذا المثال كيفية استخدام أدوات qiskit-serverless لإنشاء برنامج تحويل (transpilation) متوازٍ، ثم توظيف qiskit-ibm-catalog لرفع البرنامج إلى منصة IBM Quantum Platform واستخدامه كخدمة عن بُعد قابلة لإعادة الاستخدام.

نظرة عامة على سير العمل

  1. أنشئ مجلدًا محليًا وملف برنامج فارغًا (./source_files/transpile_remote.py)
  2. أضف كودًا إلى برنامجك كي يُجري عملية تحويل لدائرة عند رفعه إلى Qiskit Serverless
  3. استخدم qiskit-ibm-catalog للمصادقة مع Qiskit Serverless
  4. ارفع البرنامج إلى Qiskit Serverless

بعد رفع برنامجك، يمكنك تشغيله لتحويل الدائرة باتباع دليل تشغيل أول حِمل عمل لك مع Qiskit Serverless عن بُعد.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-catalog qiskit-ibm-runtime qiskit-serverless

مثال: التحويل عن بُعد باستخدام Qiskit Serverless

يرشدك هذا المثال خطوةً بخطوة في إنشاء ملف برنامج وإضافة الكود إليه بحيث يُحوِّل circuit بالاعتماد على backend محدد ومستوى تحسين optimization_level مستهدف عند رفعه إلى Qiskit Serverless.

نصيحة

يتطلّب Qiskit Serverless تنظيم ملفات .py الخاصة بحِملك في مجلد مخصص. الهيكل التالي مثال على الممارسات الجيدة:

serverless_program
├── program_uploader.ipynb
└── source_files
├── transpile_remote.py
└── *.py

يرفع Serverless محتويات مجلد محدد (في هذا المثال، مجلد source_files) لتشغيلها عن بُعد. بعد إعداد هذه الملفات، يمكنك تعديل transpile_remote.py لاسترجاع المدخلات وإرجاع المخرجات.

إنشاء المجلد وملف برنامج فارغ

أولًا، أنشئ مجلدًا باسم source_files، ثم أنشئ ملف برنامج داخله بحيث يكون مساره ./source_files/transpile_remote.py. هذا هو الملف الذي ستُحمّله إلى Qiskit Serverless.

إضافة الكود إلى ملف برنامجك

أضف الكود التالي إلى ملف برنامجك، ثم احفظه.

تنبيه

إذا كنت تطّلع على خلايا الكود محليًا في دفتر ملاحظات، فستلاحظ أمر السحر %%writefile. تنفيذ الخلايا التي تحتوي على هذا الأمر يحفظها على القرص بدلًا من تنفيذها.

# This cell is hidden from users, it creates a new folder
from pathlib import Path

Path("./source_files").mkdir(exist_ok=True)
%%writefile ./source_files/transpile_remote.py
# If you include the preceding `%%writefile` command (visible only when you read this locally in a notebook), running this cell saves to disk rather than executing the code.

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

إضافة الكود للحصول على وسيطات البرنامج

أضف الآن الكود التالي إلى ملف برنامجك، الذي يُعدّ وسيطات البرنامج.

يمتلك transpile_remote.py الأوّلي ثلاثة مدخلات: circuits وbackend_name وoptimization_level. يقتصر Serverless حاليًا على قبول المدخلات والمخرجات القابلة للتسلسل (serializable)، لذا لا يمكنك تمرير backend مباشرةً؛ استخدم backend_name كسلسلة نصية بدلًا من ذلك.

%%writefile --append ./source_files/transpile_remote.py
# If you include the preceding `%%writefile` command (visible only when you read this locally in a notebook), running this cell saves to disk rather than executing the code.

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")

إضافة الكود الذي يستدعي الـ backend

أضف الكود التالي إلى ملف برنامجك، الذي يستدعي الـ backend باستخدام QiskitRuntimeService.

يفترض الكود التالي أنك اتّبعت بالفعل عملية حفظ بيانات اعتمادك باستخدام QiskitRuntimeService.save_account، وسيُحمِّل حسابك المحفوظ الافتراضي ما لم تحدد غير ذلك. اطلع على حفظ بيانات اعتماد تسجيل الدخول وتهيئة حساب خدمة Qiskit Runtime لمزيد من المعلومات.

%%writefile --append ./source_files/transpile_remote.py
# If you include the preceding `%%writefile` command (visible only when you read this locally in a notebook), running this cell saves to disk rather than executing the code.

from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService()
backend = service.backend(backend_name)

إضافة الكود للتحويل

أخيرًا، أضف الكود التالي إلى ملف برنامجك. يُشغِّل هذا الكود transpile_remote() على جميع الـ circuits الممرَّرة ويُرجع transpiled_circuits كنتيجة:

%%writefile --append ./source_files/transpile_remote.py
# If you include the preceding `%%writefile` command (visible only when you read this locally in a notebook), running this cell saves to disk rather than executing the code.

# Each circuit is being transpiled and will populate the array
results = [
transpile_remote(circuit, 1, backend)
for circuit in circuits
]

save_result({
"transpiled_circuits": results
})

المصادقة مع Qiskit Serverless

استخدم qiskit-ibm-catalog للمصادقة مع QiskitServerless عبر مفتاح API الخاص بك (يمكنك استخدام مفتاح QiskitRuntimeService الخاص بك، أو إنشاء مفتاح API جديد من لوحة تحكم IBM Quantum Platform).

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.

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

الخطوات التالية

توصيات