Skip to main content

Deprecated: use qiskit-ibm-transpiler (https://pypi.org/project/qiskit-ibm-transpiler/) instead. A library to use Qiskit Transpiler service (https://docs.quantum.ibm.com/transpile/qiskit-transpiler-service) and the AI transpiler passes (https://docs.quantum.ibm.com/transpile/ai-transpiler-passes)

Project description

qiskit_transpiler_service

⚠️ The qiskit-transpiler-service package is deprecated. Use qiskit-ibm-transpiler instead. Version 0.4.14 will be the last one, no more fixes will be applied

A library to use Qiskit Transpiler service and the AI transpiler passes.

Note The Qiskit transpiler service and the AI transpiler passes use different experimental services that are only available for IBM Quantum Premium Plan users. This library and the releated services are an alpha release, subject to change.

Installing the qiskit-transpiler-service

To use the Qiskit transpiler service, install the qiskit-transpiler-service package:

pip install qiskit-transpiler-service

By default, the package tries to authenticate to IBM Quantum services with the defined Qiskit API token, and uses your token from the QISKIT_IBM_TOKEN environment variable or from the file ~/.qiskit/qiskit-ibm.json (under the section default-ibm-quantum).

Note: This library requires Qiskit 1.0 by default.

How to use the library

Using the Qiskit Transpiler service

The following examples demonstrate how to transpile circuits using the Qiskit transpiler service with different parameters.

  1. Create a circuit and call the Qiskit transpiler service to transpile the circuit with ibm_sherbrooke as the backend_name, 3 as the optimization_level, and not using AI during the transpilation.

    from qiskit.circuit.library import EfficientSU2
    from qiskit_transpiler_service.transpiler_service import TranspilerService
    
    circuit = EfficientSU2(101, entanglement="circular", reps=1).decompose()
    
    cloud_transpiler_service = TranspilerService(
        backend_name="ibm_sherbrooke",
        ai='false',
        optimization_level=3,
    )
    transpiled_circuit = cloud_transpiler_service.run(circuit)
    

Note: you only can use backend_name devices you are allowed to with your IBM Quantum Account. Apart from the backend_name, the TranspilerService also allows coupling_map as parameter.

  1. Produce a similar circuit and transpile it, requesting AI transpiling capabilities by setting the flag ai to 'true':

    from qiskit.circuit.library import EfficientSU2
    from qiskit_transpiler_service.transpiler_service import TranspilerService
    
    circuit = EfficientSU2(101, entanglement="circular", reps=1).decompose()
    
    cloud_transpiler_service = TranspilerService(
        backend_name="ibm_sherbrooke",
        ai='true',
        optimization_level=1,
    )
    transpiled_circuit = cloud_transpiler_service.run(circuit)
    

Using the AIRouting pass manually

The AIRouting pass acts both as a layout stage and a routing stage. It can be used within a PassManager as follows:

from qiskit.transpiler import PassManager
from qiskit_transpiler_service.ai.routing import AIRouting
from qiskit.circuit.library import EfficientSU2

ai_passmanager = PassManager([
  AIRouting(backend_name="ibm_sherbrooke", optimization_level=2, layout_mode="optimize")
])

circuit = EfficientSU2(101, entanglement="circular", reps=1).decompose()

transpiled_circuit = ai_passmanager.run(circuit)

Here, the backend_name determines which backend to route for, the optimization_level (1, 2, or 3) determines the computational effort to spend in the process (higher usually gives better results but takes longer), and the layout_mode specifies how to handle the layout selection. The layout_mode includes the following options:

  • keep: This respects the layout set by the previous transpiler passes (or uses the trivial layout if not set). It is typically only used when the circuit must be run on specific qubits of the device. It often produces worse results because it has less room for optimization.
  • improve: This uses the layout set by the previous transpiler passes as a starting point. It is useful when you have a good initial guess for the layout; for example, for circuits that are built in a way that approximately follows the device's coupling map. It is also useful if you want to try other specific layout passes combined with the AIRouting pass.
  • optimize: This is the default mode. It works best for general circuits where you might not have good layout guesses. This mode ignores previous layout selections.

Using the AI circuit synthesis passes

The AI circuit synthesis passes allow you to optimize pieces of different circuit types (Clifford, Linear Function, Permutation) by re-synthesizing them. The typical way one would use the synthesis pass is the following:

from qiskit.transpiler import PassManager

from qiskit_transpiler_service.ai.routing import AIRouting
from qiskit_transpiler_service.ai.synthesis import AILinearFunctionSynthesis
from qiskit_transpiler_service.ai.collection import CollectLinearFunctions
from qiskit.circuit.library import EfficientSU2

ai_passmanager = PassManager([
  AIRouting(backend_name="ibm_cairo", optimization_level=3, layout_mode="optimize"),  # Route circuit
  CollectLinearFunctions(),  # Collect Linear Function blocks
  AILinearFunctionSynthesis(backend_name="ibm_cairo")  # Re-synthesize Linear Function blocks
])

circuit = EfficientSU2(10, entanglement="full", reps=1).decompose()

transpiled_circuit = ai_passmanager.run(circuit)

The synthesis respects the coupling map of the device: it can be run safely after other routing passes without "messing up" the circuit, so the overall circuit will still follow the device restrictions. By default, the synthesis will replace the original sub-circuit only if the synthesized sub-circuit improves the original (currently only checking CNOT count), but this can be forced to always replace the circuit by setting replace_only_if_better=False.

The following synthesis passes are available from qiskit_transpiler_service.ai.synthesis:

  • AICliffordSynthesis: Synthesis for Clifford circuits (blocks of H, S and CX gates). Currently up to 9 qubit blocks.
  • AILinearFunctionSynthesis: Synthesis for Linear Function circuits (blocks of CX and SWAP gates). Currently up to 9 qubit blocks.
  • AIPermutationSynthesis: Synthesis for Permutation circuits (blocks of SWAP gates). Currently available for 65, 33, and 27 qubit blocks.

We expect to gradually increase the size of the supported blocks.

All passes use a thread pool to send several requests in parallel. By default it will use as max threads as number of cores plus four (default values for ThreadPoolExecutor python object). However, you can set your own value with the max_threads argument at pass instantation. For example, the following line will instantiate the AILinearFunctionSynthesis pass allowing it to use a maximum of 20 threads.

AILinearFunctionSynthesis(backend_name="ibm_cairo", max_threads=20)  # Re-synthesize Linear Function blocks using 20 threads max

You can also set the environment variable AI_TRANSPILER_MAX_THREADS to the desired number of maximum threads, and all synthesis passes instantiated after that will use that value.

For sub-circuit to be synthesized by the AI synthesis passes, it must lay on a connected subgraph of the coupling map (this can be ensured by just doing a routing pass previous to collecting the blocks, but this is not the only way to do it). The synthesis passes will automatically check if a the specific subgraph where the sub-circuit lays is supported, and if it is not supported it will raise a warning and just leave the original sub-circuit as it is.

To complement the synthesis passes we also provide custom collection passes for Cliffords, Linear Functions and Permutations that can be imported from qiskit_transpiler_service.ai.collection:

  • CollectCliffords: Collects Clifford blocks as Instruction objects and stores the original sub-circuit to compare against it after synthesis.
  • CollectLinearFunctions: Collects blocks of SWAP and CX as LinearFunction objects and stores the original sub-circuit to compare against it after synthesis.
  • CollectPermutations: Collects blocks of SWAP circuits as Permutations.

These custom collection passes limit the sizes of the collected sub-circuits so that they are supported by the AI synthesis passes, so it is recommended to use them after the routing passes and before the synthesis passes to get a better optimization overall.

Customize logs

The library is prepared to let the user log the messages they want. For that, users only have to add the following code to their code:

import logging

logging.getLogger("qiskit_transpiler_service").setLevel(logging.X)

where X can be: NOTSET, DEBUG, INFO, WARNING, ERROR or CRITICAL

Citation

If you use any AI-powered feature from the Qiskit transpiler service in your research, use the following recommended citation:

@misc{2405.13196,
Author = {David Kremer and Victor Villar and Hanhee Paik and Ivan Duran and Ismael Faro and Juan Cruz-Benito},
Title = {Practical and efficient quantum circuit synthesis and transpiling with Reinforcement Learning},
Year = {2024},
Eprint = {arXiv:2405.13196},
}

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

qiskit_transpiler_service-0.4.14.tar.gz (28.9 kB view details)

Uploaded Source

Built Distribution

qiskit_transpiler_service-0.4.14-py3-none-any.whl (30.6 kB view details)

Uploaded Python 3

File details

Details for the file qiskit_transpiler_service-0.4.14.tar.gz.

File metadata

File hashes

Hashes for qiskit_transpiler_service-0.4.14.tar.gz
Algorithm Hash digest
SHA256 6d4e6acc814049060c76fdb91b8fa97a0a039a7cf17c23a9be91e4f9bad332b6
MD5 c67e036e2c68537ad5b606838f2f9fb6
BLAKE2b-256 6d52ecff1210bfcf1d7836772009ccda9cd5f6f54c132127fe7005357646cc2f

See more details on using hashes here.

Provenance

The following attestation bundles were made for qiskit_transpiler_service-0.4.14.tar.gz:

Publisher: cd.yml on Qiskit/qiskit-ibm-transpiler

Attestations:

File details

Details for the file qiskit_transpiler_service-0.4.14-py3-none-any.whl.

File metadata

File hashes

Hashes for qiskit_transpiler_service-0.4.14-py3-none-any.whl
Algorithm Hash digest
SHA256 7192d527d22d07abff91637a9ccf577790d12a49ff405e02248bf62003241600
MD5 9ddfa3385c2abeea484c6c528cb6502f
BLAKE2b-256 b4841c4d65e6c267fae2433104ed525566e371568d021488895500bd84689f35

See more details on using hashes here.

Provenance

The following attestation bundles were made for qiskit_transpiler_service-0.4.14-py3-none-any.whl:

Publisher: cd.yml on Qiskit/qiskit-ibm-transpiler

Attestations:

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page