주 콘텐츠로 건너뛰기

클라우드 시뮬레이터에서 로컬 시뮬레이터로 마이그레이션

양자 컴퓨팅에서 시뮬레이터와 양자 하드웨어 중 어느 것을 사용할지 선택하는 것은 이 분야의 발전을 위해 매우 중요합니다. 시뮬레이터는 테스트 및 디버깅에 유용하지만, 양자 유틸리티 시대에서 양자 개발과 산업 발전에는 실제 하드웨어가 필요합니다. 양자 유틸리티로의 전환의 일환으로, 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 BackendsAerSimulatorClifford 시뮬레이션
목적스냅샷을 사용하여 특정 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 시뮬레이션 모드도 지원합니다.

노이즈 없이 세션을 사용하는 예시:

주의

다음 코드 블록은 세션을 사용하기 때문에 Open Plan 사용자에게는 오류를 반환합니다. Open Plan의 워크로드는 작업 모드 또는 배치 모드에서만 실행할 수 있습니다.

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()