Angshul commited on
Commit
795547d
·
verified ·
1 Parent(s): b6c226b

Release complete SpliNet Embedder

Browse files
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ splinet_embedder.ts filter=lfs diff=lfs merge=lfs -text
MANIFEST.json ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "README.md": {
3
+ "size_bytes": 1886,
4
+ "sha256": "467819dc02f633b6f433c85c72c185731ede2d646b2d016fb1e401b1df803643"
5
+ },
6
+ "api.py": {
7
+ "size_bytes": 3460,
8
+ "sha256": "c91422223e045a612ff8b84321430dbd5ee956545df71479ba96822044fd50c2"
9
+ },
10
+ "evaluation/FINAL_EVALUATION_SUMMARY.json": {
11
+ "size_bytes": 756,
12
+ "sha256": "4d3547d01b74bf724d7983f3beaa207fbee977cb41d373d33ae07133cf4fe74d"
13
+ },
14
+ "evaluation/STSBenchmark.json": {
15
+ "size_bytes": 85,
16
+ "sha256": "eee9ba254e1f81a6c0ecce23663eb9d675c91976e1557fa7a8006367b33751e1"
17
+ },
18
+ "evaluation/SciFact.json": {
19
+ "size_bytes": 220,
20
+ "sha256": "ba66fde9c4a72ebfd50d5306bb334708c788f562f11790027e9e2e65cb6be2be"
21
+ },
22
+ "evaluation/TwentyNewsgroupsClustering.json": {
23
+ "size_bytes": 2581,
24
+ "sha256": "bd71ae025dbf831dcb03ea42429d527822968e134735187c9910f9ab80e2c91f"
25
+ },
26
+ "evaluation/inference_vram_autotune.json": {
27
+ "size_bytes": 3081,
28
+ "sha256": "bb6dd07068b2fff8370c406140802d091328577d845baf7adac2e995e1f67dd6"
29
+ },
30
+ "model_info.json": {
31
+ "size_bytes": 1336,
32
+ "sha256": "9a7d6ec81e4c52246801790973abd4b626c8df1787e65019551768002edaf73f"
33
+ },
34
+ "requirements.txt": {
35
+ "size_bytes": 115,
36
+ "sha256": "bdaa62a067a12591d656fc74e410ee9552f53c8cf9b4941a0b92200e3dc83bd2"
37
+ },
38
+ "spiece.model": {
39
+ "size_bytes": 806898,
40
+ "sha256": "119ec6b2af9cbbc56f297bd606b69f79f6e3130a34ee56122ee813a58d15bb9d"
41
+ },
42
+ "splinet_embedder.ts": {
43
+ "size_bytes": 329392397,
44
+ "sha256": "7800d07a6bf69a0fa06ae72cfc553aea4ef263634ec5eb462008927110ea7aea"
45
+ },
46
+ "splinet_embedder_full_qqp.pt": {
47
+ "size_bytes": 329128162,
48
+ "sha256": "ae6a2f15ac997d3ca165de09fee89789c181dc2f62ccc6ef2820c6db5f475b05"
49
+ },
50
+ "training/TRAINING_COMPLETE.json": {
51
+ "size_bytes": 381,
52
+ "sha256": "6186b759a19b1ad12082e6c61b19884728eb2e5909366ff4a76761b39287cf9f"
53
+ },
54
+ "training/embedder_config.json": {
55
+ "size_bytes": 218,
56
+ "sha256": "3eaa07d108097256de4e5f929c32d4b4444479a2ddeb55dbc907ca021049264c"
57
+ },
58
+ "training/vram_autotune.json": {
59
+ "size_bytes": 2696,
60
+ "sha256": "1df1f89009031834701cfbd8ed7ef9735f68cbc589456a357db9073245af18d6"
61
+ }
62
+ }
README.md ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: agpl-3.0
3
+ pipeline_tag: feature-extraction
4
+ language:
5
+ - en
6
+ tags:
7
+ - sentence-embeddings
8
+ - sentence-similarity
9
+ - splinet
10
+ - torchscript
11
+ ---
12
+
13
+ # SpliNet Embedder
14
+
15
+ Sentence-embedding version of SpliNet.
16
+
17
+ The complete encoder was fine-tuned end-to-end on **134,378 positive QQP duplicate pairs** using symmetric contrastive learning.
18
+
19
+ ## Model
20
+
21
+ | Property | Value |
22
+ |---|---:|
23
+ | Encoder parameters | **82,270,464** |
24
+ | Embedding dimension | **768** |
25
+ | Maximum input length | **512 tokens** |
26
+ | Pooling | Masked mean |
27
+ | Output | L2-normalized |
28
+ | Fine-tuning pairs | **134,378** |
29
+ | Epochs | **1** |
30
+ | Optimization steps | **8,958** |
31
+
32
+ ## Full evaluation
33
+
34
+ | Benchmark | Metric | Score |
35
+ |---|---|---:|
36
+ | STSBenchmark | Pearson | **0.5257** |
37
+ | STSBenchmark | Spearman | **0.5174** |
38
+ | SciFact | nDCG@10 | **0.1928** |
39
+ | SciFact | MAP@10 | **0.1686** |
40
+ | SciFact | MRR@10 | **0.1766** |
41
+ | SciFact | Recall@10 | **0.2614** |
42
+ | SciFact | Recall@100 | **0.4413** |
43
+ | Twenty Newsgroups | Mean V-measure | **0.1532** |
44
+ | Twenty Newsgroups | Mean homogeneity | **0.1510** |
45
+ | Twenty Newsgroups | Mean completeness | **0.1555** |
46
+
47
+ Twenty Newsgroups evaluation used **59,545 texts** across all ten subsets.
48
+
49
+ ## Files
50
+
51
+ - `splinet_embedder.ts` — complete deployable TorchScript encoder
52
+ - `splinet_embedder_full_qqp.pt` — original trained checkpoint
53
+ - `spiece.model` — tokenizer
54
+ - `api.py` — Python/FastAPI interface
55
+ - `model_info.json` — metadata
56
+ - `evaluation/` — benchmark results
57
+ - `training/` — final training metadata
58
+
59
+ ## Usage
60
+
61
+ Install `requirements.txt`, then:
62
+
63
+ from api import encode, similarity
64
+ z = encode(['first sentence', 'second sentence'])
65
+ print(z.shape)
66
+
67
+ To serve:
68
+
69
+ python api.py
70
+
71
+ Endpoints: `/health`, `/model-info`, `/embed`, `/similarity`.
72
+
73
+ Base model: https://huggingface.co/Angshul/SpliNet
74
+
75
+ Source: https://github.com/AngshulMajumdar/SpliNet
api.py ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from pathlib import Path
2
+ import os
3
+ import json
4
+ import unicodedata
5
+ import numpy as np
6
+ import sentencepiece as spm
7
+ import torch
8
+ from fastapi import FastAPI, HTTPException
9
+ from pydantic import BaseModel
10
+
11
+ ROOT = Path(__file__).resolve().parent
12
+ DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
13
+ MODEL = torch.jit.load(str(ROOT / "splinet_embedder.ts"), map_location=DEVICE).eval()
14
+ SP = spm.SentencePieceProcessor(model_file=str(ROOT / "spiece.model"))
15
+
16
+ PAD_ID = 3
17
+ CLS_ID = 4
18
+ SEP_ID = 5
19
+ MAX_LENGTH = 512
20
+ DEFAULT_BATCH = int(os.environ.get("SPLINET_BATCH_SIZE", "256" if DEVICE.type == "cuda" else "8"))
21
+
22
+ def normalize_text(text):
23
+ text = unicodedata.normalize("NFKC", text or "").lower()
24
+ return " ".join(text.split())
25
+
26
+ def tokenize(texts):
27
+ ids = torch.full((len(texts), MAX_LENGTH), PAD_ID, dtype=torch.long)
28
+ mask = torch.zeros((len(texts), MAX_LENGTH), dtype=torch.long)
29
+ for i, text in enumerate(texts):
30
+ pieces = list(SP.encode(normalize_text(text), out_type=int))[:MAX_LENGTH - 2]
31
+ seq = [CLS_ID] + pieces + [SEP_ID]
32
+ n = len(seq)
33
+ ids[i, :n] = torch.tensor(seq, dtype=torch.long)
34
+ mask[i, :n] = 1
35
+ return ids, mask
36
+
37
+ def encode(texts, batch_size=None):
38
+ if isinstance(texts, str):
39
+ texts = [texts]
40
+ if not texts:
41
+ return np.empty((0, 768), dtype=np.float32)
42
+ bs = max(1, int(batch_size or DEFAULT_BATCH))
43
+ output = []
44
+ start = 0
45
+ while start < len(texts):
46
+ current = min(bs, len(texts) - start)
47
+ try:
48
+ ids, mask = tokenize(texts[start:start + current])
49
+ ids = ids.to(DEVICE)
50
+ mask = mask.to(DEVICE)
51
+ with torch.inference_mode():
52
+ if DEVICE.type == "cuda":
53
+ with torch.autocast(device_type="cuda", dtype=torch.float16):
54
+ z = MODEL(ids, mask)
55
+ else:
56
+ z = MODEL(ids, mask)
57
+ output.append(z.float().cpu().numpy())
58
+ start += current
59
+ except torch.OutOfMemoryError:
60
+ if DEVICE.type != "cuda" or current == 1:
61
+ raise
62
+ torch.cuda.empty_cache()
63
+ bs = max(1, current // 2)
64
+ return np.concatenate(output, axis=0).astype(np.float32)
65
+
66
+ def similarity(text_a, text_b):
67
+ z = encode([text_a, text_b])
68
+ return float(np.dot(z[0], z[1]))
69
+
70
+ class EmbedRequest(BaseModel):
71
+ texts: list[str]
72
+ batch_size: int | None = None
73
+
74
+ class SimilarityRequest(BaseModel):
75
+ text_a: str
76
+ text_b: str
77
+
78
+ app = FastAPI(title="SpliNet Embedder API", version="1.0.0")
79
+
80
+ @app.get("/health")
81
+ def health():
82
+ return {"status": "ok", "device": str(DEVICE)}
83
+
84
+ @app.get("/model-info")
85
+ def model_info():
86
+ with open(ROOT / "model_info.json", "r", encoding="utf-8") as f:
87
+ return json.load(f)
88
+
89
+ @app.post("/embed")
90
+ def embed_endpoint(req: EmbedRequest):
91
+ try:
92
+ z = encode(req.texts, req.batch_size)
93
+ return {"count": len(req.texts), "dimension": 768, "embeddings": z.tolist()}
94
+ except Exception as e:
95
+ raise HTTPException(status_code=500, detail=str(e))
96
+
97
+ @app.post("/similarity")
98
+ def similarity_endpoint(req: SimilarityRequest):
99
+ try:
100
+ return {"cosine_similarity": similarity(req.text_a, req.text_b)}
101
+ except Exception as e:
102
+ raise HTTPException(status_code=500, detail=str(e))
103
+
104
+ if __name__ == "__main__":
105
+ import uvicorn
106
+ uvicorn.run(app, host="0.0.0.0", port=int(os.environ.get("PORT", "8000")))
evaluation/FINAL_EVALUATION_SUMMARY.json ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "SpliNet Sentence Embedder",
3
+ "base_model": "Angshul/SpliNet",
4
+ "embedding_dimension": 768,
5
+ "sequence_length": 512,
6
+ "inference_batch": 527,
7
+ "measured_peak_reserved_gb": 14.041015625,
8
+ "STSBenchmark": {
9
+ "pairs": 1379,
10
+ "pearson": 0.525678022791122,
11
+ "spearman": 0.5173543800911169
12
+ },
13
+ "SciFact": {
14
+ "nDCG@10": 0.19278095226166866,
15
+ "MAP@10": 0.16858928571428572,
16
+ "MRR@10": 0.17657539682539683,
17
+ "Recall@10": 0.2613888888888889,
18
+ "Recall@100": 0.44133333333333336,
19
+ "corpus_documents": 5183,
20
+ "queries": 300
21
+ },
22
+ "TwentyNewsgroups": {
23
+ "total_texts": 59545,
24
+ "mean_homogeneity": 0.15101690743103127,
25
+ "mean_completeness": 0.15554516291013415,
26
+ "mean_v_measure": 0.15324401136971566
27
+ }
28
+ }
evaluation/STSBenchmark.json ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ {
2
+ "pairs": 1379,
3
+ "pearson": 0.525678022791122,
4
+ "spearman": 0.5173543800911169
5
+ }
evaluation/SciFact.json ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "nDCG@10": 0.19278095226166866,
3
+ "MAP@10": 0.16858928571428572,
4
+ "MRR@10": 0.17657539682539683,
5
+ "Recall@10": 0.2613888888888889,
6
+ "Recall@100": 0.44133333333333336,
7
+ "corpus_documents": 5183,
8
+ "queries": 300
9
+ }
evaluation/TwentyNewsgroupsClustering.json ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "num_subsets": 10,
3
+ "total_texts": 59545,
4
+ "mean_homogeneity": 0.15101690743103127,
5
+ "mean_completeness": 0.15554516291013415,
6
+ "mean_v_measure": 0.15324401136971566,
7
+ "subsets": [
8
+ {
9
+ "subset": 0,
10
+ "num_texts": 1000,
11
+ "num_classes": 20,
12
+ "homogeneity": 0.18848367785332787,
13
+ "completeness": 0.19373099116017206,
14
+ "v_measure": 0.19107131509256678,
15
+ "inertia": 770.6087646484375
16
+ },
17
+ {
18
+ "subset": 1,
19
+ "num_texts": 2101,
20
+ "num_classes": 20,
21
+ "homogeneity": 0.16526631539460462,
22
+ "completeness": 0.1681524678928551,
23
+ "v_measure": 0.16669690003158819,
24
+ "inertia": 1623.0032958984375
25
+ },
26
+ {
27
+ "subset": 2,
28
+ "num_texts": 3202,
29
+ "num_classes": 20,
30
+ "homogeneity": 0.1594426468684236,
31
+ "completeness": 0.16370453150846842,
32
+ "v_measure": 0.1615454848726722,
33
+ "inertia": 2477.881591796875
34
+ },
35
+ {
36
+ "subset": 3,
37
+ "num_texts": 4303,
38
+ "num_classes": 20,
39
+ "homogeneity": 0.14095093771777503,
40
+ "completeness": 0.1450873980629758,
41
+ "v_measure": 0.1429892587802194,
42
+ "inertia": 3356.320068359375
43
+ },
44
+ {
45
+ "subset": 4,
46
+ "num_texts": 5404,
47
+ "num_classes": 20,
48
+ "homogeneity": 0.15037425141416783,
49
+ "completeness": 0.15393466315321286,
50
+ "v_measure": 0.15213362889000107,
51
+ "inertia": 4200.5
52
+ },
53
+ {
54
+ "subset": 5,
55
+ "num_texts": 6505,
56
+ "num_classes": 20,
57
+ "homogeneity": 0.13539065429544844,
58
+ "completeness": 0.1427104755759666,
59
+ "v_measure": 0.1389542334616076,
60
+ "inertia": 5078.7021484375
61
+ },
62
+ {
63
+ "subset": 6,
64
+ "num_texts": 7606,
65
+ "num_classes": 20,
66
+ "homogeneity": 0.13514684478067546,
67
+ "completeness": 0.1389571821370939,
68
+ "v_measure": 0.13702552958899597,
69
+ "inertia": 5929.64111328125
70
+ },
71
+ {
72
+ "subset": 7,
73
+ "num_texts": 8707,
74
+ "num_classes": 20,
75
+ "homogeneity": 0.15154795648155694,
76
+ "completeness": 0.15817573965897352,
77
+ "v_measure": 0.15479093404206168,
78
+ "inertia": 6761.9462890625
79
+ },
80
+ {
81
+ "subset": 8,
82
+ "num_texts": 9808,
83
+ "num_classes": 20,
84
+ "homogeneity": 0.14624533873516948,
85
+ "completeness": 0.1495133374423665,
86
+ "v_measure": 0.1478612831399018,
87
+ "inertia": 7655.23095703125
88
+ },
89
+ {
90
+ "subset": 9,
91
+ "num_texts": 10909,
92
+ "num_classes": 20,
93
+ "homogeneity": 0.13732045076916352,
94
+ "completeness": 0.1414848425092566,
95
+ "v_measure": 0.139371545797542,
96
+ "inertia": 8504.7734375
97
+ }
98
+ ]
99
+ }
evaluation/inference_vram_autotune.json ADDED
@@ -0,0 +1,127 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "gpu": "Tesla T4",
3
+ "total_vram_gb": 14.56317138671875,
4
+ "target_vram_gb": 13.5,
5
+ "hard_ceiling_fraction": 0.965,
6
+ "hard_ceiling_gb": 14.053460388183593,
7
+ "selected_inference_batch": 527,
8
+ "selected_peak_reserved_gb": 14.041015625,
9
+ "selected_peak_allocated_gb": 12.066949844360352,
10
+ "measurements": [
11
+ {
12
+ "batch_size": 64,
13
+ "success": true,
14
+ "peak_allocated_gb": 2.224550247192383,
15
+ "peak_reserved_gb": 2.7890625,
16
+ "above_target": false,
17
+ "below_ceiling": true
18
+ },
19
+ {
20
+ "batch_size": 128,
21
+ "success": true,
22
+ "peak_allocated_gb": 3.584657669067383,
23
+ "peak_reserved_gb": 4.666015625,
24
+ "above_target": false,
25
+ "below_ceiling": true
26
+ },
27
+ {
28
+ "batch_size": 256,
29
+ "success": true,
30
+ "peak_allocated_gb": 6.304872512817383,
31
+ "peak_reserved_gb": 8.41796875,
32
+ "above_target": false,
33
+ "below_ceiling": true
34
+ },
35
+ {
36
+ "batch_size": 512,
37
+ "success": true,
38
+ "peak_allocated_gb": 11.745302200317383,
39
+ "peak_reserved_gb": 13.666015625,
40
+ "above_target": true,
41
+ "below_ceiling": true
42
+ },
43
+ {
44
+ "batch_size": 520,
45
+ "success": true,
46
+ "peak_allocated_gb": 11.916261672973633,
47
+ "peak_reserved_gb": 13.86328125,
48
+ "above_target": true,
49
+ "below_ceiling": true
50
+ },
51
+ {
52
+ "batch_size": 524,
53
+ "success": true,
54
+ "peak_allocated_gb": 12.001253128051758,
55
+ "peak_reserved_gb": 13.962890625,
56
+ "above_target": true,
57
+ "below_ceiling": true
58
+ },
59
+ {
60
+ "batch_size": 526,
61
+ "success": true,
62
+ "peak_allocated_gb": 12.04667854309082,
63
+ "peak_reserved_gb": 14.013671875,
64
+ "above_target": true,
65
+ "below_ceiling": true
66
+ },
67
+ {
68
+ "batch_size": 527,
69
+ "success": true,
70
+ "peak_allocated_gb": 12.066949844360352,
71
+ "peak_reserved_gb": 14.041015625,
72
+ "above_target": true,
73
+ "below_ceiling": true
74
+ },
75
+ {
76
+ "batch_size": 527,
77
+ "success": true,
78
+ "peak_allocated_gb": 12.066949844360352,
79
+ "peak_reserved_gb": 14.041015625,
80
+ "above_target": true,
81
+ "below_ceiling": true
82
+ },
83
+ {
84
+ "batch_size": 528,
85
+ "success": true,
86
+ "peak_allocated_gb": 12.086244583129883,
87
+ "peak_reserved_gb": 14.0625,
88
+ "above_target": true,
89
+ "below_ceiling": false
90
+ },
91
+ {
92
+ "batch_size": 544,
93
+ "success": false,
94
+ "above_target": false,
95
+ "below_ceiling": false,
96
+ "error": "CUDA OOM"
97
+ },
98
+ {
99
+ "batch_size": 576,
100
+ "success": false,
101
+ "above_target": false,
102
+ "below_ceiling": false,
103
+ "error": "CUDA OOM"
104
+ },
105
+ {
106
+ "batch_size": 640,
107
+ "success": false,
108
+ "above_target": false,
109
+ "below_ceiling": false,
110
+ "error": "CUDA OOM"
111
+ },
112
+ {
113
+ "batch_size": 768,
114
+ "success": false,
115
+ "above_target": false,
116
+ "below_ceiling": false,
117
+ "error": "CUDA OOM"
118
+ },
119
+ {
120
+ "batch_size": 1024,
121
+ "success": false,
122
+ "above_target": false,
123
+ "below_ceiling": false,
124
+ "error": "CUDA OOM"
125
+ }
126
+ ]
127
+ }
model_info.json ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "SpliNet Embedder",
3
+ "base_model": "Angshul/SpliNet",
4
+ "encoder_parameters": 82270464,
5
+ "embedding_dimension": 768,
6
+ "maximum_sequence_length": 512,
7
+ "pooling": "masked mean",
8
+ "output_normalization": "L2",
9
+ "fine_tuning": {
10
+ "dataset": "QQP positive duplicate pairs",
11
+ "pairs": 134378,
12
+ "epochs": 1,
13
+ "steps": 8958
14
+ },
15
+ "files": {
16
+ "deployment_model": "splinet_embedder.ts",
17
+ "original_checkpoint": "splinet_embedder_full_qqp.pt",
18
+ "tokenizer": "spiece.model"
19
+ },
20
+ "evaluation": {
21
+ "model": "SpliNet Sentence Embedder",
22
+ "base_model": "Angshul/SpliNet",
23
+ "embedding_dimension": 768,
24
+ "sequence_length": 512,
25
+ "inference_batch": 527,
26
+ "measured_peak_reserved_gb": 14.041015625,
27
+ "STSBenchmark": {
28
+ "pairs": 1379,
29
+ "pearson": 0.525678022791122,
30
+ "spearman": 0.5173543800911169
31
+ },
32
+ "SciFact": {
33
+ "nDCG@10": 0.19278095226166866,
34
+ "MAP@10": 0.16858928571428572,
35
+ "MRR@10": 0.17657539682539683,
36
+ "Recall@10": 0.2613888888888889,
37
+ "Recall@100": 0.44133333333333336,
38
+ "corpus_documents": 5183,
39
+ "queries": 300
40
+ },
41
+ "TwentyNewsgroups": {
42
+ "total_texts": 59545,
43
+ "mean_homogeneity": 0.15101690743103127,
44
+ "mean_completeness": 0.15554516291013415,
45
+ "mean_v_measure": 0.15324401136971566
46
+ }
47
+ }
48
+ }
requirements.txt ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ torch>=2.6
2
+ numpy>=1.26
3
+ sentencepiece>=0.2
4
+ fastapi>=0.115
5
+ uvicorn[standard]>=0.30
6
+ pydantic>=2
7
+ huggingface_hub>=0.34
spiece.model ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:119ec6b2af9cbbc56f297bd606b69f79f6e3130a34ee56122ee813a58d15bb9d
3
+ size 806898
splinet_embedder.ts ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7800d07a6bf69a0fa06ae72cfc553aea4ef263634ec5eb462008927110ea7aea
3
+ size 329392397
splinet_embedder_full_qqp.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ae6a2f15ac997d3ca165de09fee89789c181dc2f62ccc6ef2820c6db5f475b05
3
+ size 329128162
training/TRAINING_COMPLETE.json ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "training_complete": true,
3
+ "global_step": 8958,
4
+ "epochs": 1,
5
+ "training_pairs": 134378,
6
+ "final_model": "/content/drive/MyDrive/SpliNet_Embedder/final_embedder_full_qqp/splinet_embedder_full_qqp.pt",
7
+ "log_file": "/content/drive/MyDrive/SpliNet_Embedder/training_full_qqp.jsonl",
8
+ "checkpoint_directory": "/content/drive/MyDrive/SpliNet_Embedder/checkpoints_full_qqp"
9
+ }
training/embedder_config.json ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "base_model": "Angshul/SpliNet",
3
+ "base_parameters": 82894592,
4
+ "embedding_dimension": 768,
5
+ "pooling": "masked_mean",
6
+ "normalization": "L2",
7
+ "required_sequence_length": 512,
8
+ "training_precision": "fp16"
9
+ }
training/vram_autotune.json ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "gpu": "Tesla T4",
3
+ "total_vram_gb": 14.56317138671875,
4
+ "safety_fraction": 0.92,
5
+ "safe_vram_ceiling_gb": 13.39811767578125,
6
+ "sequence_length": 512,
7
+ "precision": "fp16",
8
+ "optimizer": "AdamW",
9
+ "full_encoder_finetuning": true,
10
+ "temperature": 0.05,
11
+ "optimal_micro_batch_pairs": 15,
12
+ "sentences_per_micro_batch": 30,
13
+ "measurements": [
14
+ {
15
+ "pair_batch_size": 1,
16
+ "sentence_batch_size": 2,
17
+ "success": true,
18
+ "within_safety_margin": true,
19
+ "loss": 0.0,
20
+ "peak_allocated_gb": 1.8602900505065918,
21
+ "peak_reserved_gb": 2.072265625,
22
+ "vram_fraction": 0.14229494180710217
23
+ },
24
+ {
25
+ "pair_batch_size": 2,
26
+ "sentence_batch_size": 4,
27
+ "success": true,
28
+ "within_safety_margin": true,
29
+ "loss": 0.342132568359375,
30
+ "peak_allocated_gb": 2.849968910217285,
31
+ "peak_reserved_gb": 3.099609375,
32
+ "vram_fraction": 0.21283889976236678
33
+ },
34
+ {
35
+ "pair_batch_size": 4,
36
+ "sentence_batch_size": 8,
37
+ "success": true,
38
+ "within_safety_margin": true,
39
+ "loss": 0.7950439453125,
40
+ "peak_allocated_gb": 4.306286811828613,
41
+ "peak_reserved_gb": 4.677734375,
42
+ "vram_fraction": 0.32120300247691774
43
+ },
44
+ {
45
+ "pair_batch_size": 8,
46
+ "sentence_batch_size": 16,
47
+ "success": true,
48
+ "within_safety_margin": true,
49
+ "loss": 1.4732666015625,
50
+ "peak_allocated_gb": 7.2357072830200195,
51
+ "peak_reserved_gb": 7.658203125,
52
+ "vram_fraction": 0.5258609489402899
53
+ },
54
+ {
55
+ "pair_batch_size": 12,
56
+ "sentence_batch_size": 24,
57
+ "success": true,
58
+ "within_safety_margin": true,
59
+ "loss": 1.0550334453582764,
60
+ "peak_allocated_gb": 10.169827461242676,
61
+ "peak_reserved_gb": 10.623046875,
62
+ "vram_fraction": 0.7294459834955973
63
+ },
64
+ {
65
+ "pair_batch_size": 14,
66
+ "sentence_batch_size": 28,
67
+ "success": true,
68
+ "within_safety_margin": true,
69
+ "loss": 0.9702497720718384,
70
+ "peak_allocated_gb": 11.684922218322754,
71
+ "peak_reserved_gb": 12.13671875,
72
+ "vram_fraction": 0.8333843245893807
73
+ },
74
+ {
75
+ "pair_batch_size": 15,
76
+ "sentence_batch_size": 30,
77
+ "success": true,
78
+ "within_safety_margin": true,
79
+ "loss": 0.7030029296875,
80
+ "peak_allocated_gb": 12.402628898620605,
81
+ "peak_reserved_gb": 12.9140625,
82
+ "vram_fraction": 0.8867616920156075
83
+ },
84
+ {
85
+ "pair_batch_size": 16,
86
+ "sentence_batch_size": 32,
87
+ "success": true,
88
+ "within_safety_margin": false,
89
+ "loss": 1.680816650390625,
90
+ "peak_allocated_gb": 13.109440803527832,
91
+ "peak_reserved_gb": 13.408203125,
92
+ "vram_fraction": 0.9206925311081587
93
+ }
94
+ ]
95
+ }