Skip to content

tensorflow wheel incompatible with rules_pyenv 0.8.0 seemingly due to pkginfo 1.8.2 upgrade #671

Closed
@lazcamus

Description

@lazcamus

🐞 bug report

Affected Rule

The issue is caused by the rule:

pip_install()

Is this a regression?

Yes. It does not occur with rules_python 0.6.0, but does occur on 0.8.0.

I found the commit that broke it (see below), so I can say it doesn't affect 0.7.0.

Description

I upgraded rules_python to 0.8.0 and ran into wheel install failure that dumps FileExistsError: [Errno 17] File exists: 'pypi__gast'

I don't have gast in my requirements.txt, but after some binary searching I tracked it down to tensorflow==2.8.0 (intel) or 2.7.0 (arm64). I replaced my requirements.txt with just the dependencies of tensorflow, but not tensorflow itself, and it works. Just tensorflow by itself causes the failure, so it seems to be related to interaction between the tensorflow wheel and the gast wheel.

I ended up testing 2 tensorflow versions while tracking this down:

  • tensorflow 2.8.0 + gast 0.5.3 (x86)
  • tensorflow 2.7.0 + gast 0.4.0 (arm64)

🔬 Minimal Reproduction

Make a stub repo, then bazel build //...

cat > WORKSPACE << "EOF"
workspace(name = "required")
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "rules_python",
    sha256 = "9fcf91dbcc31fde6d1edb15f117246d912c33c36f44cf681976bd886538deba6",
    strip_prefix = "rules_python-0.8.0",
    url = "https://github.com/bazelbuild/rules_python/archive/refs/tags/0.8.0.tar.gz",
)
load("@rules_python//python:repositories.bzl", "python_register_toolchains")

python_register_toolchains(
    name = "python39",
    python_version = "3.9",
)

load("@python39//:defs.bzl", "interpreter")
load("@rules_python//python:pip.bzl", "pip_install")

pip_install(
    name = "common_deps",
    python_interpreter_target = interpreter,
    requirements = "//:requirements.txt",
)
EOF
cat > requirements.txt << "EOF"
tensorflow
EOF
cat > BUILD << "EOF"
load("@common_deps//:requirements.bzl", "requirement")
load("@rules_python//python:defs.bzl", "py_binary")

py_binary(
    name = "hello",
    srcs = ["hello.py"],
    deps = [requirement("tensorflow")],
)
EOF

If you git bisect between 0.6.0 and 0.8.0 rules_python releases, it breaks at commit fe30f15 (PR #661)

If you pare it down to just a change to python/pip_install/repositories.bzl, and binary search on the package upgrades in the file, it's specifically broken by the upgrade of pkginfo from 1.7.1 to 1.8.2.

🔥 Exception or Error

 (Traceback (most recent call last):
  File "/home/builder/.cache/bazel/_bazel_laz/99bd544777c52d5a0d8a66ea3b05626a/external/python3_aarch64-unknown-linux-gnu/lib/python3.10/runpy.py", line 196, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/home/builder/.cache/bazel/_bazel_laz/99bd544777c52d5a0d8a66ea3b05626a/external/python3_aarch64-unknown-linux-gnu/lib/python3.10/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/home/builder/.cache/bazel/_bazel_laz/99bd544777c52d5a0d8a66ea3b05626a/external/rules_python/python/pip_install/extract_wheels/__main__.py", line 5, in <module>
    main()
  File "/home/builder/.cache/bazel/_bazel_laz/99bd544777c52d5a0d8a66ea3b05626a/external/rules_python/python/pip_install/extract_wheels/__init__.py", line 110, in main
    targets = [
  File "/home/builder/.cache/bazel/_bazel_laz/99bd544777c52d5a0d8a66ea3b05626a/external/rules_python/python/pip_install/extract_wheels/__init__.py", line 113, in <listcomp>
    bazel.extract_wheel(
  File "/home/builder/.cache/bazel/_bazel_laz/99bd544777c52d5a0d8a66ea3b05626a/external/rules_python/python/pip_install/extract_wheels/lib/bazel.py", line 377, in extract_wheel
    os.mkdir(directory)
FileExistsError: [Errno 17] File exists: 'pypi__gast'
)

🌍 Your Environment

Operating System:
Played with this across Linux x86, OSX aarch64, Linux arm64

Output of bazel version:

% bazel version
Bazelisk version: v1.5.0
Build label: 4.2.2
Build target: bazel-out/k8-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Thu Dec 2 18:15:58 2021 (1638468958)
Build timestamp: 1638468958
Build timestamp as int: 1638468958

but in testing the test repo above, it fetches:

% bazel version
Bazelisk version: v1.5.0
Build label: 5.0.0
Build target: bazel-out/k8-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Wed Jan 19 14:08:54 2022 (1642601334)
Build timestamp: 1642601334
Build timestamp as int: 1642601334

Rules_python version:

0.8.0

Anything else relevant?

Can be hacked around with this patch applied to 0.8.0 of rules_python:

diff --git a/python/pip_install/repositories.bzl b/python/pip_install/repositories.bzl
index 352f663..22e9e37 100644
--- a/python/pip_install/repositories.bzl
+++ b/python/pip_install/repositories.bzl
@@ -29,8 +29,8 @@ _RULE_DEPS = [
     ),
     (
         "pypi__pkginfo",
-        "https://files.pythonhosted.org/packages/cd/00/49f59cdd2c6a52e6665fda4de671dac5614366dc827e050c55428241b929/pkginfo-1.8.2-py2.py3-none-any.whl",
-        "c24c487c6a7f72c66e816ab1796b96ac6c3d14d49338293d2141664330b55ffc",
+        "https://files.pythonhosted.org/packages/77/83/1ef010f7c4563e218854809c0dff9548de65ebec930921dedf6ee5981f27/pkginfo-1.7.1-py2.py3-none-any.whl",
+        "37ecd857b47e5f55949c41ed061eb51a0bee97a87c969219d144c0e023982779",
     ),
     (
         "pypi__setuptools",

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions