استخدام حمل العمل
يمثّل الاستخدام استهلاك خدمة Qiskit Runtime ويُحدَّد بمقدار الوقت الذي ي كون فيه QPU مقفلًا لتنفيذ أحمال العمل.
- يُقاس استخدام الجلسة (Session) بالوقت المنقضي طوال فترة نشاط الجلسة، إذ تُحجز طاقة QPU لمدة الجلسة بأكملها بصرف النظر عن تشغيل أحمال العمل فعليًا. راجع طول الجلسة للمزيد من المعلومات حول انتقالات حالة الجلسة.
- يُقاس استخدام الدُفعة (Batch) بالوقت التراكمي الذي يكون فيه QPU مقفلًا لتنفيذ جميع المهام في الدُفعة.
- يُقاس استخدام المهمة الفردية بالوقت الذي يكون فيه QPU مقفلًا لتنفيذ المهمة.
لاحظ أن المهام الفاشلة أو الملغاة تُحسب ضمن استخدامك في ظروف معينة — راجع قسم المهام الفاشلة والملغاة للتفاصيل.
بالنسبة لمستخدمي خطة الدفع حسب الاستخدام (Pay-As-You-Go Plan)، راجع إدارة التكلفة للتفاصيل حول ضبط حد التكلفة.
الاستخدام للمهام الفاشلة والملغاة
عند فشل مهمة أو إلغائها، يكون الاستخدام المُبلَّغ عنه كالتالي:
-
وضع المهمة أو الدُفعة: إذا حدث الفشل أو الإلغاء بسبب خطأ في ا لنظام، يكون الاستخدام المُبلَّغ عنه صفرًا. أما بالنسبة للمهام التي فشلت بسبب خطأ من المستخدم أو عندما يلغي مستخدم مهمة، فإن الاستخدام المُبلَّغ عنه يكون أي استهلاك قد حدث حتى تلك اللحظة.
-
وضع الجلسة: الاستخدام المُبلَّغ عنه هو وقت الساعة الفعلي الذي تكون فيه الجلسة نشطة، بغض النظر عن عدد المهام الفاشلة أو الملغاة.
الاستعلام عن الاستخدام الفعلي لحمل العمل
بعد اكتمال حمل العمل، هناك عدة طرق لعرض استخدامه الفعلي:
- شغّل
batch.usage()أوsession.usage()فيqiskit-ibm-runtimeالإصدار 0.30 أو أحدث. إذا كنت تستخدم إصدارًا أقدم منqiskit-ibm-runtime(>= 0.23 و< 0.30)، لا يزال بإمكانك العثور على الاستخدام فيsession.details()["usage_time"]وbatch.details()["usage_time"]. - استخدم
GET /sessions/{id}لعرض الاستخدام لدُفعة أو جلسة معينة. - استخدم
GET /jobs/{id}لعرض الاستخدام لمهمة واحدة.
عرض استخدام المثيل
يمكنك عرض استخدام مثيل على صفحة المثيلات، أو، لمن لديهم الصلاحية المناسبة، صفحة التحليلات. لاحظ أن الصفحتين قد تعرضان أرقام استخدام مختلفة لأنهما تحسبان الاستخدام بطريقة مختلفة.
تعرض صفحة المثيلات الاستخدام في الوقت الفعلي للـ 28 يومًا الأخيرة (متحركة)، حتى الوقت الحالي من اليوم الحالي. أما استخدام صفحة التحليلات فيُعاد حسابه كل ساعة ويشمل آخر 28 يومًا كاملة؛ أي أنه يعرض الاستخدام من الساعة 00:00 قبل 28 يومًا حتى اليوم، عند بداية الساعة.
تقدير الاستخدام قبل إرسال مهمة
على الرغم من أن الحصول على تقدير محلي دقيق أمر معقد بسبب العمليات الإضافية التي تُجرى لقمع الأخطاء وتخفيفها، يمكنك استخدام هذه الصيغة الأساسية للحصول على تقريب للاستخدام المُقدَّر:
<per sub-job overhead> + (rep_delay + <circuit length>) * <num executions>
<per sub-job overhead>هو عبء يبلغ تقريبًا 2 ثانية لكل مهمة فرعية. يشمل ذلك عمليات مثل تحميل الحمولة في الإلكترونيات الضابطة. قد تُقسَّم مهمة primitive الخاصة بك إلى عدة مهام فرعية إذا كانت كبيرة جدًا بحيث لا يستطيع محرك التنفيذ معالجتها دفعة واحدة.rep_delayهو خيار قابل للتخصيص من قِبَل المستخدم، والقيمة الافتراضية يحددهاbackend.default_rep_delay، وهي 250 ميكروثانية على معظم backends الكم من IBM. لاحظ أن تقليلrep_delayيُقلل من إجمالي وقت تنفيذ QPU، لكن على حساب زيادة معدل خطأ تحضير الحالة؛ راجع دليل تنفيذ معدل التكرار الديناميكي للمزيد من المعلومات.<circuit length>هو إجمالي طول التعليمات. تستغرق كل تعليمة وقتًا مختلفًا على QPU، لذا يتفاوت الطول الإجمالي من Circuit إلى أخرى. على سبيل المثال، يمكن أن تستغرق عملية القياس (measurement) 56 ضعف الوقت الذي يستغرقه بوابةx. يمكن استخدامbackend.target[<instruction>][<qubit>].durationلمعرفة المدة الدقيقة لكل تعليمة. الطول النموذجي للـ Circuit يتراوح على الأرجح بين 50-100 ميكروثانية. إذا كنت تستخدم تقنيات قمع الأخطاء أو تخفيفها مع الـ primitives، فقد تُدرج تعليمات إضافية في Circuit الخاصة بك، مما يزيد من إجمالي طول الـ Circuit.ملاحظةيُرجع خيار
scheduler_timingالتجريبي إجمالي وقت الـ Circuit، لكن هذا ليس الوقت المستخدم للفوترة.<num executions>هو إجمالي عدد الـ Circuits مضروبًا في عدد اللقطات (shots)، حيث الـ Circuits هي تلك التي تُولَّد بعد بث عناصر PUB.- إذا كنت تستخدم تقنيات تخفيف الأخطاء مع الـ primitives، فقد تُشغَّل Circuits إضافية كجزء من عملية التخفيف، مما يزيد من إجمالي عدد عمليات التنفيذ. بالإضافة إلى ذلك، تقنيات تخفيف الأخطاء المتقدمة مثل PEA وPEC تأتي بعبء أعلى بكثير لأنها تتطلب تشغيل Circuits لتعلُّم الضوضاء.
- يُجمِّع Estimator المراقبات المتبادلة بحسب الكيوبت (Qubit-wise commuting)، مما يُقلل من عدد عمليات التنفيذ.
إذا لم تكن تستخدم أي تقنيات متقدمة لتخفيف الأخطاء أو rep_delay مخصصًا، يمكنك استخدام 2+0.00035*<num executions> كصيغة سريعة.
تقدير الاستخدام محليًا باستخدام Qiskit
يوضح مثال الكود هذا كيفية استخدام Qiskit لحساب وقت الدائرة:
# Schedule the circuit to get more accurate timing
pm = generate_preset_pass_manager(
target=backend.target,
optimization_level=0,
scheduling_method="alap"
)
scheduled_circuits = pm.run(isa_circuits)
init_duration = backend.target["reset"][(0,)].duration
rep_delay = sampler.options.execution.rep_delay or backend.default_rep_delay
circuit_duration = 0
for circuit in scheduled_circuits:
# Estimate circuit length
circuit_duration += circuit.estimate_duration(backend.target)
# Add INIT time
if sampler.options.execution.init_qubits:
circuit_duration += init_duration
# Add rep_delay
circuit_duration += rep_delay
total_time = 2 + (circuit_duration*shots)
print(f"Total estimated usage is {math.ceil(total_time)} seconds")
الخطوات التالية
- راجع هذه النصائح: تقليل وقت تشغيل المهمة.
- اضبط الحد الأقصى لوقت التنفيذ.
- تعلّم كيفية التحويل (Transpile) محليًا في قسم Transpile.
- جرّب دليل مقارنة إعدادات Transpiler.