주 콘텐츠로 건너뛰기
이 프로젝트는 베타 단계입니다. 버그를 발견하셨나요? GitHub 이슈 만들기. 질문이나 아이디어가 있으신가요? Discussions에서 질문하기 — 피드백을 기다립니다!
이 페이지의 번역 품질은 어떻습니까?

파라미터 스윕 실행

패키지 버전

이 페이지의 코드는 다음 요구 사항을 사용하여 개발되었습니다. 이 버전 또는 그 이상 버전을 사용하는 것을 권장합니다.

qiskit-serverless~=0.38.0

파라미터 스윕은 Slurm 작업 배열처럼 동작합니다. 입력 집합마다 run()을 한 번씩 호출하면 작업이 동시에 실행되며 각각 자체 노드에서 실행됩니다. 분자마다 또는 백엔드마다 작업 하나씩과 같이 독립적인 입력의 모든 배치에 같은 패턴을 사용하세요. 작업은 서로 데이터를 보낼 수 없으므로 작업을 독립적인 입력으로 나누세요.

이 페이지의 예제는 각도 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
)

작업 시작​

제목으로 워크플로를 가져온 다음, 입력마다 run()을 한 번씩 호출하세요. 작업 ID를 파일에 저장하세요. 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)
  • 먼저 모든 입력을 확인하세요. 워크플로에 인수 스키마가 있다면 루프 전에 각 입력에 대해 validate_arguments()를 호출하세요.

  • 작업 ID를 파일에 저장하세요. 그러면 새 세션에서 결과를 수집할 수 있습니다.

  • 각 실행의 파일에 고유한 이름을 지정하세요. 모든 실행은 워크플로의 파일 스토리지를 공유합니다. 모범 사례: 각 실행의 파일에 고유한 이름 지정을 참조하세요.

  • 활성 작업 제한 이내로 유지하세요. 관리형 워크플로는 제한을 초과하는 작업을 대기열에 넣지 않으므로, 제한에 도달하면 이전 작업이 끝난 후에 더 많은 작업을 시작하세요.

결과 수집​

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개까지 가질 수 있습니다. 이 제한은 다른 워크플로의 작업을 포함하여 모든 작업을 집계합니다. 이 제한을 초과하면 run()은 QiskitServerlessException을 발생시키며 작업을 만들거나 대기열에 넣지 않습니다.

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

다음 단계​

권장 사항