Skip to main content

Universal Inference Pipeline Framework for Computer Vision

Project description

Inferflow

Universal Inference Pipeline Framework

PyPI version Python License Documentation


Overview

InferFlow is a production-grade inference pipeline framework designed for computer vision models. It provides a clean abstraction layer that separates model runtime, preprocessing, postprocessing, and batching strategies, enabling seamless deployment across multiple inference backends.

Key Features:

  • ๐Ÿš€ Multi-Backend Support: TorchScript, ONNX Runtime, TensorRT
  • โšก Dynamic Batching: Automatic request batching with adaptive sizing
  • ๐ŸŽฏ Type Safe: Full type hints with generic pipeline definitions
  • ๐Ÿ”„ Async & Sync: Both synchronous and asynchronous APIs
  • ๐Ÿ“Š Production Ready: Comprehensive logging, metrics, and error handling
  • ๐Ÿงฉ Modular Design: Namespace-isolated pipelines for Torch and ONNX

Installation

Quick Install (Pure Python)

pip install inferflow

Backend-Specific Installation

# PyTorch backend
pip install inferflow[torch]

# ONNX Runtime backend
pip install inferflow[onnx]

# TensorRT backend (Linux only)
pip install inferflow[tensorrt]

# All backends
pip install inferflow[all]

Development Installation (with C++ optimizations)

git clone https://github.com/6ixGODD/inferflow.git
cd inferflow

# Install with C++ extensions for faster NMS
INFERFLOW_BUILD_CPP=1 pip install -e ".[dev]"

# With CUDA support
INFERFLOW_BUILD_CPP=1 INFERFLOW_CUDA=1 pip install -e ".[dev]"

Build Options:

Variable Default Description
INFERFLOW_BUILD_CPP 0 Enable C++ extensions
INFERFLOW_CUDA 0 Enable CUDA support in C++ extensions

Quick Start

Synchronous API

Basic Classification (PyTorch)

from inferflow.runtime.torch import TorchScriptRuntime
from inferflow.pipeline.classification.torch import ClassificationPipeline

# Setup runtime
runtime = TorchScriptRuntime(
    model_path="resnet50.pt",
    device="cuda:0",
)

# Create pipeline
pipeline = ClassificationPipeline(
    runtime=runtime,
    class_names={0: "cat", 1: "dog", 2: "bird"},
)

# Run inference
with pipeline.serve():
    with open("image.jpg", "rb") as f:
        result = pipeline(f.read())

    print(f"{result.class_name}: {result.confidence:.2%}")

Object Detection (ONNX)

from inferflow.runtime.onnx import ONNXRuntime
from inferflow.pipeline.detection.onnx import YOLOv5DetectionPipeline

# Setup ONNX runtime
runtime = ONNXRuntime(
    model_path="yolov5s.onnx",
    device="cpu",
    precision=Precision.FP32,
)

# Create detection pipeline
pipeline = YOLOv5DetectionPipeline(
    runtime=runtime,
    conf_threshold=0.5,
    class_names={0: "person", 1: "car", 2: "dog"},
)

with pipeline.serve():
    detections = pipeline(image_bytes)
    for det in detections:
        print(f"{det.class_name}: {det.confidence:.2%} at {det.box}")

Asynchronous API

Classification (Async + PyTorch)

import asyncio
from inferflow.asyncio.runtime.torch import TorchScriptRuntime
from inferflow.asyncio.pipeline.classification.torch import ClassificationPipeline


async def main():
    runtime = TorchScriptRuntime(
        model_path="resnet50.pt",
        device="cuda:0",
    )

    pipeline = ClassificationPipeline(
        runtime=runtime,
        class_names={0: "cat", 1: "dog"},
    )

    async with pipeline.serve():
        with open("image.jpg", "rb") as f:
            result = await pipeline(f.read())

        print(f"{result.class_name}: {result.confidence:.2%}")


asyncio.run(main())

Instance Segmentation (Async + ONNX)

import asyncio
from inferflow.asyncio.runtime.onnx import ONNXRuntime
from inferflow.asyncio.pipeline.segmentation.onnx import YOLOv5SegmentationPipeline


async def main():
    runtime = ONNXRuntime(
        model_path="yolov5s-seg.onnx",
        device="cpu",
    )

    pipeline = YOLOv5SegmentationPipeline(
        runtime=runtime,
        conf_threshold=0.5,
        class_names={0: "person"},
    )

    async with pipeline.serve():
        segments = await pipeline(image_bytes)
        for seg in segments:
            print(f"Mask:  {seg.mask.shape}, Box: {seg.box}")


asyncio.run(main())

Dynamic Batching

Enable automatic request batching for higher throughput (GPU recommended):

import asyncio
from inferflow.asyncio.batch.dynamic import DynamicBatchStrategy
from inferflow.asyncio.pipeline.classification.torch import ClassificationPipeline


async def main():
    # Configure batching strategy
    batch_strategy = DynamicBatchStrategy(
        min_batch_size=1,
        max_batch_size=32,
        max_wait_ms=50,
        queue_size=1000,
    )

    pipeline = ClassificationPipeline(
        runtime=runtime,
        batch_strategy=batch_strategy,
    )

    async with pipeline.serve():
        # Submit concurrent requests - automatically batched
        results = await asyncio.gather(
            *[
                pipeline(img) for img in images
            ]
            )

    # View metrics
    metrics = batch_strategy.get_metrics()
    print(f"Avg batch size:  {metrics.avg_batch_size:.2f}")
    print(f"Total batches: {metrics.total_batches}")
    print(f"Throughput: {metrics.total_requests / elapsed:.2f} req/s")


asyncio.run(main())

Performance Tips:

  • GPU: 3-5x speedup with batching
  • CPU: Limited benefit, focus on peak shaving
  • max_wait_ms: Balance latency vs. batch size
  • max_batch_size: GPU memory limit

Custom Workflows

Build multi-stage pipelines with conditional logic and parallel execution:

from inferflow.asyncio.workflow import task, parallel, sequence, Workflow
from dataclasses import dataclass


@dataclass
class QCContext:
    image: bytes
    is_valid: bool = True
    defects: list = None
    quality_grade: str = None


@task(name="validate_image")
async def validate(ctx: QCContext) -> QCContext:
    # Image validation logic
    ctx.is_valid = check_image_quality(ctx.image)
    return ctx


@task(
    name="detect_defects",
    condition=lambda ctx: ctx.is_valid,
)
async def detect(ctx: QCContext) -> QCContext:
    # Defect detection
    ctx.defects = await detection_pipeline(ctx.image)
    return ctx


@task(name="classify_grade")
async def classify(ctx: QCContext) -> QCContext:
    # Quality grading
    ctx.quality_grade = "A" if not ctx.defects else "B"
    return ctx


# Build workflow
workflow = Workflow[QCContext](
    validate,
    detect,
    parallel(
        classify,
        generate_report,
    ),
)

# Execute
context = QCContext(image=image_bytes)
result = await workflow.run(context)
print(f"Grade: {result.quality_grade}")

Architecture

Core Abstractions

graph TB
    subgraph Pipeline["Pipeline"]
        direction LR
        Pre[Preprocess]
        Runtime[Runtime]
        Post[Postprocess]
        Pre -->|Tensor| Runtime
        Runtime -->|Output| Post
    end

    BatchStrategy[BatchStrategy]
    Pre -.->|Batching| BatchStrategy
    Runtime -.->|Batching| BatchStrategy
    Post -.->|Batching| BatchStrategy
    style Pipeline fill: #1a1a1a, stroke: #00d9ff, stroke-width: 3px
    style Pre fill: #0d47a1, stroke: #42a5f5, stroke-width: 2px, color: #fff
    style Runtime fill: #e65100, stroke: #ff9800, stroke-width: 2px, color: #fff
    style Post fill: #6a1b9a, stroke: #ba68c8, stroke-width: 2px, color: #fff
    style BatchStrategy fill: #1b5e20, stroke: #66bb6a, stroke-width: 2px, color: #fff

Codebase Structure:

inferflow/
โ”œโ”€โ”€ runtime/
โ”‚   โ”œโ”€โ”€ torch.py         # PyTorch runtime
โ”‚   โ”œโ”€โ”€ onnx.py          # ONNX runtime
โ”‚   โ””โ”€โ”€ tensorrt.py      # TensorRT runtime
โ”‚
โ”œโ”€โ”€ pipeline/
โ”‚   โ”œโ”€โ”€ classification/
โ”‚   โ”‚   โ”œโ”€โ”€ torch.py     # Torch classification
โ”‚   โ”‚   โ””โ”€โ”€ onnx.py      # ONNX classification
โ”‚   โ”œโ”€โ”€ detection/
โ”‚   โ”‚   โ”œโ”€โ”€ torch.py     # Torch YOLOv5 detection
โ”‚   โ”‚   โ””โ”€โ”€ onnx.py      # ONNX YOLOv5 detection
โ”‚   โ””โ”€โ”€ segmentation/
โ”‚       โ”œโ”€โ”€ torch.py     # Torch YOLOv5 segmentation
โ”‚       โ””โ”€โ”€ onnx.py      # ONNX YOLOv5 segmentation
โ”‚
โ””โ”€โ”€ asyncio/             # Async versions (same structure)

Examples

Check out the examples/ directory for complete working examples:


Requirements

  • Python โ‰ฅ 3.10
  • PyTorch โ‰ฅ 2.0 (for torch backend)
  • ONNX Runtime โ‰ฅ 1.15 (for onnx backend)
  • TensorRT โ‰ฅ 8.6 (for tensorrt backend)
  • OpenCV โ‰ฅ 4.5
  • NumPy โ‰ฅ 1.23

Contributing

Contributions are not currently accepted.This project is maintained for internal use.


License

MIT License.See LICENSE for details.


Citation

@software{inferflow2025,
  title={InferFlow: Universal Inference Pipeline Framework},
  author={6ixGODD},
  year={2025},
  url={https://github.com/6ixGODD/inferflow}
}

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

inferflow-0.1.1a2.tar.gz (52.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

inferflow-0.1.1a2-py3-none-any.whl (76.9 kB view details)

Uploaded Python 3

File details

Details for the file inferflow-0.1.1a2.tar.gz.

File metadata

  • Download URL: inferflow-0.1.1a2.tar.gz
  • Upload date:
  • Size: 52.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for inferflow-0.1.1a2.tar.gz
Algorithm Hash digest
SHA256 9a314bdbb01131acfdabf89ef986dacee84a6acf26b4c6e83873e4db164f7f3a
MD5 d99b91bde52a87c449b6458b9994af6a
BLAKE2b-256 6d90c2ff6d5d17191e14428192f08a2fe10221134a6e1ba3c34e0160585a87c6

See more details on using hashes here.

Provenance

The following attestation bundles were made for inferflow-0.1.1a2.tar.gz:

Publisher: publish.yml on 6ixGODD/inferflow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file inferflow-0.1.1a2-py3-none-any.whl.

File metadata

  • Download URL: inferflow-0.1.1a2-py3-none-any.whl
  • Upload date:
  • Size: 76.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for inferflow-0.1.1a2-py3-none-any.whl
Algorithm Hash digest
SHA256 bd05d0ad315d0f990956e332bf4c0aaa7db26348b2963c0a24349490e34ba513
MD5 6b33b66712b9bea8163252ec2d4fae84
BLAKE2b-256 155a1dfdcb4502d9b83226c46333305e1516e6e9fba3981215ec374dda99cfe2

See more details on using hashes here.

Provenance

The following attestation bundles were made for inferflow-0.1.1a2-py3-none-any.whl:

Publisher: publish.yml on 6ixGODD/inferflow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page