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

moving distributed circuit into core #395

Merged
merged 6 commits into from
Apr 29, 2021
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion doc/source/qibo.rst
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ General circuit models
.. autoclass:: qibo.core.circuit.DensityMatrixCircuit
:members:
:member-order: bysource
.. autoclass:: qibo.tensorflow.distcircuit.DistributedCircuit
.. autoclass:: qibo.core.distcircuit.DistributedCircuit
:members:
:member-order: bysource

Expand Down
14 changes: 8 additions & 6 deletions examples/reuploading_classifier/qlassifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,13 +116,15 @@ def minimize(self, method='BFGS', options=None, compile=True):
parameters = r[1].result.xbest

elif method == 'sgd':
from qibo.tensorflow.gates import TensorflowGate
from qibo import K
circuit = self.circuit(self.training_set[0])
for gate in circuit.queue:
if not isinstance(gate, TensorflowGate):
raise RuntimeError('SGD VQE requires native Tensorflow '
'gates because gradients are not '
'supported in the custom kernels.')
if K.name not in {"tensorflow_defaulteinsum", "tensorflow_matmuleinsum"}:
from qibo.config import raise_error
raise_error(RuntimeError,
'SGD VQE requires native Tensorflow '
'gates because gradients are not '
'supported in the custom kernels.')

sgd_options = {"nepochs": 5001,
"nmessage": 1000,
Expand All @@ -132,7 +134,7 @@ def minimize(self, method='BFGS', options=None, compile=True):
sgd_options.update(options)

# proceed with the training
from qibo.config import K
from qibo import K
vparams = K.Variable(self.params)
optimizer = getattr(K.optimizers, sgd_options["optimizer"])(
learning_rate=sgd_options["learning_rate"])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from qibo.abstractions.circuit import AbstractCircuit
from qibo.config import raise_error, get_threads
from qibo.core import callbacks, circuit, measurements, states
from qibo.tensorflow.distutils import DistributedQueues
from qibo.core.distutils import DistributedQueues
from typing import Dict, List, Optional, Set, Tuple, Union


Expand Down
File renamed without changes.
4 changes: 2 additions & 2 deletions src/qibo/core/states.py
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ class DistributedState(VectorState):
"""Data structure that holds the pieces of a state vector.

This is created automatically by
:class:`qibo.tensorflow.distcircuit.DistributedCircuit`
:class:`qibo.core.distcircuit.DistributedCircuit`
which uses state pieces instead of the full state vector tensor to allow
distribution to multiple devices.
Using the ``DistributedState`` instead of the full state vector as a tensor
Expand All @@ -182,7 +182,7 @@ class DistributedState(VectorState):
"""

def __init__(self, circuit):
from qibo.tensorflow.distcircuit import DistributedCircuit
from qibo.core.distcircuit import DistributedCircuit
super().__init__(circuit.nqubits)
self.circuit_cls = DistributedCircuit
if not isinstance(circuit, self.circuit_cls):
Expand Down
2 changes: 1 addition & 1 deletion src/qibo/models/circuit.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def _constructor(cls, *args, **kwargs):
kwargs = {}
else:
try:
from qibo.tensorflow.distcircuit import DistributedCircuit
from qibo.core.distcircuit import DistributedCircuit
except ModuleNotFoundError: # pragma: no cover
# CI installs all required libraries by default
raise_error(ModuleNotFoundError,
Expand Down
4 changes: 2 additions & 2 deletions src/qibo/models/evolution.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ def execute(self, final_time, start_time=0.0, initial_state=None):

Returns:
Final state vector a ``tf.Tensor`` or a
:class:`qibo.tensorflow.distutils.DistributedState` when a
:class:`qibo.core.distutils.DistributedState` when a
distributed execution is used.
"""
state = self.get_initial_state(initial_state)
Expand Down Expand Up @@ -154,7 +154,7 @@ class AdiabaticEvolution(StateEvolution):
solver (str): Solver to use for integrating Schrodinger's equation.
callbacks (list): List of callbacks to calculate during evolution.
accelerators (dict): Dictionary of devices to use for distributed
execution. See :class:`qibo.tensorflow.distcircuit.DistributedCircuit`
execution. See :class:`qibo.core.distcircuit.DistributedCircuit`
for more details. This option is available only when the Trotter
decomposition is used for the time evolution.
memory_device (str): Name of device where the full state will be saved.
Expand Down
2 changes: 1 addition & 1 deletion src/qibo/models/variational.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ class QAOA(object):
Default solver is 'exp' (:class:`qibo.solvers.Exponential`).
callbacks (list): List of callbacks to calculate during evolution.
accelerators (dict): Dictionary of devices to use for distributed
execution. See :class:`qibo.tensorflow.distcircuit.DistributedCircuit`
execution. See :class:`qibo.core.distcircuit.DistributedCircuit`
for more details. This option is available only when ``hamiltonian``
is a :class:`qibo.abstractions.hamiltonians.TrotterHamiltonian`.
memory_device (str): Name of device where the full state will be saved.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ def apply_gate(state, gate, qubits, nqubits, target, omp_num_threads=get_threads
state (tf.Tensor): State vector of shape ``(2 ** nqubits,)``.
gate (tf.Tensor): Gate matrix of shape ``(2, 2)``.
qubits (tf.Tensor): Tensor that contains control and target qubits in
sorted order. See :meth:`qibo.tensorflow.cgates.TensorflowGate.qubits_tensor`
sorted order. See :meth:`qibo.backends.abstract.TensorflowCustomBackend.cache.qubits_tensor`
for more details.
nqubits (int): Total number of qubits in the state vector.
target (int): Qubit ID that the gate will act on.
Expand Down
2 changes: 1 addition & 1 deletion src/qibo/tests/test_distributed.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import numpy as np
import qibo
from qibo import models, gates
from qibo.tensorflow import distutils
from qibo.core import distutils
from qibo.tests import utils


Expand Down
6 changes: 3 additions & 3 deletions src/qibo/tests_new/test_core_states_distributed.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def test_distributed_state_init():
def test_distributed_state_constructors(init_type):
"""Tests `zero_state` and `plus_state` for `DistributedState`."""
from qibo.models import Circuit
from qibo.tensorflow.distutils import DistributedQubits
from qibo.core.distutils import DistributedQubits
c = Circuit(6, {"/GPU:0": 2, "/GPU:1": 2})
c.queues.qubits = DistributedQubits(range(c.nglobal), c.nqubits) # pylint: disable=E1101
state = getattr(states.DistributedState, f"{init_type}_state")(c)
Expand All @@ -40,7 +40,7 @@ def test_distributed_state_constructors(init_type):
def test_user_initialization(nqubits):
import itertools
from qibo.models import Circuit
from qibo.tensorflow.distutils import DistributedQubits
from qibo.core.distutils import DistributedQubits
target_state = (np.random.random(2 ** nqubits) +
1j * np.random.random(2 ** nqubits))
c = Circuit(nqubits, {"/GPU:0": 2, "/GPU:1": 2})
Expand All @@ -56,7 +56,7 @@ def test_user_initialization(nqubits):

def test_distributed_state_copy():
from qibo.models import Circuit
from qibo.tensorflow.distutils import DistributedQubits
from qibo.core.distutils import DistributedQubits
c = Circuit(4, {"/GPU:0": 2, "/GPU:1": 2})
c.queues.qubits = DistributedQubits(range(c.nglobal), c.nqubits) # pylint: disable=E1101
state = states.DistributedState.zero_state(c)
Expand Down