مراقبة مهمة أو إلغاؤها
يشرح هذا الدليل كيفية مراقبة حالة المهمة، وعرض معلومات الاستخدام، وإلغاء المهام. يمكنك الوصول إلى هذه المعلومات من خلال منصة IBM Quantum® وبرمجيًا باستخدام Qiskit.
إصدارات الحزم
تم تطوير الشيفرة الموجودة في هذه الصفحة باستخدام المتطلبات التالية. نوصي باستخدام هذه الإصدارات أو أحدث.
qiskit-ibm-runtime~=0.46.1
مراقبة مهمة
استخدم هذه الطرق (methods) للتحقق من حالة المهام التي أرسلتها، واسترجاع النتائج، وعرض التفاصيل المتعلقة بالمهمة وتنفيذها.
- مراقبة مهمة باستخدام Qiskit
- مراقبة مهمة على IBM Quantum Platform
يوفر مثيل المهمة (job instance) عدة طرق للمراقبة:
| الطريقة | الوصف |
|---|---|
job.status() | تحقق من حالة المهمة الحالية |
job.job_id() | احصل على معرف المهمة الفريد |
job.result() | استرجع نتائج المهمة (استدعاء حاجب ينتظر حتى اكتمال المهمة) |
job.wait_for_final_state() | انتظر (بشكل حاجب) حتى تصل المهمة إلى حالة نهائية |
انتقل إلى صفحة Workloads وتحقق من عمود Status. تظهر حالة مهمتك كواحدة مما يلي:
- Pending: المهمة تنتظر التشغيل على QPU
- In progress: المهمة قيد التنفيذ حاليًا
- Completed: انتهت المهمة بنجاح
- Failed: واجهت المهمة خطأً
- Canceled: قام المستخدم بإلغاء المهمة
انقر على اسم المهمة أو الصف لفتح العرض التفصيلي، حيث يمكنك رؤية معلومات مثل النتائج وأي رسائل خطأ.
لماذا تبقى المهمة في حالة "In progress"
قد تلاحظ أن مهمة (باستخدام إما job mode أو batch mode) تتوقع أن تستغرق ثوانٍ قليلة فقط تبقى في حالة In progress (تسمى RUNNING في Qiskit) لمدة أطول بكثير. هذا أمر طبيعي، ولا يعني أن المهمة تستهلك كامل ذلك الوقت كاستخدام. يحدث هذا بسبب طريقة جدولة المهام على QPU:
-
تتطلب كل مهمة معالجة أولية كلاسيكية قبل أن تتمكن من التشغيل على QPU. تنتقل المهمة إلى In progress (
RUNNING) بمجرد بدء هذه المعالجة الكلاسيكية — وليس عندما تبدأ التنفيذ على QPU. -
تعمل معظم هذه المعالجة الكلاسيكية بالتوازي، لذا يمكن أن تكون عدة مهام في حالة In progress في الوقت نفسه.
-
مع ذلك، لا يمكن أن تعمل سوى مهمة واحدة على QPU في كل مرة. عندما تنتهي عدة مهام من معالجتها الكلاسيكية وتصبح جاهزة للتنفيذ، يجب أن تنتظر دورها للحصول على QPU. يُعرف هذا بـ تنافس QPU (QPU contention). عندما يكون التنافس مرتفعًا، يمكن أن تبقى المهمة في حالة In progress لفترة أطول ملحوظة من ثواني وقت QPU التي تحتاجها فعليًا.
-
يمكن أن يحدث التنافس أيضًا عندما تعمل مهمة صيانة للنظام، مثل المعايرة (calibration)، على QPU. تبقى مهمتك في حالة In progress حتى تكتمل مهمة الصيانة ويصبح QPU متاحًا.
بسبب هذا، فإن الوقت الفعلي المنقضي الذي تقضيه المهمة في حالة In progress ليس نفس استخدامها. يعتمد كلٌ من الاستخدام المُقدَّر والحد الأقصى لوقت التنفيذ فقط على الوقت الذي يكون فيه QPU مقفلاً لتنفيذ مهمتك، وبالتالي يستثنيان المعالجة الكلاسيكية متعددة الخيوط (multi-threaded) الموصوفة أعلاه. لا يزيد وقت In progress الطويل من استخدامك أو تكلفتك المُبلَّغ عنها.
Session mode مختلف
ينطبق السلوك السابق على job mode وbatch mode. في session mode، خلال النافذة الزمنية النشطة للجلسة، يحصل المستخدم على وصول حصري إلى الـ Backend ولا يمكن لأي مهام أخرى العمل، بما في ذلك مهام المعايرة. لذلك، يحدث تنافس QPU فقط بين مهام جلستك الخاصة. بالإضافة إلى ذلك، نظرًا لأن سعة QPU محجوزة طوال مدة الجلسة، يُقاس استخدام الجلسة كالوقت المنقضي أثناء بقاء الجلسة نشطة، بغض النظر عما إذا كانت المهام قيد التشغيل الفعلي أم لا. راجع استخدام حمل العمل لمزيد من المعلومات.
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"qiskit_ibm_runtime": "qiskit-ibm-runtime"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
# Retrieve a job by ID
job = service.job("<job_id>")
# Get job ID (useful for saving for later retrieval)
print(f"Job ID: {job.job_id()}")
# Check current status
print(f"Status: {job.status()}")
# Wait for job to complete (blocking call)
job.wait_for_final_state()
print("Job completed")
# Get results
results = job.result()
print(results)
عرض الاستخدام المتبقي
تتبّع مقدار ما تبقى من حصة الاستخدام في خطتك.
- التحقق من الاستخدام باستخدام Qiskit
- عرض الاستخدام على IBM Quantum Platform
استخدم طريقة service.usage() للحصول على معلومات الاستخدام لمثيلك (instance) النشط الحالي.
انتقل إلى صفحة Instances واختر التبويب المرتبط بالخطة التي تريد التحقق منها. سيظهر إجمالي الوقت المُستخدَم والوقت المتبقي في خطتك.
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
# Get usage information for the current active instance
usage = service.usage()
print(usage)
عرض مقاييس المهمة
احصل على نظرة عامة عن إرسالات مهامك، بما في ذلك مقاييس أحمال عمل الدُفعة والجلسة.
- الحصول على مقاييس المهمة باستخدام Qiskit
- عرض مقاييس المهمة على IBM Quantum Platform
استخدم طريقة service.jobs() مع عوامل التصفية (filters) لاسترجاع معلومات حول المهام التي أرسلتها، مثل عدد المهام المُرسَلة، وحالاتها، وتاريخ إنشائها. يسترجع المثال التالي جميع المهام المُرسَلة خلال الأيام السبعة الماضية ويحسب إجمالي الاستخدام من تلك المهام.
انتقل إلى صفحة Analytics لرؤية البيانات وتنزيلها، مثل ما يلي:
- إجمالي الاستخدام
- الاستخدام مُصفّى حسب المثيل (instance)، وحاسوب الكم، والمستخدم
- عدد أحمال عمل المهمة والدُفعة والجلسة
ملاحظة: يمكنك الوصول إلى صفحة Analytics فقط للحسابات التي تملكها أو تديرها.
from datetime import datetime, timedelta
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
# Retrieve all jobs in the last 7 days
seven_days_ago = datetime.now() - timedelta(days=7)
jobs = service.jobs(limit=None, created_after=seven_days_ago)
# To retrieve all jobs in a Session or Batch, use the session_id filter
# jobs = service.jobs(session_id="<session id>")
total_usage = 0
for job in jobs:
total_usage += job.usage()
print(f"{len(jobs)} jobs were submitted in the last 7 days.")
print(f"Total usage was {total_usage} seconds")
استرداد نتائج المهمة في وقت لاحق
يمكنك حفظ معرّفات المهام (job IDs) واسترجاع النتائج لاحقًا، حتى بعد إغلاق جلستك.
- استرجاع النتائج باستخدام Qiskit
- استرجاع النتائج على IBM Quantum Platform
إذا حفظت معرّف المهمة عند إرسالها، استخدم service.job(<job_id>) لاسترجاعها لاحقًا. إذا لم يكن لديك معرّف المهمة، أو إذا أردت استرجاع عدة مهام دفعة واحدة (بما في ذلك المهام من QPUs المتقاعدة)، استخدم service.jobs() بدلاً من ذلك، مع عوامل تصفية اختيارية.
راجع توثيق واجهة برمجة التطبيقات QiskitRuntimeService.jobs لمعرفة عوامل التصفية المتاحة.
يوضح هذا المثال استرجاع النتائج الأخيرة التي تم تشغيلها على Backend محدد.
- انتقل إلى صفحة Workloads.
- استخدم خيارات البحث أو التصفية للعثور على مهمتك حسب الاسم أو التاريخ أو الحالة.
- انقر على المهمة لعرض نتائجها وتفاصيلها.
استرجاع خصائص Backend
- استرجاع خصائص Backend باستخدام Qiskit
- استرجاع خصائص Backend على IBM Quantum Platform
يمكنك استخدام job.properties() لاسترجاع خصائص الـ Backend، بما في ذلك معدلات الخطأ، في وقت تنفيذ المهمة.
يوضح هذا المثال كيفية استرجاع خصائص Backend التي كانت سارية في وقت تنفيذ مهمة، بما في ذلك أوقات / ومعدلات الخطأ لـ Qubit محدد (0).
تُعيد service.jobs() أيضًا المهام التي تم تشغيلها من حزمة qiskit-ibm-provider المهملة. لم تعد المهام التي أُرسلت بواسطة حزمة qiskit-ibmq-provider الأقدم (وهي أيضًا مهملة) متاحة.
يمكنك رؤية بيانات المعايرة (calibration) لـ Backend في وقت تنفيذ المهمة، وكذلك في وقت إنشائها.
- انتقل إلى صفحة Workloads
- انقر على حمل عمل لفتح صفحة تفاصيله
- تحت Quantum computer، انقر على View calibration history
- استخدم القائمة المنسدلة للتبديل من عرض البيانات "At job execution start" إلى "At job creation"
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
# Uncomment the next line to retrieve a specific job by ID
# job = service.job("<job_id>")
# Optionally retrieve multiple jobs with filters
# Use `limit` to retrieve a specific number of jobs. The default `limit` is 10.
my_backend = "<your-backend>"
recent_jobs = service.jobs(backend_name=my_backend, limit=10)
print(f"Retrieved {len(recent_jobs)} recent jobs from {my_backend}\n")
# Get results from all jobs
for job in recent_jobs:
print(f"Job ID: {job.job_id()}")
print(f"Status: {job.status()}")
# Retrieve results if the job is complete
if str(job.status()) == "DONE":
try:
results = job.result()
print(f"Results: {results}")
except Exception as e:
print(f"Error retrieving results: {e}")
else:
print("Results: Not available (job still running or failed)")
print()
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
# Retrieve a specific job by ID
job = service.job("<job_id>")
print(f"Job ID: {job.job_id()}")
print(f"Backend: {job.backend}\n")
# Fetch backend properties at the time of job execution
properties = job.properties()
if properties:
print("Backend Properties at Job Execution Time:")
print("=" * 60)
# Get T1 (relaxation time) for qubit 0
t1 = properties.t1(0)
print(f"Qubit 0 T1 (relaxation time): {t1}")
# Get T2 (dephasing time) for qubit 0
t2 = properties.t2(0)
print(f"Qubit 0 T2 (dephasing time): {t2}")
# Get readout error for qubit 0
readout_error = properties.readout_error(0)
print(f"Qubit 0 readout error: {readout_error}")
# Get all properties for a specific qubit
print("All properties for qubit 0:")
qubit_props = properties.qubit_property(0)
for prop_name, prop_value in qubit_props.items():
print(f" {prop_name}: {prop_value}")
else:
print("No properties available for this job")
إلغاء مهمة
ألغِ مهمة في قائمة الانتظار أو قيد التشغيل. بمجرد إلغاء مهمة، لا يمكن استئنافها.
- الإلغاء باستخدام Qiskit
- الإلغاء على IBM Quantum Platform
استخدم طريقة job.cancel() لإلغاء مهمة برمجيًا.
- من جدول أحمال العمل: انقر على قائمة الفائض (overflow menu) في نهاية صف حمل العمل الذي تريد إلغاءه، واختر Cancel.
- من صفحة تفاصيل المهمة: انقر على حمل العمل لفتح صفحة تفاصيله، واستخدم القائمة المنسدلة Actions في الأعلى، واختر Cancel.
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
# Retrieve the job
job = service.job("<job_id>")
# Cancel the job
job.cancel()
print(f"Job {job.job_id()} has been canceled")
الخطوات التالية
- راجع مرجع واجهة برمجة التطبيقات
QiskitRuntimeServiceلمزيد من طرق إدارة المهام. - استكشف أوضاع التنفيذ لفهم أنواع أحمال عمل الدُفعة والجلسة.