From 80d0407b4c250a61fab0c3afb0e4fd62de319141 Mon Sep 17 00:00:00 2001 From: Martijn van Beers Date: Thu, 5 Dec 2024 15:39:34 +0100 Subject: [PATCH 1/3] Add pyproject.toml copied from the tarball on pypi so I can (dev-)install my fork --- pyproject.toml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 pyproject.toml diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..571ebc2 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,28 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "calflops" +version = "0.3.2" +authors = [ + { name="MrYXJ", email="yxj2017@gmail.com"}, +] +description = "This package is designed to compute the theoretical amount of FLOPs(floating-point operations)、MACs(multiply-add operations) and Parameters in all various neural networks, such as Linear、 CNN、 RNN、 GCN、Transformer(Bert、LlaMA etc Large Language Model),including any custom models via torch.nn.function.* as long as based on the Pytorch implementation." + +readme = "README.md" +license = { file="LICENSE" } +requires-python = ">=3.6" +classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", +] +dependencies = [ + "torch>=1.1.0", + "accelerate>=0.22.0", + "huggingface_hub>=0.16.4" +] + +[project.urls] +"Homepage" = "https://github.com/MrYxJ/calculate-flops.pytorch" \ No newline at end of file From 6db399199f8c8c2d5404a35128f4f9e784145d43 Mon Sep 17 00:00:00 2001 From: Martijn van Beers Date: Thu, 5 Dec 2024 15:54:39 +0100 Subject: [PATCH 2/3] Remove __pycache__ Remove the compiled python files, and add __pycache__ to the .gitignore so they won't come back --- .gitignore | 1 + calflops/__pycache__/__init__.cpython-311.pyc | Bin 1020 -> 0 bytes calflops/__pycache__/__init__.cpython-39.pyc | Bin 850 -> 0 bytes .../__pycache__/big_modeling.cpython-39.pyc | Bin 4690 -> 0 bytes .../calculate_pipline.cpython-311.pyc | Bin 17281 -> 0 bytes .../calculate_pipline.cpython-39.pyc | Bin 13298 -> 0 bytes calflops/__pycache__/estimate.cpython-311.pyc | Bin 10534 -> 0 bytes calflops/__pycache__/estimate.cpython-39.pyc | Bin 6258 -> 0 bytes calflops/__pycache__/estimate.py | 271 ------------------ .../__pycache__/flops_counter.cpython-311.pyc | Bin 9750 -> 0 bytes .../__pycache__/flops_counter.cpython-39.pyc | Bin 7376 -> 0 bytes .../flops_counter_hf.cpython-311.pyc | Bin 7228 -> 0 bytes .../flops_counter_hf.cpython-39.pyc | Bin 5444 -> 0 bytes .../__pycache__/pytorch_ops.cpython-311.pyc | Bin 32714 -> 0 bytes .../__pycache__/pytorch_ops.cpython-39.pyc | Bin 14879 -> 0 bytes calflops/__pycache__/utils.cpython-311.pyc | Bin 10076 -> 0 bytes calflops/__pycache__/utils.cpython-39.pyc | Bin 6696 -> 0 bytes 17 files changed, 1 insertion(+), 271 deletions(-) create mode 100644 .gitignore delete mode 100644 calflops/__pycache__/__init__.cpython-311.pyc delete mode 100644 calflops/__pycache__/__init__.cpython-39.pyc delete mode 100644 calflops/__pycache__/big_modeling.cpython-39.pyc delete mode 100644 calflops/__pycache__/calculate_pipline.cpython-311.pyc delete mode 100644 calflops/__pycache__/calculate_pipline.cpython-39.pyc delete mode 100644 calflops/__pycache__/estimate.cpython-311.pyc delete mode 100644 calflops/__pycache__/estimate.cpython-39.pyc delete mode 100644 calflops/__pycache__/estimate.py delete mode 100644 calflops/__pycache__/flops_counter.cpython-311.pyc delete mode 100644 calflops/__pycache__/flops_counter.cpython-39.pyc delete mode 100644 calflops/__pycache__/flops_counter_hf.cpython-311.pyc delete mode 100644 calflops/__pycache__/flops_counter_hf.cpython-39.pyc delete mode 100644 calflops/__pycache__/pytorch_ops.cpython-311.pyc delete mode 100644 calflops/__pycache__/pytorch_ops.cpython-39.pyc delete mode 100644 calflops/__pycache__/utils.cpython-311.pyc delete mode 100644 calflops/__pycache__/utils.cpython-39.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..61f2dc9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +**/__pycache__/ diff --git a/calflops/__pycache__/__init__.cpython-311.pyc b/calflops/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 5f379170ea852c312945d01623084eb5922271c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1020 zcma))&2G~`5XaZ~beyKGD#U@)0+$Aq*hz^>Erh6AKte4b@geYK<=ETAmDjd**Hy!d zAf5p62)u=lA*V{5xK*mep%<9l0;&-QMx*h6emkDoUHfCFV<9l|<$L&{g3wo${5Ht7 zogKmBJqnSBLL;oi2CH}#L+NT$^Aqeq?}Psq9n^Dtga?G8$&KrA|#KJiE6DIme4Zu15qNYna_PzW-H^F zq-C@gaH?igmdP1mX-MOz-Q`7-kT4AhS#&OD1!-=zQOP1@|XxKV(s2@1{Y{Xd;EZv%N_1o6)5H7OOr|`TDz1S|;L0LN2&|l&_uwFTOz-n6&|Q5H@fpHt)i8`xvt`sykqTFl tal1gbF8drgMcGeKuPFN*-7LyJM>mSH&(Zaw?EmxD30g1y<$Mix{}ZttDJ=j1 diff --git a/calflops/__pycache__/__init__.cpython-39.pyc b/calflops/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index f467f288dc8b1165fe835cc6433d79ee4846a8a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 850 zcmZ9K%Z}496o!*t)3lwbx@6@gU9{{Sg&lSh{W)`;tm~#cc(jbY0oy1Kl z+!YmEagDF?s;J?b^)+4>4cxH44!((-);GX=*t5O~zJ*)Xd*FTSTi*iT#%=3;-Vt5g z1>b(@3_2fw`DjH|ELovho*@(>AHAVc*#&|K(PT9C(W2C8E)9SP(MG;|`_xC9i18a_ z>EZhQbUeAZ+6&;LI2S&8!gN}0|I~yi)w)n&5bP~BB>}X$hE}Uc(_5{kT2k!Aaj(A*h7=rA0UMN8Q{}4%cK=15nMy09KGRo90mx4;d zvZBA*xpfeH0>V)))NJiq6oo^4Co}zv%so9%~LLZ386Uv_r z&W=q&k~}5^cW?HJ^D@&^O7p^S?}WiAWYyq$sTo(Y242>UG>kNjct%5+yCXd(8U#Q^U{SEB|qvD`*8K;I@5D>UG erU`+}(R%==DLH*;22y>HTD#+RD)9gPD!&0r9_w)c diff --git a/calflops/__pycache__/big_modeling.cpython-39.pyc b/calflops/__pycache__/big_modeling.cpython-39.pyc deleted file mode 100644 index b33536f3146fc8aae92cb02be719c0abb26c6f1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4690 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 diff --git a/calflops/__pycache__/calculate_pipline.cpython-311.pyc b/calflops/__pycache__/calculate_pipline.cpython-311.pyc deleted file mode 100644 index 18b1b0cf43b93592891689a2dcb2b022b5640239..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17281 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 diff --git a/calflops/__pycache__/calculate_pipline.cpython-39.pyc b/calflops/__pycache__/calculate_pipline.cpython-39.pyc deleted file mode 100644 index 588a6dbae50e0b17f10a443fe3f4f5f765a9f814..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13298 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 DYTyXq diff --git a/calflops/__pycache__/estimate.cpython-311.pyc b/calflops/__pycache__/estimate.cpython-311.pyc deleted file mode 100644 index dd59e89edcea90cae2480a4d349b4a5977eeb918..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10534 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 diff --git a/calflops/__pycache__/estimate.cpython-39.pyc b/calflops/__pycache__/estimate.cpython-39.pyc deleted file mode 100644 index 186845cb3756f2af1f90e2ff0f4227da6cdf9bae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6258 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 Q%CagZN^8X_R@T1pAF-gG2><{9 diff --git a/calflops/__pycache__/estimate.py b/calflops/__pycache__/estimate.py deleted file mode 100644 index df179ec..0000000 --- a/calflops/__pycache__/estimate.py +++ /dev/null @@ -1,271 +0,0 @@ -#!/usr/bin/env python - -# Copyright 2023 The HuggingFace Team. All rights reserved. -# -# 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 - -from huggingface_hub import model_info -from huggingface_hub.utils import GatedRepoError, RepositoryNotFoundError - -from accelerate import init_empty_weights -from accelerate.utils import ( - # calculate_maximum_sizes, - # convert_bytes, - is_timm_available, - is_transformers_available, -) - - -if is_transformers_available(): - import transformers - from transformers import AutoConfig, AutoModel - -if is_timm_available(): - import timm - - -def verify_on_hub(repo: str, token: str = None): - "Verifies that the model is on the hub and returns the model info." - try: - return model_info(repo, token=token) - except GatedRepoError: - return "gated" - except RepositoryNotFoundError: - return "repo" - - -def check_has_model(error): - """ - Checks what library spawned `error` when a model is not found - """ - if is_timm_available() and isinstance(error, RuntimeError) and "Unknown model" in error.args[0]: - return "timm" - elif ( - is_transformers_available() - and isinstance(error, OSError) - and "does not appear to have a file named" in error.args[0] - ): - return "transformers" - else: - return "unknown" - - -def create_empty_model(model_name: str, library_name: str, trust_remote_code: bool = False, access_token: str = None): - """ - Creates an empty model from its parent library on the `Hub` to calculate the overall memory consumption. - - Args: - model_name (`str`): - The model name on the Hub - library_name (`str`): - The library the model has an integration with, such as `transformers`. Will be used if `model_name` has no - metadata on the Hub to determine the library. - trust_remote_code (`bool`, `optional`, defaults to `False`): - Whether or not to allow for custom models defined on the Hub in their own modeling files. This option - should only be set to `True` for repositories you trust and in which you have read the code, as it will - execute code present on the Hub on your local machine. - access_token (`str`, `optional`, defaults to `None`): - The access token to use to access private or gated models on the Hub. (for use on the Gradio app) - - Returns: - `torch.nn.Module`: The torch model that has been initialized on the `meta` device. - - """ - model_info = verify_on_hub(model_name, access_token) - # Simplified errors - if model_info == "gated": - raise GatedRepoError( - f"Repo for model `{model_name}` is gated. You must be authenticated to access it. Please run `huggingface-cli login`." - ) - elif model_info == "repo": - raise RepositoryNotFoundError( - f"Repo for model `{model_name}` does not exist on the Hub. If you are trying to access a private repo," - " make sure you are authenticated via `huggingface-cli login` and have access." - ) - if library_name is None: - library_name = getattr(model_info, "library_name", False) - if not library_name: - raise ValueError( - f"Model `{model_name}` does not have any library metadata on the Hub, please manually pass in a `--library_name` to use (such as `transformers`)" - ) - if library_name == "transformers": - if not is_transformers_available(): - raise ImportError( - f"To check `{model_name}`, `transformers` must be installed. Please install it via `pip install transformers`" - ) - print(f"Loading pretrained config for `{model_name}` from `transformers`...") - - #auto_map = model_info.config.get("auto_map", False) - auto_map = model_info.config.get("auto_map", True) - config = AutoConfig.from_pretrained(model_name, trust_remote_code=trust_remote_code) - - with init_empty_weights(): - # remote code could specify a specific `AutoModel` class in the `auto_map` - constructor = AutoModel - if isinstance(auto_map, dict): - value = None - for key in auto_map.keys(): - if key.startswith("AutoModelFor"): - value = key - break - if value is not None: - constructor = getattr(transformers, value) - model = constructor.from_config(config, trust_remote_code=trust_remote_code) - elif library_name == "timm": - if not is_timm_available(): - raise ImportError( - f"To check `{model_name}`, `timm` must be installed. Please install it via `pip install timm`" - ) - print(f"Loading pretrained config for `{model_name}` from `timm`...") - with init_empty_weights(): - model = timm.create_model(model_name, pretrained=False) - else: - raise ValueError( - f"Library `{library_name}` is not supported yet, please open an issue on GitHub for us to add support." - ) - return model - - -def create_ascii_table(headers: list, rows: list, title: str): - "Creates a pretty table from a list of rows, minimal version of `tabulate`." - sep_char, in_between = "│", "─" - column_widths = [] - for i in range(len(headers)): - column_values = [row[i] for row in rows] + [headers[i]] - max_column_width = max(len(value) for value in column_values) - column_widths.append(max_column_width) - - formats = [f"%{column_widths[i]}s" for i in range(len(rows[0]))] - - pattern = f"{sep_char}{sep_char.join(formats)}{sep_char}" - diff = 0 - - def make_row(left_char, middle_char, right_char): - return f"{left_char}{middle_char.join([in_between * n for n in column_widths])}{in_between * diff}{right_char}" - - separator = make_row("├", "┼", "┤") - if len(title) > sum(column_widths): - diff = abs(len(title) - len(separator)) - column_widths[-1] += diff - - # Update with diff - separator = make_row("├", "┼", "┤") - initial_rows = [ - make_row("┌", in_between, "┐"), - f"{sep_char}{title.center(len(separator) - 2)}{sep_char}", - make_row("├", "┬", "┤"), - ] - table = "\n".join(initial_rows) + "\n" - column_widths[-1] += diff - centered_line = [text.center(column_widths[i]) for i, text in enumerate(headers)] - table += f"{pattern % tuple(centered_line)}\n{separator}\n" - for i, line in enumerate(rows): - centered_line = [t.center(column_widths[i]) for i, t in enumerate(line)] - table += f"{pattern % tuple(centered_line)}\n" - table += f'└{"┴".join([in_between * n for n in column_widths])}┘' - - return table - - -# def estimate_command_parser(subparsers=None): -# if subparsers is not None: -# parser = subparsers.add_parser("estimate-memory") -# else: -# parser = argparse.ArgumentParser(description="Model size estimator for fitting a model onto CUDA memory.") - -# parser.add_argument("model_name", type=str, help="The model name on the Hugging Face Hub.") -# parser.add_argument( -# "--library_name", -# type=str, -# help="The library the model has an integration with, such as `transformers`, needed only if this information is not stored on the Hub.", -# choices=["timm", "transformers"], -# ) -# parser.add_argument( -# "--dtypes", -# type=str, -# nargs="+", -# default=["float32", "float16", "int8", "int4"], -# help="The dtypes to use for the model, must be one (or many) of `float32`, `float16`, `int8`, and `int4`", -# choices=["float32", "float16", "int8", "int4"], -# ) -# parser.add_argument( -# "--trust_remote_code", -# action="store_true", -# help="""Whether or not to allow for custom models defined on the Hub in their own modeling files. This flag -# should only be used for repositories you trust and in which you have read the code, as it will execute -# code present on the Hub on your local machine.""", -# ) - -# if subparsers is not None: -# parser.set_defaults(func=estimate_command) -# return parser - - -# def gather_data(args): -# "Creates an empty model and gathers the data for the sizes" -# try: -# model = create_empty_model( -# args.model_name, library_name=args.library_name, trust_remote_code=args.trust_remote_code -# ) -# except (RuntimeError, OSError) as e: -# library = check_has_model(e) -# if library != "unknown": -# raise RuntimeError( -# f"Tried to load `{args.model_name}` with `{library}` but a possible model to load was not found inside the repo." -# ) -# raise e - -# total_size, largest_layer = calculate_maximum_sizes(model) - -# data = [] - -# for dtype in args.dtypes: -# dtype_total_size = total_size -# dtype_largest_layer = largest_layer[0] -# if dtype == "float16": -# dtype_total_size /= 2 -# dtype_largest_layer /= 2 -# elif dtype == "int8": -# dtype_total_size /= 4 -# dtype_largest_layer /= 4 -# elif dtype == "int4": -# dtype_total_size /= 8 -# dtype_largest_layer /= 8 -# dtype_training_size = dtype_total_size * 4 -# data.append([dtype, dtype_largest_layer, dtype_total_size, dtype_training_size]) -# return data - - -# def estimate_command(args): -# data = gather_data(args) -# for row in data: -# for i, item in enumerate(row): -# if isinstance(item, (int, float)): -# row[i] = convert_bytes(item) - -# headers = ["dtype", "Largest Layer", "Total Size", "Training using Adam"] - -# title = f"Memory Usage for loading `{args.model_name}`" -# table = create_ascii_table(headers, data, title) -# print(table) - - -# def main(): -# parser = estimate_command_parser() -# args = parser.parse_args() -# estimate_command(args) - - -# if __name__ == "__main__": -# main() \ No newline at end of file diff --git a/calflops/__pycache__/flops_counter.cpython-311.pyc b/calflops/__pycache__/flops_counter.cpython-311.pyc deleted file mode 100644 index 08ce4fd4faf928c86aad8073930b2b582c5223f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9750 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 AbpQYW diff --git a/calflops/__pycache__/flops_counter.cpython-39.pyc b/calflops/__pycache__/flops_counter.cpython-39.pyc deleted file mode 100644 index 12aa21a9b244e7d8816022d9d22ad7c03a463099..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7376 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 C8SI__ diff --git a/calflops/__pycache__/flops_counter_hf.cpython-311.pyc b/calflops/__pycache__/flops_counter_hf.cpython-311.pyc deleted file mode 100644 index 00f2939ed0948f170b4ebd6b8e8a3105a2bc4202..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7228 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 EKgQoF*Z=?k diff --git a/calflops/__pycache__/flops_counter_hf.cpython-39.pyc b/calflops/__pycache__/flops_counter_hf.cpython-39.pyc deleted file mode 100644 index 23f834ed7129b0935d9d2ffda09d155d54715d60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5444 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 YpuskVQoX7qgLK1h34e;b`1`N_0~ax@!~g&Q diff --git a/calflops/__pycache__/pytorch_ops.cpython-311.pyc b/calflops/__pycache__/pytorch_ops.cpython-311.pyc deleted file mode 100644 index 82e8992c3861fd73be59ee7ffb77829bf6037416..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32714 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 diff --git a/calflops/__pycache__/utils.cpython-311.pyc b/calflops/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index 1fbd18c1efe575a11e2463b3651b4a7955ed8040..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10076 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 diff --git a/calflops/__pycache__/utils.cpython-39.pyc b/calflops/__pycache__/utils.cpython-39.pyc deleted file mode 100644 index 52f08b4ebf5ae030291eab979f8eb5e2d22d1c21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6696 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 F{s&YONE!eD From ffe975671729c17bf2598a381fc9b250181b8f6d Mon Sep 17 00:00:00 2001 From: Martijn van Beers Date: Thu, 5 Dec 2024 15:58:05 +0100 Subject: [PATCH 3/3] Add extra_apply_funcs parameter Add a parameter to be able to run extra functions through model.apply(). They are run right before the print function. This lets you do things like store the FLOPS for each module rather than just printing them, as the new example script shows. --- calflops/flops_counter.py | 6 ++++ calflops/flops_counter_hf.py | 6 ++++ test_examples/test_extra_func.py | 47 ++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 test_examples/test_extra_func.py diff --git a/calflops/flops_counter.py b/calflops/flops_counter.py index ba216f3..4a2c6a2 100644 --- a/calflops/flops_counter.py +++ b/calflops/flops_counter.py @@ -30,6 +30,7 @@ def calculate_flops(model, forward_mode="forward", include_backPropagation=False, compute_bp_factor=2.0, + extra_apply_funcs=[], print_results=True, print_detailed=True, output_as_string=True, @@ -48,6 +49,7 @@ def calculate_flops(model, forward_mode (str, optional): To determine the mode of model inference, Default to 'forward'. And use 'generate' if model inference uses model.generate(). include_backPropagation (bool, optional): Decides whether the final return FLOPs computation includes the computation for backpropagation. compute_bp_factor (float, optional): The model backpropagation is a multiple of the forward propagation computation. Default to 2. + extra_apply_funcs (bool, optional): A list of functions to use in model.apply() which will be run before print_results. Defaults to the empty list. print_results (bool, optional): Whether to print the model profile. Defaults to True. print_detailed (bool, optional): Whether to print the detailed model profile. Defaults to True. output_as_string (bool, optional): Whether to print the output as string. Defaults to True. @@ -172,6 +174,10 @@ def calculate_flops(model, macs = calculate_flops_pipline.get_total_macs() params = calculate_flops_pipline.get_total_params() + if len(extra_apply_funcs) > 0: + for func in extra_apply_funcs: + model.apply(func) + if print_results: return_print = calculate_flops_pipline.print_model_pipline(units=output_unit, precision=output_precision, diff --git a/calflops/flops_counter_hf.py b/calflops/flops_counter_hf.py index 5d4e21e..edfc42e 100644 --- a/calflops/flops_counter_hf.py +++ b/calflops/flops_counter_hf.py @@ -33,6 +33,7 @@ def calculate_flops_hf(model_name, forward_mode="forward", include_backPropagation=False, compute_bp_factor=2.0, + extra_apply_funcs=[], print_results=True, print_detailed=True, output_as_string=True, @@ -51,6 +52,7 @@ def calculate_flops_hf(model_name, forward_mode (str, optional): To determine the mode of model inference, Default to 'forward'. And use 'generate' if model inference uses model.generate(). include_backPropagation (bool, optional): Decides whether the final return FLOPs computation includes the computation for backpropagation. compute_bp_factor (float, optional): The model backpropagation is a multiple of the forward propagation computation. Default to 2. + extra_apply_funcs (bool, optional): A list of functions to use in model.apply() which will be run before print_results. Defaults to the empty list. print_results (bool, optional): Whether to print the model profile. Defaults to True. print_detailed (bool, optional): Whether to print the detailed model profile. Defaults to True. output_as_string (bool, optional): Whether to print the output as string. Defaults to True. @@ -126,6 +128,10 @@ def calculate_flops_hf(model_name, params = calculate_flops_pipline.get_total_params() + if len(extra_apply_funcs) > 0: + for func in extra_apply_funcs: + model.apply(func) + print_return = calculate_flops_pipline.print_return_model_pipline(units=output_unit, precision=output_precision, print_detailed=print_detailed, diff --git a/test_examples/test_extra_func.py b/test_examples/test_extra_func.py new file mode 100644 index 0000000..6d383c2 --- /dev/null +++ b/test_examples/test_extra_func.py @@ -0,0 +1,47 @@ +# !usr/bin/env python +# -*- coding:utf-8 -*- + +''' + Description : + Version : 1.0 + Author : MrYXJ + Mail : yxj2017@gmail.com + Github : https://github.com/MrYxJ + Date : 2023-08-24 11:48:59 + LastEditTime : 2023-08-24 19:42:16 + Copyright (C) 2023 mryxj. All rights reserved. +''' + +from calflops import calculate_flops +from calflops.utils import get_module_flops +from transformers import AutoModel +from transformers import AutoTokenizer +from collections import deque +from functools import partial + +def store_flops(module, datastore=None): + data = dict() + children = list(module.named_children()) + if len(children) > 0: + datastore.rotate(len(children)) + for name, child in children: + typename, flops, child_data = datastore.popleft() + data[name] = (typename, flops, child_data,) + datastore.append((type(module).__name__, get_module_flops(module), data,)) + +myqueue = deque() + +batch_size = 1 +max_seq_length = 128 +model_name = "bert-base-uncased" + +model = AutoModel.from_pretrained(model_name) +tokenizer = AutoTokenizer.from_pretrained(model_name) + +flops, macs, params = calculate_flops(model=model, + extra_apply_funcs=[partial(store_flops, datastore=myqueue)], + print_detailed=False, + input_shape=(batch_size,max_seq_length), + transformer_tokenizer=tokenizer) +print("Bert(hfl/chinese-roberta-wwm-ext) FLOPs:%s MACs:%s Params:%s \n" %(flops, macs, params)) +print(myqueue)