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

انشر أول سير عمل مُدار لك

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

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

qiskit[all]~=2.6.1
qiskit-serverless~=0.38.0

استخدم هذه الصفحة لرفع سير عمل وتشغيله والحصول على نتيجته. يُحسّن سير العمل النموذجي دارة Qiskit ويحاكيها. يحاكي الدارة على عتاد كلاسيكي، لذا لا يستهلك وقت QPU.

قبل البدء، ثبّت حزمة العميل وأجرِ المصادقة.

استخدم مهارات الذكاء الاصطناعي (اختياري)

لنشر شيفرتك الخاصة بمساعدة مساعد ذكاء اصطناعي، استخدم مهارات الذكاء الاصطناعي في مستودع قوالب Qiskit Function.

# 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_serverless": "qiskit-serverless"}
_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")

اكتب سير عمل​

أنشئ بنية المجلدات​

سير العمل المُدار هو مجلد من ملفات Python مع ملف نقطة دخول واحد. يرفع سير العمل المُدار كل ما في المجلد، حتى 50 MB، ويشغّل نقطة الدخول كسكربت. ولأن سير العمل يرفع المجلد كاملًا، أبقِ ملفاتك المحلية، مثل deploy.ipynb، خارج المجلد. أنشئ البنية التالية:

hello_world_project/
├── deploy.ipynb # Your local notebook: upload and run the workflow
└── source_files/ # The working directory that you upload
└── hello_world.py # The entrypoint

اكتب نقطة دخول hello world​

تقرأ نقطة الدخول دارة، وتحسّنها وتحاكيها، وتحفظ العدّات وعمق الدارة ثنائي الكيوبت. احفظ الشيفرة التالية باسم source_files/hello_world.py:

ملاحظة

إذا قرأت هذه الصفحة كدفتر، فإن خلية الشيفرة الخاصة بـ hello_world.py تبدأ بـالأمر السحري %%writefile. عند تشغيل هذه الخلية، تحفظ الشيفرة في الملف بدلًا من تشغيلها.

# This cell is hidden from users. It creates the working directory.
from pathlib import Path

Path("./source_files").mkdir(exist_ok=True)
%%writefile ./source_files/hello_world.py
from qiskit.primitives import StatevectorSampler
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_serverless import Job, get_arguments, save_result, update_status

# Read the arguments that you pass to run()
arguments = get_arguments()
circuit = arguments["circuit"]
shots = arguments.get("shots", 1024)

# Optimize the circuit. Printed text goes to the job's logs.
update_status(Job.OPTIMIZING_HARDWARE)
pass_manager = generate_preset_pass_manager(
optimization_level=1, basis_gates=["cz", "rz", "sx", "x"]
)
isa_circuit = pass_manager.run(circuit)
two_qubit_depth = isa_circuit.depth(lambda instruction: instruction.operation.num_qubits == 2)
print(f"Two-qubit depth after optimization: {two_qubit_depth}", flush=True)

# Simulate the circuit and return the counts
sampler = StatevectorSampler(seed=1234)
pub_result = sampler.run([isa_circuit], shots=shots).result()[0]
save_result({"counts": pub_result.data.meas.get_counts(), "two_qubit_depth": two_qubit_depth})
Writing ./source_files/hello_world.py

تستخدم نقطة الدخول ثلاث دوال من qiskit_serverless:

  • تُعيد get_arguments() الوسائط المسمّاة التي تمرّرها إلى run()، كقاموس. يجب أن تكون كل قيمة قابلة للتسلسل إلى JSON، أو كائنًا يستطيع العميل ترميزه، مثل QuantumCircuit. تصل الكائنات المرمَّزة كما هي الكائنات التي مرّرتها.

  • تضبط update_status(Job.OPTIMIZING_HARDWARE) الحالة التفصيلية RUNNING: OPTIMIZING_FOR_HARDWARE، التي يمكنك رؤيتها أثناء تشغيل المهمة. راجع الإبلاغ عن التقدم باستخدام update_status().

  • تخزّن save_result() قيمة قابلة للتسلسل إلى JSON تقرؤها لاحقًا باستخدام job.result(). يُعيد سير العمل العدّات كقاموس وعمق الدارة المحسّنة ثنائي الكيوبت كعدد صحيح.

كل ما يكتبه سير العمل إلى المخرج القياسي، مثل عمق الدارة ثنائي الكيوبت، يذهب إلى سجلات المهمة. لإضافة الطوابع الزمنية ومستويات السجل، استخدم الوحدة logging. راجع كتابة السجلات ومعالجة الأخطاء.

ارفع سير العمل​

في دفترك المحلي، شغّل الشيفرة التالية من المجلد hello_world_project. تتصل الشيفرة بحسابك المحفوظ، وتعرّف سير العمل، وترفعه. entrypoint هو الملف الذي يشغّله سير العمل، وworking_dir هو المجلد الذي ترفعه:

from qiskit_ibm_catalog import ManagedWorkflow, ManagedWorkflowClient

client = ManagedWorkflowClient()

hello_world = ManagedWorkflow(
title="hello-world",
entrypoint="hello_world.py",
working_dir="./source_files/",
)

hello_world = client.upload(hello_world)

شغّل سير العمل مع مدخلات​

ابنِ دارة GHZ بثلاثة كيوبتات لتمريرها إلى hello_world كمدخل:

from qiskit import QuantumCircuit

circuit = QuantumCircuit(3)
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.measure_all()

شغّل hello_world مع الدارة وعدد اللقطات (shots) كوسائط مسمّاة. تطابق أسماء الوسائط المفاتيح التي تقرؤها نقطة الدخول باستخدام get_arguments():

job = hello_world.run(circuit=circuit, shots=1024)
print(job.job_id)
54705348-5117-44b7-935b-e6986ef182fa

تُعيد run() كائن Job بعد أن يضع سير العمل المهمة في الطابور. ولا تنتظر تشغيل المهمة. تستمر المهمة في السحابة بعد إغلاق جلسة Python. للعثور عليها لاحقًا، اعرض مهامك الأخيرة باستخدام client.jobs().

احصل على الحالة والنتيجة والسجلات​

مباشرةً بعد استدعاء run()، تكون الحالة عادةً QUEUED:

job.status()
'QUEUED'

تتغير الحالة من QUEUED إلى INITIALIZING ثم RUNNING ثم DONE.

تنتظر job.result() حتى تنتهي المهمة، ثم تُعيد القيمة التي مرّرها سير العمل إلى save_result():

job.result()
{'counts': {'111': 514, '000': 510}, 'two_qubit_depth': 2}
# This cell is hidden from users. It checks the result.
assert set(_["counts"]) <= {"000", "111"} # noqa: F821
assert sum(_["counts"].values()) == 1024 # noqa: F821
from qiskit.visualization import plot_histogram

plot_histogram(job.result()["counts"])

Output of the previous code cell

يمكنك قراءة السجلات أثناء تشغيل المهمة. يرفع سير العمل أسطرًا جديدة كل 15 ثانية تقريبًا. تتضمن السجلات السطر الذي طبعه سير العمل:

print(job.logs())
Two-qubit depth after optimization: 2
# This cell is hidden from users. It checks the logs.
assert "Two-qubit depth after optimization" in job.logs()

حدّث سير العمل​

لتغيير سير عمل، عدّل ملفاته واستدعِ upload() مرة أخرى بالقيمة نفسها لـ title. يحلّ الرفع الجديد محل السابق، ولا تتأثر المهام التي بدأت بالفعل.

تحتفظ حقول مثل arguments_schema وsizes_map بقيمها المخزّنة عند حذفها من الرفع الجديد.

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

توصيات