inference icon indicating copy to clipboard operation
inference copied to clipboard

Please support Python 3.13 on MacOS

Open cdeil opened this issue 3 months ago • 5 comments

Search before asking

  • [x] I have searched the Inference issues and found no similar bug report.

Bug

I tried to install inference with Python 3.13 on MacOS and got a build error for the av dependency.

The errors is from trying to build av v12.3.0 but that's old, now there's https://pypi.org/project/av/15.1.0/

Any chance to modernize the inference dependency constraints to make this work?

Environment

  • Inference: v0.55.0
  • OS: MacOS
  • Python: 3.13

Minimal Reproducible Example

To reproduce create this pyproject.toml:

[project]
name = "rf1"
version = "0.1.0"
requires-python = ">=3.13"
dependencies = ["inference>=0.55.0"]

Then try to install it:

% uv sync
Resolved 143 packages in 92ms
  × Failed to build `av==12.3.0`
  ├─▶ The build backend returned an error
  ╰─▶ Call to `setuptools.build_meta:__legacy__.build_wheel` failed (exit status: 1)

      [stdout]
      running bdist_wheel
      running build
      running build_py
      copying av/deprecation.py -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/datasets.py -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/__init__.py -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/about.py -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/__main__.py -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/video/__init__.py -> build/lib.macosx-10.13-universal2-cpython-313/av/video
      copying av/codec/__init__.py -> build/lib.macosx-10.13-universal2-cpython-313/av/codec
      copying av/container/__init__.py -> build/lib.macosx-10.13-universal2-cpython-313/av/container
      copying av/audio/__init__.py -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
      copying av/subtitles/__init__.py -> build/lib.macosx-10.13-universal2-cpython-313/av/subtitles
      copying av/filter/__init__.py -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
      copying av/sidedata/__init__.py -> build/lib.macosx-10.13-universal2-cpython-313/av/sidedata
      copying av/data/__init__.py -> build/lib.macosx-10.13-universal2-cpython-313/av/data
      copying av/packet.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/buffer.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/error.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/_core.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/bitstream.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/format.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/logging.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/descriptor.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/frame.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/plane.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/dictionary.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/stream.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/option.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/enum.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/py.typed -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/utils.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/frame.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/descriptor.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/logging.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/format.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/bitstream.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/__init__.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/error.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/buffer.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/packet.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/bytesource.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/enum.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/option.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/stream.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/dictionary.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/plane.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
      copying av/video/__init__.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/video
      copying av/video/reformatter.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/video
      copying av/video/format.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/video
      copying av/video/frame.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/video
      copying av/video/plane.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/video
      copying av/video/stream.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/video
      copying av/video/codeccontext.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/video
      copying av/video/frame.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/video
      copying av/video/reformatter.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/video
      copying av/video/format.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/video
      copying av/video/__init__.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/video
      copying av/video/codeccontext.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/video
      copying av/video/stream.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/video
      copying av/video/plane.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/video
      copying av/codec/context.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/codec
      copying av/codec/codec.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/codec
      copying av/codec/__init__.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/codec
      copying av/codec/context.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/codec
      copying av/codec/codec.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/codec
      copying av/container/output.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/container
      copying av/container/__init__.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/container
      copying av/container/core.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/container
      copying av/container/input.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/container
      copying av/container/streams.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/container
      copying av/container/input.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/container
      copying av/container/core.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/container
      copying av/container/__init__.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/container
      copying av/container/pyio.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/container
      copying av/container/output.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/container
      copying av/container/streams.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/container
      copying av/audio/layout.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
      copying av/audio/format.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
      copying av/audio/fifo.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
      copying av/audio/frame.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
      copying av/audio/plane.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
      copying av/audio/resampler.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
      copying av/audio/stream.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
      copying av/audio/codeccontext.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
      copying av/audio/frame.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
      copying av/audio/fifo.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
      copying av/audio/format.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
      copying av/audio/layout.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
      copying av/audio/__init__.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
      copying av/audio/codeccontext.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
      copying av/audio/stream.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
      copying av/audio/resampler.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
      copying av/audio/plane.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
      copying av/subtitles/subtitle.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/subtitles
      copying av/subtitles/stream.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/subtitles
      copying av/subtitles/codeccontext.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/subtitles
      copying av/subtitles/__init__.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/subtitles
      copying av/subtitles/codeccontext.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/subtitles
      copying av/subtitles/stream.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/subtitles
      copying av/subtitles/subtitle.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/subtitles
      copying av/filter/filter.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
      copying av/filter/context.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
      copying av/filter/__init__.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
      copying av/filter/graph.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
      copying av/filter/link.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
      copying av/filter/pad.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
      copying av/filter/__init__.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
      copying av/filter/graph.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
      copying av/filter/context.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
      copying av/filter/filter.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
      copying av/filter/pad.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
      copying av/filter/link.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
      copying av/sidedata/motionvectors.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/sidedata
      copying av/sidedata/sidedata.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/sidedata
      copying av/sidedata/__init__.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/sidedata
      copying av/sidedata/motionvectors.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/sidedata
      copying av/sidedata/sidedata.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/sidedata
      copying av/data/stream.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/data
      copying av/data/__init__.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/data
      copying av/data/stream.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/data
      copying include/libav.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include
      copying include/libavfilter/buffersink.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavfilter
      copying include/libavfilter/avfiltergraph.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavfilter
      copying include/libavfilter/avfilter.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavfilter
      copying include/libavfilter/buffersrc.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavfilter
      copying include/libavutil/frame.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavutil
      copying include/libavutil/avutil.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavutil
      copying include/libavutil/error.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavutil
      copying include/libavutil/channel_layout.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavutil
      copying include/libavutil/dict.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavutil
      copying include/libavutil/samplefmt.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavutil
      copying include/libavutil/motion_vector.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavutil
      copying include/libavdevice/avdevice.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavdevice
      copying include/libavformat/avformat.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavformat
      copying include/libswscale/swscale.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libswscale
      copying include/libavcodec/avcodec.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavcodec
      copying include/libavcodec/bsf.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavcodec
      copying include/libswresample/swresample.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libswresample
      running build_ext
      building 'av.stream' extension
      clang -fno-strict-overflow -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -O3 -Wall -arch arm64 -arch x86_64 -I/opt/homebrew/Cellar/ffmpeg/8.0_1/include
      -I/Users/cdeil/.cache/uv/builds-v0/.tmpHvyxzr/include -I/Library/Frameworks/Python.framework/Versions/3.13/include/python3.13 -c src/av/stream.c -o build/temp.macosx-10.13-universal2-cpython-313/src/av/stream.o

      [stderr]
      /Users/cdeil/.cache/uv/builds-v0/.tmpHvyxzr/lib/python3.13/site-packages/setuptools/_distutils/dist.py:289: UserWarning: Unknown distribution option: 'test_suite'
        warnings.warn(msg)
      /Users/cdeil/.cache/uv/builds-v0/.tmpHvyxzr/lib/python3.13/site-packages/setuptools/dist.py:759: SetuptoolsDeprecationWarning: License classifiers are deprecated.
      !!

              ********************************************************************************
              Please consider removing the following classifiers in favor of a SPDX license expression:

              License :: OSI Approved :: BSD License

              See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.
              ********************************************************************************

      !!
        self._finalize_license_expression()
      src/av/stream.c:4618:31: error: no member named 'nb_side_data' in 'struct AVStream'
       4618 |   __pyx_t_1 = __pyx_v_stream->nb_side_data;
            |               ~~~~~~~~~~~~~~  ^
      src/av/stream.c:4652:35: error: no member named 'side_data' in 'struct AVStream'
       4652 |     __pyx_t_5 = ((__pyx_v_stream->side_data[__pyx_v_i]).type == AV_PKT_DATA_DISPLAYMATRIX);
            |                   ~~~~~~~~~~~~~~  ^
      src/av/stream.c:4662:97: error: no member named 'side_data' in 'struct AVStream'
       4662 |       __pyx_t_2 = PyFloat_FromDouble(av_display_rotation_get(((int32_t const *)(__pyx_v_stream->side_data[__pyx_v_i]).data))); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 141, __pyx_L1_error)
            |                                                                                 ~~~~~~~~~~~~~~  ^
      3 errors generated.
      error: command '/usr/bin/clang' failed with exit code 1

      hint: This usually indicates a problem with the package or the build environment.
  help: `av` (v12.3.0) was included because `rf1` (v0.1.0) depends on `inference` (v0.55.0) which depends on `aiortc` (v1.9.0) which depends on `av`

Additional

No response

Are you willing to submit a PR?

  • [ ] Yes I'd like to help by submitting a PR!

cdeil avatar Sep 14 '25 20:09 cdeil

Thanks for reporting @cdeil will try to add support for python 3.13. Don't have immediate bandwidth to implement, but added to backlog.

Not sure why av / aiortc fails to build. according to pypi both support 3.13

hansent avatar Sep 23 '25 15:09 hansent

@hansent - I think the problem is that you hard-pin some dependencies to old versions.

Specifically here with aiortc~=1.9.0 you force aiortc and possibly av versions that are over a year old:

https://github.com/roboflow/inference/blob/8f5716fcb72d53f371180dc462678c138782e586/requirements/_requirements.txt#L1C14-L2C25

If you could restrict that with a >= dependency to allow newer versions like https://pypi.org/project/aiortc/1.13.0/ I think this problem would go away.

Would you accept a PR with that change if CI is green?

cdeil avatar Sep 23 '25 15:09 cdeil

Definitely welcome a PR. We can run some additional tests on it also. c/c @grzegorz-roboflow who is most familiar with the aiortc usage

hansent avatar Sep 23 '25 15:09 hansent

So I did manage with inference version 0.57.2 to get a Python 3.13 environment installed with uv that includes some common PyData and computer vision packages:

[project]
name = "stocadro-ai"
version = "0.1.0"
readme = "README.md"
requires-python = ">=3.13,<3.14"
dependencies = [
    "altair>=5.5.0",
    "bokeh>=3.8.0",
    "dash>=3.2.0",
    "dvc[s3]>=3.63.0",
    "httpx>=0.28.1",
    "inference>=0.57.2",
    "ipython>=9.5.0",
    "jupyter>=1.1.1",
    "jupyter-bokeh>=4.0.5",
    "matplotlib>=3.10.6",
    "onnx>=1.19.0",
    "onnxruntime>=1.23.0",
    "onnxsim>=0.4.36",
    "onnxslim>=0.1.69",
    "opencv-python>=4.11.0.86",
    "pandas>=2.3.2",
    "panel>=1.8.1",
    "polars>=1.33.1",
    "python-dotenv>=1.1.1",
    "rfdetr>=1.2.1",
    "roboflow>=1.2.9",
    "shapely>=2.1.2",
    "streamlit>=1.50.0",
    "supervision>=0.26.1",
    "torch>=2.8.0",
    "torchvision>=0.23.0",
    "transformers>=4.56.2",
    "ultralytics>=8.3.203",
    "watchdog>=6.0.0",
    "watchfiles>=1.1.0",
]

But it was very painful to get inference to install at all, and to avoid it installing an old version and downgrading many packages to old versions because you have so many upper pins.

[tool.uv]
override-dependencies = [
    # The `inference` package puts upper limits on a lot of packages
    # Here we override many things to allow `uv install inference`
    # without it forcing downgrades (and year old bugs) for many packages.
    "opencv-python>=4.11.0.86",
    "python-dotenv>=1.1.1",
    "onnxruntime>=1.23.0",
    "shapely>=2.1.2",
    "transformers>=4.56.2",
    "tokenizers>=0.22.0",
    # The following overrides are to prevent `uv install inference`
    # to force downgrade to old versions with their upper constraints
    "aiobotocore>=2.15.2",
    "boto3>=1.35.36",
    "botocore>=1.35.36",
    "cachetools>=6.2.0",
    "colorama>=0.4.6",
    "cython>=3.1.4",
    "ml-dtypes>=0.5.3",
    "numpy>=2.3.3",
    "pi-heif>=1.1.0",
    "pillow>=11.3.0",
    "requests==2.32.5",
    "rich>=13.9.4",
    "s3transfer>=0.10.4",
    "typer>=0.16.0",
    "urllib3>=2.5.0",
    "setuptools>=80.9.0",
    "pydantic-settings>=2.11.0",
    "redis>=5.3.1",
    "structlog>=25.4.0",
    "zxing-cpp>=2.3.0",
]

@grzegorz-roboflow or anyone familiar with the reasons all those upper version pins wer put in place - any chance to reduce and remove some of them?

I realize new versions can create incompatibilities. But forcing old versions also has a cost - we run into issues in the old versions of the dependencies that were solved in the meantime.

cdeil avatar Sep 29 '25 20:09 cdeil

updated a couple of these recently and have a branch with newest transformers version also.

tryin gright now on clean py13 venv fails on mediapipe:

➜  ~ uv venv --python 3.13 py313
Using CPython 3.13.5 interpreter at: /opt/homebrew/opt/[email protected]/bin/python3.13
Creating virtual environment at: py313
Activate with: source py313/bin/activate
➜  ~ source py313/bin/activate
(py313) ➜  ~ cd code/inference
(py313) ➜  inference git:(fix-exp-tests) uv pip install -e .
Using Python 3.13.5 environment at: /Users/hansent/py313
  × No solution found when resolving dependencies:
  ╰─▶ Because all versions of mediapipe have no wheels with a matching Python
      ABI tag (e.g., `cp313`) and inference-development==0.0.0 depends on
      mediapipe, we can conclude that inference-development==0.0.0 cannot
      be used.
      And because only inference-development==0.0.0 is available and you
      require inference-development, we can conclude that your requirements
      are unsatisfiable.

      hint: You require CPython 3.13 (`cp313`), but we only found wheels
      for `mediapipe` (v0.10.21) with the following Python ABI tags: `cp39`,
      `cp310`, `cp311`, `cp312`

hansent avatar Nov 13 '25 18:11 hansent