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.4.0 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())
print(x[0, :].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.
  • Arg reductions support all-element flat indices or one axis at a time for argmax and argmin.
  • Selection helpers where, maximum, and minimum are native C++ tensor ops with broadcasting and autograd support for floating-point branches.
  • Basic integer/slice indexing is supported as native C++ views with autograd scatter-back. Advanced list, tensor, and boolean-mask indexing are not implemented yet.
  • 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.4.0.tar.gz (151.5 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.4.0-cp313-cp313-win_amd64.whl (857.5 kB view details)

Uploaded CPython 3.13Windows x86-64

tensorstudio-1.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.1 MB view details)

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

tensorstudio-1.4.0-cp313-cp313-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

tensorstudio-1.4.0-cp312-cp312-win_amd64.whl (857.6 kB view details)

Uploaded CPython 3.12Windows x86-64

tensorstudio-1.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.1 MB view details)

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

tensorstudio-1.4.0-cp312-cp312-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

tensorstudio-1.4.0-cp311-cp311-win_amd64.whl (853.4 kB view details)

Uploaded CPython 3.11Windows x86-64

tensorstudio-1.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.1 MB view details)

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

tensorstudio-1.4.0-cp311-cp311-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

tensorstudio-1.4.0-cp310-cp310-win_amd64.whl (851.9 kB view details)

Uploaded CPython 3.10Windows x86-64

tensorstudio-1.4.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.1 MB view details)

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

tensorstudio-1.4.0-cp310-cp310-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: tensorstudio-1.4.0.tar.gz
  • Upload date:
  • Size: 151.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.11

File hashes

Hashes for tensorstudio-1.4.0.tar.gz
Algorithm Hash digest
SHA256 12f99f127ce50d3d2db32f499e8b31313e0eee6300f4ed1658c70fb2da14236c
MD5 24938e21ef1a9c1af702bbc81fae646a
BLAKE2b-256 42e84af4e84b9a0e23a298f41b72b98df03948bb1c3c03769591f550dfd18f5c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.4.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 58dd86f8ab75259b7ab83773dce2dc4219633f44781e75e0ec7970ac266f6291
MD5 52768dfcb5770b23d2d962d82b679afd
BLAKE2b-256 9af14ee2c9504d08af551ce9ab41ca411b3e811819928299d2e2fcac7fbeb029

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e7b3d48f72bf97bebaaf992acebee4659d98c4612da86b899433b5362011df84
MD5 9abad067ba86ae076dd8842aa1d92beb
BLAKE2b-256 e19db7060c0546000b05c3d832a37f8e12a17697411c0f262dffdf75be5682b1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.4.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f849ff5a6acf708f5ac04b7f7edf9f82efd75ba554515c6b8a0d38a22bb9ff5a
MD5 e249d18228a11bbd30a3d75bcd082570
BLAKE2b-256 8e0f601a0c6e051f7a88241769bf6dffe4355d65e1eebd7fb2aa2459a9e1f306

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.4.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 abed94b21410f091bf8ba73257223e6806017e633ca0373d115751be31ec6776
MD5 9be27941796646d67e68d3e83037cfde
BLAKE2b-256 cad8c40946142e59bd477dde0e71bf60fe9535a12fa4850660ffaa7de5665e16

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 31ab3d7adc435fb764f3f562f408a6855f4c53622a15c407d1c931669c2fab72
MD5 bb12bdd8e6dae8560805918edaa156fa
BLAKE2b-256 a016b52b30a9951905cfd0a55215674e7a253ceafb5c13db0d578d1bcdc26a48

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.4.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 32cd23a8a7cac649bd77b584fc031f2c9b710691f87527f63757e9f8dee3eed9
MD5 0b4f2e92547b08688481178cef354167
BLAKE2b-256 9fecda3303ef4b626feb345d7c1716d7c0caad98b2dca3bc5bb87c63c3aae996

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.4.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 43516bfe40be38249ef544b6bc6efa10fc4c335e05d4abb6ca1eb2327fefa6e4
MD5 0e9999bc8f4caa71b3d210f5e286f9e0
BLAKE2b-256 f194be0ad6abefd336457648346cb48a8b0a7a51a4fc95ad2125a61c20d2a476

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c21430300117f23c67f1ce7d0fded947017f7267f34b3a4431b33598e9787f17
MD5 68f6b823aac93be60cd201de01090b25
BLAKE2b-256 30bcdf417a48284d731848f77963fc749bec62e050fc2fe9862e29c5f9b9d81b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.4.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fbb00a764a90e344bb52aaefa0ccdf5ae16ec6afefc24003ae5c690a2eaf9f1a
MD5 73fd51636ac3431c748b91b5a038ce6b
BLAKE2b-256 7557d1589a918c5aa83fe3b955b1893e4f589e8a1a6f5c7e4a55a5a3c2176734

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.4.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 d7773bf21fcf36344b1381ac45eee58820a9f9bdf77cb152c0a87b1a19979c7b
MD5 6542a0f84362daef6ee7032c4e2b3752
BLAKE2b-256 3339d31d99fb8859df3ad89f49f0b9ee492e461ea4681d13a0b4c40dea996ea9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.4.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 04c5abec67459cddec0546c0f06b142cf2a4f03f03d960414f732180a2927e40
MD5 bb70abf1de8a8962801ae0630129dd71
BLAKE2b-256 f015e429fecc47e7bbb9f823eecefb30bf11ea6424511c713923e30b0cddd8e2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.4.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9fad7bef08bd3bda154405b6f873a062457fb26d40d1e9a98b03713d0fbe47c7
MD5 61b350cbdc02173dbd7ed3539a8aa457
BLAKE2b-256 cb4535d1b10b19288b748a422ee1dc2787827ecc367e3a3a8fc3a6d6ba5039e0

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