Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

generate_preset_pass_manager compatibility issue in 'scheduling_method' options with runtime FakebakcendV2 and Aersimulator #12362

Open
0sophy1 opened this issue May 7, 2024 · 1 comment
Labels
bug Something isn't working

Comments

@0sophy1
Copy link

0sophy1 commented May 7, 2024

Environment

  • Qiskit version: 1.0.2
  • Python version: 3.10.14
  • Operating system: Mac, Anaconda

What is happening?

if add scheduling_method option inside of generate_preset_pass_manager with FakebackendV2 of qiskit-ibm-runtim and Aersimulator of qiskit-aer, granularity relate error comes

below is whole error block:

AttributeError                            Traceback (most recent call last)
Cell In[26], line 2
      1 #but ok with Aersimulator, which bring confuration from backends
----> 2 pm = generate_preset_pass_manager(backend=noisy_backend, optimization_level=1, scheduling_method='alap')

File ~/opt/anaconda3/envs/qiskit10/lib/python3.10/site-packages/qiskit/transpiler/preset_passmanagers/__init__.py:255, in generate_preset_pass_manager(optimization_level, backend, target, basis_gates, inst_map, coupling_map, instruction_durations, backend_properties, timing_constraints, initial_layout, layout_method, routing_method, translation_method, scheduling_method, approximation_degree, seed_transpiler, unitary_synthesis_method, unitary_synthesis_plugin_config, hls_config, init_method, optimization_method, _skip_target)
    253     pm = level_0_pass_manager(pm_config)
    254 elif optimization_level == 1:
--> 255     pm = level_1_pass_manager(pm_config)
    256 elif optimization_level == 2:
    257     pm = level_2_pass_manager(pm_config)

File ~/opt/anaconda3/envs/qiskit10/lib/python3.10/site-packages/qiskit/transpiler/preset_passmanagers/level1.py:94, in level_1_pass_manager(pass_manager_config)
     88     pre_optimization = common.generate_pre_op_passmanager(remove_reset_in_zero=False)
     90 optimization = plugin_manager.get_passmanager_stage(
     91     "optimization", optimization_method, pass_manager_config, optimization_level=1
     92 )
---> 94 sched = plugin_manager.get_passmanager_stage(
     95     "scheduling", scheduling_method, pass_manager_config, optimization_level=1
     96 )
     98 pre_init = common.generate_control_flow_options_check(
     99     layout_method=layout_method,
    100     routing_method=routing_method,
   (...)
    105     target=target,
    106 )
    107 init = plugin_manager.get_passmanager_stage(
    108     "init", init_method, pass_manager_config, optimization_level=1
    109 )

File ~/opt/anaconda3/envs/qiskit10/lib/python3.10/site-packages/qiskit/transpiler/preset_passmanagers/plugin.py:255, in PassManagerStagePluginManager.get_passmanager_stage(self, stage_name, plugin_name, pm_config, optimization_level)
    251     return self._build_pm(
    252         self.optimization_plugins, stage_name, plugin_name, pm_config, optimization_level
    253     )
    254 elif stage_name == "scheduling":
--> 255     return self._build_pm(
    256         self.scheduling_plugins, stage_name, plugin_name, pm_config, optimization_level
    257     )
    258 else:
    259     raise TranspilerError(f"Invalid stage name: {stage_name}")

File ~/opt/anaconda3/envs/qiskit10/lib/python3.10/site-packages/qiskit/transpiler/preset_passmanagers/plugin.py:272, in PassManagerStagePluginManager._build_pm(self, stage_obj, stage_name, plugin_name, pm_config, optimization_level)
    270     raise TranspilerError(f"Invalid plugin name {plugin_name} for stage {stage_name}")
    271 plugin_obj = stage_obj[plugin_name]
--> 272 return plugin_obj.obj.pass_manager(pm_config, optimization_level)

File ~/opt/anaconda3/envs/qiskit10/lib/python3.10/site-packages/qiskit/transpiler/preset_passmanagers/builtin_plugins.py:623, in AlapSchedulingPassManager.pass_manager(self, pass_manager_config, optimization_level)
    620 inst_map = pass_manager_config.inst_map
    621 target = pass_manager_config.target
--> 623 return common.generate_scheduling(
    624     instruction_durations, scheduling_method, timing_constraints, inst_map, target
    625 )

File ~/opt/anaconda3/envs/qiskit10/lib/python3.10/site-packages/qiskit/transpiler/preset_passmanagers/common.py:573, in generate_scheduling(instruction_durations, scheduling_method, timing_constraints, inst_map, target)
    566     scheduling.append(ContainsInstruction("delay"))
    567     scheduling.append(
    568         ConditionalController(
    569             TimeUnitConversion(instruction_durations, target=target), condition=_contains_delay
    570         )
    571     )
    572 if (
--> 573     timing_constraints.granularity != 1
    574     or timing_constraints.min_length != 1
    575     or timing_constraints.acquire_alignment != 1
    576     or timing_constraints.pulse_alignment != 1
    577 ):
    578     # Run alignment analysis regardless of scheduling.
    580     def _require_alignment(property_set):
    581         return property_set["reschedule_required"]

AttributeError: 'NoneType' object has no attribute 'granularity'

there will be no error if we use this option inside of transpile() function.

How can we reproduce the issue?

  1. with FakebackendV2
from qiskit_ibm_runtime.fake_provider import FakeOsaka
fakeosaka = FakeOsaka()

pm = generate_preset_pass_manager(backend=fakeosaka, optimization_level=1, scheduling_method='alap')

--> this returns "AttributeError: 'NoneType' object has no attribute 'granularity'"

  1. with Aersimulator with noise model
from qiskit_aer import AerSimulator
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService(channel="ibm_quantum")

sim = AerSimulator()
backend_device = service.get_backend('ibm_osaka')
noisy_backend = AerSimulator.from_backend(backend_device)

pm = generate_preset_pass_manager(backend=noisy_backend, optimization_level=1, scheduling_method='alap')

--> this also returns "AttributeError: 'NoneType' object has no attribute 'granularity'"

What should happen?

add delays according to the option as expected.
except this, other options and plugins of generate_preset_pass_manager works well

Any suggestions?

No response

@0sophy1 0sophy1 added the bug Something isn't working label May 7, 2024
@ashsaki
Copy link
Contributor

ashsaki commented May 15, 2024

Same issue with real backends.

Minimal example:

from qiskit.circuit import QuantumCircuit
from qiskit import transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService()
backend = service.backend("ibm_torino")

circuit = QuantumCircuit(2)
circuit.h(0)
circuit.x(1)
circuit.cx(0,1)

pm_sched = generate_preset_pass_manager(
    backend=backend,
    optimization_level=3,
    scheduling_method="alap"
)
isa_circuit_sched_pm = pm_sched.run(circuit)

Note that, this error does not occur if we use:

  • target instead of backend in the present pass manager.
  • transpile function instead of generate_preset_pass_manager

Software versions:

  • Qiskit: $1.0.2$ and $1.1.0rc1$
  • Qiskit IBM Runtime: $0.23.0$
  • Python: $3.11$
  • OS: Mac OS Sonoma

Error trace

14 pm_sched = generate_preset_pass_manager(
     15     backend=backend,
     16     optimization_level=3,
     17     scheduling_method="alap"
     18 )
     19 isa_circuit_sched_pm = pm_sched.run(circuit)

File [python3.11/site-packages/qiskit/transpiler/preset_passmanagers/__init__.py:259](python3.11/site-packages/qiskit/transpiler/preset_passmanagers/__init__.py#line=258), in generate_preset_pass_manager(optimization_level, backend, target, basis_gates, inst_map, coupling_map, instruction_durations, backend_properties, timing_constraints, initial_layout, layout_method, routing_method, translation_method, scheduling_method, approximation_degree, seed_transpiler, unitary_synthesis_method, unitary_synthesis_plugin_config, hls_config, init_method, optimization_method, _skip_target)
    257     pm = level_2_pass_manager(pm_config)
    258 elif optimization_level == 3:
--> 259     pm = level_3_pass_manager(pm_config)
    260 else:
    261     raise ValueError(f"Invalid optimization level {optimization_level}")

File [python3.11/site-packages/qiskit/transpiler/preset_passmanagers/level3.py:106](python3.11/site-packages/qiskit/transpiler/preset_passmanagers/level3.py#line=105), in level_3_pass_manager(pass_manager_config)
    103 else:
    104     pre_optimization = common.generate_pre_op_passmanager(remove_reset_in_zero=False)
--> 106 sched = plugin_manager.get_passmanager_stage(
    107     "scheduling", scheduling_method, pass_manager_config, optimization_level=3
    108 )
    110 return StagedPassManager(
    111     pre_init=pre_init,
    112     init=init,
   (...)
    118     scheduling=sched,
    119 )

File [python3.11/site-packages/qiskit/transpiler/preset_passmanagers/plugin.py:255](python3.11/site-packages/qiskit/transpiler/preset_passmanagers/plugin.py#line=254), in PassManagerStagePluginManager.get_passmanager_stage(self, stage_name, plugin_name, pm_config, optimization_level)
    251     return self._build_pm(
    252         self.optimization_plugins, stage_name, plugin_name, pm_config, optimization_level
    253     )
    254 elif stage_name == "scheduling":
--> 255     return self._build_pm(
    256         self.scheduling_plugins, stage_name, plugin_name, pm_config, optimization_level
    257     )
    258 else:
    259     raise TranspilerError(f"Invalid stage name: {stage_name}")

File [python3.11/site-packages/qiskit/transpiler/preset_passmanagers/plugin.py:272](python3.11/site-packages/qiskit/transpiler/preset_passmanagers/plugin.py#line=271), in PassManagerStagePluginManager._build_pm(self, stage_obj, stage_name, plugin_name, pm_config, optimization_level)
    270     raise TranspilerError(f"Invalid plugin name {plugin_name} for stage {stage_name}")
    271 plugin_obj = stage_obj[plugin_name]
--> 272 return plugin_obj.obj.pass_manager(pm_config, optimization_level)

File [python3.11/site-packages/qiskit/transpiler/preset_passmanagers/builtin_plugins.py:623](python3.11/site-packages/qiskit/transpiler/preset_passmanagers/builtin_plugins.py#line=622), in AlapSchedulingPassManager.pass_manager(self, pass_manager_config, optimization_level)
    620 inst_map = pass_manager_config.inst_map
    621 target = pass_manager_config.target
--> 623 return common.generate_scheduling(
    624     instruction_durations, scheduling_method, timing_constraints, inst_map, target
    625 )

File [python3.11/site-packages/qiskit/transpiler/preset_passmanagers/common.py:573](python3.11/site-packages/qiskit/transpiler/preset_passmanagers/common.py#line=572), in generate_scheduling(instruction_durations, scheduling_method, timing_constraints, inst_map, target)
    566     scheduling.append(ContainsInstruction("delay"))
    567     scheduling.append(
    568         ConditionalController(
    569             TimeUnitConversion(instruction_durations, target=target), condition=_contains_delay
    570         )
    571     )
    572 if (
--> 573     timing_constraints.granularity != 1
    574     or timing_constraints.min_length != 1
    575     or timing_constraints.acquire_alignment != 1
    576     or timing_constraints.pulse_alignment != 1
    577 ):
    578     # Run alignment analysis regardless of scheduling.
    580     def _require_alignment(property_set):
    581         return property_set["reschedule_required"]

AttributeError: 'NoneType' object has no attribute 'granularity'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants