MemT-1.0-Nano keeps a chat's memory in a 41.9 MB file, and it answered 9 of 9 questions after a reload
MemT-1.0-Nano on one 80 GB A100: facts saved to a fixed 41.9 MB file, reloaded into an empty session in about 2 s, 9 of 9 recalled.
A 41.9 MB file and an empty chat session: the model still knew the flour supplier's code was BX-4471. That model is MemT-1.0-Nano, an open model from MemTensor. It writes past turns into a memory of fixed size that you can save to a file and load back later. We told it some facts, saved the file and closed the session. Then we loaded the file into a brand-new session with zero messages. It answered 9 of 9 questions about those facts. For anyone who runs their own GPUs, a session becomes a fixed-size file that reloads in about two seconds, instead of a history the model has to reread. The limits are plain. It needs an 80 GB card, the first version is slow, and the authors admit that the best text-based memory systems still recall long, detailed histories better. So it is worth a pilot to measure recall on your own long histories, and not yet a bet for a product that must quote old details exactly.

Both sessions start empty. The only difference is the 41.9 MB file on the left.
Past turns fold into a fixed-size memory you can save, instead of a growing history
Think of a tape and a notebook. Most chat models work from a tape. Every message stays, and the model rereads the whole tape before each answer. The tape grows every turn, and so does the scratch space it fills on the graphics card. When the session ends, the scratch space is thrown away and the tape goes back to a database.
MemT-1.0-Nano has a notebook. When you tell it to remember a turn, it folds what was said into a set of numbers of fixed size, then drops the text. The notebook never gets thicker. You can save it as a file, close everything, and hand it back tomorrow. The price of a fixed size is detail: the notebook keeps what you flagged, not every word.
The model is MemTensor's work, built on Qwen3.6-35B-A3B from the Qwen team. The weights are Apache-2.0, so you can use them commercially.
The test: one 80 GB card, made-up facts, a save, a close and a reload
This is a behavior check, not a benchmark. We used the published weights as they are, unshrunk, on one A100 with 80 GB. The model ran on the authors' own code, behind a test copy of InferenceKey built from its latest source.
We invented a customer, Dana, who runs a bakery. In two turns she told the model her bakery's name and city, her oven, her flour supplier's account code, a sesame allergy and the day her daughter starts school. We saved the memory, closed the session, opened a new one from the file and asked four questions. Then we did a harder version. One long note of 1,467 tokens (tokens are word pieces) held forty sentences of bakery routine with five facts buried inside, followed by five questions. In all, nine recall questions, plus one asked of a session without the file, one user at a time.
Results: 9 of 9 facts back from the file, and a blank session that knew nothing
Every question about the facts came back right after the reload. The control was a new session without the file, asked for the supplier code. It said it had no access to her records and could not tell her.
| Question, after the reload | Answer | Seconds |
|---|---|---|
| My bakery and city? | "Forno Azul, and it is located in Porto." | 2.05 |
| My supplier's account code? | "BX-4471." | 1.80 |
| A bread for the weekend, given my allergy? | A Portuguese sourdough, "naturally free of sesame" | 6.72 |
| When does my daughter start school? | "Your daughter, Ines, starts school on September 9." | 1.83 |
| Supplier code, new session without the file | "I do not have access to your personal business records" | 14.26 |
Time on the card for each answer. Longer answers took longer: the bread answer, and the control's 169-token refusal.
The control only shows that the file carries information.
The long note went the same way. All five buried facts came back, each short answer in 1.55 to 2.45 seconds. Folding the note into memory took 4 seconds.
The file stayed exactly 41,944,024 bytes, after Dana's two lines and after the long note. Saving it took about a second (0.66 to 1.02 s). Loading it into a fresh session took between 1.35 and 1.99 seconds on the card.
One behavior matters if you build on it. Only the turns you mark as "remember" go into the notebook. Ordinary questions stay in the session as plain text, as with any chat model. So the app decides what gets committed to memory, not the model.
Text is always smaller on disk, and the file pays off only on long histories
A short support chat gains nothing. An assistant that knows one person over months could.
Stored as text, a conversation is always smaller than this file. Dana's history was 107 tokens, a few hundred bytes. So the file does not save disk.
What it can save is the rereading. A model working from the tape rebuilds the scratch space from the whole history before it answers, and holds it on the card while the session is live. That scratch space grows with every token. By our arithmetic, the file only gets smaller than it past about 2,000 tokens of history, a bit more than our long note. At 128K tokens, the file is about 64 times smaller.
Speed breaks even much later. End to end, the paper found Nano slower on short histories, about even at 32,000 tokens (over twenty times our long note) and about 1.86 times faster at 128K. We measured neither. The size figures are our arithmetic, the speed figures are the paper's.
Where it falls short: the strongest text-memory systems are far ahead on long, detailed histories
The authors say the strongest systems that keep the conversation as text and look up the right passage still win, by a wide margin. Across 11 memory benchmarks in their paper, Flash, Nano's bigger sibling, ranks first and Nano second among models that keep memory as numbers inside the model. The best text-memory systems, and simply keeping the whole conversation, score about 1.4 to 1.5 times Nano's 47.0.
The gap is widest where a detail from far back matters. On a test of long chat histories, Nano scores 32.6 against 76.8 for keeping the full conversation. The card puts it in one line: "Strong textual-memory systems remain ahead overall, particularly on long histories that require detailed evidence retrieval."
That is the notebook again. It holds the gist and the facts you flagged, in a fixed space. If your product has to quote an exact clause from a contract signed six months ago, keep a text store. Our nine questions were short facts the model had just been told. They prove the save and reload works. They do not prove recall over a long life, and nobody in our test wrote many memories over time to see whether new facts push out old ones.
On six general tests it scores about the same as the Qwen model it is built on (0.9 points lower on average), with one coding test 5.8 points lower.
Which GPU: one 80 GB card worked, and the 8-bit shortcut failed
The smallest card that worked is the one we used: an 80 GB A100, model unshrunk, everything on the card. At peak it used about 66.5 GiB of the card's memory. We found nothing smaller that worked.
We tried to squeeze it. First we capped the A100 to what a 48 GB card can really use, and loaded the model compressed to 8 bits. It ran out of memory while loading, because it first asked for about 64 GiB. Then we ran the same 8-bit model on the real 80 GB card without the cap, to see why. It took about as much memory, and the first "remember" crashed with an internal error. Most of the weights are stored in a shape the 8-bit tool skips, so compression saved only about 2 GiB.
That 48 GB test was a cap on the A100, not a real 48 GB card, and we did not try other ways to shrink the model. MemTensor publishes no compressed version. Plan on an 80 GB card.
On InferenceKey: a memory file behind an OpenAI-style endpoint, ready in 20 seconds
One copy of the model on a rented card keeps named sessions, each with its memory file on disk, behind a standard chat API with one extra field. Our worker, a program on your GPU machine, loads the model once and keeps those sessions alive. Only the authors' Python code runs its memory, so we wrapped it in a small file. The extra field says remember, ask, save, close or load.
The first start downloaded 70.3 GB of weights in about four minutes. Once they were on disk, a restart was ready in 20 seconds, 14.8 of them loading the model onto the card. A 128-token reply to a "remember" turn took about 13 seconds, which is slow. We did not install the faster optional components or tune it.
One problem you will probably hit, and its status:
- Loading from the Hugging Face download folder fails. Loading the model from the folder where Hugging Face keeps its downloads stops with a "file not found" error. Status: fixed in the SDK example by loading by the model's name and a pinned version.
The Hugging Face code we ran is Apache-2.0, and it is the slow path. In our backend, requests run one after another, and we did not test concurrency. The authors' two-GPU SGLang server is licensed for noncommercial use only, and we did not test it.
Should you use it? Worth a pilot on your own long histories, not yet a production bet
- If you build an assistant that follows one person over weeks, run a pilot and measure recall on your own long histories. The memory is a file you can store, back up, move and delete per person.
- If your conversations are short, skip it.
- If you need exact details from long histories, keep a text-based memory. The authors' own numbers put the strongest ones far ahead there.
- If your largest card has 48 GB, we found no way to run it there: no compressed version exists and our 8-bit attempt failed.
- If you need speed, the stock code is slow today.
To save and reload a memory file on your own NVIDIA machine, clone the SDK example. Fill in its .env, including INFERENCEKEY_TENANT_ID and INFERENCEKEY_USER_TOKEN so publish.py can upload the backend. Then build the Python binding and run python publish.py and python main.py. It needs an 80 GB card, about 90 GB of local disk and a driver for CUDA 13 (580 or newer).
For engineers
Model and files
MemTensor/MemT-1.0-Nano, sha30fe0b22422c4cc4c87475f98db5c8baa5c1a902, created 2026-10-15, last modified 2026-10-20T05:49:52Z, not gated, Apache-2.0. 26 safetensors shards plusmemt_block.safetensors,configuration_memt.py,modeling_memt.pyandtech_report.pdf. 70.3 GB downloaded. 18,765 downloads and 123 likes on 2026-10-26.- Card: 36B total, 3B active, 451M trainable memory parameters, 10M dynamic memory state.
library: transformers, tagcustom_code. config.json:model_typememt_qwen3_5_moe,MemTQwen3_5MoeForCausalLM. Backboneqwen3_5_moe: 40 layers withfull_attention_interval4 (10 full attention, 30 linear attention, GatedDeltaNet), hidden 2048, 256 experts with 8 per token, 16 attention heads, 2 KV heads, head_dim 256, vocab 248,320,max_position_embeddings262,144. memt block:gdn_versionstable_gdn2,memory_update_modetoken,num_memory_heads16,chunk_tokens2048.- Release: paper on 19 October 2026, weights and code by 20 October.
- Sibling
MemTensor/MemT-1.0-Flash: DeepSeek-V4-Flash backbone, 288B total, 17B active, 3.61B trainable memory parameters, 336M dynamic memory state, HF license tagmit. - Licensing: weights Apache-2.0 (HF card). All original code in
MemTensor/MemT-1.0on GitHub, includingmemt-sglang, is PolyForm Noncommercial 1.0.0 ("Commercial use of the repository software is not permitted"). The paper is CC BY-NC-SA 4.0.
Session API (modeling_memt.py at the pinned sha)
chat(query, *, memory=None, enable_memory=False, enable_thinking=None, return_dict=False). Withenable_memory=Truethe turn's plaintext history is committed into the memory state and dropped. Other turns stay as plaintext history in the session.save_state(path, *, overwrite=False)refuses to overwrite an existing file by default, flushes plaintext turns, and writes FP32 tensors as safetensors with metadata formatmemt-memory-v1plus an identity hash (config, chat template, vocab).- Sessions are guarded by a
threading.RLock. - The state is a dict of 10 FP32 tensors
[1, 16, 256, 256], one per full-attention layer: 10 x 16 x 256 x 256 x 4 B = 41,943,040 B. Measured file: 41,944,024 B, so about 984 B of header and metadata.
Condensed from the card's Quick Start (Python 3.11+, PyTorch 2.11.0 built for CUDA 13, pip install transformers==5.12.1 accelerate==1.15.0 safetensors==0.8.0):
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
repo = "MemTensor/MemT-1.0-Nano"
tokenizer = AutoTokenizer.from_pretrained(repo, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
repo,
trust_remote_code=True,
dtype=torch.bfloat16,
device_map="auto",
attn_implementation="sdpa",
)
session = model.create_session(tokenizer)
session.chat("<facts to remember>", enable_memory=True, enable_thinking=False)
session.save_state("memmy_memory.safetensors")
session.close()
restored = model.create_session(tokenizer, state="memmy_memory.safetensors")
print(len(restored.messages)) # 0
Storage arithmetic (ours, not measured)
Plain KV cache of this backbone: 10 full-attention layers x 2 KV heads x 256 x 2 (K and V) x 2 B (bf16) = 20,480 B per token. The 41.9 MB state equals the KV of about 2,048 tokens. At 131,072 tokens the KV is 2.68 GB, 64x the state (the card and paper say about 66x, as a logical per-trajectory size that excludes shared weights). Below about 2,000 tokens of history the file is larger than the KV it replaces. The linear-attention (GatedDeltaNet) states exist in both cases and are not counted. The paper also notes that DenseRAG storage is cheaper than Nano's fixed state at short histories and only overtakes it as records accumulate.
Our setup
- One NVIDIA A100-SXM4-80GB on our cloud, driver 595.91.07, CUDA 13.2, 170 GB container disk (two other A100 configurations had no stock at the time). Weights on the container disk, never a network volume.
- A local InferenceKey manager built from
main, connected to the worker over tunnels. Production was never touched. - Custom Python backend
memt-1-0-nano0.1.1: Transformers 5.12.1 withtrust_remote_code, PyTorch 2.11 (CUDA 13).setup()downloads the pinned revision withsnapshot_download, then loads by repo id plus revision withdtype=torch.bfloat16,device_map={"": 0}(whole model on GPU 0, no silent CPU spill) andattn_implementation="sdpa". Greedy decoding (do_sample=False),max_new_tokens256 by default. task_typetext2text,process()only. Operations travel inextra_body.memt = {"op": "remember" | "ask" | "save" | "close" | "load" | "status", "session": ..., "text" | "name": ...}on/v1/chat/completions. Plain chat text also works (remember: ...,save: <name>,forget,load: <name>, anything else is an ask). Each answer returns JSON with the reply, token counts, seconds, tokens/s,memory_updated,plaintext_messages_kept, file size and sha256, and VRAM.
Deploy step by step
From the SDK example (commit ef656124 on main):
git clone https://github.com/inferencekey/inferencekey-sdk
cd inferencekey-sdk/examples/memt-nano-memory-state-custom-backend-private-nvidia
cp .env.example .env # INFERENCEKEY_SDK_TOKEN, INFERENCEKEY_API_KEY,
# INFERENCEKEY_PROJECT, IK_WORKER_ID, and for the
# upload INFERENCEKEY_TENANT_ID, INFERENCEKEY_USER_TOKEN
python -m venv .venv && . .venv/bin/activate
pip install maturin requests
( cd ../../bindings/python && maturin develop --release )
python publish.py # once: packages backend.py; uploads only if TENANT_ID and USER_TOKEN are set
python main.py # deploy, remember x2, save, close, load, ask x4, control ask
- Needs an NVIDIA driver for CUDA 13 (580+), an 80 GB card, about 90 GB of local disk, Python 3.11 to 3.13 on the worker.
- Optional env:
MEMT_MAX_NEW_TOKENS(default 256),IK_KEEP_ALIVE=1to keep the workload after the run,MEMT_LOAD_IN_8BIT=1(bitsandbytes; see the ladder, it fails),MEMT_GPU_CAP_GIB(torch.cuda.set_per_process_memory_fraction, to emulate a smaller card),MEMT_REVISION. main.pywrites every request, answer, token count and timing tooutputs/memory-test.json.
The 65-second demo: remember, save, close, load and ask, from a terminal client against the worker.
Time to ready
| Phase | Time |
|---|---|
| Backend venv | about 23 s |
| Weights download (37 files, 70.3 GB, unauthenticated, about 300 MB/s) | 235.5 s |
| First load (backend 0.1.0) | failed, see problem 1 |
Warm start, ensure() to ready | 20.3 s (model load 14.8 s), 20.0 s on the second run |
| Warm start, 8-bit | 29.8 s (model load 24.3 s) |
Measurements
Memory test, run 2 (bf16; seconds are GPU time in the backend, the round trip adds 0.3 to 1.1 s):
| Step | Input tokens | Output tokens | Seconds | Result |
|---|---|---|---|---|
| remember 1: name, Forno Azul in Porto, Rational iCombi Pro oven, supplier code BX-4471 | 64 | 128 | 12.72 | reply, plaintext kept 0 |
| remember 2: sesame allergy, daughter Ines starts school 9 September | 43 | 53 | 5.68 | "Noted! ...", plaintext kept 0 |
save dana | 1.02 | 41,944,024 B | ||
| close | session gone | |||
load dana into a new session | 1.99 | 0 plaintext messages | ||
| ask: bakery and city | 27 | 19 | 2.05 | right |
| ask: supplier code | 68 | 16 | 1.80 | right |
| ask: weekend bread given the allergy | 113 | 71 | 6.72 | right (sesame-free Portuguese sourdough) |
| ask: daughter's name and school date | 210 | 16 | 1.83 | right |
| control: new session, no file, supplier code | 21 | 169 | 14.26 | refuses, does not know |
Input tokens grow from 27 to 210 in the restored session because ask turns stay as plaintext history. main.py's first keyword check scored the school date as a miss because it wanted "9 september"; by reading it is right, and the committed check is looser.
Long-input test (bf16, MEMT_MAX_NEW_TOKENS=96): one remember of 1,467 input tokens, reply "Noted.", 4.02 s, plaintext kept 0. Save 0.66 s, 41,944,024 B. Load 1.35 s. Five of five recalled: fridge code 5832 (1.55 s), landlord Rui Matos with rent on the 3rd (2.01 s), policy PT-77-0912 (1.76 s), Silva cake on 14 November, three-tier lemon (2.45 s), backup technician Marta with a phone ending in 4410 (2.21 s).
Demo client: remember 58 tokens, "Noted." in 1.4 s; save 0.68 s; load 1.41 s; "BX-4471" in 2.0 s (21-token prompt); "Forno Azul bakery in Porto" in 1.7 s (58-token prompt).
Speed: about 9 to 10 tokens/s decode (128 tokens in 12.72 s) with PyTorch reference GatedDeltaNet kernels (flash-linear-attention and causal-conv1d not installed) and HF generate. Not tuned.
GPU memory, bf16: 65.4 GiB allocated after load, 65.45 to 65.55 GiB peak allocated during requests, 67,605 MiB on the card idle after load, 68,117 MiB card peak (nvidia-smi, 1 s samples). The narrative gives these as GiB (66.5 GiB peak; the 8-bit load asked for 63.67 GiB).

VRAM ladder
| GPU or cap | Config | Peak VRAM | Time per output | Output OK? | Real or emulated |
|---|---|---|---|---|---|
| A100-SXM4 80 GB | bf16, Transformers 5.12.1, sdpa, whole model on GPU 0 | 68,117 MiB card (65.5 GiB allocated) | ask 1.6 to 2.5 s, about 9 to 10 tokens/s | yes, 9/9 recall | real |
| 48 GB (44 GiB torch cap on the A100) | bitsandbytes 8-bit | failed at load | no: torch.OutOfMemoryError: CUDA out of memory. Tried to allocate 63.67 GiB ... 44.00 GiB allowed | emulated | |
| A100 80 GB, no cap (diagnostic) | bitsandbytes 8-bit | 67,695 MiB card (63.67 GiB allocated) | no: first remember fails with expected mat1 and mat2 to have the same dtype, but got: c10::BFloat16 != signed char | real |
Why 8-bit barely shrinks: the 256 fused experts per layer are 3D parameters, not nn.Linear, so bitsandbytes leaves them in bf16 (about 2 GiB saved). Not tried: a real 48 GB card, H100, CPU offload, fp8, community quantizations (none from MemTensor at test time). Smallest that passed: one 80 GB A100 in bf16.
The authors' SGLang path (not tested)
memt-sglang(import memt_sglang) inMemTensor/MemT-1.0: native session memory on SGLang 0.5.16. Pins PyTorch 2.11.0, Transformers 5.12.1,flashinfer-python[cu13]0.6.14,sglang-kernel0.4.5. PolyForm Noncommercial 1.0.0.inference/start_memt_nano.sh:CUDA_VISIBLE_DEVICES=0,1,--tp-size 2 --ep 1 --dp-size 1,--max-prefill-tokens 16384,--max-sessions-per-rank 6,--max-inflight-commits-per-rank 2,--min-kv-tokens 2048,--max-total-tokens 65536,--max-running-requests 8,--mem-fraction-static 0.60,--dtype bfloat16, triton attention, linear-attention and MoE backends, snapshots in./memt-state, port 30000. The guide says these settings have "not been deeply optimized".- Constraints: single-node eager execution, unquantized BF16 safetensors only; chunked prefill, radix cache, overlap scheduling and CUDA graphs must stay disabled; the launcher rejects
trust_remote_code. - Snapshots are server-side
.safetensorsunder--state-directory. Routes:GET /memt/identity,GET /memt/capabilities,POST /memt/control,POST /generatewith a MemT RID. Leases (TTL 1 to 3600 s, default 300), transactions and epochs; a server restart needs a new session plus a snapshot import. HF snapshots and server exports are interchangeable for the same model and tokenizer. - Whether it fits Nano on one 80 GB card, and its throughput, are not documented and were not tested.
- We found no vLLM support for MemT. The
memt-sglanglauncher is the authors' own integration, not stock SGLang.
Paper figures (not reproduced)
arXiv 2610.26825, "MemT-1.0: Towards Memory-Native Evolution", MemTensor Team, v1 19 October 2026, v2 20 October. 34B training tokens, continued pre-training plus post-training, Gated DeltaNet-2 with a stable token-level memory update, Mixture-of-Storage.
- Table 2, 11 memory benchmarks, average: MemT-1.0-Flash 50.6, MemT-1.0-Nano 47.0, Temp-LoRA 38.1 (best other parametric method). Textual memory on the Qwen3.6-35B-A3B backbone: MemOS 68.5, Full Context 66.3, Mem0 66.0, OpenViking 65.4, DenseRAG 56.5, Graphiti 45.7. Nano on LongMemEval-S 32.6 against Full Context 76.8 and MemOS 80.8; on BEAM-1M 35.8 against MemOS 71.3.
- Table 3, general capabilities in the noise setting, delta against Qwen3.6-35B-A3B: MMLU-Pro -1.6, GPQA Diamond -1.5, IFEval +3.3, LongBench v2 -2.0, BigCodeBench-Hard +2.0, LiveCodeBench v6 -5.8, average -0.9.
- Section 6.5, HF inference on two GPUs, concurrency 1, BEAM histories: slower than full context at short histories, about equal at 32K, end-to-end speedups of about 1.20x at 64K, 1.86x at 128K and 3.99x at 256K. Query TTFT (time to the first word of the answer) about 104 to 112 ms against about 257 ms (128K) and 445 ms (256K) for full context.
- Sections 4.3 and 6.6: per-trajectory state about 33x smaller than full context at 64K and 66x at 128K.
Remaining problems and status
- Loading from the HF cache snapshot path fails with
trust_remote_code.from_pretrained(<snapshot dir>)raisesFileNotFoundError: ... models--MemTensor--MemT-1.0-Nano/blobs/configuration_memt.py, because Transformers follows themodeling_memt.pysymlink intoblobs/and resolves the relative import there. Status: fixed in backend 0.1.1 by loading by repo id plus revision. - 8-bit does not fit a smaller card (ladder above). Status: no workaround; needs an official quantization or expert-aware quantization.
- Changing
config.envon a running custom-backend workload does nothing. The manager sendsreload_backendand the worker logsreload_backend handle_load_model failed: unknown backend memt-1-0-nano; the old backend keeps serving. Workaround: delete the workload and runmain.pyagain. Status: open. - Manual GPU machine creation ignores the disk setting. The handler hard-codes
DEFAULT_POD_DISK_GB = 100and no longer readsRUNPOD_CONTAINER_DISK_GB. 70.3 GB of weights plus a torch venv is tight on 100 GB. Status: patched locally for this test only, open. - The dashboard chat tester cannot drive a
process()-only backend (it streams). The demo used a terminal client. Status: known, open. - The state file cannot travel through the API (41.9 MB against an 8 MB result limit). Status: by design for now; it stays on the worker disk and the API returns size and sha256.
- The tunnels between our test manager and the worker dropped once; a supervisor loop reconnected them without restarting the worker.
Limits
Nine recall questions plus one control on our own made-up facts (two more in the demo client), greedy decoding, requests one at a time. The HF session uses a per-session lock and the backend serializes requests, so multi-user throughput is unknown. One card type. No benchmark from the paper was reproduced, and our 64x is arithmetic, not a measurement. We did not measure reread time or per-session card memory against a full-context baseline. The hosted InferenceKey endpoint is untested: this ran on a local test manager.
Credits
MemTensor built MemT-1.0, trained the memory block, wrote the session API, the SGLang integration and the paper, and released the Nano weights under Apache-2.0. The Qwen team made Qwen3.6-35B-A3B, Nano's backbone. Hugging Face Transformers runs the authors' custom code. We spotted the model in the AI Search news video of 25 October, and r/LocalLLaMA had a thread on it on 22 October. Our part: the custom backend, the deployment on InferenceKey, the load fix, the memory tests and the measurements.
