Qiskit Serverless로 코드 이식하기
팁
Qiskit Serverless는 업그레이드 중이며, 기능이 빠르게 변화하고 있습니다. 개발 단계 동안 릴리스 노트와 최신 문서는 Qiskit Serverless GitHub 페이지에서 확인하세요.
다음 예시는 Qiskit Serverless를 활용하기 위해 기존 코드를 이식하는 방법을 보여줍니다.
참고
다음 코드는 자격 증명이 저장되어 있다고 가정합니다. 저장하지 않으셨다면, IBM Cloud 계정 설정 페이지의 지침에 따라 API 키로 인증하세요.
실험 업데이트
참고
Serverless 버전에서는 QiskitRuntimeService() 대신 (qiskit_serverless의) get_runtime_service()로 런타임 서비스를 생성하면, 해당 서비스가 시작하는 IBM Quantum® Compute Service 작업과 세션이 상위 Qiskit Serverless 작업에 연결되어 추적됩니다. 자세한 내용은 첫 번째 Qiskit Serverless 프로그램 작성을 참조하세요.
- 로컬 실험
- 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, get_runtime_service
# 프로그램 인자 가져오기
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(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 = get_runtime_service()
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
]
# 이제 작업 참조에서 결과를 수집해야 합니다
results = get(sample_task_references)
# Return results
save_result({
"transpiled_circuits": results
})
except Exception as e:
# Exception handling
import traceback
print(traceback.format_exc())
Upload to Qiskit Serverless
Follow the instructions on the Introduction to Qiskit Functions page to authenticate with your API key.
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와 양자 중심 슈퍼컴퓨팅을 활용하여 양자 화학을 탐구한 논문을 읽어보세요.