انتقل إلى المحتوى الرئيسي
هذا المشروع في مرحلة تجريبية. وجدت خطأ؟ افتح مشكلة على GitHub. لديك سؤال أو فكرة؟ اسأل في Discussions — نحب سماع ملاحظاتك!
كيف جودة الترجمة في هذه الصفحة؟

مراقبة مهمة أو إلغاؤها

يشرح هذا الدليل كيفية مراقبة حالة المهمة، وعرض معلومات الاستخدام، وإلغاء المهام. يمكنك الوصول إلى هذه المعلومات من خلال منصة IBM Quantum® وبرمجيًا باستخدام Qiskit.

إصدارات الحزم

تم تطوير الشيفرة الموجودة في هذه الصفحة باستخدام المتطلبات التالية. نوصي باستخدام هذه الإصدارات أو أحدث.

qiskit-ibm-runtime~=0.46.1

مراقبة مهمة​

استخدم هذه الطرق (methods) للتحقق من حالة المهام التي أرسلتها، واسترجاع النتائج، وعرض التفاصيل المتعلقة بالمهمة وتنفيذها.

يوفر مثيل المهمة (job instance) عدة طرق للمراقبة:

الطريقةالوصف
job.status()تحقق من حالة المهمة الحالية
job.job_id()احصل على معرف المهمة الفريد
job.result()استرجع نتائج المهمة (استدعاء حاجب ينتظر حتى اكتمال المهمة)
job.wait_for_final_state()انتظر (بشكل حاجب) حتى تصل المهمة إلى حالة نهائية

لماذا تبقى المهمة في حالة "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)

عرض الاستخدام المتبقي​

تتبّع مقدار ما تبقى من حصة الاستخدام في خطتك.

استخدم طريقة service.usage() للحصول على معلومات الاستخدام لمثيلك (instance) النشط الحالي.

from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService()

# Get usage information for the current active instance
usage = service.usage()
print(usage)

عرض مقاييس المهمة​

احصل على نظرة عامة عن إرسالات مهامك، بما في ذلك مقاييس أحمال عمل الدُفعة والجلسة.

استخدم طريقة service.jobs() مع عوامل التصفية (filters) لاسترجاع معلومات حول المهام التي أرسلتها، مثل عدد المهام المُرسَلة، وحالاتها، وتاريخ إنشائها. يسترجع المثال التالي جميع المهام المُرسَلة خلال الأيام السبعة الماضية ويحسب إجمالي الاستخدام من تلك المهام.

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) واسترجاع النتائج لاحقًا، حتى بعد إغلاق جلستك.

إذا حفظت معرّف المهمة عند إرسالها، استخدم service.job(<job_id>) لاسترجاعها لاحقًا. إذا لم يكن لديك معرّف المهمة، أو إذا أردت استرجاع عدة مهام دفعة واحدة (بما في ذلك المهام من QPUs المتقاعدة)، استخدم service.jobs() بدلاً من ذلك، مع عوامل تصفية اختيارية.

راجع توثيق واجهة برمجة التطبيقات QiskitRuntimeService.jobs لمعرفة عوامل التصفية المتاحة.

يوضح هذا المثال استرجاع النتائج الأخيرة التي تم تشغيلها على Backend محدد.

استرجاع خصائص Backend​

يمكنك استخدام job.properties() لاسترجاع خصائص الـ Backend، بما في ذلك معدلات الخطأ، في وقت تنفيذ المهمة.

يوضح هذا المثال كيفية استرجاع خصائص Backend التي كانت سارية في وقت تنفيذ مهمة، بما في ذلك أوقات T1T_1/T2T_2 ومعدلات الخطأ لـ Qubit محدد (0).

حزم مزوّدين مهملة (Deprecated)

تُعيد service.jobs() أيضًا المهام التي تم تشغيلها من حزمة qiskit-ibm-provider المهملة. لم تعد المهام التي أُرسلت بواسطة حزمة qiskit-ibmq-provider الأقدم (وهي أيضًا مهملة) متاحة.

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

إلغاء مهمة​

ألغِ مهمة في قائمة الانتظار أو قيد التشغيل. بمجرد إلغاء مهمة، لا يمكن استئنافها.

استخدم طريقة job.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")

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

توصيات