Qiskit Aer 프리미티브를 이용한 정확한 시뮬레이션과 노이즈 시뮬레이션
이 페이지의 코드는 다음 요구 사항을 사용하여 개발되었습니다. 다음 버전 이상을 사용하는 것이 좋습니다.
qiskit[all]~=2.5.2 qiskit-aer~=0.17
Qiskit SDK 의 기본 요소를 활용한 정확한 시뮬레이션 예제는 Qiskit에 포함된 참조 기본 요소를 사용하여 양자 회로의 정확한 시뮬레이션을 수행하는 방법을 보여줍니다. 현재 존재하는 양자 프로세서에는 오류나 노이즈가 발생하기 때문에, 정확한 시뮬레이션 결과가 실제 하드웨어에서 회로를 실행했을 때 예상되는 결과를 반드시 반영하는 것은 아닙니다. Qiskit의 참조 프리미티브는 노이즈 모델링을 지원하지 않지만, Qiskit Aer에는 노이즈 모델링을 지원하는 프리미티브 구현이 포함되어 있습니다. Qiskit Aer는 참조 프리미티브 대신 사용할 수 있는 고성능 양자 회로 시뮬레이터로, 더 뛰어난 성능과 다양한 기능을 제공합니다. 이는 Qiskit 생태계의 일부입니다. 이 글에서는 Qiskit Aer 기본 요소를 활용하여 정확한 시뮬레이션과 노이즈가 포함된 시뮬레이션을 수행하는 방법을 설명합니다.
qiskit-aerv0.14 이상이 필요합니다.- Qiskit Aer 프리미티브는 프리미티브 인터페이스를 구현하지만, IBM Quantum 프리미티브와 동일한 옵션을 제공하지는 않습니다. 예를 들어, Qiskit Aer 기본 요소에서는 복원력 수준을 사용할 수 없습니다.
- Aer가 지원하는 시뮬레이션 방법 옵션에 대한 자세한 내용은 AerSimulator 설명서를 참조하세요.
정확하고 잡음이 적은 시뮬레이션을 살펴보려면 8개의 큐비트로 예제 회로를 만들어 보세요:
from qiskit.circuit.library import efficient_su2
n_qubits = 8
circuit = efficient_su2(n_qubits)
circuit.draw("mpl")Output:
이 회로에는 및 게이트의 회전 각도를 나타내는 파라미터가 포함되어 있습니다. 이 회로를 시뮬레이션할 때는 이러한 파라미터에 대한 명시적인 값을 지정해야 합니다. 다음 셀에서는 이러한 매개변수에 대한 몇 가지 값을 지정하고 Qiskit Aer의 추정기 프리미티브를 사용하여 관측 가능한 의 정확한 기대값을 계산합니다.
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_aer import AerSimulator
from qiskit_aer.primitives import EstimatorV2 as Estimator
observable = SparsePauliOp("Z" * n_qubits)
params = [0.1] * circuit.num_parameters
exact_estimator = Estimator()
# The circuit needs to be transpiled to the AerSimulator target
pass_manager = generate_preset_pass_manager(3, AerSimulator())
isa_circuit = pass_manager.run(circuit)
pub = (isa_circuit, observable, params)
job = exact_estimator.run([pub])
result = job.result()
pub_result = result[0]
exact_value = float(pub_result.data.evs)
exact_valueOutput:
0.8870140234256602
이제 모든 CX 게이트에 2%의 탈분극 오류를 포함하는 노이즈 모델을 초기화해 봅시다. 실제로 회로를 실행할 때, 여기서는 CX 게이트인 2큐비트 게이트에서 발생하는 오류가 주요 오류 원인이 됩니다. Qiskit Aer에서 소음 모델을 구축하는 방법에 대한 개요는 ‘소음 모델 구축’을 참조하십시오.
다음 셀에서는 이 노이즈 모델을 통합하는 추정기를 구성하고 이를 사용하여 관측 가능성의 기대값을 계산합니다.
from qiskit_aer.noise import NoiseModel, depolarizing_error
noise_model = NoiseModel()
cx_depolarizing_prob = 0.02
noise_model.add_all_qubit_quantum_error(
depolarizing_error(cx_depolarizing_prob, 2), ["cx"]
)
noisy_estimator = Estimator(
options=dict(backend_options=dict(noise_model=noise_model))
)
job = noisy_estimator.run([pub])
result = job.result()
pub_result = result[0]
noisy_value = float(pub_result.data.evs)
noisy_valueOutput:
0.7247404214143528
보시다시피 노이즈가 있을 때의 기대값은 정확한 값과 상당히 차이가 납니다. 실제로는 다양한 오류 완화 기술을 사용하여 노이즈의 영향에 대응할 수 있지만 이러한 기술에 대한 논의는 이 글의 범위를 벗어납니다.
노이즈가 최종 결과에 어떤 영향을 미치는지 대략적으로 파악하려면 각 CX 게이트에 2%의 디분극 오차를 추가하는 노이즈 모델을 고려하세요. 확률 의 탈분극 오류는 밀도 행렬 에 대해 다음과 같은 동작을 하는 양자 채널 로 정의됩니다:
여기서 는 큐비트 수(이 경우 2)입니다. 즉, 확률 로 상태가 완전히 혼합된 상태로 대체되고 확률 로 상태가 보존됩니다. 탈분극 채널을 적용한 후 상태가 보존될 확률은 이 됩니다. 따라서 시뮬레이션이 끝날 때 올바른 상태를 유지할 확률은 회로의 CX 게이트 수에 따라 기하급수적으로 감소할 것으로 예상됩니다.
회로의 CX 게이트 수를 세고 을 계산해 봅시다. count_ops 을 호출하여 게이트 이름을 카운트에 매핑하는 사전을 가져오고 CX 게이트에 대한 항목을 검색합니다.
cx_count = circuit.count_ops()["cx"]
(1 - cx_depolarizing_prob) ** cx_countOutput:
0.6542558123199923
이 값인 65%는 최종 상태가 정확할 확률을 대략적으로 추정할 수 있는 수치입니다. 시뮬레이션의 초기 상태를 고려하지 않았기 때문에 보수적인 추정치입니다.
다음 코드 셀은 키스킷 에어의 샘플러 프리미티브를 사용하여 잡음이 있는 회로에서 샘플링하는 방법을 보여줍니다. 샘플러 프리미티브로 실행하기 전에 회로에 측정값을 추가해야 합니다.
from qiskit_aer.primitives import SamplerV2 as Sampler
measured_circuit = circuit.copy()
measured_circuit.measure_all()
noisy_sampler = Sampler(
options=dict(backend_options=dict(noise_model=noise_model))
)
# The circuit needs to be transpiled to the AerSimulator target
pass_manager = generate_preset_pass_manager(3, AerSimulator())
isa_circuit = pass_manager.run(measured_circuit)
pub = (isa_circuit, params, 100)
job = noisy_sampler.run([pub])
result = job.result()
pub_result = result[0]
pub_result.data.meas.get_counts()Output:
{'00000110': 1,
'11100000': 1,
'00000000': 59,
'11000000': 3,
'11110000': 1,
'00010100': 1,
'00100000': 2,
'00000011': 3,
'00110010': 1,
'00110101': 1,
'00000101': 1,
'11000010': 1,
'10000000': 4,
'00110000': 1,
'01000000': 2,
'00010000': 2,
'00000100': 2,
'01010000': 1,
'00001000': 2,
'00011110': 1,
'00001010': 1,
'01111000': 1,
'10100000': 1,
'01100000': 1,
'00001100': 2,
'00010110': 1,
'01001000': 1,
'00101000': 1,
'00000010': 1}
다음 단계
- 작고 간단한 회로를 시뮬레이션하려면 ‘ Qiskit SDK 기본 요소(primitives)를 사용한 정확한 시뮬레이션’을 참조하십시오.
- 키스킷 에어 문서를 검토하세요.