Skip to main content

Ultralytics logo

English | 简体中文

🚀 THOP: PyTorch-OpCounter

THOP profiles PyTorch models by counting Multiply-Accumulate Operations (MACs) and parameters. It is lightweight, easy to extend, and maintained by Ultralytics.

THOP CI Ultralytics Actions Ultralytics Discord Ultralytics Forums Ultralytics Reddit

📄 Description

THOP measures a model with one forward pass, making it useful for comparing architecture complexity before training or deployment. It includes counting rules for common convolutional, normalization, pooling, activation, linear, and recurrent layers, with support for custom rules.

📦 Installation

PyPI - Version Downloads PyPI - Python Version

pip install ultralytics-thop

To install the latest development version:

pip install --upgrade git+https://github.com/ultralytics/thop.git

🛠️ How to Use

Basic Usage

Pass the model and a tuple of example inputs to profile():

import torch
from torchvision.models import resnet50

from thop import profile

model = resnet50()
inputs = (torch.randn(1, 3, 224, 224),)
macs, params = profile(model, inputs=inputs)

print(f"MACs: {macs}, Parameters: {params}")
# Expected output: MACs: 4133742592.0, Parameters: 25557032.0

For image models, pass the target-size input and the model stride to estimate MACs from smaller stride-aligned profiles. profile() retains a single-profile fast path for spatial-only models, fits two points when size-independent operations may be present, fits three points and checks a fourth when attention, functional products or custom_ops may make the cost quadratic in image area, and falls back to the target input when the smaller inputs are unsuitable or no smaller than a quarter of it. Raise min_cells when the cost only takes its final form past some input width, e.g. a decoder selecting a fixed number of queries from its anchors:

inputs = (torch.randn(1, 3, 640, 640),)
macs, params = profile(model, inputs=inputs, stride=32)

Calls that omit stride retain the exact profiling behavior shown in the basic example.

On torch>=1.13, profile() also counts the products a forward runs functionally (@, torch.matmul, torch.bmm, two-operand torch.einsum, linear, multi_head_attention_forward and scaled_dot_product_attention), which no module hook observes, except inside a module whose own counting rule already accounts for them.

Define Custom Rules for Third-Party Modules

Map an unsupported module type to a forward-hook function. The hook receives the module, its inputs, and its output, then adds the operation count to module.total_ops. Parameters need no hook — they are read from the module tree. A rule covers subclasses of the type it is registered for, the nearest registered ancestor winning, so an entry for nn.Conv2d also counts an nn.Conv2d subclass. A subclass whose forward computes something different needs its own entry, or it is counted as its base.

import torch
from torch import nn

from thop import profile


def count_silu(module, inputs, output):
    """Count one operation per output element as a simple example."""
    module.total_ops += output.numel()


model = nn.Sequential(nn.Conv2d(3, 64, 3, padding=1), nn.SiLU())
inputs = (torch.randn(1, 3, 224, 224),)
macs, params = profile(model, inputs=inputs, custom_ops={nn.SiLU: count_silu})

print(f"Custom MACs: {macs}, Parameters: {params}")
# Expected output: Custom MACs: 89915392.0, Parameters: 1792.0

Improve Output Readability

Use clever_format() to convert raw counts into human-readable values:

import torch
from torchvision.models import resnet50

from thop import clever_format, profile

model = resnet50()
inputs = (torch.randn(1, 3, 224, 224),)
macs, params = profile(model, inputs=inputs)
macs_readable, params_readable = clever_format([macs, params], "%.3f")

print(f"Formatted MACs: {macs_readable}, Formatted Parameters: {params_readable}")
# Expected output: Formatted MACs: 4.134G, Formatted Parameters: 25.557M

📊 Results of Recent Models

The following detection models were profiled at 640 × 640 from their fused architecture definitions using ultralytics==8.4.106. Install that version, then run python benchmark/evaluate_famous_models.py to reproduce the table without downloading model weights. FLOPs are often approximated as twice the MAC count.

Model size
(pixels)
params
(M)
MACs
(B)
YOLOv8n 640 3.15 4.37
YOLOv8s 640 11.16 14.30
YOLOv8m 640 25.89 39.47
YOLOv8l 640 43.67 82.57
YOLOv8x 640 68.20 128.90
YOLO11n 640 2.62 3.24
YOLO11s 640 9.44 10.73
YOLO11m 640 20.09 33.99
YOLO11l 640 25.34 43.46
YOLO11x 640 56.92 97.45
YOLO26n 640 2.41 2.68
YOLO26s 640 9.50 10.34
YOLO26m 640 20.41 34.09
YOLO26l 640 24.81 43.21
YOLO26x 640 55.73 96.93

🤝 Contribute

We thrive on community collaboration! THOP wouldn't be the tool it is without contributions from developers like you. Please see our Contributing Guide to get started. We also welcome your feedback—share your experience by completing our Survey. A huge Thank You 🙏 to everyone who contributes!

Ultralytics open-source contributors

We look forward to your contributions to help make the Ultralytics ecosystem even better!

📜 License

Ultralytics offers two licensing options to suit different needs:

  • AGPL-3.0 License: This OSI-approved open-source license is perfect for students, researchers, and enthusiasts. It encourages open collaboration and knowledge sharing. See the LICENSE file for full details.
  • Ultralytics Enterprise License: For development and production use, this license enables seamless integration of Ultralytics software and AI models into business products and services, including internal tools, automated workflows, and production deployments, bypassing the open-source requirements of AGPL-3.0. To get started, please contact us via Ultralytics Licensing.

📞 Contact

For bug reports and feature requests related to THOP, please visit GitHub Issues. For questions, discussions, and community support, join our active communities on Discord, Reddit, and the Ultralytics Community Forums. We're here to help with all things Ultralytics!


Ultralytics GitHub space Ultralytics LinkedIn space Ultralytics Twitter space Ultralytics YouTube space Ultralytics TikTok space Ultralytics BiliBili space Ultralytics Discord

Metadata

Release files for ultralytics-thop 2.2.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ultralytics-thop 2.2.3
File Size Uploaded Provenance Actions
ultralytics_thop-2.2.3.tar.gz 39.8 kB With provenance Details for ultralytics_thop-2.2.3.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for ultralytics-thop 2.2.3
File Interpreter ABI Platform Actions
ultralytics_thop-2.2.3-py3-none-any.whl Python 3 none any Details for ultralytics_thop-2.2.3-py3-none-any.whl

Total release size: 72.6 kB

Release files / ultralytics_thop-2.2.3.tar.gz

Download URL ultralytics_thop-2.2.3.tar.gz
Size 39.8 kB
Tags Source
SHA-256 checksum
How to use checksums
141cea7d1af7fda04b135b5070d19d84f2272c76c5401de9e47581c23e7c5c60
BLAKE2b-256 checksum
How to use checksums
f96ff7dd1959a3f0d3d7417800f6c54112a0bdc9f0529470bb0558c326cd19f3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 19, 2026.

Transparency log

Release files / ultralytics_thop-2.2.3-py3-none-any.whl

Download URL ultralytics_thop-2.2.3-py3-none-any.whl
Size 32.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d56c860b9422b6abfd7e9d7afdd8af3b1242a854c17305bd60ad05cbc7f4b5b6
BLAKE2b-256 checksum
How to use checksums
0e9f5246244e2674210549e8b6247bf28a6b586878c2e744d2c82b4d4f872bf7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 19, 2026.

Transparency log

Security for ultralytics-thop 2.2.3

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for ultralytics_thop-2.2.3.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 19, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

2.2.3 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page