클라우드 시뮬레이터에서 로컬 시뮬레이터로 마이그레이션
양자 컴퓨팅에서 시뮬레이터와 양자 하드웨어 중 어느 것을 사용할지 선택하는 것은 이 분야의 발전을 위해 매우 중요합니다. 시뮬레이터는 테스 트 및 디버깅에 유용하지만, 양자 유틸리티 시대에서 양자 개발과 산업 발전에는 실제 하드웨어가 필요합니다. 양자 유틸리티로의 전환의 일환으로, IBM Quantum® 클라우드 시뮬레이터는 2024년 5월 15일부로 서비스가 종료되었습니다. 이 가이드에서는 서비스 종료에 대한 자세한 내용과, ibmq_qasm_simulator와 같은 클라우드 기반 시뮬레이터에서 로컬 시뮬레이터로 마이그레이션하는 방법을 설명합니다.
클라우드 시뮬레이터가 서비스 종료되는 이유는 무엇인가요?
클라우드 시뮬레이터가 서비스 종료되는 데에는 여러 가지 이유가 있습니다:
시뮬레이터에는 한계가 있습니다
시뮬레이터는 유용할 수 있지만, 연구나 실험에 사용하기에는 너무 제한적입니다:
-
시뮬레이터는 소규모 QPU(양자 처리 장치)를 이해하는 데 유용하지만, 고성능 슈퍼컴퓨터에 접근하더라도 약 50 Qubit 수준에서 유용성이 한계에 달합니다. 이 한계는 더 큰 양자 컴퓨터를 시뮬레이션하는 데 필요한 컴퓨팅 자원이 지수적으로 증가하기 때문입니다(자세한 설명은 Massively parallel quantum computer simulator, eleven years later를 참고하세요). 100 Qubit 이 상의 양자 컴퓨터를 탐구하려면 하드웨어가 필요합니다.
-
일부 시뮬레이터는 노이즈 모델을 제공하지만, 실제 QPU의 전체 역학을 포착하는 것은 매우 어려운 문제입니다. 양자 하드웨어는 연구자들이 노이즈, 오류, 결어긋남과 같은 양자 컴퓨터 고유의 문제를 현실적인 테스트 환경에서 직접 다룰 수 있는 가능성을 제공합니다.
양자 하드웨어를 사용하면 고유한 기술을 쌓을 수 있습니다
양자 하드웨어와의 직접적인 상호작용은 시뮬레이터만 사용해서는 얻을 수 없는 기술과 경험을 키워줍니다:
-
양자 하드웨어와의 직접적인 상호작용은 신뢰할 수 있는 계산을 위해 오류 완화 또는 억제 기술을 구현하거나 사용해야 하기 때문에 기술을 키워줍니다.
-
양자 하드웨어에 대한 실습 경험은 양자 현상과 양자 프로세서의 특성에 맞게 알고리즘을 조정하는 방법에 대한 더 깊은 이해를 발전시킵니다.
-
양자 하드웨어와의 상호작용은 양자 컴퓨팅의 도전과 기회에 대한 실질적인 통찰을 제공하여 개발자들이 이 분야에서 혁신을 이끌 수 있는 능력을 향상시킵니다.
알고리즘은 양자 하드웨어에 맞게 조정되어야 합니다
성공적인 양자 알고리즘은 성능과 효율성을 최적화하기 위해 양자 하드웨어의 기능을 활용하도록 조정되어야 합니다.
-
양자 하드웨어는 시뮬레이 터보다 실제 QPU를 더 정확하게 표현합니다.
-
양자 하드웨어에 맞게 알고리즘을 세밀하게 조정하는 과정은 성능을 극대화하기 위해 ansatz, Circuit 구현, 매개변수 및 구성을 조정하는 것을 포함합니다. 이 과정은 양자 하드웨어와의 직접적인 실험을 통해 가장 잘 달성할 수 있습니다.
시뮬레이터는 언제 사용해야 하나요?
양자 시뮬레이터는 프로그램을 개발하고 테스트한 후 세밀하게 조정하여 양자 하드웨어로 전송하기 전에 사용해야 합니다. 로컬 시뮬레이터는 좋은 성능과 효율성으로 이를 수행할 수 있습니다. Clifford Circuit은 매우 효율적으로 시뮬레이션할 수 있으며 결과를 검증할 수 있어, 실험에 대한 확신을 높이는 데 유용한 방법입니다.
로컬 테스트 모드에는 내장된 오류 억제 또는 완화 기능이 없습니다. 대신, 해당 옵션을 명시적으로 지정해야 합니다. 자세한 내용은 Qiskit Runtime의 오류 완화 구성을 참고하세요.
로컬 시뮬레이터로 마이그레이션
qiskit-ibm-runtime 0.22.0 이상에서는 로컬 테스트 모드를 사용하여 클라우드 시뮬레이터를 대체할 수 있습니다. 필요에 따라 로컬 테스트 모드를 사용하는 여러 가지 방법이 있습니다. 시작하려면 qiskit_ibm_runtime.fake_provider의 fake Backend 중 하나를 지정하거나, 프리미티브 또는 세션을 인스턴스화할 때 Qiskit Aer Backend를 지정하세요.
시뮬레이터 선택 가이드
다음 표를 참고하여 시뮬레이터를 선택하세요.
| 시뮬레이터 | Fake Backends | AerSimulator | Clifford 시뮬레이션 |
|---|---|---|---|
| 목적 | 스냅샷을 사용하여 특정 IBM® QPU를 모방 | 범용 고성능 시뮬레이션 | Clifford Circuit을 위한 효율적인 시뮬레이션 |
| 노이즈 모델 | QPU 스냅샷의 노이즈 모델을 자동으로 적용 | 맞춤형 또는 실제 QPU 캘리브레이션 데이 터 기반 | 노이즈 없는 시뮬레이션에 적합 |
| Circuit 크기 | 모방된 QPU의 기능으로 제한 | 더 큰 Circuit 처리 가능 | 매우 큰 Circuit(수백 Qubit)에 적합 |
| 결과 | QPU 특화 테스트의 적당한 실행 시간 | 다양한 시뮬레이션에서 짧은 실행 시간 | 매우 빠르며, 스태빌라이저 Circuit에 적합 |
| 사용 사례 | Transpiler 및 QPU 특화 동작 테스트 | 일반 개발, 맞춤형 노이즈 모델 | 대형 스태빌라이저 Circuit, 오류 교정 |
대부분의 사용자에게는 유연성과 성능으로 인해 AerSimulator가 좋은 선택입니다. 그러나 작업이 특정 QPU를 대상으로 하는 경우, fake Backend가 더 나은 선택일 수 있습니다.
Fake Backends
fake backends는 스냅샷을 사용하여 IBM QPU의 동작을 모방합니다. 스냅샷에는 커플링 맵, 기저 Gate, Qubit 속성과 같은 QPU에 대한 중요한 정보가 포함되어 있으며, 이는 Transpiler 테스트 및 QPU의 노이즈 시뮬레이션 수행에 유용합니다. 스냅샷의 노이즈 모델은 시뮬레이션 중에 자동으로 적용됩니다.
예시:
from qiskit.circuit.library import RealAmplitudes
from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime.fake_provider import FakeManilaV2
from qiskit_ibm_runtime import SamplerV2 as Sampler, QiskitRuntimeService
service = QiskitRuntimeService()
# Bell Circuit
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()
# Run the sampler job locally using FakeManilaV2
fake_manila = FakeManilaV2()
pm = generate_preset_pass_manager(backend=fake_manila, optimization_level=1)
isa_qc = pm.run(qc)
# You can use a fixed seed to get fixed results.
options = {"simulator": {"seed_simulator": 42}}
sampler = Sampler(mode=fake_manila, options=options)
result = sampler.run([isa_qc]).result()
AerSimulator
Qiskit Aer의 시뮬레이터와 함께 로컬 테스트 모드를 사용할 수 있습니다. 이를 통해 더 큰 Circuit을 처리할 수 있는 고성능 시뮬레이션과 맞춤형 노이즈 모델을 사용할 수 있습니다. 또한 많은 수의 Qubit을 가진 Clifford Circuit을 효율적으로 시뮬레이션할 수 있는 Clifford 시뮬레이션 모드도 지원합니다.
노이즈 없이 세션을 사용하는 예시:
from qiskit_aer import AerSimulator
from qiskit.circuit.library import RealAmplitudes
from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime import Session, SamplerV2 as Sampler, QiskitRuntimeService
service = QiskitRuntimeService()
# Bell Circuit
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()
# Run the sampler job locally using AerSimulator.
# Session syntax is supported but ignored because local mode doesn't support sessions.
aer_sim = AerSimulator()
pm = generate_preset_pass_manager(backend=aer_sim, optimization_level=1)
isa_qc = pm.run(qc)
with Session(backend=aer_sim) as session:
sampler = Sampler()
result = sampler.run([isa_qc]).result()
노이즈와 함께 시뮬레이션하려면 QPU(양자 하드웨어)를 지정하고 Aer에 제출하세요. Aer는 해당 QPU의 캘리브레이션 데이터를 기반으로 노이즈 모델을 구축하고 그 모델로 Aer Backend를 인스턴스화합니다. 원하는 경우 노이즈 모델을 직접 구축할 수도 있습니다.
노이즈를 사용하는 예시:
from qiskit_aer import AerSimulator
from qiskit.circuit.library import RealAmplitudes
from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler
service = QiskitRuntimeService()
# Bell Circuit
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()
# Specify a QPU to use for the noise model
real_backend = service.backend("ibm_brisbane")
aer = AerSimulator.from_backend(real_backend)
# Run the sampler job locally using AerSimulator.
pm = generate_preset_pass_manager(backend=aer, optimization_level=1)
isa_qc = pm.run(qc)
sampler = Sampler(mode=aer)
result = sampler.run([isa_qc]).result()
Clifford 시뮬레이션
Clifford Circuit은 검증 가능한 결과로 효율적으로 시뮬레이션할 수 있기 때문에, Clifford 시뮬레이션은 매우 유용한 도구입니다. 심층적인 예시는 Qiskit Aer 프리미티브를 사용한 스태빌라이저 Circuit의 효율적인 시뮬레이션을 참고하세요.
예시:
import numpy as np
from qiskit.circuit.library import EfficientSU2
from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler
service = QiskitRuntimeService()
n_qubits = 500 # <---- note this uses 500 qubits!
circuit = EfficientSU2(n_qubits)
circuit.measure_all()
rng = np.random.default_rng(1234)
params = rng.choice(
[0, np.pi / 2, np.pi, 3 * np.pi / 2],
size=circuit.num_parameters,
)
# Tell Aer to use the stabilizer (clifford) simulation method
aer_sim = AerSimulator(method="stabilizer")
pm = generate_preset_pass_manager(backend=aer_sim, optimization_level=1)
isa_circuit = pm.run(circuit)
sampler = Sampler(mode=aer_sim)
result = sampler.run([(isa_circuit, params)]).result()