Qiskit v1.0 기능 변경 사항
이 가이드는 Qiskit v1.0의 가장 중요한 기능 변경 사항에 대한 마이그레이션 경로를 모듈별로 설명합니다. 오른쪽의 목차를 사용하여 관심 있는 모듈로 이동하세요.
Qiskit v1.0 마이그레이션 도구
마이그레이션 과정을 쉽게 하기 위해,
flake8-qiskit-migration
도구를 사용하여 코드에서 제거된 임포트 경로를 감지하고 대안을 제안받을 수 있습니다.
- pipx로 실행
- venv로 실행
pipx가 설치되어 있다면, 다음 명령어를 실행하세요.
pipx run flake8-qiskit-migration <path-to-source-directory>
패키지가 임시 가상 환경에 설치되고 코드에 대해 실행됩니다.
pipx를 사용하고 싶지 않다면, 도구를 위한 새 환경을 수동으로 만들 수 있습니다.
이 방법을 사용하면 nbqa를 사용하여
Jupyter 노트북의 코드 예제도 검사할 수 있습니다. 작업이 끝나면 환경을 삭제하세요.
# Make new environment and install
python -m venv .flake8-qiskit-migration-venv
source .flake8-qiskit-migration-venv/bin/activate
pip install flake8-qiskit-migration
# Run plugin on Python code
flake8 --select QKT100 <path-to-source-directory> # e.g. `src/`
# (Optional) run plugin on notebooks
pip install nbqa
nbqa flake8 ./**/*.ipynb --select QKT100
# Deactivate and delete environment
deactivate
rm -r .flake8-qiskit-migration-venv
이 도구는 제거된 임포트 경로만 감지합니다. 제거된 메서드(예: QuantumCircuit.qasm)나
인수의 사용은 감지하지 않습니다. 또한 qk = qiskit과 같은 할당을 추적할 수 없지만,
import qiskit as qk과 같은 별칭은 처리할 수 있습니다.
자세한 내용은 프로젝트 리포지토리를 참조하세요.
전역 인스턴스 및 함수
Aer
qiskit.Aer 객체는 Qiskit v1.0에서 사용할 수 없습니다. 대신, 드롭인 대체인
qiskit_aer 네임스페이스의 동일한 객체를 사용하세요.
qiskit_aer를 설치하려면 다음을 실행하세요:
pip install qiskit-aer
BasicAer
qiskit.BasicAer 객체는 Qiskit v1.0에서 사용할 수 없습니다. 마이그레이션 옵션은
basicaer 마이그레이션 섹션을 참조하세요.
execute
qiskit.execute 함수는 Qiskit v1.0에서 사용할 수 없습니다. 이 함수는 Qiskit의
transpile 및
run 함수에 대한 고수준 래퍼 역할을 했습니다.
qiskit.execute 대신,
transpile 함수에 이어
backend.run()을 사용하세요.
# Legacy path
from qiskit import execute
job = execute(circuit, backend)
# New path
from qiskit import transpile
new_circuit = transpile(circuit, backend)
job = backend.run(new_circuit)
또는, Sampler
프리미티브가 제거된 qiskit.execute 함수와 의미적으로 동일합니다.
BackendSampler 클래스는
프리미티브를 지원하지 않는 Backend를 위한 범용 래퍼입니다:
from qiskit.primitives import BackendSampler
sampler = BackendSampler(backend)
job = sampler.run(circuit)
qiskit.circuit
QuantumCircuit.qasm
QuantumCircuit.qasm 메서드가 제거되었습니다. 대신,
qasm2.dump 또는
qasm2.dumps를 사용하세요.
Pygments 형식의 출력을 원한다면, qasm2.dump와 qasm2.dumps는 Pygments 색상 출력을
제공하지 않으므로 독립형 openqasm-pygments
패키지를 확인하세요.
from qiskit import QuantumCircuit
qc = QuantumCircuit(1)
# Old
qasm_str = qc.qasm()
# Alternative
from qiskit.qasm2 import dumps
qasm_str = dumps(qc)
# Alternative: Write to file
from qiskit.qasm2 import dump
with open("my_file.qasm", "w") as f:
dump(qc, f)
QuantumCircuit Gate
다음 Gate 메서드가 제거되었으며, 동일한 Gate를 추가하는 더 확립된 메서드로 대체되었습니다:
| 제거됨 | 대안 |
|---|---|
QuantumCircuit.cnot | QuantumCircuit.cx |
QuantumCircuit.toffoli | QuantumCircuit.ccx |
QuantumCircuit.fredkin | QuantumCircuit.cswap |
QuantumCircuit.mct | QuantumCircuit.mcx |
QuantumCircuit.i | QuantumCircuit.id |
QuantumCircuit.squ | QuantumCircuit.unitary |
다음 Circuit 메서드가 제거되었습니다. 대신, 이러한 Gate는 QuantumCircuit.append로 Circuit에 적용할 수 있습니다.
| 제거됨 | 대안 (append) |
|---|---|
QuantumCircuit.diagonal | DiagonalGate |
QuantumCircuit.hamiltonian | HamiltonianGate |
QuantumCircuit.isometry | Isometry |
QuantumCircuit.iso | Isometry |
QuantumCircuit.uc | UCGate |
QuantumCircuit.ucrx | UCRXGate |
QuantumCircuit.ucry | UCRYGate |
QuantumCircuit.ucrz | UCRZGate |
예를 들어, DiagonalGate의 경우:
from qiskit.circuit import QuantumCircuit
# new location in the circuit library:
from qiskit.circuit.library import DiagonalGate
circuit = QuantumCircuit(2)
circuit.h([0, 1]) # some initial state
gate = DiagonalGate([1, -1, -1, 1])
qubits = [0, 1] # qubit indices on which to apply the gate
circuit.append(gate, qubits) # apply the gate
다음 QuantumCircuit 메서드도 제거되었습니다:
| 제거됨 | 대안 |
|---|---|
QuantumCircuit.bind_parameters | QuantumCircuit.assign_parameters |
QuantumCircuit.snapshot | qiskit-aer's save instructions |
qiskit.converters
qiskit.converters.ast_to_dag 함수가 Qiskit에서 제거되었습니다. 이 함수는 레거시 OpenQASM 2 파서가 생성한 추상 구문 트리를
DAGCircuit로 변환했습니다. 레거시
OpenQASM 2 파서가 제거되었으므로(qiskit.qasm 참조), 이 함수는 더 이상 용도가 없습니다. 대신,
QuantumCircuit.from_qasm_file
또는
QuantumCircuit.from_qasm_str
생성자 메서드(또는 qiskit.qasm2 모듈)를 사용하여 OpenQASM 2 파일을
QuantumCircuit로 파싱한 다음, 해당 QuantumCircuit을
circuit_to_dag로
DAGCircuit로 변환하세요.
# Previous
from qiskit.converters import ast_to_dag
from qiskit.qasm import Qasm
dag = ast_to_dag(Qasm(filename="myfile.qasm").parse())
# Current alternative
import qiskit.qasm2
from qiskit.converters import circuit_to_dag
dag = circuit_to_dag(qiskit.qasm2.load("myfile.qasm"))
qiskit.extensions
qiskit.extensions 모듈은 더 이상 사용할 수 없습니다. 대부분의 객체가 Circuit 라이브러리
(qiskit.circuit.library)에 통합되었습니다. 새 위치로
마이그레이션하려면, 객체 임포트 경로에서 qiskit.extensions를 qiskit.circuit.library로 바꾸면 됩니다.
드롭인 대체입니다.
# Previous
from qiskit.extensions import DiagonalGate
# Current alternative
from qiskit.circuit.library import DiagonalGate
qiskit.circuit.library로 이동한 클래스는 다음과 같습니다:
DiagonalGateHamiltonianGateInitializeIsometryqiskit.circuit.library.generalized_gates.mcg_up_diag.MCGupDiagUCGateUCPauliRotGateUCRXGateUCRYGateUCRZGateUnitaryGate
다음 클래스는 코드베이스에서 제거되었으며, 해당 기능이 중복되었거나 extensions 모듈에 연결되어 있었습니다:
| 제거됨 | 대안 |
|---|---|
SingleQubitUnitary | qiskit.circuit.library.UnitaryGate |
Snapshot | Use qiskit-aer's save instructions |
ExtensionError | A relevant error class |
qiskit.primitives
qiskit.primitives 모듈에서 가장 주목할만한 변경 사항은 새로운 프리미티브 V2 인터페이스의 도입입니다. 이 섹션에서는 프리미티브 V1에서 V2로의 워크플로우 마이그레이션 방법과 V1 인터페이스에서 허용되는 입력의 변경 사항을 설명합니다.
v1.0 릴리스부터 1.0 이전의 프리미티브 인터페이스를 "프리미티브 V1"이라고 합니다.
V1에서 V2로 마이그레이션
프리미티브 V1과 V2 API의 공식적인 차이점은 프리미티브 구현이 상속하는 기본 클래스입니다. 새 기본 클래스로 전환하려면, qiskit.primitives에서 기존 임포트 경로를 유지할 수 있습니다:
| 마이그레이션 대상 | 대체 항목 |
|---|---|
BaseEstimator | BaseEstimatorV2 |
BaseSampler | BaseSamplerV2 |
V2 프리미티브의 qiskit 코어 구현 이름(qiskit.primitives에서 임포트 가능)이 statevector 시뮬레이터 Backend로 로컬에서 실행할 수 있는 구현으로서의 목적을 명확히 하기 위해 수정되었습니다. 새 이름에는 -V2 접미사가 포함되지 않습니다.
| 마이그레이션 대상 | 대체 항목 |
|---|---|
qiskit.primitives.Estimator | qiskit.primitives.StatevectorEstimator |
qiskit.primitives.Sampler | qiskit.primitives.StatevectorSampler |
V1에서 V2로 마이그레이션할 때 고려해야 할 몇 가지 개념적 차이점이 있습니다.
이러한 차이점은 기본 클래스에 의해 결정되지만, 다음 예제에서는 qiskit.primitives에 있는 statevector 구현을 사용하여 보여줍니다:
다음 예제에서는 다음 임포트 및 프리미티브 초기화를 가정합니다:
from qiskit.primitives import (
Sampler,
StatevectorSampler,
Estimator,
StatevectorEstimator,
)
estimator_v1 = Estimator()
sampler_v1 = Sampler()
estimator_v2 = StatevectorEstimator()
sampler_v2 = StatevectorSampler()
# define circuits, observables and parameter values
Sampler 및 Estimator: 새로운 V2 프리미티브는 벡터화된 입력을 받도록 설계되어, 단일 Circuit을 배열 값 사양과 그룹화할 수 있습니다. 즉, 하나의 Circuit을n개의 매개변수 세트,n개의 옵저버블, 또는 둘 다(Estimator의 경우)의 배열에 대해 실행할 수 있습니다. 각 그룹을 **프리미티브 통합 블록(PUB)**이라 하며, 튜플로 표현할 수 있습니다:(1 x circuit, [n x observables], [n x parameters]). V1 인터페이스는 동일한 유연성을 허용하지 않았습니다. 대신, 입력 Circuit의 수가 옵저버블 및 매개변수 세트의 수와 일치해야 했습니다. 다음 예제를 참조하세요(탭을 선택하여 각 예제를 확인하세요):
- Estimator, 1 circuit, 4 observables
- Sampler, 1 circuit, 3 parameter sets
- Estimator, 1 circuit, 4 observables, 2 parameter sets
# executing 1 circuit with 4 observables using Estimator V1
job = estimator_v1.run([circuit] * 4, [obs1, obs2, obs3, obs4])
evs = job.result().values
# executing 1 circuit with 4 observables using Estimator V2
job = estimator_v2.run([(circuit, [obs1, obs2, obs3, obs4])])
evs = job.result()[0].data.evs
# executing 1 circuit with 3 parameter sets using Sampler V1
job = sampler_v1.run([circuit] * 3, [vals1, vals2, vals3])
dists = job.result().quasi_dists
# executing 1 circuit with 3 parameter sets using Sampler V2
job = sampler_v2.run([(circuit, [vals1, vals2, vals3])])
counts = job.result()[0].data.meas.get_counts()
# executing 1 circuit with 4 observables and 2 parameter sets using Estimator V1
job = estimator_v1.run([circuit] * 8, [obs1, obs2, obs3, obs4] * 2, [vals1, vals2] * 4)
evs = job.result().values
# executing 1 circuit with 4 observables and 2 parameter sets using Estimator V2
job = estimator_v2.run([(circuit, [[obs1, obs2, obs3, obs4]], [[vals1], [vals2]])])
evs = job.result()[0].data.evs
V2 프리미티브는 여러 PUB를 입력으로 받으며, 각 PUB는 자체 결과를 얻습니다. 이를 통해 다양한 매개변수/옵저버블 조합으로 서로 다른 Circuit을 실행할 수 있으며, 이는 V1 인터페이스에서 항상 가능하지 않았습니다:
- Sampler, 2 circuits, 1 parameter set
- Estimator, 2 circuits, 2 different observables
# executing 2 circuits with 1 parameter set using Sampler V1
job = sampler_v1.run([circuit1, circuit2], [vals1] * 2)
dists = job.result().quasi_dists
# executing 2 circuits with 1 parameter set using Sampler V2
job = sampler_v2.run([(circuit1, vals1), (circuit2, vals1)])
counts1 = job.result()[0].data.meas.get_counts() # result for pub 1 (circuit 1)
counts2 = job.result()[1].data.meas.get_counts() # result for pub 2 (circuit 2)
# executing 2 circuits with 2 different observables using Estimator V1
job = estimator_v1.run([circuit1, circuit2] , [obs1, obs2])
evs = job.result().values
# executing 2 circuits with 2 different observables using Estimator V2
job = estimator_v2.run([(circuit1, obs1), (circuit2, obs2)])
evs1 = job.result()[0].data.evs # result for pub 1 (circuit 1)
evs2 = job.result()[1].data.evs # result for pub 2 (circuit 2)
-
Sampler: V2 Sampler는 이제 V1 인터페이스의 유사 확률 분포 대신 비트문자열 또는 카운트 형태의 측정 결과 샘플을 반환합니다. 비트문자열은 측정된 순서를 보존하며 측정 결과를 보여줍니다. V2 Sampler 결과 객체는 동적 Circuit과의 호환성을 위해 입력 Circuit의 고전 레지스터 이름에 따라 데이터를 구성합니다.
# Define quantum circuit with 2 qubitscircuit = QuantumCircuit(2)circuit.h(0)circuit.cx(0, 1)circuit.measure_all()circuit.draw()┌───┐ ░ ┌─┐q_0: ┤ H ├──■───░─┤M├───└───┘┌─┴─┐ ░ └╥┘┌─┐q_1: ─────┤ X ├─░──╫─┤M├└───┘ ░ ║ └╥┘meas: 2/══════════════╩══╩═0 1기본 고전 레지스터 이름위 Circuit에서 고전 레지스터의 이름이 기본적으로
"meas"인 것을 확인하세요. 이 이름은 나중에 측정 비트문자열에 접근하는 데 사용됩니다.# Run using V1 Samplerresult = sampler_v1.run(circuit).result()quasi_dist = result.quasi_dists[0]print(f"The quasi-probability distribution is: {quasi_dist}")The quasi-probability distribution is: {0: 0.5, 3: 0.5}# Run using V2 Samplerresult = sampler_v2.run([circuit]).result()# Access result data for pub 0data_pub = result[0].data# Access bitstrings for the classical register "meas"bitstrings = data_pub.meas.get_bitstrings()print(f"The number of bitstrings is: {len(bitstrings)}")# Get counts for the classical register "meas"counts = data_pub.meas.get_counts()print(f"The counts are: {counts}")The number of bitstrings is: 1024The counts are: {'00': 523, '11': 501} -
Sampler 및 Estimator: V1 구현에서shots실행 옵션을 통해 일반적으로 노출되던 샘플링 오버헤드가 이제 PUB 수준에서 지정할 수 있는 프리미티브run()메서드의 인수입니다. V2 기본 클래스는 V1 API와 다른 형식으로 인수를 노출합니다:-
BaseSamplerV2.run은shots인수를 노출합니다(이전 워크플로우와 유사):# Sample two circuits at 128 shots each.sampler_v2.run([circuit1, circuit2], shots=128)# Sample two circuits at different amounts of shots.# The "None"s are necessary as placeholders# for the lack of parameter values in this example.sampler_v2.run([(circuit1, None, 123), (circuit2, None, 456)]) -
EstimatorV2.run은 프리미티브 구현이 기대값 추정에 대해 목표로 해야 하는 오차 범위를 지정하는precision인수를 도입합니다:# Estimate expectation values for two PUBs, both with 0.05 precision.estimator_v2.run([(circuit1, obs_array1),(circuit2, obs_array_2)], precision=0.05)
-
V1 인터페이스 업데이트
-
Estimator옵저버블 인수에서 밀집BaseOperator에서SparsePauliOp으로의 암묵적 변환이 더 이상 허용되지 않습니다. 대신SparsePauliOp.from_operator(operator)를 사용하여 명시적으로SparsePauliOp으로 변환해야 합니다. -
Estimator 옵저버블 인수에서
PauliList를 사용하는 것이 더 이상 허용되지 않습니다. 대신 먼저SparsePauliOp(pauli_list)를 사용하여 인수를 명시적으로 변환해야 합니다.
qiskit.providers
basicaer
qiskit.providers.basicaer 모듈의 대부분 기능이 새로운
qiskit.providers.basic_provider
모듈로 대체되었습니다. 단, UnitarySimulatorPy와 StatevectorSimulatorPy 클래스는
제거되었으며, 해당 기능은 이미 quantum_info 모듈에 포함되어 있었습니다.
새 경로로의 마이그레이션은 간단합니다. qiskit.providers.basicaer의 대부분 클래스를
qiskit.providers.basic_provider
대응 항목으로 바꿀 수 있습니다(드롭인 대체). 다음 클래스는 새 경로와 이름을 가집니다:
| 제거됨 | 대안 |
|---|---|
qiskit.providers.basicaer | qiskit.providers.basic_provider |
BasicAerProvider | BasicProvider |
BasicAerJob | BasicProviderJob |
QasmSimulatorPy | BasicSimulator |
새 모듈로 마이그레이션할 때 전역 인스턴스에 주의하세요. qiskit.BasicAer로 직접 임포트할 수 있었던
BasicAer 전역 인스턴스에 대한 대체는 없습니다. 이는
from qiskit import BasicProvider가 더 이상 유효한 임포트가 아님을 의미합니다.
대신, 프로바이더 클래스를 서브모듈에서 임포트하고 사용자가 인스턴스화해야 합니다:
# Previous
from qiskit import BasicAer
backend = BasicAer.get_backend("backend_name")
# Current
from qiskit.providers.basic_provider import BasicProvider
backend = BasicProvider().get_backend("backend_name")
유니터리 및 상태 벡터 시뮬레이터는 다른 quantum_info 클래스로 대체할 수 있습니다. 드롭인 대체는 아니지만 변경 사항은 최소한입니다. 다음 마이그레이션 예제를 참조하세요:
| 제거됨 | 대안 |
|---|---|
UnitarySimulatorPy | quantum_info.Operator |
StatevectorSimulatorPy | quantum_info.Statevector |
다음 예제는 basicaer 시뮬레이터의 마이그레이션 경로를 보여줍니다.
- Statevector simulator
- Unitary simulator
- QASM simulator
from qiskit import QuantumCircuit
qc = QuantumCircuit(3)
qc.h(0)
qc.h(1)
qc.cx(1, 2)
qc.measure_all()
# Previous
from qiskit import BasicAer
backend = BasicAer.get_backend("statevector_simulator")
statevector = backend.run(qc).result().get_statevector()
# Current
qc.remove_final_measurements() # no measurements allowed
from qiskit.quantum_info import Statevector
statevector = Statevector(qc)
from qiskit import QuantumCircuit
qc = QuantumCircuit(3)
qc.h(0)
qc.h(1)
qc.cx(1, 2)
qc.measure_all()
# Previous
from qiskit import BasicAer
backend = BasicAer.get_backend("unitary_simulator")
result = backend.run(qc).result()
# Current
qc.remove_final_measurements() # no measurements allowed
from qiskit.quantum_info import Operator
result = Operator(qc).data
from qiskit import QuantumCircuit
qc = QuantumCircuit(3)
qc.h(0)
qc.h(1)
qc.cx(1, 2)
qc.measure_all()
# Previous
from qiskit import BasicAer
backend = BasicAer.get_backend("qasm_simulator")
result = backend.run(qc).result()
# One current option
from qiskit.providers.basic_provider import BasicProvider
backend = BasicProvider().get_backend("basic_simulator")
result = backend.run(qc).result()
# Another current option is to specify it directly
from qiskit.providers.basic_provider import BasicSimulator
backend = BasicSimulator()
result = backend.run(qc).result()
fake_provider
사용자 대상 qiskit.providers.fake_provider 컴포넌트의 대부분이
qiskit-ibm-runtime Python 패키지로 마이그레이션되었습니다. 여기에는 페이크 프로바이더 클래스,
모든 디바이스별 페이크 Backend(예: FakeVigo, FakeNairobiV2, FakeSherbrooke), 페이크 Backend
기본 클래스가 포함됩니다. 다음 탭을 클릭하여 영향을 받는 클래스를 확인하세요.
- 페이크 Backend
- 페이크 프로바이더
- Any class in
qiskit.providers.fake_provider.backends fake_provider.fake_backend.FakeBackendfake_provider.fake_backend.FakeBackendV2
fake_provider.FakeProviderfake_provider.FakeProviderForBackendV2fake_provider.FakeProviderFactory
새 경로로 마이그레이션하려면:
-
qiskit-ibm-runtime0.17.1이상을 설치하세요:pip install 'qiskit-ibm-runtime>=0.17.1' -
코드에서
qiskit.providers.fake_provider의 인스턴스를qiskit_ibm_runtime.fake_provider로 바꾸세요. 예를 들어:# Oldfrom qiskit.providers.fake_provider import FakeProviderbackend1 = FakeProvider().get_backend("fake_ourense")from qiskit.providers.fake_provider import FakeSherbrookebackend2 = FakeSherbrooke()# Alternativefrom qiskit_ibm_runtime.fake_provider import FakeProviderbackend1 = FakeProvider().get_backend("fake_ourense")from qiskit_ibm_runtime.fake_provider import FakeSherbrookebackend2 = FakeSherbrooke()
페이크 Backend 기본 클래스도 마이그레이션되었지만, 임포트 경로에 몇 가지 차이가 있습니다:
| 제거됨 | 대안 |
|---|---|
qiskit.providers.fake_provider.FakeQasmBackend | qiskit_ibm_runtime.fake_provider.fake_qasm_backend.FakeQasmBackend |
qiskit.providers.fake_provider.FakePulseBackend | qiskit_ibm_runtime.fake_provider.fake_pulse_backend.FakePulseBackend |
다운스트림 라이브러리의 단위 테스트를 위해 페이크 Backend에 의존하고 있으며 qiskit-ibm-runtime
의존성과 충돌이 있는 경우, 새로운 Qiskit 네이티브 범용 페이크 Backend 대안도 찾을 수 있습니다.
여기에는 다음 BackendV1 클래스(드롭인 대체)가 포함됩니다:
qiskit.providers.fake_provider.Fake5QV1qiskit.providers.fake_provider.Fake20QV1qiskit.providers.fake_provider.Fake7QPulseV1qiskit.providers.fake_provider.Fake27QPulseV1qiskit.providers.fake_provider.Fake127QPulseV1
BackendV2 인스턴스를 반환하는 설정 가능한 클래스입니다:
fake_provider (특수 테스트 Backend)
qiskit.providers.fake_provider의 특수 테스트 목적 페이크 Backend 클래스는
qiskit_ibm_runtime.fake_provider로 마이그레이션되지 않았습니다. 권장 마이그레이션 경로는
새로운 GenericBackendV2
클래스를 사용하여 유사한 속성을 가진 Backend를 구성하거나 커스텀 타겟을 빌드하는 것입니다.
| 제거됨 | 대안 |
|---|---|
fake_provider.FakeBackendV2 | fake_provider.GenericBackendV2 |
fake_provider.FakeBackend5QV2 | fake_provider.GenericBackendV2 |
fake_provider.FakeBackendV2LegacyQubitProps | fake_provider.GenericBackendV2 |
fake_provider.FakeBackendSimple | fake_provider.GenericBackendV2 |
fake_provider.ConfigurableFakeBackend | fake_provider.GenericBackendV2 |
예제: 새로운
GenericBackendV2
클래스로 마이그레이션:
# Legacy path
from qiskit.providers.fake_provider import FakeBackend5QV2
backend = FakeBackend5QV2()
# New path
from qiskit.providers.fake_provider import GenericBackendV2
backend = GenericBackendV2(num_qubits=5)
# Note that this class generates a 5q backend with generic
# properties that serves the same purpose as FakeBackend5QV2
# but will not be identical.
기타 마이그레이션 팁
-
qiskit.providers.aer에서의 임포트가 더 이상 불가능합니다. 대신, 드롭인 대체인qiskit_aer에서 임포트하세요.qiskit_aer를 설치하려면 다음을 실행하세요:pip install qiskit-aer -
qiskit.providers.fake_provider의 Backend에서 펄스 작업 실행 지원이 Qiskit v1.0에서 제거되었습니다. 이는 Qiskit Aer가 이러한 작업에 대한 시뮬레이션 기능을 제거했기 때문입니다. 저수준 해밀토니안 시뮬레이션 워크로드의 경우, Qiskit Dynamics와 같은 전문 라이브러리 사용을 고려하세요.
qiskit.pulse
ParametricPulse
qiskit.pulse.library.parametric_pulses.ParametricPulse 기본 클래스와 펄스 라이브러리가
qiskit.pulse.SymbolicPulse
및 해당 펄스 라이브러리로 대체되었습니다. SymbolicPulse는
QPY 직렬화를 지원합니다:
from qiskit import pulse, qpy
with pulse.build() as schedule:
pulse.play(pulse.Gaussian(100, 0.1, 25), pulse.DriveChannel(0))
with open('schedule.qpy', 'wb') as fd:
qpy.dump(schedule, fd)
| 제거됨 | 대안 |
|---|---|
pulse.library.parametric_pulses.ParametricPulse | qiskit.pulse.SymbolicPulse |
pulse.library.parametric_pulses.Constant | pulse.library.symbolic_pulses.Constant |
pulse.library.parametric_pulses.Drag | pulse.library.symbolic_pulses.Drag |
pulse.library.parametric_pulses.Gaussian | pulse.library.symbolic_pulses.Gaussian |
qiskit.pulse.library.parametric_pulses.GaussianSquare | pulse.library.symbolic_pulses.GaussianSquare |
복소값 진폭
복소값 펄스 진폭(amp)이 (amp, angle) 쌍으로 대체되었습니다. 이 표현은 특히 각도 캘리브레이션과 같은 일부 캘리브레이션 작업에서 더 직관적입니다:
from qiskit import pulse
from qiskit.circuit import Parameter
from math import pi
with pulse.build() as schedule:
angle = Parameter("θ")
pulse.play(pulse.Gaussian(100, 0.1, 25, angle=angle), pulse.DriveChannel(0))
schedule.assign_parameters({angle: pi})
Circuit Gate 연산 삽입
qiskit.pulse.builder.call을 통해 펄스 빌더 컨텍스트에 Circuit Gate 연산을 삽입하는 것이 더 이상 불가능합니다.
이 제거는 QuantumCircuit 유형의 입력 인수와 다음 함수에 영향을 줍니다:
qiskit.pulse.builder.call_gateqiskit.pulse.builder.cxqiskit.pulse.builder.u1qiskit.pulse.builder.u2qiskit.pulse.builder.u3qiskit.pulse.builder.x
여전히 Backend 캘리브레이션된 스케줄을 삽입하려면, Gate 명령어를 호출하는 대신 다음 패턴을 사용하세요.
from qiskit.providers.fake_provider import GenericBackendV2
from qiskit import pulse
backend = GenericBackendV2(num_qubits=5)
sched = backend.target["x"][(qubit,)].calibration
with pulse.build() as only_pulse_scheds:
pulse.call(sched)
마찬가지로, QuantumCircuit는
객체를 수동으로 트랜스파일하고 스케줄링하여 빌더 컨텍스트에 삽입할 수 있습니다.
from math import pi
from qiskit.compiler import schedule, transpile
qc = QuantumCircuit(2)
qc.rz(pi / 2, 0)
qc.sx(0)
qc.rz(pi / 2, 0)
qc.cx(0, 1)
qc_t = transpile(qc, backend)
sched = schedule(qc_t, backend)
with pulse.build() as only_pulse_scheds:
pulse.call(sched)
전체 프로그램을 펄스 모델로 작성하는 대신, 빌더로 최소한의 펄스 프로그램을 작성하고
QuantumCircuit.add_calibration
메서드를 통해 Gate 명령어의 마이크로코드로 QuantumCircuit에 첨부하는 것을 권장합니다.
builder.build
qiskit.pulse.builder.build의 다음 인수가 대안 없이 제거되었습니다.
default_transpiler_settingsdefault_circuit_scheduler_settings
다음 함수도 제거되었습니다:
qiskit.pulse.builder.active_transpiler_settingsqiskit.pulse.builder.active_circuit_scheduler_settingsqiskit.pulse.builder.transpiler_settingsqiskit.pulse.builder.circuit_scheduler_settings
이는 빌더 컨텍스트에 Circuit 객체를 삽입하는 것이 더 이상 불가능하기 때문입니다 (Circuit Gate 연산 삽입 참조). 이러한 설정은 삽입된 객체를 펄스 표현으로 변환하기 위한 것이었습니다.
library
이산 펄스 라이브러리가 코드베이스에서 제거되었습니다. 여기에는 다음이 포함됩니다:
qiskit.pulse.library.constantqiskit.pulse.library.zeroqiskit.pulse.library.squareqiskit.pulse.library.sawtoothqiskit.pulse.library.triangleqiskit.pulse.library.cosqiskit.pulse.library.sinqiskit.pulse.library.gaussianqiskit.pulse.library.gaussian_derivqiskit.pulse.library.sechqiskit.pulse.library.sech_derivqiskit.pulse.library.gaussian_squareqiskit.pulse.library.drag
대신, 해당하는
qiskit.pulse.SymbolicPulse를
SymbolicPulse.get_waveform()과 함께 사용하세요.
예를 들어, pulse.gaussian(100,0.5,10) 대신
pulse.Gaussian(100,0.5,10).get_waveform()을 사용하세요.
Sawtooth 및
Square의 위상은
이산 대응 항목과 달리 2\\pi의 위상이 전체 사이클을 이동하도록 정의됩니다.
또한 심볼릭 펄스 라이브러리에서 복소 진폭은 더 이상 지원되지 않습니다. 대신 float, amp, angle을 사용하세요.
ScalableSymbolicPulse
버전 5 이하의 qpy 파일(Qiskit Terra < 0.23.0)에서 복소 amp 매개변수가 있는
라이브러리 qiskit.pulse.ScalableSymbolicPulse 객체를 로드하는 것이 더 이상 불가능합니다.
복소 amp가 자동으로 float(amp, angle)로 변환되므로 마이그레이션 작업이 필요하지 않습니다.
이 변경은 다음 펄스에 적용됩니다:
qiskit.qasm
이전에 qiskit.qasm에 있던 레거시 OpenQASM 2 파서 모듈이
qiskit.qasm2 모듈로 대체되었으며, 이는 더 빠르고 정확한 OpenQASM 2 파서를 제공합니다. 고수준
QuantumCircuit 메서드인
from_qasm_file()
및
from_qasm_str()는
동일하게 유지되지만 내부적으로 새 파서를 사용합니다. 그러나 qasm2 모듈의 공개 인터페이스는 동일하지 않습니다. qiskit.qasm
모듈은 ply 파서 라이브러리가 반환하는 추상 구문 트리에 대한 인터페이스를 제공했지만, qiskit.qasm2는 AST나 파서에 대한
하위 수준 구현 세부 사항을 노출하지 않습니다. 대신 OpenQASM 2 입력을 받아
QuantumCircuit 객체를 출력합니다.
예를 들어, 이전에 다음과 같은 코드를 실행했다면:
import qiskit.qasm
from qiskit.converters import ast_to_dag, dag_to_circuit
ast = qiskit.qasm.Qasm(filename="myfile.qasm").parse()
dag = ast_to_dag(ast)
qasm_circ = dag_to_circuit(dag)
다음으로 대체하세요:
import qiskit.qasm2
qasm_circ = qiskit.qasm2.load("myfile.qasm")
qiskit.quantum_info
qiskit.quantum_info.synthesis 모듈이 코드베이스의 다양한 위치로 마이그레이션되었으며, 대부분 qiskit.synthesis로 이동했습니다.
| 제거됨 | 대안 |
|---|---|
OneQubitEulerDecomposer | qiskit.synthesis.one_qubit.OneQubitEulerDecomposer |
TwoQubitBasisDecomposer | qiskit.synthesis.two_qubits.TwoQubitBasisDecomposer |
XXDecomposer | qiskit.synthesis.two_qubits.XXDecomposer |
two_qubit_cnot_decompose | qiskit.synthesis.two_qubits.two_qubit_cnot_decompose |
Quaternion | qiskit.quantum_info.Quaternion |
이 이동은 Quaternion의 일반적인 임포트 경로에 영향을 주지 않았지만, 더 이상 qiskit.quantum_info.synthesis를 통해 접근할 수 없습니다.
마지막으로, cnot_rxx_decompose가 제거되었습니다.
qiskit.test
qiskit.test 모듈은 더 이상 공개 모듈이 아닙니다. 이 모듈은 공개되거나 Qiskit 테스트 스위트 외부에서 사용되도록 의도된 적이 없었습니다. 모든 기능이 Qiskit에 특화되어 있으며 대안이 제공되지 않습니다. 유사한 기능이 필요한 경우, 자체 테스트 하네스에 포함해야 합니다.
qiskit.tools
qiskit.tools 모듈은 Qiskit v1.0에서 제거되었습니다. 이 기능의 대부분은 다른 패키지의 유사한 기능으로 대체되었거나 대안 없이 제거되었습니다.
주요 예외는 qiskit.tools.parallel_map() 함수로, qiskit.utils 모듈로 이전되었습니다. 이 새 위치에서 사용할 수 있습니다. 예를 들어:
이전에 다음을 실행했다면:
# Previous
from qiskit.tools import parallel_map
parallel_map(func, input)
# Current
from qiskit.utils import parallel_map
parallel_map(func, input)
jupyter
qiskit.tools.jupyter 서브모듈이 제거되었습니다. 이 모듈의 기능이 더 이상 지원되지 않는 레거시 qiskit-ibmq-provider 패키지에 연결되어 있었기 때문입니다. 또한 BackendV1만 지원하고 최신 BackendV2 인터페이스는 지원하지 않았습니다.
monitor
qiskit.tools.monitor 서브모듈이 제거되었습니다. 이는 더 이상 지원되지 않는 레거시 qiskit-ibmq-provider 패키지에 연결되어 있었기 때문입니다(BackendV1 인터페이스만 지원하고 최신 BackendV2 인터페이스는 지원하지 않았습니다). 이 기능에 대한 대안은 제공되지 않습니다.
visualization
qiskit.tools.visualization 서브모듈이 제거되었습니다. 이 모듈은 Qiskit 시각화 모듈의 원래 위치에서의 레거시 리다이렉트였으며, Qiskit 0.8.0에서 qiskit.visualization으로 이동되었습니다. 이 경로를 여전히 사용하고 있다면, qiskit.tools.visualization에서 qiskit.visualization으로 임포트를 업데이트하세요.
# Previous
from qiskit.tools.visualization import plot_histogram
plot_histogram(counts)
# Current
from qiskit.visualization import plot_histogram
plot_histogram(counts)
events
qiskit.tools.events 모듈과 이 모듈이 노출하던 progressbar() 유틸리티가 제거되었습니다. 이 모듈의 기능은 널리 사용되지 않았으며, tqdm과 같은 전용 패키지로 더 잘 대체됩니다.
qiskit.transpiler
synthesis
qiskit.transpiler.synthesis 모듈의 항목이 새 위치로 마이그레이션되었습니다:
| 제거됨 | 대안 |
|---|---|
qiskit.transpiler.synthesis.aqc (except for AQCSynthesisPlugin) | qiskit.synthesis.unitary.aqc |
qiskit.transpiler.synthesis.graysynth | qiskit.synthesis.synth_cnot_phase_aam |
qiskit.transpiler.synthesis.cnot_synth | qiskit.synthesis.synth_cnot_count_full_pmh |
passes
NoiseAdaptiveLayout Transpiler 패스가
VF2Layout 및
VF2PostLayout로
대체되었으며, 이는 Backend의 보고된 노이즈 특성을 기반으로 레이아웃을 설정합니다. 패스와 해당 "noise_adaptive" 레이아웃 스테이지 플러그인이 모두 Qiskit에서 제거되었습니다.
CrosstalkAdaptiveSchedule Transpiler 패스가 코드베이스에서 제거되었습니다. 이 패스의 내부 동작이 BackendV1 인스턴스의 BackendProperties 페이로드에 설정된 사용자 정의 속성에 의존했기 때문에 더 이상 사용할 수 없었습니다. 이러한 필드를 설정하는 Backend가 없으므로 패스가 제거되었습니다.
passmanager
ConditionalController,
FlowControllerLinear, 및
DoWhileController 클래스의
append 메서드가 제거되었습니다. 대신, 컨트롤러 객체가 생성될 때 모든 작업이 제공되어야 합니다.
qiskit.utils
qiskit.utils의 다음 도구가 대체 없이 제거되었습니다:
qiskit.utils.arithmeticqiskit.utils.circuit_utilsqiskit.utils.entangler_mapqiskit.utils.name_unnamed_args
이러한 함수는 역시 제거된 qiskit.algorithms 및 qiskit.opflow 모듈에서만 사용되었습니다.
qiskit.visualization
qiskit.visualization.qcstyle 모듈이 제거되었습니다. 직접 대체로 qiskit.visualization.circuit.qcstyle를 사용하세요.