.. _installation:
Installation
============
`Conda `_ packages
----------------------------------------------------
Before installing, configure the Conda channels as follows::
conda config --add channels dhealth
conda config --add channels conda-forge
conda config --set channel_priority strict
Then run:
* ``conda install pyeddl-cpu``: for the CPU-only version
* ``conda install pyeddl-gpu``: for the GPU-enabled version
* ``conda install pyeddl-cudnn``: for GPU-enabled with cuDNN support
Each PyEDDL package installs the corresponding EDDL one as a dependency, as
well as any other requirement, so there's no need to separately install EDDL
or PyEDDL / EDDL when installing via Conda.
.. note::
The highest version available from Conda might be less than the latest
version on PyPI for recent releases.
Head over to https://github.com/deephealthproject/conda_builds for further
information.
Docker images
-------------
If you don't want to install on bare metal, the `DeepHealth Docker images
`_ provide ready-to-use
containers for the DeepHealth components, including PyEDDL. Refer to the above
link for further information.
Installing from source
----------------------
To install PyEDDL from source, you need to install EDDL first. Installation
instructions for EDDL are available as part of the `EDDL docs
`_, although we also provide
some hints here. Please refer to the EDDL docs if you need more details.
Some EDDL components are optional. By default, PyEDDL assumes that EDDL has
been installed with ONNX support. Also, EDDL can be compiled for CPU only or
with GPU/CUDNN support. You can build PyEDDL in both cases, with some
differences that will be highlighted further ahead.
Each PyEDDL version depends on a specific EDDL version. If you are installing
from the GitHub repo, the correct version of EDDL is available from the
submodule (``third_party`` dir).
The following sections contain instructions to install PyEDDL from scratch,
EDDL installation included. We use Ubuntu Linux as an example platform.
Install EDDL dependencies
^^^^^^^^^^^^^^^^^^^^^^^^^
EDDL needs the development versions of the zlib and Eigen3 libraries. To
enable ONNX I/O, you also need to install Google protobuf. On Ubuntu, for
instance, install the following with APT: ``build-essential, zlib1g-dev,
libeigen3-dev, wget, ca-certificates``. Install protobuf from source::
wget -q https://github.com/protocolbuffers/protobuf/releases/download/v3.11.4/protobuf-all-3.11.4.tar.gz
tar xf protobuf-all-3.11.4.tar.gz
cd protobuf-3.11.4
./configure
make -j$(nproc)
make install
If you want to compile EDDL for **GPU/CUDNN**, you also need the CUDA toolkit
(``nvidia-cuda-toolkit``). In this case, `you also need a recent version of
Eigen3
`_.
In the CUDNN case, you also need to install cuDNN.
.. note::
PyEDDL is part of the `DeepHealth ecosystem
`_. If you plan to use PyEDDL with
other DeepHealth components, you should make sure that your environment
satisfies the requirements of all such components. In particular, `ECVL
`_ needs a compiler with support
for C++ 17. Being a set of bindings for ECVL,
`PyECVL `_ also needs a C++ 17
compiler. Since all components need to be built with the same compiler to
work together, if you want to use PyEDDL together with PyECVL, you need to
compile everything with the same C++ 17 compiler. See the `PyECVL docs
`_ for an example of PyECVL +
PyEDDL installation.
Install EDDL
^^^^^^^^^^^^
Clone the PyEDDL GitHub repo::
git clone --recurse-submodules https://github.com/deephealthproject/pyeddl.git
cd pyeddl
Install EDDL::
pushd third_party/eddl
mkdir build
pushd build
cmake -D BUILD_SHARED_LIB=ON -D BUILD_PROTOBUF=ON -D BUILD_TESTS=OFF
make -j$(nproc)
make install
popd
popd
The above sequence builds EDDL with the default target, which at the moment is
``CUDNN``. To compile for a specific target, add the following to the cmake
flags:
* ``-D BUILD_TARGET=CPU`` for CPU-only
* ``-D BUILD_TARGET=GPU`` for GPU-enabled (also works on the CPU)
* ``-D BUILD_TARGET=CUDNN`` for GPU with CUDNN support (also works on the CPU)
.. note::
EDDL versions 0.3 and 0.3.1 are affected by an issue that breaks the
building of the shared library. To work around this, you can patch the
EDDL code with ``eddl_0.3.patch`` (at the top level in the PyEDDL git
repository).
Install PyEDDL
^^^^^^^^^^^^^^
You need the development version of python3 and pip. On Ubuntu, install
``python3-dev`` and ``python3-pip``.
Install the Python dependencies. Note that, at the moment, the pybind11
version needs to be less than 2.6::
python3 -m pip install --upgrade setuptools pip
python3 -m pip install --upgrade numpy 'pybind11<2.6' pytest
The EDDL code includes Eigen headers like in this example: ``#include
``, e.g., with ``Eigen`` as the root directory. However, Eigen
installations usually have the header rooted at ``eigen3`` (for instance, the
apt installation places them in ``/usr/include/eigen3``). To work around this
you can either add a symlink or set ``CPATH``, e.g.::
export CPATH="/usr/include/eigen3:${CPATH}"
Install pyeddl::
python3 setup.py install
Alternatively, in the case of tagged releases, you can also install PyEDDL
with pip. The following table shows the required EDDL version for each PyEDDL
version:
+----------------+--------------+
| PyEDDL version | EDDL version |
+================+==============+
| 0.1.0 | 0.2.2 |
+----------------+--------------+
| 0.2.0 | 0.3 |
+----------------+--------------+
| 0.3.0 | 0.3.1 |
+----------------+--------------+
| 0.4.0 | 0.4.2 |
+----------------+--------------+
| 0.5.0 | 0.4.3 |
+----------------+--------------+
| 0.6.0 | 0.4.4 |
+----------------+--------------+
| 0.7.* | 0.5.4a |
+----------------+--------------+
| 0.8.* | 0.6.0 |
+----------------+--------------+
| 0.9.* | 0.7.1 |
+----------------+--------------+
| 0.10.* | 0.8a |
+----------------+--------------+
| 0.11.* | 0.8.1a |
+----------------+--------------+
| 0.12.* | 0.8.3a |
+----------------+--------------+
| 0.13.* | 0.9.1b |
+----------------+--------------+
| 0.14.* | 0.9.2b |
+----------------+--------------+
| 1.0.0 | 1.0.2a |
+----------------+--------------+
| 1.1.0 | 1.0.3b |
+----------------+--------------+
| 1.2.0 | 1.0.4b |
+----------------+--------------+
| 1.3.* | 1.1b |
+----------------+--------------+
To install, run::
python3 -m pip install pyeddl
If EDDL was compiled for GPU/CUDNN, you need to export the ``EDDL_WITH_CUDA``
environment variable **before installing PyEDDL** so that ``setup.py`` will
also link the ``cudart``, ``cublas`` and ``curand`` libraries. These will be
expected in "standard" system locations, so you might need to create symlinks
depending on your CUDA toolkit installation. For instance, with CUDA 11.3::
export EDDL_WITH_CUDA="true"
ln -s /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudart.so /usr/lib/
ln -s /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcurand.so /usr/lib/
ln -s /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcublas.so /usr/lib/
Disabling unwanted modules
^^^^^^^^^^^^^^^^^^^^^^^^^^
By default, PyEDDL assumes a complete EDDL installation, including optional
modules, and builds bindings for all of them. You can disable support for
specific modules via environment variables. For instance, suppose you
installed EDDL without protobuf support: by default, PyEDDL will try to build
the bindings for protobuf-specific EDDL tools (ONNX support). To avoid this,
set the ``EDDL_WITH_PROTOBUF`` environment variable to ``OFF`` (or ``FALSE``)
before building PyEDDL.
EDDL installed in an arbitrary directory
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The above installation instructions assume installation in standard system
paths (such as ``/usr/local/include``, ``/usr/local/lib``). However, EDDL can
be installed in an arbitrary directory, for instance::
cd third_party/eddl
mkdir build
cd build
cmake -D BUILD_SHARED_LIB=ON -D BUILD_PROTOBUF=ON -DCMAKE_INSTALL_PREFIX=/home/myuser/eddl ..
make
make install
You can tell the PyEDDL setup script about this via the EDDL_DIR environment
variable::
export EDDL_DIR=/home/myuser/eddl
python3 setup.py install
In this way, ``setup.py`` will look for additional include files in
``/home/myuser/eddl/include`` and for additional libraries in
``/home/myuser/eddl/lib``.