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.5 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.
  • Arg reductions support all-element flat indices or one axis at a time for argmax and argmin.
  • 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.5.tar.gz (135.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.5-cp313-cp313-win_amd64.whl (766.8 kB view details)

Uploaded CPython 3.13Windows x86-64

tensorstudio-1.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (975.2 kB view details)

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

tensorstudio-1.3.5-cp313-cp313-macosx_11_0_arm64.whl (961.1 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

tensorstudio-1.3.5-cp312-cp312-win_amd64.whl (766.9 kB view details)

Uploaded CPython 3.12Windows x86-64

tensorstudio-1.3.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (975.2 kB view details)

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

tensorstudio-1.3.5-cp312-cp312-macosx_11_0_arm64.whl (961.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

tensorstudio-1.3.5-cp311-cp311-win_amd64.whl (762.8 kB view details)

Uploaded CPython 3.11Windows x86-64

tensorstudio-1.3.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (973.0 kB view details)

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

tensorstudio-1.3.5-cp311-cp311-macosx_11_0_arm64.whl (958.1 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

tensorstudio-1.3.5-cp310-cp310-win_amd64.whl (761.5 kB view details)

Uploaded CPython 3.10Windows x86-64

tensorstudio-1.3.5-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (971.6 kB view details)

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

tensorstudio-1.3.5-cp310-cp310-macosx_11_0_arm64.whl (956.4 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: tensorstudio-1.3.5.tar.gz
  • Upload date:
  • Size: 135.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.5.tar.gz
Algorithm Hash digest
SHA256 034046e10ad3335b04e8cad5db117f0ad35ecbfb1246b32855fc9d29e39786f4
MD5 4d028698745664f4dcaf86209bbf8b3a
BLAKE2b-256 1853973ef2a9a5cf969611e8e834c49b199146e7e0a5a17d5afe44aa7a5c152e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.3.5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 84a4b5e14a3dcd34ce18dab7c5f720ab5c16334764c2a4b7f61034db24d4ed29
MD5 dcd4b2e27df2443daeb9eb88f6732b63
BLAKE2b-256 b2c78e5f5c0f3bdb88ecf3f4673bd4aad0303669b8795bbac14812467e54e970

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5c90c6db570bae28d15407746b3779f661c253945a75460b8ee8e2b23d79b9d0
MD5 9fb158e49a98c828370d0f73ddccdafd
BLAKE2b-256 9b896d72e5c4cd3fcc97d34e298c6a6a766f1e20d2e52fce16037df976bf3d6a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.3.5-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 13c6d45d5671e2a38d34af4ba216481e5483cf89f7923489c1c9a0758d8ea6a9
MD5 3e328ebf49ec80403462dc25b9439b6a
BLAKE2b-256 6f7e1c6d50fd0f3efca22cc9d4ea48aec09c530f5ceea45700634b6060f56ef3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.3.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f26584771d2e4ee1bbd3515ab3590e8836aa2d6074cbd086508f9658d2161d0b
MD5 a923a191c20723f2926ee7c1c985acd4
BLAKE2b-256 8ba9d7862b2d55aa3bd30d6a0c6981003a2d8c3756a9ce6061a4cdf9bba45de4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.3.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 aad51e6e57ea3b149f0b4083eb5b21125967f40bc366d89e2bd655344d92da66
MD5 42ce057296137c9bf460c3af048a8768
BLAKE2b-256 94da53a0c9d39ace5475f26f97b1f6bc516f8f726a43869d0e2ded37c91df259

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.3.5-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 80dfaa896ac4f53ae4bdc84ca17a39fec6280a58fdd1e5b940630d4b58456bc4
MD5 d99750087e05f0e7228b88cd8a1ba788
BLAKE2b-256 7ab53a591936412845b7c171ce903269121fef5298d131c19068ce8cd699bc75

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.3.5-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 2a0c1ba5b29aaa798a7dc8af7933dee10454ec9fd25902f71ab6e792ba4931f9
MD5 6ee9b3992621dd38e540eb74d99c892e
BLAKE2b-256 a070dd866da340d5dfabff4bb1322ca916a431e1f53c0461e483c61e74b543a8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.3.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 368a7e56c32eaeefe9b288dd24b0adec9f240d006ea718b58d832d4fca66fdd2
MD5 f78a239f5fc37cb3cd050b46c13288b7
BLAKE2b-256 9736f8a9e5105abd1f13545808bbde32154bdce57f4bb55a7a5bd487966d3c88

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.3.5-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bb21ea77ae0628640e4c267a46f821b08d0eb5bd477948cbb1f2575212dff98c
MD5 53a75a9de32d0cf7dc1bc1b07e9e3f2c
BLAKE2b-256 93167b50694b05a3ec34acca072fe0d9e12ea8fab3590f547202564628d36e97

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.3.5-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 e40bff8647406fb7dda650a805df3c8af73aeb461d842e1fab233360501efc92
MD5 32b454aeef343f1f9de5a750fd070c95
BLAKE2b-256 81edb6ba7f671be89962b5ed9d89363084f37b14f3d5ac274f0ba923bb7cd739

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.3.5-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 42f1953a62ca098c6e191fdfc02f095b92889014a9b6e71baa6fc215ea447c90
MD5 cf17d1d9184534a2601e7fd37be6b193
BLAKE2b-256 767442809c92231d748ca9127ac7dd02d5ccc1273e0234d146f191faabc64a1e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tensorstudio-1.3.5-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d2fcdd9fa693c09634b704ea5b8b22e6080ad214c6aa4c8f5e00426358191863
MD5 3789c170309d630cffb90d0a239471b5
BLAKE2b-256 52e3d66d221011fd7511036a5ea13f726721bfa34a20c0bd4df1b7b4bc2bb331

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