Qiskit Serverless로 코드 이식하기
팁
Qiskit Serverless는 업그레이드 중이며, 기능이 빠르게 변화하고 있습니다. 개발 단계 동안 릴리스 노트와 최신 문서는 Qiskit Serverless GitHub 페이지에서 확인하세요.
다음 예시는 Qiskit Serverless를 활용하기 위해 기존 코드를 이식하는 방법을 보여줍니다.
참고
다음 코드는 자격 증명이 저장되어 있다고 가정합니다. 저장하지 않으셨다면, IBM Cloud 계정 설정 페이지의 지침에 따라 API 키로 인증하세요.
실험 업데이트
- 로컬 실험
- Serverless
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit.circuit.random import random_circuit
qc_random = [(random_circuit(20, 20, measure=True)) for _ in range(30)]
optimization_level = 3
service = QiskitRuntimeService(channel="ibm_quantum_platform")
backend = service.get_backend(backend_name)
pass_manager = generate_preset_pass_manager(
optimization_level=optimization_level, backend=backend
)
# @distribute_task(target={"cpu": 1})
def transpile_parallel(circuit, pass_manager):
"""Distributed transpilation for an abstract circuit into an ISA circuit for a given backend."""
isa_circuit = pass_manager.run(circuit)
return isa_circuit
transpiled_circuits = [
transpile_parallel(circuit, pass_manager)
for circuit in circuits
]
print(transpiled_circuits)
# transpile_remote.py
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_serverless import get_arguments, save_result, distribute_task, get
from qiskit_ibm_runtime import QiskitRuntimeService
# Get program arguments
arguments = get_arguments()
circuits = arguments.get("circuits")
backend_name = arguments.get("backend_name")
optimization_level = arguments.get("optimization_level")
pass_manager = generate_preset_pass_manager(
optimization_level=optimization_level, backend=backend_name
)
# Distribute task across workers
@distribute_task(target={"cpu": 1})
def transpile_parallel(circuit, pass_manager):
"""Distributed transpilation for an abstract circuit into an ISA circuit for a given backend."""
isa_circuit = pass_manager.run(circuit)
return isa_circuit
try:
# Get backend
service = QiskitRuntimeService()
backend = service.get_backend(backend_name)
# run distributed tasks as async function
# we get task references as a return type
sample_task_references = [
transpile_parallel(circuit, pass_manager)
for circuit in circuits
]
# now we need to collect results from task references
results = get(sample_task_references)
# Return results
save_result({
"transpiled_circuits": results
})
except Exception as e:
# Exception handling
import traceback
print(traceback.format_exc())
Qiskit Serverless에 업로드하기
API 키로 인증하려면 Qiskit Functions 소개 페이지의 지침을 따르세요.
from qiskit_ibm_catalog import QiskitServerless, QiskitFunction
# Authenticate to the remote cluster and submit the pattern for remote execution.
serverless = QiskitServerless()
transpile_remote_demo = QiskitFunction(
title="transpile_remote_serverless",
entrypoint="transpile_remote.py",
working_dir="./source_files/",
)
serverless.upload(transpile_remote_demo)
출력
'transpile_remote_serverless'
Qiskit Serverless에서 원격 실행하기
from qiskit.circuit.random import random_circuit
from qiskit_ibm_runtime import QiskitRuntimeService
# Setup inputs
qc_random = [(random_circuit(20, 20, measure=True)) for _ in range(30)]
backend = "ibm_brisbane"
optimization_level = 3
# Running program
transpile_remote_serverless = serverless.load('transpile_remote_serverless')
job = transpile_remote_serverless.run(
circuits=qc_random,
backend=backend,
optimization_level=optimization_level
)
job.job_id
출력
'727e921d-512d-4b7d-af97-fe29e93ce7ea'
다음 단계
권장 사항
- 연구자들이 Qiskit Serverless와 양자 중심 슈퍼컴퓨팅을 활용하여 양자 화학을 탐구한 논문을 읽어보세요.