{"id":19001322,"url":"https://github.com/oneflow-inc/flow-opcounter","last_synced_at":"2025-04-22T17:28:06.229Z","repository":{"id":63998558,"uuid":"556603811","full_name":"Oneflow-Inc/flow-OpCounter","owner":"Oneflow-Inc","description":"Count the FLOPs \u0026 Params of your OneFlow model.","archived":false,"fork":false,"pushed_at":"2022-11-30T08:52:59.000Z","size":56,"stargazers_count":11,"open_issues_count":1,"forks_count":0,"subscribers_count":32,"default_branch":"master","last_synced_at":"2025-04-17T07:17:48.738Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Oneflow-Inc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-10-24T06:56:30.000Z","updated_at":"2023-09-21T09:29:50.000Z","dependencies_parsed_at":"2023-01-14T18:00:35.820Z","dependency_job_id":null,"html_url":"https://github.com/Oneflow-Inc/flow-OpCounter","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oneflow-Inc%2Fflow-OpCounter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oneflow-Inc%2Fflow-OpCounter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oneflow-Inc%2Fflow-OpCounter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oneflow-Inc%2Fflow-OpCounter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Oneflow-Inc","download_url":"https://codeload.github.com/Oneflow-Inc/flow-OpCounter/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250286691,"owners_count":21405486,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T18:10:47.083Z","updated_at":"2025-04-22T17:28:06.207Z","avatar_url":"https://github.com/Oneflow-Inc.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OneFlow-OpCounter | [**简体中文**](README_CN.md)\n\n[![PyPI version](https://img.shields.io/pypi/v/flowflops.svg)](https://pypi.org/project/flowflops/)\n[![PyPI pyversions](https://img.shields.io/pypi/pyversions/flowflops.svg)](https://pypi.org/project/flowflops/)\n[![PyPI license](https://img.shields.io/pypi/l/flowflops.svg)](https://pypi.org/project/flowflops/)\n\nmodified from `https://github.com/sovrasov/flops-counter.pytorch`\n\n## install\n\n```shell\npip install flowflops\n```\n\n## usage\n\n```python\nimport oneflow as flow\nfrom flowflops import get_model_complexity_info\nfrom flowflops.utils import flops_to_string, params_to_string\n\n\nmodel = ...              # your own model, nn.Module\ndsize = (1, 3, 224, 224) # B, C, H, W\n\ntotal_flops, total_params = get_model_complexity_info(\n    model, dsize,\n    as_strings=False,\n    print_per_layer_stat=False,\n    mode=\"eager\"         # eager or graph\n)\nprint(flops_to_string(total_flops), params_to_string(total_params))\n```\n\n## why graph?\n\n```python\nclass BasicBlock(nn.Module):\n    expansion: int = 1\n\n    def __init__(\n        self,\n        inplanes: int,\n        planes: int,\n        stride: int = 1,\n        downsample: Optional[nn.Module] = None,\n        groups: int = 1,\n        base_width: int = 64,\n        dilation: int = 1,\n        norm_layer: Optional[Callable[..., nn.Module]] = None,\n    ) -\u003e None:\n        super(BasicBlock, self).__init__()\n        if norm_layer is None:\n            norm_layer = nn.BatchNorm2d\n        if groups != 1 or base_width != 64:\n            raise ValueError(\"BasicBlock only supports groups=1 and base_width=64\")\n        if dilation \u003e 1:\n            raise NotImplementedError(\"Dilation \u003e 1 not supported in BasicBlock\")\n        # Both self.conv1 and self.downsample layers downsample the input when stride != 1\n        self.conv1 = conv3x3(inplanes, planes, stride)\n        self.bn1 = norm_layer(planes)\n        self.relu = nn.ReLU()\n        self.conv2 = conv3x3(planes, planes)\n        self.bn2 = norm_layer(planes)\n        self.downsample = downsample\n        self.stride = stride\n\n    def forward(self, x: Tensor) -\u003e Tensor:\n        identity = x\n\n        out = self.conv1(x)\n        out = self.bn1(out)\n        out = self.relu(out)\n\n        out = self.conv2(out)\n        out = self.bn2(out)\n\n        if self.downsample is not None:\n            identity = self.downsample(x)\n\n        out += identity\n        # !!!NOTE!!!: this will make add-op flops that cannot be hooked in eager mode\n        out = self.relu(out)\n\n        return out\n```\n\n## sample\n\n`python benchmark/evaluate_famous_models.py`\n\n```\n====== eager ======\n+--------------------+----------+-------------+\n|       Model        |  Params  |    FLOPs    |\n+--------------------+----------+-------------+\n|      alexnet       |  61.1 M  | 718.16 MMac |\n|       vgg11        | 132.86 M |  7.63 GMac  |\n|      vgg11_bn      | 132.87 M |  7.64 GMac  |\n|   squeezenet1_0    |  1.25 M  | 830.05 MMac |\n|   squeezenet1_1    |  1.24 M  | 355.86 MMac |\n|      resnet18      | 11.69 M  |  1.82 GMac  |\n|      resnet50      | 25.56 M  |  4.12 GMac  |\n|  resnext50_32x4d   | 25.03 M  |  4.27 GMac  |\n| shufflenet_v2_x0_5 |  1.37 M  |  43.65 MMac |\n|   regnet_x_16gf    | 54.28 M  |  16.01 GMac |\n|  efficientnet_b0   |  5.29 M  | 401.67 MMac |\n|    densenet121     |  7.98 M  |  2.88 GMac  |\n+--------------------+----------+-------------+\n====== graph ======\n+--------------------+----------+-------------+\n|       Model        |  Params  |    FLOPs    |\n+--------------------+----------+-------------+\n|      alexnet       |  61.1 M  | 718.16 MMac |\n|       vgg11        | 132.86 M |  7.63 GMac  |\n|      vgg11_bn      | 132.87 M |  7.64 GMac  |\n|   squeezenet1_0    |  1.25 M  | 830.05 MMac |\n|   squeezenet1_1    |  1.24 M  | 355.86 MMac |\n|      resnet18      | 11.69 M  |  1.82 GMac  |\n|      resnet50      | 25.56 M  |  4.13 GMac  |\n|  resnext50_32x4d   | 25.03 M  |  4.28 GMac  |\n| shufflenet_v2_x0_5 |  1.37 M  |  43.7 MMac  |\n|   regnet_x_16gf    | 54.28 M  |  16.02 GMac |\n|  efficientnet_b0   |  5.29 M  | 410.35 MMac |\n|    densenet121     |  7.98 M  |  2.88 GMac  |\n+--------------------+----------+-------------+\n```\n\n## support\n\n### Eager\n\n\u003e the outputs will be the same as the `ptflops`\n\nsupported layers:\n\n```python\n# convolutions\nnn.Conv1d\nnn.Conv2d\nnn.Conv3d\n# activations\nnn.ReLU\nnn.PReLU\nnn.ELU\nnn.LeakyReLU\nnn.ReLU6\n# poolings\nnn.MaxPool1d\nnn.AvgPool1d\nnn.AvgPool2d\nnn.MaxPool2d\nnn.MaxPool3d\nnn.AvgPool3d\n# nn.AdaptiveMaxPool1d\nnn.AdaptiveAvgPool1d\n# nn.AdaptiveMaxPool2d\nnn.AdaptiveAvgPool2d\n# nn.AdaptiveMaxPool3d\nnn.AdaptiveAvgPool3d\n# BNs\nnn.BatchNorm1d\nnn.BatchNorm2d\nnn.BatchNorm3d\n# INs\nnn.InstanceNorm1d\nnn.InstanceNorm2d\nnn.InstanceNorm3d\n# FC\nnn.Linear\n# Upscale\nnn.Upsample\n# Deconvolution\nnn.ConvTranspose1d\nnn.ConvTranspose2d\nnn.ConvTranspose3d\n# RNN\nnn.RNN\nnn.GRU\nnn.LSTM\nnn.RNNCell\nnn.LSTMCell\nnn.GRUCell\n```\n\n### Graph\n\nsupported ops:\n\n```python\n# conv\n\"conv1d\"\n\"conv2d\"\n\"conv3d\"\n# pool\n\"max_pool_1d\"\n\"max_pool_2d\"\n\"max_pool_3d\"\n\"avg_pool_1d\"\n\"avg_pool_2d\"\n\"avg_pool_3d\"\n\"adaptive_max_pool1d\"\n\"adaptive_max_pool2d\"\n\"adaptive_max_pool3d\"\n\"adaptive_avg_pool1d\"\n\"adaptive_avg_pool2d\"\n\"adaptive_avg_pool3d\"\n# activate\n\"relu\"\n\"leaky_relu\"\n\"prelu\"\n\"hardtanh\"\n\"elu\"\n\"silu\"\n\"sigmoid\"\n\"sigmoid_v2\"\n# add\n\"bias_add\"\n\"add_n\"\n# matmul\n\"matmul\"\n\"broadcast_matmul\"\n# norm\n\"normalization\"\n# scalar\n\"scalar_mul\"\n\"scalar_add\"\n\"scalar_sub\"\n\"scalar_div\"\n# stats\n\"var\"\n# math\n\"sqrt\"\n\"reduce_sum\"\n# broadcast\n\"broadcast_mul\"\n\"broadcast_add\"\n\"broadcast_sub\"\n\"broadcast_div\"\n# empty\n\"reshape\"\n\"ones_like\"\n\"zero_like\"\n\"flatten\"\n\"concat\"\n\"transpose\"\n\"slice\"\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foneflow-inc%2Fflow-opcounter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foneflow-inc%2Fflow-opcounter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foneflow-inc%2Fflow-opcounter/lists"}