דלג לתוכן הראשי
פרויקט זה בשלב בטא. מצאת באג? פתח issue ב-GitHub. יש שאלה או רעיון? שאל ב-Discussions — נשמח לשמוע ממך!
מה איכות התרגום בדף זה?

הרצת סריקת פרמטרים

גרסאות חבילות

הקוד בדף הזה פותח עם הדרישות הבאות. מומלץ להשתמש בגרסאות האלה או בחדשות יותר.

qiskit-serverless~=0.38.0

סריקת פרמטרים עובדת כמו מערך jobs של Slurm. קראו ל-run() פעם אחת לכל קבוצת קלטים, וה-jobs רצים בו-זמנית, כל אחד על צומת משלו. השתמשו באותה תבנית לכל אצווה של קלטים בלתי תלויים, כמו job אחד לכל מולקולה או לכל Backend. jobs לא יכולים לשלוח נתונים זה לזה, ולכן חלקו את העבודה לקלטים בלתי תלויים.

הדוגמאות בדף הזה משתמשות ב-workflow מתוך הרצת workflow מנוהל, שקורא זווית אחת, theta:

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"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")
# 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/my_workflow.py
import math

from qiskit_serverless import get_arguments, save_result

arguments = get_arguments()
theta = arguments["theta"]
if not 0 <= theta <= math.pi:
raise ValueError(f"theta must be between 0 and pi, got {theta}")

print(f"Computing the expectation value for theta={theta}", flush=True)
save_result({"theta": theta, "expectation_value": math.cos(theta)})
Writing ./source_files/my_workflow.py
# This cell is hidden from users. It uploads the workflow under a title that
# other test notebooks do not use, and makes load("my-workflow") return it.
import logging

from qiskit_ibm_catalog import ManagedWorkflow, ManagedWorkflowClient

logging.getLogger("qiskit_ibm_runtime").setLevel(logging.ERROR)

_test_title = "docs-run-parameter-sweep"
ManagedWorkflowClient().upload(
ManagedWorkflow(
title=_test_title,
entrypoint="my_workflow.py",
working_dir="./source_files/",
)
)
_load = ManagedWorkflowClient.load
ManagedWorkflowClient.load = lambda self, title, *a, **k: _load(
self, _test_title if title == "my-workflow" else title, *a, **k
)

הפעלת ה-jobs​

קבלו את ה-workflow לפי הכותרת שלו, וקראו ל-run() פעם אחת לכל קלט. שמרו את מזהי ה-job בקובץ: run_workflow_remotely.ipynb

import json

from qiskit_ibm_catalog import ManagedWorkflowClient

client = ManagedWorkflowClient()
my_workflow = client.load("my-workflow")

thetas = [0.1, 0.2, 0.3]

job_ids = {
f"theta-{theta}": my_workflow.run(theta=theta).job_id for theta in thetas
}

with open("job_ids.json", "w") as f:
json.dump(job_ids, f)
  • בדקו כל קלט קודם. אם ל-workflow יש סכמת ארגומנטים, קראו ל-validate_arguments() על כל קלט לפני הלולאה.

  • שמרו את מזהי ה-job בקובץ. כך תוכלו לאסוף את התוצאות מ-session חדש.

  • תנו לקבצים של כל הרצה שם ייחודי. כל ההרצות חולקות את אחסון הקבצים של ה-workflow. ראו שיטה מומלצת: תנו לקבצים של כל הרצה שם ייחודי.

  • הישארו מתחת למגבלת ה-jobs הפעילים. workflow מנוהל לא מכניס לתור jobs מעל המגבלה, ולכן כשמגיעים אליה, הפעילו jobs נוספים רק אחרי שjobs קודמים מסתיימים.

איסוף התוצאות​

קבל כל משימה לפי ה-ID שלה, ותפוס משימות שנכשלו כדי שכשל אחד לא יעצור את הלולאה: run_workflow_remotely.ipynb

from qiskit_serverless.exception import QiskitServerlessException

with open("job_ids.json") as f:
job_ids = json.load(f)

results, errors = {}, {}
for run_name, sweep_job_id in job_ids.items():
try:
results[run_name] = client.job(sweep_job_id).result()
except QiskitServerlessException as error:
errors[run_name] = str(error)

print(f"{len(results)} jobs finished, {len(errors)} failed")
3 jobs finished, 0 failed
# This cell is hidden from users. It checks the sweep results.
assert len(results) == 3 and not errors, (results, errors)
assert all(results[f"theta-{t}"]["theta"] == t for t in thetas)

כדי להריץ מחדש את הקלטים שנכשלו, קרא שוב ל-run() עם אותם ארגומנטים.

מגבלת משימות פעילות​

אפשר להחזיק עד 50 משימות שנמצאות בו-זמנית בתור, באתחול, בריצה או בביטול. המגבלה סופרת את כל המשימות שלך, כולל משימות של workflows אחרים. אם תחרוג ממנה, run() מעלה QiskitServerlessException ולא יוצר את המשימה ולא מכניס אותה לתור:

| Message: Http bad request.
| Code: 429
| Details: Active job limit reached. The maximum allowed is 50.

השלבים הבאים​

המלצות