edgefirst-tensor
Zero-copy tensor memory for edge AI inference pipelines — DMA-BUF, IOSurface, AHardwareBuffer, OpenGL PBO, POSIX shared memory and heap behind one Python API.
Part of the EdgeFirst HAL
edgefirst-tensor is one of five Python packages built from the EdgeFirst Hardware Abstraction Layer.
The EdgeFirstAI/hal repository is the home for all of them — source, issue tracker, architecture documentation and release notes.
| Package | Provides |
|---|---|
edgefirst-tensor |
Zero-copy tensor allocation and host/GPU/CUDA mapping (this package) |
edgefirst-codec |
JPEG and PNG decoding directly into pre-allocated tensors |
edgefirst-image |
GPU-accelerated colour conversion, resize, letterbox, tiling and drawing |
edgefirst-decoder |
YOLO and ModelPack output decoding |
edgefirst-tracker |
ByteTrack multi-object tracking |
This package is the foundation the other four build on; installing any of them installs this one.
Installation
pip install edgefirst-tensor
Requires Python 3.8 or newer and NumPy. Wheels are published for Linux (x86_64, aarch64), macOS (arm64), and Windows (x86_64).
The _codec, _image, _decoder and _tracker extensions locate libedgefirst_tensor.so via DT_RUNPATH=$ORIGIN/../tensor. That assumes every edgefirst.* package lands in the same site-packages tree, which pip normally guarantees. A split layout (pip install --target, some vendored trees) will fail at import with libedgefirst_tensor.so.0: cannot open shared object file. On Windows the library is edgefirst_tensor.dll in that same edgefirst/tensor/ directory and there is no rpath: each sibling package's __init__.py registers the directory with os.add_dll_directory() before loading its extension, because Python 3.8+ does not consult PATH for extension-module DLLs.
Packages install under the PEP 420 edgefirst.* namespace, so imports are edgefirst.tensor, edgefirst.codec, and so on. No package ships an edgefirst/__init__.py — a single one would shadow the namespace and hide its siblings.
Quick start
Allocate an image tensor, fill it through a mapped host view, and read it back as NumPy:
import numpy as np
from edgefirst.tensor import Tensor, PixelFormat
# Allocate once; a real pipeline reuses the tensor every frame.
# mem=None selects the best backend available on the platform.
tensor = Tensor.image(1920, 1080, PixelFormat.Rgb, None, "readwrite")
with tensor.map() as view:
frame = np.asarray(view) # shape, dtype and strides all carried
frame[:] = 128
print(tensor.shape, tensor.format, tensor.dtype)
map() returns a HostView implementing the buffer protocol, so np.asarray wraps the tensor's memory without copying — and because the view publishes shape, dtype and the real row stride, no manual reshape is needed and a pitch-aligned DMA buffer is read correctly rather than sheared. The view is released when the with block exits.
The map also owns its cache-coherency bracket, and access chooses the direction. The default "readwrite" flushes the whole buffer on release; a reader does not need that, and on a non-coherent Arm DMA-BUF backing skipping it is a per-frame saving:
with tensor.map("read") as view:
frame = np.asarray(view) # read-only view, not writable
pin_host() is the exception: it is deliberately decoupled from coherency so a pinned address can survive across convert() calls, which is why it pairs with an explicit cpu_access() bracket instead.
Handing memory to an external runtime
pin_host() returns a stable host address that outlives any map guard and carries no borrow of the tensor, so a pinned buffer can be given to an inference runtime (TFLite custom allocations, ONNX Runtime external tensors) while your frame loop keeps writing to it:
pin = tensor.pin_host("readwrite")
print(hex(pin.ptr), pin.len, pin.alignment)
# pin.ptr stays valid for the lifetime of `pin` — across re-maps and across
# ImageProcessor.convert() calls — so an external runtime can hold on to it.
pin.release()
What this package provides
| API | Purpose |
|---|---|
Tensor |
Allocation, reshape, host mapping, NumPy interchange |
Tensor.image() |
Allocate with image dimensions and a pixel format |
Tensor.map() / HostView |
Buffer-protocol host access, released on scope exit |
Tensor.pin_host() / HostPin |
Stable host address for external runtimes |
Tensor.cuda_map() / CudaMap |
Zero-copy CUDA device pointer for TensorRT (Jetson) |
TensorMemory, PixelFormat, Region |
Backend selection, pixel layout, sub-regions |
Quantization, Colorimetry |
Quantization parameters and colour metadata |
is_dma_available() and friends |
Runtime capability probes |
Tracing, build_info() |
Diagnostics |
Interoperability
Each edgefirst-* package is a separate PyO3 extension module, so edgefirst.tensor.Tensor and, say, edgefirst.codec.Tensor are different Python classes even though they wrap the same Rust type — a known PyO3 limitation (issue #1444). A tensor still crosses package boundaries safely, through the __edgefirst_tensor__ capsule protocol every Tensor implements:
# CORRECT — works regardless of which edgefirst.* package produced obj
if hasattr(obj, "__edgefirst_tensor__"):
...
# WRONG — always False for a tensor from a sibling package
if isinstance(obj, edgefirst.image.Tensor):
...
edgefirst.tensor.EdgeFirstTensorExportable is a typing.Protocol you can annotate a cross-package parameter with, so a type checker accepts a tensor from any edgefirst.* package. See crates/python-common/INTEROP.md for the full protocol — capsule names, lifetime and ownership rules, and versioning.
Versioning and changelog
All four edgefirst-* packages are versioned and released together with the HAL itself, so a given version number refers to the same source tree in every language. Because of that there is no per-package changelog: release notes for every version live in the single CHANGELOG.md in the hal repository, which follows Keep a Changelog and Semantic Versioning.
Links
- Changelog — release notes for all packages
- Source — the
halmonorepo - Issue tracker
- Package documentation — the underlying Rust crate, including the memory backend matrix and CUDA mapping
- EdgeFirst
License
Apache-2.0
Metadata
Release files for edgefirst-tensor 0.32.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| edgefirst_tensor-0.32.0-cp311-abi3-win_amd64.whl | CPython 3.11 | abi3 | Windows x86-64 | Details |
| edgefirst_tensor-0.32.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.11 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| edgefirst_tensor-0.32.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.11 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| edgefirst_tensor-0.32.0-cp311-abi3-macosx_11_0_arm64.whl | CPython 3.11 | abi3 | macOS 11.0+ ARM64 | Details |
| edgefirst_tensor-0.32.0-cp38-abi3-win_amd64.whl | CPython 3.8 | abi3 | Windows x86-64 | Details |
| edgefirst_tensor-0.32.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.8 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| edgefirst_tensor-0.32.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.8 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| edgefirst_tensor-0.32.0-cp38-abi3-macosx_11_0_arm64.whl | CPython 3.8 | abi3 | macOS 11.0+ ARM64 | Details |
Total release size: 9.6 MB
Release files / edgefirst_tensor-0.32.0-cp311-abi3-win_amd64.whl
| Download URL | edgefirst_tensor-0.32.0-cp311-abi3-win_amd64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.11 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
077822444f976181bf6ced7eee71609c20a993c86b81f1a2568f606fdafbabc1
|
|
BLAKE2b-256 checksum How to use checksums |
24d3996256fe12993e20a069fa3924eda130ad4747950016700c597d448e434e
|
| 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 Sep 18, 2026.
Transparency logRelease files / edgefirst_tensor-0.32.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | edgefirst_tensor-0.32.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
fc0e131b033a821d38c7672d1586465c548df31cfaf600859214506c12f18e62
|
|
BLAKE2b-256 checksum How to use checksums |
ae1dfa22458df980e8a5e328e51fb0b004b6d928ab079a5d34f3626710c2215b
|
| 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 Sep 18, 2026.
Transparency logRelease files / edgefirst_tensor-0.32.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | edgefirst_tensor-0.32.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.11 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
10498df322a080f77a129823299a575ae5da0ae0a7ec976a77207723ca5731ce
|
|
BLAKE2b-256 checksum How to use checksums |
73d5677089d7d0ffc467d6c2a65f59b06464ab95b60c41155cb562f6d662ecdf
|
| 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 Sep 18, 2026.
Transparency logRelease files / edgefirst_tensor-0.32.0-cp311-abi3-macosx_11_0_arm64.whl
| Download URL | edgefirst_tensor-0.32.0-cp311-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.11 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
c0a407bb4495db7d01db45883dd220317fe17413f76ba81432fde94831863081
|
|
BLAKE2b-256 checksum How to use checksums |
6c1dea413f6c0746e0d84266775db5b8d57bb8b1f4101e7b2ea6951f418b3bd6
|
| 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 Sep 18, 2026.
Transparency logRelease files / edgefirst_tensor-0.32.0-cp38-abi3-win_amd64.whl
| Download URL | edgefirst_tensor-0.32.0-cp38-abi3-win_amd64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.8 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
9f6a66c2698ff1f4579b9553f401ad866340b9f1f9adc765b780acc97431eedd
|
|
BLAKE2b-256 checksum How to use checksums |
43639b2f463a0867263a4efffccb3b967925d4f2f0e886504864b6d0a5b782cc
|
| 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 Sep 18, 2026.
Transparency logRelease files / edgefirst_tensor-0.32.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | edgefirst_tensor-0.32.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.8 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
56ca3ecfb047226a1506b3b515de997b84d2263e231fbd53bc9d221253241990
|
|
BLAKE2b-256 checksum How to use checksums |
62ff8e7e46e965dcf251b4074ffef2f44a58ebd02b114e8a8ed5039619e9e9f7
|
| 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 Sep 18, 2026.
Transparency logRelease files / edgefirst_tensor-0.32.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | edgefirst_tensor-0.32.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.8 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
655f3ebd9fcfd3b101722a8cc99ec8d09f0980ed3053566a0dc4975b463cdfa6
|
|
BLAKE2b-256 checksum How to use checksums |
3f9fe06299897850cc9050c928214432701655cb598e83e2735c761e2e698eb9
|
| 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 Sep 18, 2026.
Transparency logRelease files / edgefirst_tensor-0.32.0-cp38-abi3-macosx_11_0_arm64.whl
| Download URL | edgefirst_tensor-0.32.0-cp38-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.8 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
c478e9cf1f2a6a047212305f758c57742968343e227fc376601231fccc8c0a49
|
|
BLAKE2b-256 checksum How to use checksums |
22b8f74bc3e9037497e1814a60a3b5a3c96dfec5e49630e0610102e23f3e8e8b
|
| 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 Sep 18, 2026.
Transparency log