Skip to content

Support for uv Package Manager Caching #822

Closed as not planned
Closed as not planned

Description

@mgaitan

Description
Hey there! I'm suggesting we add caching support for the uv package manager in setup-python. uv (uv pip command currently) is a drop-in replace for pip, using requirements.txt or any other input file that pip supports for dependencies definitions. The only difference is its cache directory: setup-python uses the output of pip cache dir to find the cache directory, but uv uses uv cache dir instead (see astral-sh/uv#1734). It should be a straightforward addition that could help projects using uv.

Justification
uv is 10-100x faster than pip. There is a lot of interest from the community to use this new tool in CI environments (e.g astral-sh/uv#1386)

Are you willing to submit a PR?
Yep! Happy to help out and get my hands dirty with a PR to make this happen. However, I'm far of being a Typescript expert.

Activity

  1. nschloe commented on Feb 23, 2024

    @nschloe

    You could also just cache the uv cache directory, e.g.,

          - uses: actions/cache@v4
            id: cache-uv
            with:
              path: ~/.cache/uv
              key: ${{ runner.os }}-python-${{ matrix.python-version }}-uv
  2. acostapazo commented on Feb 26, 2024

    @acostapazo

    You could also just cache the uv cache directory, e.g.,

          - uses: actions/cache@v4
            id: cache-uv
            with:
              path: ~/.cache/uv
              key: ${{ runner.os }}-python-${{ matrix.python-version }}-uv

    I have just tested this solution and I think it is not worth using it when your requirements are large packages.

    I've added the cache in my public playground with alice-biometrics/uv-playground@14871e8

    And run a workflow to test what happens when run without cache: https://github.com/alice-biometrics/uv-playground/actions/runs/8046635708/job/21974
    Screenshot 2024-02-26 at 10 35 38
    241996

    surprisingly, the size of the cache is very large, so it takes a long time to save in the post-cache.
    Screenshot 2024-02-26 at 10 36 05

    Then, I run it again to test how works with a saved cache: https://github.com/alice-biometrics/uv-playground/actions/runs/8046670133/job/21974345476
    Screenshot 2024-02-26 at 10 37 23

    The installation time is extremely fast, however, it takes the same amount of time to retrieve the cache as it does to install in a fresh environment with uv.

    Example of a workflow without uv cache: https://github.com/alice-biometrics/uv-playground/actions/runs/7986874748/job/21808164311
    Screenshot 2024-02-26 at 10 43 23

  3. added a commit that references this issue on Mar 24, 2024
  4. akx commented on Mar 27, 2024

    @akx
    Contributor

    Heh, I actually wrote a PR that implements this (before this issue, to boot), but no actions/setup-python maintainer seems to have seen it: #818

  5. added a commit that references this issue on Apr 2, 2024
  6. alechouse97 commented on Apr 24, 2024

    @alechouse97

    I've been playing with replacing pip with uv in our Gitlab CI pipeline, and it massively speeds up installing packages when you've got the cache. However, I've noticed that the uv cache is notably larger than the pip one (along with significantly more files), and the increase in Gitlab's cache time almost outweighs the shift to uv. Anyone else run into this?

  7. edgarrmondragon commented on Apr 24, 2024

    @edgarrmondragon

    I've been playing with replacing pip with uv in our Gitlab CI pipeline, and it massively speeds up installing packages when you've got the cache. However, I've noticed that the uv cache is notably larger than the pip one (along with significantly more files), and the increase in Gitlab's cache time almost outweighs the shift to uv. Anyone else run into this?

    I think that's essentially the same that's reported in #822 (comment)

  8. kdeldycke commented on Jul 24, 2024

    @kdeldycke

    Another strategy worth considering would be to cache the whole .venv, as demonstrated in this article: https://adamj.eu/tech/2023/11/02/github-actions-faster-python-virtual-environments/

  9. charliermarsh commented on Jul 24, 2024

    @charliermarsh

    I did some analysis on the uv-playground repo described here by @acostapazo. Interestingly, the pip cache is even larger than the uv cache (2.8 GB vs. 2.2 GB) though both are of course very large. Almost the entirety of the cache (at least in the uv case, I'm less familiar with pip's cache structure) are the enormous torch and nvidia_cudnn_cu12 wheels.

    My guess is that it's less efficient for uv to run through the cache in such cases (big pre-built wheels) than it is to install from scratch. The main case where this would not be true is if you had to build things from source, where caching can have a huge impact. I'm experimenting with a uv command (astral-sh/uv#5391) that would enable you to clear pre-built wheels from the cache, but retain anything that was built from source, to get the best of both worlds.

  10. EwoutH commented on Aug 21, 2024

    @EwoutH

    Example from our repo: Pandas doesn't have Python 3.13 wheels out yet, but Pandas 2.2.2 can be build on Python 3.13. So it now takes around ~4 minutes to build, either with uv pip or an uncached pip. While cached pip takes only 30 seconds, uv takes only 3 seconds on Python 3.12 where all wheels are available.

    So in the case wheels are not yet up yet, caching would provide huge value if also supported for uv.

  11. eifinger commented on Aug 28, 2024

    @eifinger

    I have created an action to install uv and modelled it so it can nearly be used as a drop in replacement: https://github.com/eifinger/setup-uv

    A simple example workflow could look like this:

    - name: Checkout the repository
      uses: actions/checkout@main
    - name: Install the latest version of uv
      uses: eifinger/setup-uv@v1
      with:
        enable-cache: true
    - name: Test
      run: uv run --frozen pytest

    EDIT: My action got adopted by Astral and is now astral-sh/setup-uv

  12. hugovk commented on Aug 29, 2024

    @hugovk
    Contributor

    I've also been trying out https://github.com/hynek/setup-cached-uv

    jobs:
      tests:
        runs-on: ubuntu-latest  # or macOS, or Windows
        steps:
          - uses: hynek/setup-cached-uv@v2
    
          - run: uv ...
  13. codespearhead commented on Oct 9, 2024

    @codespearhead

    Should this be closed in favor of [1]? UV already keeps track of the Python version to install in source control.

    - name: Enable caching
      uses: astral-sh/setup-uv@v3
      with:
        enable-cache: true

    [1] https://github.com/astral-sh/setup-uv?tab=readme-ov-file#enable-caching

  14. hugovk commented on Oct 13, 2024

    @hugovk
    Contributor

    See also https://github.com/hynek/setup-cached-uv

    jobs:
      tests:
        runs-on: ubuntu-latest  # or macOS, or Windows
        steps:
          - uses: hynek/setup-cached-uv@v2
    
          - run: uv ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    feature requestNew feature or request to improve the current logic

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions