Skip to main content

CPU-first C++ inference engine for ESM-2 protein language models

Project description

esm.cpp

A CPU-first C++ inference engine for ESM-2 protein language models, with Python bindings. Production throughput on commodity hardware, no GPU required.

Why

ESM-2 is the backbone of modern protein ML, but the reference stack is PyTorch + CUDA. That's the wrong shape for several real workloads:

  • Deep mutational scanning (10⁴–10⁷ variants per protein) — embarrassingly parallel scoring across millions of mutants. CPU throughput matters more than per-call latency.
  • Antibody developability screening (10⁵–10⁶ candidates) — rank by PLM likelihood for aggregation, solubility, immunogenicity prefiltering. Nightly batch jobs on lab CPUs.
  • Embedding extraction at corpus scale — per-residue or per-sequence vectors for downstream classifiers, alignment, or retrieval.
  • On-prem / regulated environments — clinical, compliance-restricted, or air-gapped pipelines that cannot reach a cloud GPU.

The defensible niche is the intersection no existing project occupies: production-grade CPU inference + ahead-of-time W8A8 quantization + variable-length packed-batch scheduling for encoder-only PLMs. esm.cpp targets it. v0.2 ships ESM-2 at 8M, 35M, 150M, 650M, and 3B, with W8A8 INT8 (SmoothQuant) for 150M and above and FP32 for the smaller two.

Performance

ESM-2-650M, esm.cpp vs HuggingFace eager FP32, p50 over 5 runs:

Host Varlen 256-seq (OAS) Uniform 8 × 256 Mechanism
Intel Xeon 8481C Sapphire Rapids (22 vCPU) 9.31× HF (12.4 s) 4.09× HF (0.92 s) AMX-INT8, default
Apple M3 Pro (after one fetch step) 3.97× HF (37.8 s) 10.05× HF (459 ms) Whole-graph CoreML → ANE + GPU
GCP C4A / Neoverse V2 (8 vCPU, Graviton-class) 5.04× HF (29.3 s) 2.30× HF (2.02 s) NEON SDOT, default
Apple M3 Pro (default, no fetch) 3.97× HF (37.8 s) 1.79× HF (2.17 s) NEON SDOT, default

Two structural wins drive these numbers.

Variable-length packed-batch scheduling (the x86 + Linux ARM headline). HuggingFace pads every sequence in a batch to max(len). esm.cpp packs sequences back-to-back along the token axis and isolates per-sequence attention via cu_seqlens. On antibody-shaped data (mean ~120 residues, max ~250) that saves roughly 3× of HF's attention compute and 2× of its FFN compute on top of the INT8 baseline.

Whole-graph CoreML compilation (the Apple uniform-shape headline). The entire ESM-2 forward — 33 encoder layers + LM head — is compiled into ONE .mlmodelc at convert time and dispatched through an Objective-C++ MLModel bridge. Keeps one op-fused fp16 graph hot on the Apple Neural Engine + GPU instead of the per-Linear pattern that thrashes the ANE compiled-state cache. Logit correlation vs HF FP32 is 0.999998 at 650M with strict pseudo-perplexity drift below 0.001 across the holdout subset.

How it works

  • Kernels. Hand-written, runtime-dispatched per ISA. x86: AVX-512 + VNNI + AMX-INT8. ARM: NEON FMLA + SDOT + opt-in SMMLA/i8mm. Every vectorized kernel has a scalar-reference twin behind #ifdef ESM_KERNEL_REFERENCE; the same tests cross-check both with strict tolerances (FP32 rtol/atol=1e-6, INT8 rtol=1e-3 atol=1).
  • Quantization. Ahead-of-time W8A8 INT8 with SmoothQuant, calibrated on UniRef50. Pseudo-perplexity drift < 0.1 and ProteinGym Spearman drift < 0.01 are non-negotiable gates.
  • Scheduler. Variable-length sequences pack back-to-back along the token axis; attention isolates per-sequence via cu_seqlens; FFNs see one fused [ΣL, d] matmul instead of B padded [L_max, d] ones.
  • Loaders. Both safetensors (HF native, zero-copy mmap) and GGUF (esm.cpp native, block-decoded INT8). Weight tensors are never copied into RAM at load.
  • Apple path. On Apple Silicon, if pre-built artifacts are on disk, Model.load_* auto-engages them: a whole-graph CoreML model for registered uniform shapes, and a per-Linear AMX-fp16 BNNSGraph stack for everything else. With no artifacts installed, the engine falls back to the same NEON SDOT kernels Linux ARM uses. No Apple framework appears in the canonical kernel stack itself.

Install

pip install esm-cpp

That's the whole install on Linux x86, Linux ARM, and as a working baseline on Apple Silicon. On Apple Silicon, one extra step pulls the pre-built whole-graph + AMX artifacts that unlock the 10× headline:

esm-cpp-fetch-artifacts --model esm2_t33_650M

The artifacts land in ~/.cache/esm_cpp/<model>/ (~5 GB for 650M) and Model.load_* auto-discovers them on every load. The fetch CLI is pure stdlib — no coremltools, torch, or transformers needed at user time.

OS / arch What pip install esm-cpp gets you Extra step for headline
Linux x86_64 (Sapphire Rapids+) AMX-INT8 → 9.31× HF varlen, 4.09× HF uniform none
Linux x86_64 (Cascade Lake / Ice Lake) AVX-512 + VNNI INT8 baseline none
Linux ARM64 (Graviton 3/4, Axion, Ampere) NEON SDOT → 5.04× HF varlen, 2.30× HF uniform none
Apple Silicon (M1 / M2 / M3) NEON SDOT → 3.97× HF varlen, 1.79× HF uniform esm-cpp-fetch-artifacts10.05× HF uniform

Quick start

import esm_cpp

# Load FP32 weights from a HF safetensors file. On Apple Silicon, if you
# ran esm-cpp-fetch-artifacts, this auto-engages the whole-graph CoreML
# path — no env vars, no register calls.
model = esm_cpp.Model.load_from_safetensors(
    "/path/to/esm2_t33_650M_UR50D/model.safetensors")
tokenizer = esm_cpp.Tokenizer()

# Single sequence.
ids = tokenizer.encode("MKTGVAQRLELDSPMVLQKRSGE")
logits = model.forward(ids)  # [seq_len, vocab_size=33]

# Packed batch — variable-length sequences in one forward.
seqs = ["MKTGVA", "MAGAASPCANGCGPSAPS", "MSEEKRGGQATKLP"]
batch_ids = [tokenizer.encode(s) for s in seqs]
batch_logits = model.forward_scheduled(batch_ids)
# returns list of [L_i, vocab_size] arrays in input order

The same Model.load_from_safetensors (or Model.load_from_gguf for the quantized artifact) is the entry point on every supported OS; the correct kernel path is selected at load time from cpu_features plus whatever Apple artifacts are present.

Convert + quantize

# 1. HF safetensors -> esm-cpp GGUF (FP32).
esm-cpp-convert --hf facebook/esm2_t30_150M_UR50D --out weights/esm2_150m.gguf

# 2. Calibrate on UniRef50.
esm-cpp-quantize --calibrate \
    --model esm2_t30_150M \
    --calib data/uniref50_calib_v1.fasta \
    --out weights/esm2_150m_calib.json

# 3. Apply SmoothQuant + quantize to INT8.
esm-cpp-quantize --apply-smoothquant \
    --model esm2_t30_150M \
    --stats weights/esm2_150m_calib.json \
    --alpha 0.5 \
    --output weights/esm2_150m_q8.gguf

Then load the quantized artifact directly:

m = esm_cpp.Model.load_from_gguf("weights/esm2_150m_q8.gguf")
assert m.config.weights_quantized

Benchmark vs HuggingFace

esm-cpp-bench \
    --model facebook/esm2_t6_8M_UR50D \
    --dataset data/oas_sample_v1.fasta \
    --modes esm-cpp-fp32,hf-eager-fp32 \
    --output benchmarks/results/my_run.json

--modes accepts any subset of esm-cpp-fp32, esm-cpp-int8, hf-eager-fp32, hf-sdpa-fp32. The harness reports p50 / p90 / throughput on uniform and varlen workloads and writes a JSON record per run for tracking.

Scope

Inference only. No training, no LoRA, no backward pass — those belong upstream. Hardware targets are x86_64 (AVX-512 / VNNI / AMX) and AArch64 (NEON / SDOT / SMMLA, plus opt-in Apple ANE/AMX via CoreML artifacts on Apple Silicon). GPU, ARM SVE2, and RISC-V are out of scope for v0.x. ESM-2-15B is bandwidth-bound on CPU at FP32/INT8 and needs W4 quant before it makes sense; that's v2 work.

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

esm_cpp-0.2.0.tar.gz (292.2 kB view details)

Uploaded Source

Built Distributions

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

esm_cpp-0.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (463.2 kB view details)

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

esm_cpp-0.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (412.7 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

esm_cpp-0.2.0-cp313-cp313-macosx_11_0_arm64.whl (323.8 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

esm_cpp-0.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (463.2 kB view details)

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

esm_cpp-0.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (412.6 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

esm_cpp-0.2.0-cp312-cp312-macosx_11_0_arm64.whl (323.7 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

esm_cpp-0.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (461.7 kB view details)

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

esm_cpp-0.2.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (411.3 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

esm_cpp-0.2.0-cp311-cp311-macosx_11_0_arm64.whl (321.9 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

esm_cpp-0.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (460.0 kB view details)

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

esm_cpp-0.2.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (410.6 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

esm_cpp-0.2.0-cp310-cp310-macosx_11_0_arm64.whl (320.6 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

esm_cpp-0.2.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (460.5 kB view details)

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

esm_cpp-0.2.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (411.0 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

esm_cpp-0.2.0-cp39-cp39-macosx_11_0_arm64.whl (320.8 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

Details for the file esm_cpp-0.2.0.tar.gz.

File metadata

  • Download URL: esm_cpp-0.2.0.tar.gz
  • Upload date:
  • Size: 292.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for esm_cpp-0.2.0.tar.gz
Algorithm Hash digest
SHA256 2cfe38e98cd991f8640d7404541e6be34fbd598ff384a455625cfd8a745e4da9
MD5 7914af89bd4e74dd92ad8244566fbfc7
BLAKE2b-256 2f04a2e08c14231d4b795ab6f178a8a1778f556967feec3f9dece9ddfaae6c47

See more details on using hashes here.

Provenance

The following attestation bundles were made for esm_cpp-0.2.0.tar.gz:

Publisher: wheels.yml on ayan-goel/esm-cpp

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

File details

Details for the file esm_cpp-0.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for esm_cpp-0.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f27a46fe5d5950b97f6eb0d5129670267ef8026168ebcf15ef0efb3f6e1ee243
MD5 2036e580bfba671c9d655b5c91e4176b
BLAKE2b-256 6e52212466e17ee7017c823a6df4ec6e362b615c85641c4a8611f00e9747961f

See more details on using hashes here.

Provenance

The following attestation bundles were made for esm_cpp-0.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on ayan-goel/esm-cpp

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

File details

Details for the file esm_cpp-0.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for esm_cpp-0.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 44df8e318fcf819f44c55400459a5a8467a0aec93c79a27ef2f822acbccaed14
MD5 1820c2c2a82bcb0fa065881530641cf0
BLAKE2b-256 b1736e68238aa87658d3b7faf7a237681d63337fa3135586966b48e775650d33

See more details on using hashes here.

Provenance

The following attestation bundles were made for esm_cpp-0.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl:

Publisher: wheels.yml on ayan-goel/esm-cpp

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

File details

Details for the file esm_cpp-0.2.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for esm_cpp-0.2.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3fed7b8fbcde39e68745b7a4fd9513a9b9df19905c61d90afcec67093ef35f5e
MD5 9f023dc381f7e30f10fad9fc60d54dc0
BLAKE2b-256 832c3879a7c75a4815457c31ab8eaead0d0bd3908d7a4d762e820c415a643892

See more details on using hashes here.

Provenance

The following attestation bundles were made for esm_cpp-0.2.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: wheels.yml on ayan-goel/esm-cpp

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

File details

Details for the file esm_cpp-0.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for esm_cpp-0.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ff5020a2987ac7a0050d2454c7839fb86fa1c34406f33dda577723998634f034
MD5 a467cb1ab2a3275b0acff1f3ec05ae2a
BLAKE2b-256 03279b3156b3993d3d51c3b60a53e5bb09a0bb78ec5e16e7da028afa685143d6

See more details on using hashes here.

Provenance

The following attestation bundles were made for esm_cpp-0.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on ayan-goel/esm-cpp

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

File details

Details for the file esm_cpp-0.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for esm_cpp-0.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5407d541b17a33bcb085e6c51e30e598ddb50ad6eea1e0a7def88262248e30be
MD5 012e0988e244d827a3acae713fb24c89
BLAKE2b-256 3f19976531b79600900c1c8386de2d70e7ddeb7b018673f26449b71228a8241a

See more details on using hashes here.

Provenance

The following attestation bundles were made for esm_cpp-0.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl:

Publisher: wheels.yml on ayan-goel/esm-cpp

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

File details

Details for the file esm_cpp-0.2.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for esm_cpp-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7769219ebbc4c20473ad4ef77b9341de1f63d9fbd4c17f33f972f05a76853ef8
MD5 8818f9e3bb49cddbe071f6817554132d
BLAKE2b-256 c22b1550dd532d13c51515783793c4e7b1b25ccccd3baf53d5ffa032dae6547a

See more details on using hashes here.

Provenance

The following attestation bundles were made for esm_cpp-0.2.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: wheels.yml on ayan-goel/esm-cpp

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

File details

Details for the file esm_cpp-0.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for esm_cpp-0.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f661f20cd8d4f1d11722f88f1bc6ca0eb9ea9627795ece40bf6bff11c56792bc
MD5 11b1fc5b5af4ebe72f7cdfb1e121113a
BLAKE2b-256 31b63a7079ed16734c2d22227ac88ea9bb851095bc8afe5e9e23143f665fee29

See more details on using hashes here.

Provenance

The following attestation bundles were made for esm_cpp-0.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on ayan-goel/esm-cpp

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

File details

Details for the file esm_cpp-0.2.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for esm_cpp-0.2.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ee659e25e173ecd60f0d43ce3678da6ba8c07790be4b276cf520313b22773d4e
MD5 ec66f74a2f1d21fe32b1f6fb7ca7b07a
BLAKE2b-256 92fa9eb55891f16f447845641f9a0c6122701299a9f3e8c5ae2d98361b703ca8

See more details on using hashes here.

Provenance

The following attestation bundles were made for esm_cpp-0.2.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl:

Publisher: wheels.yml on ayan-goel/esm-cpp

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

File details

Details for the file esm_cpp-0.2.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for esm_cpp-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7b99ae5a796fedb7c4d81c98e4a5b174c89bf32c73cfe611dc727d9a60b884ca
MD5 e662ae44b4137bb0f54839dcb0acc5e0
BLAKE2b-256 d99afadc1e67c3d8d5d85d013f0399f728eafc69f4a43ae7798798c5e9a42fb1

See more details on using hashes here.

Provenance

The following attestation bundles were made for esm_cpp-0.2.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: wheels.yml on ayan-goel/esm-cpp

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

File details

Details for the file esm_cpp-0.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for esm_cpp-0.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7b9f64f75fc6fb853dd7bcfcd95eefc05ee9a97c64284860bc3738aba4eeb6f4
MD5 a5438f712116b721927830f693d7641f
BLAKE2b-256 241f0b436838c7c35dafed3774195cb31e61ff36c85b44cedd30224b5a3cace7

See more details on using hashes here.

Provenance

The following attestation bundles were made for esm_cpp-0.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on ayan-goel/esm-cpp

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

File details

Details for the file esm_cpp-0.2.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for esm_cpp-0.2.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 11dc7924006afc8a59dc3f6933c333f1f4a437e08ec4a5c31452a5a5dc43ab3e
MD5 d72ebe8f429123987c821f95aae6f52c
BLAKE2b-256 56942d38ab7262773d4ef51741c48b0572672748f4f309cb717e29f817b37a53

See more details on using hashes here.

Provenance

The following attestation bundles were made for esm_cpp-0.2.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl:

Publisher: wheels.yml on ayan-goel/esm-cpp

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

File details

Details for the file esm_cpp-0.2.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for esm_cpp-0.2.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7bf7c12ec68b41d398debcd0fab09b9701c5755a5c0ae649810a0c818fcd5e76
MD5 ab461c2c5230fa5c2bc41d35ccb201e7
BLAKE2b-256 4bb4226a03f5c16e021d11a0a688675c65fe56ace26661c54ac82fa41fe1afba

See more details on using hashes here.

Provenance

The following attestation bundles were made for esm_cpp-0.2.0-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: wheels.yml on ayan-goel/esm-cpp

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

File details

Details for the file esm_cpp-0.2.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for esm_cpp-0.2.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a6c4b2dfaa59fe670398d5b88d0372054c01c61d2b71ebc69523d4723022c848
MD5 87716298b8309396c9471039c92ab71e
BLAKE2b-256 f28b9e3e87336fad97aded25758241930c94a6ec4716cac7f35e3e65ff04a7d2

See more details on using hashes here.

Provenance

The following attestation bundles were made for esm_cpp-0.2.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on ayan-goel/esm-cpp

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

File details

Details for the file esm_cpp-0.2.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for esm_cpp-0.2.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f2aeacc032e928b21b3796c5b567b8de2ae6bcefb65c461ddd85b132b0f34ae6
MD5 fbc89f8dfeef74342abd8136c1c6e938
BLAKE2b-256 877e4ee8b767fcfded774500cb9a9bea65d0c8cec894663f4e1767be40e3ef97

See more details on using hashes here.

Provenance

The following attestation bundles were made for esm_cpp-0.2.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl:

Publisher: wheels.yml on ayan-goel/esm-cpp

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

File details

Details for the file esm_cpp-0.2.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for esm_cpp-0.2.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1fd6d75d2520f8e91a5b08a37f74227746eaf0f808e33ded86f003256426fe46
MD5 5ff9f26671b6e468b6ab0da12bdca80a
BLAKE2b-256 e3820ff5e0ba0d6c5ec864bd506f7bfc1878ce9dd18051cc7d5e4adee4a4ada9

See more details on using hashes here.

Provenance

The following attestation bundles were made for esm_cpp-0.2.0-cp39-cp39-macosx_11_0_arm64.whl:

Publisher: wheels.yml on ayan-goel/esm-cpp

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