Tutorial for Using the uv Package Manager ========================================= `uv `_ is a Python package manager meant to act as a drop-in replacement for ``pip`` (and many more tools). In this project, we use it to manage our packages, similar to how ``poetry`` works. This is done using a lockfile called ``uv.lock``. The reasons for choosing ``uv`` over something like ``poetry`` are multiple: * ``uv`` tries to replace more than just ``poetry``, but also ``pyenv``, ``pip``, ``virtualenv`` and more. Thus, we can use a single, unified tool for most of our Python needs, similar to ``cargo`` in Rust. * ``uv`` is much faster than other package managers, providing a speed boost of 10-100 times compared to ``pip``. uv as a Drop-In Replacement for pip ----------------------------------- ``uv`` is a lot faster than ``pip``, so we recommend installing packages from ``PyPI`` with ``uv pip install `` instead of ``pip install ``. Since ``uv`` works as a drop-in replacement for ``pip``, you can use this feature to speedup any installation without changing the setup of your project. uv as a Project-Wide Package Manager ------------------------------------ If you wish to use the ``uv sync`` and/or ``uv lock`` commands, which is how you use ``uv`` to manage all your project packages, then note that these commands will only work with the directory called ``.venv`` in the project directory. This can occasionally be inconvenient, especially with an existing virtual environment, so we recommend using a `symlink `_. If you need to switch between multiple virtual environments, you can update the symlink to point to the desired one. Using Symlinks to Manage Multiple venvs ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To create a symlink between your venv and the ``.venv`` directory, you can use the following command: .. code-block:: bash ln -s As an example, if I am in the ``itwinai/`` folder and my venv is called ``envAI_juwels``, the following will create the desired symlink: .. code-block:: bash ln -s envAI_juwels .venv Installing from the uv.lock File ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. warning:: If ``uv`` creates your venv for you, the venv will not have ``pip`` installed. However, ``pip``is required to be able to run the installation scripts for ``Horovod`` and ``DeepSpeed``, so we have included it as a dependency in the ``pyproject.toml``. To install from the ``uv.lock`` file into the ``.venv`` venv, you can do the following: .. code-block:: bash uv sync Optional dependencies listed in the ``uv.lock`` file (e.g., ``torch``, ``tf``, and dev in itwinai) can be included with the --extra flag as shown below: .. code-block:: bash uv sync --extra torch --extra dev These "extras" correspond to the optional dependencies in the ``pyproject.toml``. In particular, if you are a developer you would use one of the following two commands. If you are on HPC with CUDA, you would use: .. code-block:: bash uv sync --no-cache --extra dev --extra torch --extra tf If you are developing on your local computer, then you would use: .. code-block:: bash uv sync --extra torch --extra tf --extra dev Updating the uv.lock File ~~~~~~~~~~~~~~~~~~~~~~~~~~ To update the project's ``uv.lock`` file with the dependencies of the project, you can use the command: .. code-block:: bash uv lock This will create a ``uv.lock`` file if it doesn't already exist, using the dependencies from the ``pyproject.toml``. Adding New Packages to the Project ---------------------------------- To add a new package to the project (i.e. to the ``pyproject.toml`` file) with ``uv``, you can use the following command: .. code-block:: bash uv add if you want to add a package to a specific optional dependency, then you can add the ``--optional `` flag: .. code-block:: bash uv add --optional As an example, if I wanted to add ``numpy`` as an optional dependency under the dependency group ``torch``, then I would do the following: .. code-block:: bash uv add numpy --optional torch This has the advantage that ``uv`` will run its dependency solver, meaning it will find suitable version constraints that fit with the other packages in the ``pyproject.toml``. .. warning:: This will add the package to your ``.venv`` venv, so make sure to have symlinked to this directory if you haven't already.