From 9cf4a8b45668cbcb1bb10ad61d9a9c2c27ab9890 Mon Sep 17 00:00:00 2001 From: Sylvain Gugger <35901082+sgugger@users.noreply.github.com> Date: Tue, 16 May 2023 14:23:10 -0400 Subject: [PATCH] Build with non Python files (#23405) * Add a test of the built release * Polish everything * Trigger CI --- MANIFEST.in | 1 - Makefile | 7 +++++++ setup.py | 12 ++++------- utils/check_build.py | 48 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 9 deletions(-) delete mode 100644 MANIFEST.in create mode 100644 utils/check_build.py diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 1aba38f67a2..00000000000 --- a/MANIFEST.in +++ /dev/null @@ -1 +0,0 @@ -include LICENSE diff --git a/Makefile b/Makefile index d6d6966a1da..25ab889148b 100644 --- a/Makefile +++ b/Makefile @@ -111,3 +111,10 @@ post-release: post-patch: python utils/release.py --post_release --patch + +build-release: + rm -rf dist + rm -rf build + python setup.py bdist_wheel + python setup.py sdist + python utils/check_build.py diff --git a/setup.py b/setup.py index f553e69bc12..952cfcf510a 100644 --- a/setup.py +++ b/setup.py @@ -38,14 +38,9 @@ To create the package for pypi. 7. Build both the sources and the wheel. Do not change anything in setup.py between creating the wheel and the source distribution (obviously). - Clean up your build and dist folders (to avoid re-uploading oldies): - rm -rf dist - rm -rf build + Run `make build-release`. This will build the release and do some sanity checks for you. If this ends with an error + message, you need to fix things before going further. - For the wheel, run: "python setup.py bdist_wheel" in the top level directory. - (this will build a wheel for the python version you use to build it). - - For the sources, run: "python setup.py sdist" You should now have a /dist directory with both .whl and .tar.gz source versions. 8. Check that everything looks correct by uploading the package to the pypi test server: @@ -61,6 +56,7 @@ To create the package for pypi. Check you can run the following commands: python -c "from transformers import pipeline; classifier = pipeline('text-classification'); print(classifier('What a nice release'))" python -c "from transformers import *" + python utils/check_build.py --check_lib If making a patch release, double check the bug you are patching is indeed resolved. @@ -446,7 +442,7 @@ setup( package_dir={"": "src"}, packages=find_packages("src"), include_package_data=True, - package_data={"transformers": ["*.cu", "*.cpp", "*.cuh", "*.h", "*.pyx"]}, + package_data={"": ["**/*.cu", "**/*.cpp", "**/*.cuh", "**/*.h", "**/*.pyx"]}, zip_safe=False, extras_require=extras, entry_points={"console_scripts": ["transformers-cli=transformers.commands.transformers_cli:main"]}, diff --git a/utils/check_build.py b/utils/check_build.py new file mode 100644 index 00000000000..a699ed4f7e0 --- /dev/null +++ b/utils/check_build.py @@ -0,0 +1,48 @@ +# coding=utf-8 +# Copyright 2023 The HuggingFace Inc. team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import argparse +import importlib +from pathlib import Path + + +# Test all the extensions added in the setup +FILES_TO_FIND = [ + "kernels/rwkv/wkv_cuda.cu", + "kernels/rwkv/wkv_op.cpp", + "models/deformable_detr/custom_kernel/ms_deform_attn.h", + "models/deformable_detr/custom_kernel/cuda/ms_deform_im2col_cuda.cuh", + "models/graphormer/algos_graphormer.pyx", +] + + +def test_custom_files_are_present(transformers_path): + # Test all the extensions added in the setup + for file in FILES_TO_FIND: + if not (transformers_path / file).exists(): + return False + return True + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--check_lib", action="store_true", help="Whether to check the build or the actual package.") + args = parser.parse_args() + if args.check_lib: + transformers_module = importlib.import_module("transformers") + transformers_path = Path(transformers_module.__file__).parent + else: + transformers_path = Path.cwd() / "build/lib/transformers" + if not test_custom_files_are_present(transformers_path): + raise ValueError("The built release does not contain the custom files. Fix this before going further!")