Skip to main content

TensorStudio is a compact C++ tensor and autograd engine with a Python API for learning, experimentation, and lightweight ML workloads.

Project description

TensorStudio

CI Wheels PyPI

TensorStudio is a compact C++ tensor and autograd engine with a Python API for learning, experimentation, and lightweight ML workloads.

TensorStudio 1.3.4 is a CPU-only stable API foundation. It is eager-only, intentionally small, and not a replacement for mature ML frameworks.

Install

From PyPI:

python -m pip install tensorstudio

From a source checkout:

python -m pip install -U pip
python -m pip install -e ".[dev]"

Install optional extras for ONNX export and Pillow-backed image inputs:

python -m pip install "tensorstudio[onnx,vision]"

Build source and wheel distributions:

python -m build
python -m twine check dist/*

End users should install wheels and should not need CMake. Source builds require a C++20 compiler because the native extension is implemented in C++.

Platform Setup

Windows is the primary release target. Use Python from python.org and install Microsoft C++ Build Tools or Visual Studio with the Desktop development with C++ workload before building from source:

python -m pip install -U pip
python -m pip install -e ".[dev]"
pytest -q

Linux source builds need GCC or Clang, CMake, and Python development headers:

python -m pip install -U pip
python -m pip install -e ".[dev]"
pytest -q

macOS source builds need Xcode Command Line Tools:

xcode-select --install
python -m pip install -U pip
python -m pip install -e ".[dev]"
pytest -q

Quickstart

import tensorstudio as ts

x = ts.tensor([[1.0, 2.0], [3.0, 4.0]])
y = ts.ones((2, 2))

print((x + y).tolist())
print((x @ y).numpy())
print(x.reshape((4,)).tolist())

Tensor API

TensorStudio supports CPU tensors with float32, float64, int32, int64, and bool dtypes.

import tensorstudio as ts

ts.manual_seed(7)

a = ts.zeros((2, 3))
b = ts.rand((2, 3))
c = ts.eye(3)
d = ts.linspace(0.0, 1.0, 5)

print(a.shape, a.strides, a.device, a.is_contiguous)
print((b.clamp(0.2, 0.8) + 1).mean().item())
print(b.sum(axis=1).tolist())
print(ts.concat([b, b], axis=0).shape, b.astype("float64").dtype)
print(c.tolist(), d.tolist())
print(ts.zeros_like(b).shape, ts.randn_like(b, seed=11).dtype)

Arithmetic promotion is explicit and inspectable:

print(ts.promote_types("int32", "float32"))        # float32
print(ts.result_type("int64", "int32", op="div")) # float32
print(ts.result_type("int64", "float32", op="gt")) # bool

Advanced Math

Native C++ elementwise math includes trigonometric functions and numerically useful helpers with autograd support:

import tensorstudio as ts

x = ts.tensor([0.1, 0.2, 0.3], requires_grad=True)
y = ts.sin(x) + x.cos() + x.log1p() + x.rsqrt()
loss = y.mean()
loss.backward()

print(loss.item())
print(x.grad.tolist())

Higher-level helpers live in tensorstudio.math:

values = ts.tensor([[1.0, 2.0], [3.0, 4.0]])

print(ts.math.variance(values).item())
print(ts.math.std(values, axis=0).tolist())
print(ts.math.norm(values, ord=2).item())

Autograd

import tensorstudio as ts

x = ts.tensor([1.0, 2.0, 3.0], requires_grad=True)
loss = (x * x).mean()
loss.backward()

print(x.grad.tolist())

Use no_grad() when you want eager computation without recording a graph:

with ts.no_grad():
    y = x * 2

Neural Networks

import tensorstudio as ts
from tensorstudio import nn, optim

ts.manual_seed(0)

model = nn.Sequential(nn.Linear(1, 8), nn.Tanh(), nn.Linear(8, 1))
optimizer = optim.SGD(model.parameters(), lr=0.05, momentum=0.9)
scheduler = optim.StepLR(optimizer, step_size=50, gamma=0.5)
criterion = nn.MSELoss()

x = ts.tensor([[0.0], [1.0], [2.0], [3.0]])
y = ts.tensor([[1.0], [3.0], [5.0], [7.0]])

for _ in range(100):
    optimizer.zero_grad()
    loss = criterion(model(x), y)
    loss.backward()
    optim.clip_grad_norm_(model.parameters(), max_norm=10.0)
    optimizer.step()
    scheduler.step()

print(loss.item())
print(model.state_dict().keys())
print(model.parameter_count())

Vision

TensorStudio includes a practical computer-vision namespace for local image classification workflows: Pillow-backed image IO, transform pipelines, deterministic augmentations, ImageFolder datasets, metrics, image grids, bounding-box drawing, and compact CNN classifiers running through native Conv2d/pooling kernels.

import numpy as np
import tensorstudio as ts
from tensorstudio import nn, optim

transform = ts.vision.Compose(
    [
        ts.vision.Resize((8, 8)),
        ts.vision.ToTensor(),
        ts.vision.Normalize(0.5, 0.5),
    ]
)
image = np.zeros((8, 8, 3), dtype=np.uint8)
x = transform(image).reshape((1, 3, 8, 8))

model = ts.vision.ImageClassifier((3, 8, 8), num_classes=2, channels=(4,))
target = ts.tensor([1], dtype="int64")
optimizer = optim.SGD(model.parameters(), lr=0.01)

optimizer.zero_grad()
loss = nn.CrossEntropyLoss()(model(x), target)
loss.backward()
optimizer.step()
print(ts.vision.accuracy(model(x), target))

DataLoader

import tensorstudio as ts
from tensorstudio.data import DataLoader, TensorDataset

dataset = TensorDataset(ts.arange(6).reshape((6, 1)), ts.arange(6))
loader = DataLoader(dataset, batch_size=2, shuffle=True, seed=42)

for features, targets in loader:
    print(features.shape, targets.shape)

The v1 DataLoader is intentionally single-process so it works cleanly on Windows without multiprocessing setup.

Projects And Training

tensorstudio.project provides project folders, JSON config, reusable trainers, safe NPZ weight files, and trusted full checkpoints:

import tensorstudio as ts
from tensorstudio import nn, optim
from tensorstudio.data import DataLoader, TensorDataset
from tensorstudio.project import Project, ProjectConfig, Trainer, save_state_dict

x = ts.tensor([[0.0], [1.0], [2.0], [3.0]])
y = ts.tensor([[1.0], [3.0], [5.0], [7.0]])

model = nn.Linear(1, 1)
loader = DataLoader(TensorDataset(x, y), batch_size=2)
trainer = Trainer(model, optim.SGD(model.parameters(), lr=0.05), nn.MSELoss())
project = Project("runs/linear", ProjectConfig(name="linear-regression", seed=7))

history = trainer.fit(loader, epochs=50)
save_state_dict(model, project.checkpoint_path("weights"))
print(history.last)

Performance

TensorStudio is optimized for small-to-medium CPU eager workloads, but performance is still experimental. Benchmarks live in benchmarks/ and can be run locally:

python benchmark_all.py
python benchmarks/benchmark_report.py

benchmark_all.py writes benchmarks/results.md and includes explicit win columns for NumPy, TensorFlow, PyTorch, and JAX when those libraries are available locally.

On one Windows CPython 3.10 development run reporting 1.2.0, TensorStudio beat NumPy on 26 small operation benchmark cases and lost on 77 NumPy-comparable cases. Against PyTorch CPU 2.12.1+cpu, TensorStudio won 75 local cases and lost 33. The strongest local wins were small eager operations, small contiguous axis reductions, and the simple NumPy convolution/pooling references where framework dispatch or Python loops dominate; larger matrix multiplication, PyTorch convolution and pooling, larger axis reductions, larger transcendental activations, and larger autograd workloads remain faster in PyTorch and NumPy. See benchmarks/results.md for the full table, platform details, and exact timings.

Snapshot from that local run:

operation shape TensorStudio NumPy PyTorch CPU TS vs NumPy TS vs PyTorch
sigmoid (32,) 0.0017 ms 0.0038 ms 0.0614 ms 2.1691x 35.3154x
mean (32,) 0.0029 ms 0.0131 ms 0.0186 ms 4.5638x 6.4709x
sum_axis1 (16, 16) 0.0027 ms 0.0029 ms 0.0085 ms 1.0894x 3.1408x
chain_relu (128,) 0.0112 ms 0.0051 ms 0.0726 ms 0.4575x 6.4533x
matmul (256, 256) 4.4121 ms 0.3779 ms 0.1669 ms 0.0856x 0.0378x
conv2d_3x3_padding1 (1, 1, 8, 8) 0.2374 ms 1.7112 ms 0.0186 ms 7.2091x 0.0784x
max_pool2d_2x2 (1, 1, 16, 16) 0.0237 ms 0.2764 ms 0.0082 ms 11.6685x 0.3462x
avg_pool2d_2x2 (1, 1, 16, 16) 0.0198 ms 0.7431 ms 0.0073 ms 37.4930x 0.3662x
elementwise_backward (1024,) 3.0196 ms n/a 0.2254 ms n/a 0.0746x

Speedup is competitor median / TensorStudio median, so values above 1.0x favor TensorStudio.

Do not treat these results as universal. TensorStudio does not claim to be faster than NumPy, TensorFlow, PyTorch, or JAX overall.

Save And Load

import tensorstudio as ts
from tensorstudio import nn

model = nn.Linear(2, 1)
ts.save({"model": model.state_dict()}, "checkpoint.tsmodel")
checkpoint = ts.load("checkpoint.tsmodel")

Serialization uses pickle. Loading pickle files from untrusted sources is unsafe because pickle can execute arbitrary code.

For safer tensor and state_dict interchange, use TensorStudio's non-pickle NPZ helpers:

state = model.state_dict()
ts.save_npz(state, "weights.tsnpz")
model.load_state_dict(ts.load_npz("weights.tsnpz"))

ONNX Export

TensorStudio can export a supported nn.Sequential graph to ONNX when the optional onnx extra is installed:

import tensorstudio as ts
from tensorstudio import nn

model = nn.Sequential(
    nn.Conv2d(1, 2, kernel_size=3, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(2),
    nn.Flatten(),
    nn.Linear(2 * 2 * 2, 3),
)

ts.export_onnx(model, "classifier.onnx", input_shape=(1, 1, 4, 4))

The exporter supports Linear, Conv2d, Flatten, ReLU, Sigmoid, Tanh, MaxPool2d, and AvgPool2d. It is an exporter, not an ONNX runtime or importer.

Development

python -m pip install -e ".[dev,docs]"
python test_all.py --skip-build
ruff check .
mypy python/tensorstudio
pytest -q
python -m build
python -m twine check dist/*

The native extension module is tensorstudio._C, built with CMake, pybind11, scikit-build-core, and C++20.

Release Checklist

  • python test_all.py passes locally.
  • ruff check . passes.
  • mypy python/tensorstudio passes.
  • pytest -q passes on Windows, Linux, and macOS.
  • python -m build passes.
  • python -m twine check dist/* passes.
  • Benchmarks are generated and performance claims match the data.
  • Clean wheel installs pass on Windows, Linux, and macOS.
  • Clean sdist installs pass on Windows, Linux, and macOS.
  • Examples run on all platforms.
  • Docs match the implemented feature set.
  • No PyPI tokens are committed or printed.
  • TestPyPI is verified before a real PyPI release.

Publishing

GitHub Actions build wheels with cibuildwheel. The publish workflow is designed for PyPI trusted publishing with id-token: write; it should not hardcode PyPI tokens or print secrets.

Current Limitations

  • CPU backend only.
  • Eager execution only.
  • No CUDA or Metal backend yet.
  • No BLAS-backed matrix multiplication yet.
  • No graph compiler or distributed runtime.
  • Convolution and pooling support are currently limited to CPU NCHW conv2d, max_pool2d, and avg_pool2d style workloads.
  • Vision covers local image-classification utilities, metrics, visualization, and compact CNNs. It is not an OpenCV replacement and does not include pretrained model zoos, detection/segmentation training stacks, video IO, or GPU image kernels yet.
  • ONNX support is export-only for a limited set of TensorStudio modules.
  • Reductions support all-element, single-axis, and tuple/list-axis reductions for sum, mean, max, and min.
  • No sparse tensors or advanced indexing.
  • Dtype casting is basic and does not include a full promotion/casting policy.
  • Experimental performance; benchmarks are local references only.
  • Pickle serialization is for trusted TensorStudio objects only.

Roadmap

  • CUDA backend
  • Graph/JIT mode
  • Broader convolution ops, adaptive/global pooling, and image-model examples
  • Richer dataset utilities
  • Model zoo examples
  • ONNX import and broader export coverage
  • Improved memory allocator
  • SIMD kernels
  • Multithreaded ops

License

TensorStudio is licensed under the MIT License.

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

tensorstudio-1.3.4.tar.gz (134.8 kB view details)

Uploaded Source

Built Distributions

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

tensorstudio-1.3.4-cp313-cp313-win_amd64.whl (762.5 kB view details)

Uploaded CPython 3.13Windows x86-64

tensorstudio-1.3.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (973.0 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

tensorstudio-1.3.4-cp313-cp313-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

tensorstudio-1.3.4-cp312-cp312-win_amd64.whl (762.6 kB view details)

Uploaded CPython 3.12Windows x86-64

tensorstudio-1.3.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (972.8 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

tensorstudio-1.3.4-cp312-cp312-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

tensorstudio-1.3.4-cp311-cp311-win_amd64.whl (758.5 kB view details)

Uploaded CPython 3.11Windows x86-64

tensorstudio-1.3.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (969.1 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

tensorstudio-1.3.4-cp311-cp311-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

tensorstudio-1.3.4-cp310-cp310-win_amd64.whl (757.3 kB view details)

Uploaded CPython 3.10Windows x86-64

tensorstudio-1.3.4-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (967.8 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

tensorstudio-1.3.4-cp310-cp310-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file tensorstudio-1.3.4.tar.gz.

File metadata

  • Download URL: tensorstudio-1.3.4.tar.gz
  • Upload date:
  • Size: 134.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for tensorstudio-1.3.4.tar.gz
Algorithm Hash digest
SHA256 1d04bf8a3e750ddf0e89e8e8c0257a7b3e14f79848eb7d2ae0538d192dc9942c
MD5 e8b887008e8d70345c963160912946e3
BLAKE2b-256 ccfc313bfaaee864e5dab1a75d3cffd2f7a7ea3f55d20c42c77c3093283d1bc7

See more details on using hashes here.

File details

Details for the file tensorstudio-1.3.4-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for tensorstudio-1.3.4-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 04767cac1c32819de063ddd2f595314d738365c2b90ac0e7e22da6a99231e2e9
MD5 cec2aab4e54cc8326dafc07fb7d2c281
BLAKE2b-256 8ba85f72c0c045e999b86cde5f70970904d32a25310da218183fcf9e81d691a1

See more details on using hashes here.

File details

Details for the file tensorstudio-1.3.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for tensorstudio-1.3.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9f751b6be7d32c9feb42ce4f7744e8b6157db5f901cb2c24667603bb769b7599
MD5 52caf3b349ccf2c53c0cd7270a90094c
BLAKE2b-256 f1c132da5e05ab2722df4195f157e47cb4b09d56e87c1f7760dedf064b6ab027

See more details on using hashes here.

File details

Details for the file tensorstudio-1.3.4-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tensorstudio-1.3.4-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 364e5a6efc69c8fb693f24366363a698058147c0befd5646c1d48d6e53ba084a
MD5 d38198b740ceef1052a732e97b23e9e6
BLAKE2b-256 0a3da46adce5e7cc62c9d79509e7865ea0a85fb6016f88d8755a817d6297e5b4

See more details on using hashes here.

File details

Details for the file tensorstudio-1.3.4-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for tensorstudio-1.3.4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 86ef7c9e2b8b93cf2e28bea68ecf1b476f91090e1dd92abfbeac95394b53f78a
MD5 a9e6f4aabf16bd71f401c41b95b22b07
BLAKE2b-256 726ecade2d3f4b462ffe5f9b331c2c90feab8db5811cf3be62b6a13358889572

See more details on using hashes here.

File details

Details for the file tensorstudio-1.3.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for tensorstudio-1.3.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 38afc4759526856dffc4494567db85b8adfe809dd9b3dca1df4871be17d7eb3f
MD5 6603e3c77c0fe2ee7e6e87826dee4a32
BLAKE2b-256 624caa05237ca2e832ac479dd1ed120cea56a83823d5723dd2c4e7f3c13e50eb

See more details on using hashes here.

File details

Details for the file tensorstudio-1.3.4-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tensorstudio-1.3.4-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e18878c01a3bc47595ba3cf5febd20291492720994b25973ee55755aba93707e
MD5 967907eea0588f32dbb9a0ca92d8d27d
BLAKE2b-256 213befb8b9327355ae407556ccf70aff08f118f7b9f26e4a35214514a3e8089b

See more details on using hashes here.

File details

Details for the file tensorstudio-1.3.4-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for tensorstudio-1.3.4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 5170534ace8135a7a047e1e86fbed011408d4ce49fafe0246a2abc072422b358
MD5 0f3a9712ef0cdb271fd38fdaf9a66ec4
BLAKE2b-256 970d5d20dfa2fcd584fb15d08b4b7a1da508095b52d18a05bd609848d9438db1

See more details on using hashes here.

File details

Details for the file tensorstudio-1.3.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for tensorstudio-1.3.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 382ca173694d746282efb66ef6d1d479e44e3153ffe563098fa485c3b1562424
MD5 9b05ba446388cad1f405c27eb912ed54
BLAKE2b-256 2fa3c81dbfece23fe2e31fdc291938dfc736cb8d26ebd9037696ce2efb07b35d

See more details on using hashes here.

File details

Details for the file tensorstudio-1.3.4-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tensorstudio-1.3.4-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9230bd91af53245b86457c85e8897e8245c591d3cac7bf62ec2ab1b4ee9f6569
MD5 ef01cf19429af020f1cad876b5f064ad
BLAKE2b-256 c868f03fa615e511e3de3d8fa3d8c14bcfa9aa7a8f139591aeba4f41420b1ab3

See more details on using hashes here.

File details

Details for the file tensorstudio-1.3.4-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for tensorstudio-1.3.4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 088e6d6fb9d06511e816f8983b97c032d27d29ba2dbc3779bbeebf59a371c52b
MD5 9f275e33c2836f5450fde76dc2e4ddb5
BLAKE2b-256 3674abf69d0e9fdcb61d54bad81a9aa4c5b5fd9206c9f85646dca160b9d2f3b0

See more details on using hashes here.

File details

Details for the file tensorstudio-1.3.4-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for tensorstudio-1.3.4-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e029f0134a132c3233d0f42982be9c3cdbfd93c31e424ed8db99ddfe7c4a0d65
MD5 f05f7be5c6d5d5c47470ee17760e95dd
BLAKE2b-256 b779d048c8dc9b6d434b058c2f1ac2d33e8a60d5169846d8052309fbeaccdf3e

See more details on using hashes here.

File details

Details for the file tensorstudio-1.3.4-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tensorstudio-1.3.4-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fd8852c53c2c576eb9be9cf6080a476d83d11394ddf199edb5c0704783b6d0d2
MD5 7bcd2d91fae62c501b91a679ff173f5e
BLAKE2b-256 d278cd711c6484757d819487ff471ea69ec49e961a6c6a9c6a9c726258b1ccae

See more details on using hashes here.

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