qilimanjaro-tech / qililab

Qililab is a generic and scalable quantum control library used for fast characterization and calibration of quantum chips. Qililab also offers the ability to execute high-level quantum algorithms with your quantum hardware.
Apache License 2.0
29 stars 2 forks source link

[BUG] Changing waveform using Qprogram for QM causes crash #709

Closed OscarQili closed 3 months ago

OscarQili commented 5 months ago

Expected behavior

I want to run the same Qprogram several times in a row, changing the pulse length between runs. This should run without any issue.

Actual behavior

The first Qprogram runs without issue. After changing the pulse length from 1000 -> 1004 for instance, it throws an error and crashes.

Additional information

In this case the Qprogram run is "rabi_single" from experiment_portfolio.qprogram. I have managed to get it to crash through the same procedure for other Qprograms such as resonator spectroscopy however.

The notebook used can be found in LabScripts/Personal_folders/Oscar/QM_Qprogram/Qprogram_QM_spectroscopy_new_calibration.ipynb

Source code

# Debugging
from experiment_portfolio.qprogram import rabi_amplitude, rabi_single

qprogram = rabi_single(AVERAGES, int(RESON_DUR), 1000, "QM", RESON_AMP, DRIVE_AMP)

results = platform.execute_qprogram(qprogram, bus_mapping={"readout": readout_bus, "drive": drive_bus}).results

----- change value in cell

# Debugging
from experiment_portfolio.qprogram import rabi_amplitude, rabi_single

qprogram = rabi_single(AVERAGES, int(RESON_DUR), 1004, "QM", RESON_AMP, DRIVE_AMP)

results = platform.execute_qprogram(qprogram, bus_mapping={"readout": readout_bus, "drive": drive_bus}).results

Tracebacks

Unclosed connection: Channel('192.168.1.67', 10251, ..., path=None)
2024-03-26 14:05:15,544 - qm - ERROR    - CONFIG ERROR in key "pulses.control_b3869bb5_b3869bb5_1000" [pulses.length] : Pulse 'control_b3869bb5_b3869bb5_1000' length doesn't match waveform 'b3869bb5' length
2024-03-26 14:05:15,545 - qm - ERROR    - CONFIG ERROR in key "pulses.control_b3869bb5_b3869bb5_1000" [pulses.length] : Pulse 'control_b3869bb5_b3869bb5_1000' length doesn't match waveform 'b3869bb5' length
Unclosed connection: Channel('192.168.1.67', 10251, ..., path=None)
Unclosed connection: Channel('192.168.1.67', 10251, ..., path=None)

{
    "name": "OpenQmException",
    "message": "Can not open QM. Please see previous errors",
    "stack": "---------------------------------------------------------------------------
OpenQmException                           Traceback (most recent call last)
Cell In[15], line 6
      2 from experiment_portfolio.qprogram import rabi_amplitude, rabi_single
      4 qprogram = rabi_single(AVERAGES, int(RESON_DUR), 1004, \"QM\", RESON_AMP, DRIVE_AMP)
----> 6 results = platform.execute_qprogram(qprogram, bus_mapping={\"readout\": readout_bus, \"drive\": drive_bus}).results

File ~/miniconda3/envs/qililab/lib/python3.10/site-packages/qililab/platform/platform.py:628, in Platform.execute_qprogram(self, qprogram, bus_mapping, debug)
    624         raise NotImplementedError(
    625             \"Executing QProgram in more than one Quantum Machines Cluster is not supported.\"
    626         )
    627     cluster: QuantumMachinesCluster = instruments.pop()  # type: ignore[assignment]
--> 628     return self._execute_qprogram_with_quantum_machines(
    629         cluster=cluster, qprogram=qprogram, bus_mapping=bus_mapping, debug=debug
    630     )
    631 raise NotImplementedError(\"Executing QProgram in a mixture of instruments is not supported.\")

File ~/miniconda3/envs/qililab/lib/python3.10/site-packages/qililab/platform/platform.py:686, in Platform._execute_qprogram_with_quantum_machines(self, cluster, qprogram, bus_mapping, debug)
    683 compiler = QuantumMachinesCompiler()
    684 qua_program, configuration, measurements = compiler.compile(qprogram=qprogram, bus_mapping=bus_mapping)
--> 686 cluster.append_configuration(configuration=configuration)
    688 if debug:
    689     with open(\"debug_qm_execution.py\", \"w\", encoding=\"utf-8\") as sourceFile:

File ~/miniconda3/envs/qililab/lib/python3.10/site-packages/qililab/instruments/quantum_machines/quantum_machines_cluster.py:299, in QuantumMachinesCluster.append_configuration(self, configuration)
    297 # If we are already connected, reopen the connection with the new configuration
    298 if self._is_connected_to_qm:
--> 299     self._qm = self._qmm.open_qm(config=self._config, close_other_machines=True)

File ~/miniconda3/envs/qililab/lib/python3.10/site-packages/qm/quantum_machines_manager.py:249, in QuantumMachinesManager.open_qm(self, config, close_other_machines, validate_with_protobuf, add_calibration_elements_to_config, use_calibration_data, **kwargs)
    246     loaded_config = prep_config_for_calibration(loaded_config, self._octave_config, self._caps)
    248 self._octave_manager.set_octaves_from_qua_config(loaded_config.v1_beta.octaves)
--> 249 machine_id = self._frontend.open_qm(loaded_config, close_other_machines)
    251 return QuantumMachine(
    252     machine_id=machine_id,
    253     pb_config=loaded_config,
   (...)
    258     octave_manager=self._octave_manager,
    259 )

File ~/miniconda3/envs/qililab/lib/python3.10/site-packages/qm/api/base_api.py:28, in connection_error_handle_decorator.<locals>.wrapped(*args, **kwargs)
     25 @functools.wraps(func)
     26 def wrapped(*args: P.args, **kwargs: P.kwargs) -> Ret:
     27     try:
---> 28         return func(*args, **kwargs)
     29     except grpclib.exceptions.GRPCError as e:
     30         if is_debug():

File ~/miniconda3/envs/qililab/lib/python3.10/site-packages/qm/api/frontend_api.py:129, in FrontendApi.open_qm(self, config, close_other_machines)
    121         logger.error(
    122             f'PHYSICAL CONFIG ERROR in key \"{physical_error.path}\" [{physical_error.group}] : {physical_error.message}'
    123         )
    125     errors = [(item.group, item.path, item.message) for item in response.config_validation_errors] + [
    126         (item.group, item.path, item.message) for item in response.physical_validation_errors
    127     ]
--> 129     raise OpenQmException(\"Can not open QM. Please see previous errors\", errors=errors)
    131 for warning in response.open_qm_warnings:
    132     logger.warning(f\"Open QM ended with warning {warning.code}: {warning.message}\")

OpenQmException: Can not open QM. Please see previous errors"
}

error for resonator spectroscopy:

Unclosed connection: Channel('192.168.1.67', 10251, ..., path=None)
Unclosed connection: Channel('192.168.1.67', 10251, ..., path=None)
Unclosed connection: Channel('192.168.1.67', 10251, ..., path=None)
2024-03-26 13:57:54,220 - qm - ERROR    - Program "1705078996791" not found
2024-03-26 13:57:54,220 - qm - ERROR    - Job 1705078996797 failed. Failed to execute program.

{
    "name": "FailedToAddJobToQueueException",
    "message": "Job 1705078996797 failed. Failed to execute program.",
    "stack": "---------------------------------------------------------------------------
FailedToAddJobToQueueException            Traceback (most recent call last)
Cell In[24], line 1
----> 1 results = platform.execute_qprogram(qprogram, bus_mapping={\"readout\": readout_bus})
      2 path = ql.save_results(
      3     results.results[readout_bus][0].array, loops={\"frequency\": frequency}, data_path=\"/home/jupytershared/data/\"
      4 )

File ~/miniconda3/envs/qililab/lib/python3.10/site-packages/qililab/platform/platform.py:628, in Platform.execute_qprogram(self, qprogram, bus_mapping, debug)
    624         raise NotImplementedError(
    625             \"Executing QProgram in more than one Quantum Machines Cluster is not supported.\"
    626         )
    627     cluster: QuantumMachinesCluster = instruments.pop()  # type: ignore[assignment]
--> 628     return self._execute_qprogram_with_quantum_machines(
    629         cluster=cluster, qprogram=qprogram, bus_mapping=bus_mapping, debug=debug
    630     )
    631 raise NotImplementedError(\"Executing QProgram in a mixture of instruments is not supported.\")

File ~/miniconda3/envs/qililab/lib/python3.10/site-packages/qililab/platform/platform.py:697, in Platform._execute_qprogram_with_quantum_machines(self, cluster, qprogram, bus_mapping, debug)
    694     self._qua_program_cache[qua_program_hash] = cluster.compile(program=qua_program)
    695 compiled_program_id = self._qua_program_cache[qua_program_hash]
--> 697 job = cluster.run_compiled_program(compiled_program_id=compiled_program_id)
    699 acquisitions = cluster.get_acquisitions(job=job)
    701 results = QProgramResults()

File ~/miniconda3/envs/qililab/lib/python3.10/site-packages/qililab/instruments/quantum_machines/quantum_machines_cluster.py:392, in QuantumMachinesCluster.run_compiled_program(self, compiled_program_id)
    390 def run_compiled_program(self, compiled_program_id: str) -> RunningQmJob:
    391     \"\"\"Runs a compiled QUA Program.\"\"\"
--> 392     pending_job = self._qm.queue.add_compiled(compiled_program_id)
    393     return pending_job.wait_for_execution()

File ~/miniconda3/envs/qililab/lib/python3.10/site-packages/qm/jobs/job_queue.py:107, in QmQueue.add_compiled(self, program_id, overrides)
     81 \"\"\"Adds a compiled QUA program to the end of the queue, optionally
     82 overriding the values of analog waveforms defined in the program.
     83 Programs in the queue will play as soon as possible.
   (...)
    103     
    104 \"\"\"
    105 execution_overrides = overrides or {}
--> 107 job_id = self._frontend.add_compiled_to_queue(
    108     machine_id=self.machine_id,
    109     program_id=program_id,
    110     execution_overrides=ExecutionOverridesSchema().load(execution_overrides),
    111 )
    112 return QmPendingJob(
    113     job_id=job_id,
    114     machine_id=self.machine_id,
   (...)
    117     store=self._store,
    118 )

File ~/miniconda3/envs/qililab/lib/python3.10/site-packages/qm/api/base_api.py:28, in connection_error_handle_decorator.<locals>.wrapped(*args, **kwargs)
     25 @functools.wraps(func)
     26 def wrapped(*args: P.args, **kwargs: P.kwargs) -> Ret:
     27     try:
---> 28         return func(*args, **kwargs)
     29     except grpclib.exceptions.GRPCError as e:
     30         if is_debug():

File ~/miniconda3/envs/qililab/lib/python3.10/site-packages/qm/api/frontend_api.py:241, in FrontendApi.add_compiled_to_queue(self, machine_id, program_id, execution_overrides)
    239 if not response.ok:
    240     logger.error(f\"Job {job_id} failed. Failed to execute program.\")
--> 241     raise FailedToAddJobToQueueException(f\"Job {job_id} failed. Failed to execute program.\")
    243 return job_id

FailedToAddJobToQueueException: Job 1705078996797 failed. Failed to execute program."
}

System Information

Name: qililab
Version: 0.24.0
Summary: Fundamental package for fast characterization and calibration of quantum chips.
Home-page: https://github.com/qilimanjaro-tech/qililab
Author: Qilimanjaro Quantum Tech
Author-email: info@qilimanjaro.tech
License: Apache License 2.0
Location: /home/opihl/miniconda3/envs/qililab/lib/python3.10/site-packages
Requires: h5py, lmfit, networkx, pandas, papermill, PyVISA-py, qblox-instruments, qcodes, qcodes-contrib-drivers, qibo, qiboconnection, qm-qua, qpysequence, qualang-tools, ruamel.yaml, rustworkx, submitit, tqdm, urllib3
Required-by: experiment-portfolio

Platform info:             Linux-5.15.0-94-generic-x86_64-with-glibc2.35
Python version:            3.10.13
PyVISA version:            0.7.1
QCodes version:            0.42.0
QCodes Contrib version:    0.18.0
Qblox Instrument version:  0.10.1
Qpysequence version:       0.10.0
Quantum Machines version:  1.1.6
Qibo version:              0.1.12.dev0

Also tried running this on branch ahc-298-bug-executing-aprogram-after-creating-new-quantum-machines without success:

Name: qililab
Version: 0.24.0
Summary: Fundamental package for fast characterization and calibration of quantum chips.
Home-page: https://github.com/qilimanjaro-tech/qililab
Author: Qilimanjaro Quantum Tech
Author-email: info@qilimanjaro.tech
License: Apache License 2.0
Location: /home/opihl/miniconda3/envs/qililab/lib/python3.10/site-packages
Requires: h5py, lmfit, networkx, pandas, papermill, PyVISA-py, qblox-instruments, qcodes, qcodes-contrib-drivers, qibo, qiboconnection, qm-qua, qpysequence, qualang-tools, ruamel.yaml, rustworkx, submitit, tqdm, urllib3
Required-by: experiment-portfolio

Platform info:             Linux-5.15.0-94-generic-x86_64-with-glibc2.35
Python version:            3.10.13
PyVISA version:            0.7.1
QCodes version:            0.42.0
QCodes Contrib version:    0.18.0
Qblox Instrument version:  0.10.1
Qpysequence version:       0.10.0
Quantum Machines version:  1.1.6
Qibo version:              0.1.12.dev0

Existing GitHub issues

linear[bot] commented 5 months ago

QHC-331 [BUG] Changing waveform using Qprogram for QM causes crash

jordivallsq commented 4 months ago

Bug is solved in https://github.com/qilimanjaro-tech/qililab/pull/713 look forward for the publication in the main branch