ابدأ مع Qiskit Functions
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"qiskit": "qiskit", "qiskit_ibm_catalog": "qiskit-ibm-catalog", "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")
# This cell is hidden from users
# It gets these details programmatically so we can test this notebook
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit.circuit.random import random_circuit
from qiskit_ibm_catalog import QiskitFunctionsCatalog
service = QiskitRuntimeService()
instance = service.active_account()["instance"]
backend_name = service.least_busy().name
catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")
qesem_function = catalog.load("qedma/qesem")
circuit = random_circuit(num_qubits=2, depth=2, seed=42)
observable = "Z" * circuit.num_qubits
يمكن لمستخدمي خطط Premium وFlex وOn-Prem (عبر واجهة برمجة تطبيقات IBM Quantum Platform) البدء باستخدام IBM Qiskit Functions مجانًا، أو يمكنهم الحصول على ترخيص من أحد الشركاء الذين ساهموا بدالة في الكتالوج.
طلب تجربة مجانية لدوال Qiskit Functions التابعة لجهات خارجية
لطلب تجربة مجانية، انتقل إلى كتالوج Qiskit Functions، واستكشف لوحة التفاصيل. انقر على Request a free trial واملأ المعلومات المطلوبة من شريك الدوال، بما في ذلك AccessGroupId الخاص بـ IBM Cloud:
-
انتقل إلى IBM Cloud IAM.
-
تحقق من الأهلية.
-
بدّل حسابك في شريط القوائم في الترويسة إلى حساب بالتنسيق التالي:
XXXXXXX - [Organization Name] -
تأكد من أن المنظمة هي نفسها المرتبطة بحساب Premium الخاص بك.
-
إذا رأيت "[Your Name]'s Account"، فأنت تستخدم حسابك الشخصي، وهو غير مؤهل للوصول إلى Premium.
-
-
اعثر على معرّف مجموعة الوصول الخاصة بك.
-
انقر على اسم مجموعة.
-
انقر على Details.
-
انسخ معرّف مجموعة الوصول. يجب أن يبدأ بـ
AccessGroup-.
-
تثبيت عميل كتالوج Qiskit Functions
-
لبدء استخدام Qiskit Functions، ثبّت عميل IBM Qiskit Functions Catalog:
pip install qiskit-ibm-catalog -
استرجع مفتاح API الخاص بك من لوحة معلومات IBM Quantum Platform، وفعّل بيئة Python الافتراضية الخاصة بك. راجع تعليمات التثبيت إذا لم يكن لديك بالفعل بيئة افتراضية مُعدّة.
إذا كنت تعمل في بيئة Python موثوقة (مثل جهاز كمبيوتر محمول أو محطة عمل شخصية)، استخدم الطريقة
save_account()لحفظ بيانات الاعتماد الخاصة بك محليًا. (انتقل إلى الخطوة التالية إذا كنت لا تستخدم بيئة موثوقة، مثل جهاز كمبيوتر مشترك أو عام، للمصادقة على IBM Quantum Platform.)يجب أن يكون لدى المثيل الذي تصادق به إمكانية الوصول إلى Qiskit Functions مفعّلة. لتهيئتها على مثيل موجود، راجع تهيئة الوصول إلى Qiskit Functions على مثيل.
لاستخدام
save_account()، شغّلpythonفي الطرفية، ثم أدخل ما يلي:from qiskit_ibm_catalog import QiskitFunctionsCatalogQiskitFunctionsCatalog.save_account(channel="ibm_quantum_platform", token="<your-token>", instance="<instance-crn>")اكتب
exit(). من الآن فصاعدًا، متى احتجت إلى المصادقة على الخدمة، يمكنك تحميل بيانات اعتمادك على النحو التالي:from qiskit_ibm_catalog import QiskitFunctionsCatalogcatalog = QiskitFunctionsCatalog()على سبيل المثال:
# Load saved credentials
from qiskit_ibm_catalog import QiskitFunctionsCatalog
catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")
تجنب تنفيذ الكود على جهاز غير موثوق أو بيئة Python سحابية خارجية لتقليل المخاطر الأمنية. إذا كان يجب عليك استخدام بيئة غير موثوقة (على سبيل المثال، جهاز كمبيوتر عام)، فقم بتغيير مفتاح API الخاص بك بعد كل استخدام عن طريق حذفه من صفحة IBM Cloud API keys لتقليل المخاطر. تعرّف على المزيد في موضوع إدارة مفاتيح API للمستخدم. لتهيئة الخدمة في هذه الحالة، استخدم هذا الكود:
from qiskit_ibm_catalog import QiskitFunctionsCatalog
# After using the following code, delete your API key on the
# IBM Quantum Platform home dashboard
catalog = QiskitFunctionsCatalog(token="<YOUR_API_KEY>") # Use the 44-character
# API_KEY you created and saved from the IBM Quantum Platform Home dashboard
لا تُضمّن مفتاحك أبدًا في كود المصدر أو نصوص Python أو ملفات الدفاتر. عند مشاركة الكود مع الآخرين، تأكد من عدم تضمين مفتاح API مباشرة داخل نص Python. بدلاً من ذلك، شارك النص دون المفتاح وقدّم تعليمات لإعداده بأمان.
إذا شاركت مفتاحك عن طريق الخطأ مع شخص ما أو أدرجته في نظام تحكم بالإصدارات مثل Git، ألغِ مفتاحك فورًا بحذفه من صفحة IBM Cloud API keys للحد من المخاطر. تعرّف على المزيد في موضوع إدارة مفاتيح API للمستخدم.
اسرد الدوال التي يمكنك الوصول إليها
بعد المصادقة، يمكنك سرد الدوال من كتالوج Qiskit Functions التي لديك حق الوصول إليها:
catalog.list()
[QiskitFunction(qunova/hivqe-chemistry),
QiskitFunction(global-data-quantum/quantum-portfolio-optimizer),
QiskitFunction(algorithmiq/tem),
QiskitFunction(qedma/qesem),
QiskitFunction(multiverse/singularity),
QiskitFunction(ibm/circuit-function),
QiskitFunction(q-ctrl/optimization-solver),
QiskitFunction(colibritd/quick-pde),
QiskitFunction(q-ctrl/performance-management),
QiskitFunction(kipu-quantum/iskay-quantum-optimizer)]
تشغيل الدوال المفعّلة
بعد إنشاء نسخة من كائن الكتالوج، يمكنك اختيار دالة باستخدام catalog.load("<provider/function-name>"):
qesem_function = catalog.load("qedma/qesem")
لكل دالة Qiskit Function مدخلات وخيارات ومخرجات مخصصة. تحقق من صفحات التوثيق الخاصة بالدالة التي تريد تشغيلها لمزيد من المعلومات. افتراضيًا، لا يمكن لجميع المستخدمين تشغيل سوى مهمة دالة واحدة في كل مرة:
from qiskit.quantum_info import SparsePauliOp
avg_magnetization = SparsePauliOp.from_sparse_list(
[("Z", [q], 1 / 5) for q in range(5)], num_qubits=5
)
job = qesem_function.run(
pubs=[(circuit, [avg_magnetization, observable])],
backend_name=backend_name, # example: "ibm_fez"
# options = {
# "estimate_time_only": "empirical",
# "default_precision": 0.2, # Default precision is applied to all pubs that don't have a precision specified, see API reference for more details
# "max_execution_time": 3600, # You can specify a maximum QPU time in seconds, see API reference for more details
# "transpilation_level": "standard", # "minimal_with_layout_opt" for minimal transpilation, see API reference for more details
# "parallel_execution": True, # True for parallel execution, see API reference for more details
# },
)
job.job_id
'7f08c9d5-471b-4da2-92e7-4f2cb94c23a8'
تتحقق run() من سعتك المتبقية والوصول إلى الـ Backend قبل إرسال المهمة. إذا نفدت سعة المثيل الخاص بك، أو كان الـ Backend الذي حددته غير متاح، ترفع run() خطأً فورًا بدلاً من ترك المهمة تفشل في الطابور. عندما تكون السعة منخفضة، تصدر run() تحذيرًا. مرر suppress_low_usage_warning=True لكتم التحذير.
job = qesem_function.run(
pubs=[(circuit, [avg_magnetization, observable])],
backend_name=backend_name, # example: "ibm_fez"
suppress_low_usage_warning=True,
# options = {
# "estimate_time_only": "empirical",
# "default_precision": 0.2, # Default precision is applied to all pubs that don't have a precision specified, see API reference for more details
# "max_execution_time": 3600, # You can specify a maximum QPU time in seconds, see API reference for more details
# "transpilation_level": "standard", # "minimal_with_layout_opt" for minimal transpilation, see API reference for more details
# "parallel_execution": True, # True for parallel execution, see API reference for more details
# },
)
تحقق من حالة المهمة
باستخدام job_id الخاص بدالة Qiskit Function، يمكنك التحقق من حالة المهام الجارية. وتشمل هذه الحالات ما يلي:
-
QUEUED: البرنامج البعيد في طابور Qiskit Functions. تعتمد أولوية الطابور على مدى استخدامك لـ Qiskit Functions. -
INITIALIZING: البرنامج البعيد يبدأ التشغيل؛ ويشمل ذلك إعداد البيئة البعيدة وتثبيت التبعيات. -
RUNNING: البرنامج قيد التشغيل. ويشمل ذلك أيضًا عدة حالات أكثر تفصيلاً إذا كانت الدوال المحددة تدعمها.-
RUNNING: MAPPING: تقوم الدالة حاليًا بتعيين مدخلاتك الكلاسيكية إلى مدخلات كمومية. -
RUNNING: OPTIMIZING_FOR_HARDWARE: تقوم الدالة بالتحسين للـ QPU المختار. يمكن أن يشمل ذلك تحويل الدارة (transpilation)، وتوصيف QPU، والانتشار العكسي للمرصودات، وما إلى ذلك. -
RUNNING: WAITING_FOR_QPU: أرسلت الدالة مهمة إلى IBM Quantum Compute Service، وهي في الانتظار في الطابور. -
RUNNING: EXECUTING_QPU: لدى الدالة مهمة Quantum Compute نشطة. -
RUNNING: POST_PROCESSING: تقوم الدالة بمعالجة النتائج لاحقًا، وقد يشمل ذلك تخفيف الأخطاء، وتخطيط النتائج الكمومية إلى كلاسيكية، وما إلى ذلك.
-
-
DONE: البرنامج مكتمل، ويمكنك استرجاع بيانات النتيجة باستخدامjob.result(). -
ERROR: توقف البرنامج عن التشغيل بسبب مشكلة. استخدمjob.result()للحصول على رسالة الخطأ. -
CANCELED: تم إلغاء البرنامج من قِبل مستخدم أو الخدمة أو الخادم.
job.status()
'QUEUED'
استرجاع النتائج
بعد أن يصبح البرنامج DONE، يمكنك استخدام job.result() لاسترجاع النتيجة. يختلف تنسيق هذا المخرج حسب كل دالة، لذا احرص على اتباع التوثيق الخاص بها:
result = job.result()
print(result)
PrimitiveResult([PubResult(data=DataBin(evs=np.ndarray(<shape=(), dtype=float64>), stds=np.ndarray(<shape=(), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(), dtype=float64>)), metadata={'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32})], metadata={'dynamical_decoupling': {'enable': True, 'sequence_type': 'XX', 'extra_slack_distribution': 'middle', 'scheduling_method': 'alap'}, 'twirling': {'enable_gates': False, 'enable_measure': True, 'num_randomizations': 'auto', 'shots_per_randomization': 'auto', 'interleave_randomizations': True, 'strategy': 'active-accum'}, 'resilience': {'measure_mitigation': True, 'zne_mitigation': False, 'pec_mitigation': False}, 'version': 2})
يمكنك أيضًا إلغاء مهمة في أي وقت:
job.cancel()
'Job has been stopped.'
الوصول إلى مهام Quantum Compute المرتبطة
يمكن لدالة Qiskit Function إرسال مهمة واحدة أو أكثر من مهام Quantum Compute إلى QPU أثناء تشغيلها. لاسترجاع معرّفات مهام وقت التشغيل هذه، استخدم job.runtime_jobs(). يمكنك استخدام هذه المعرّفات لاسترجاع كائنات مهام وقت التشغيل من نسخة QiskitRuntimeService، أو للعثور على أحمال العمل في لوحة معلومات IBM Quantum® Platform.
runtime_job_ids = job.runtime_jobs()
runtime_job_ids
إذا جمّعت دالة ما مهام وقت التشغيل الخاصة بها في جلسات أو دفعات، استخدم job.runtime_sessions() لسرد معرّفات الجلسات. مرر معرّف جلسة واحدة إلى job.runtime_jobs() لإرجاع مهام وقت التشغيل الموجودة في تلك الجلسة فقط:
sessions = job.runtime_sessions()
if sessions:
session_runtime_jobs = job.runtime_jobs(runtime_session=sessions[0])
print(session_runtime_jobs)
else:
print("No runtime sessions for this job.")
يمكن أن تكون القائمة المُعادة فارغة. تُبلغ الدالة عن مهام وقت التشغيل (runtime jobs) الخاصة بها فقط عندما ترسلها عبر خدمة وقت التشغيل التي تتلقاها الدالة أثناء التشغيل، وبعض الدوال لا ترسل مهام وقت التشغيل مباشرة.
عرض سجلات المهمة
استخدم job.logs() لاسترجاع مخرجات السجل التي تنتجها الدالة أثناء تشغيلها. تفيد السجلات في تتبع التقدم وفي تصحيح مهمة تنتهي بحالة ERROR.
print(job.logs().splitlines())
بالنسبة لمهمة طويلة التشغيل تنتج العديد من أسطر السجل، استخدم job.filtered_logs() لإرجاع الأسطر التي تريدها فقط. مرر تعبيرًا نمطيًا إلى include لإبقاء الأسطر المطابقة، أو إلى exclude لحذف الأسطر المطابقة:
print(job.filtered_logs(include="iteration"))
سرد مهام Qiskit Functions التي شُغّلت سابقًا
يمكنك استخدام jobs() لسرد جميع المهام المُرسلة إلى Qiskit Functions:
old_jobs = catalog.jobs()
old_jobs
[<Job | f6c29f49-4d5f-4fff-aca6-2e9a115b9763>,
<Job | 7f08c9d5-471b-4da2-92e7-4f2cb94c23a8>,
<Job | 62fe9176-d1e5-467e-b2bd-7a3f3c7be4e5>,
<Job | af525b2e-16b1-45a1-80bb-dbd94ce30258>,
<Job | b95a7a57-c1ad-4958-b7ac-953e4e1ee824>,
<Job | 7bfa33da-0f17-4e67-84b6-f556f7eeb436>,
<Job | ca46c191-9eb9-4de6-bfa7-b60d7eb29b5e>,
<Job | 6ac0ba93-3831-43fb-9fb9-760da2225e06>,
<Job | f0e38071-060d-47e8-988d-9cc1f69358e3>,
<Job | 629cf110-e490-4675-8a07-f6d298d166b0>]
لتضييق النتائج، مرر عوامل تصفية. صفِّ حسب الدالة باستخدام function، وحسب الحالة باستخدام status، وحسب تاريخ الإرسال باستخدام created_after. تصفّح النتائج صفحة بصفحة باستخدام limit وoffset:
recent_errors = catalog.jobs(
function=qesem_function,
status="ERROR",
created_after="2024-01-01T00:00:00Z",
limit=5,
)
recent_errors
إذا كان لديك بالفعل معرّف المهمة لمهمة معينة، يمكنك استرجاع المهمة باستخدام catalog.job():
# First, get the most recent job that has been executed.
latest_job = old_jobs[0]
# We can also get that same job with `catalog.job`
job_by_id = catalog.job(latest_job.job_id)
# Verify that the job is the same using both retrieval methods.
assert job_by_id.job_id == latest_job.job_id
# Print the job_id for this job.
print(job_by_id.job_id)
f6c29f49-4d5f-4fff-aca6-2e9a115b9763
استرجاع رسائل الأخطاء
إذا كانت حالة البرنامج ERROR، استخدم job.error_message() لاسترجاع رسالة الخطأ على النحو التالي:
job.error_message()
qiskit.exceptions.QiskitError: 'Workflow execution failed -- https://docs.quantum.ibm.com/errors#9999'
الخطوات التالية
-
استكشف دوال الدارات لبناء خوارزميات وتطبيقات جديدة، دون الحاجة إلى إدارة النقل أو معالجة الأخطاء.
-
استكشف دوال التطبيقات لحل مهام خاصة بمجال معين، بمدخلات ومخرجات كلاسيكية.
-
راجع توثيق مرجع API لدوال Qiskit Functions.
-
للحصول على تجربة عملية، جرّب بعض الدروس التي توضح دوال Qiskit Functions.