FilBona's picture
EmbeddingGemma 2 (text) in Core ML, 8-bit, fixed 512 tokens, for the Apple Neural Engine
cecc10e verified
Raw History Blame Contribute Delete
1.28 kB
import sys, time, numpy as np, coremltools as ct
from transformers import AutoTokenizer
path = sys.argv[1]
tok = AutoTokenizer.from_pretrained("google/embeddinggemma-2")
texts = ["task: search result | query: quando finisce la posizione dei QA?",
"title: none | text: Marco: allora il contratto del tester scade il primo gennaio 2027, poi vediamo.",
"title: none | text: Giulia porta il vino alla cena di domenica, Maria Grazia il dolce.",
"task: search result | query: chi porta il dolce?"]
ref = np.load("ref.npy")
for units in [ct.ComputeUnit.CPU_AND_NE]:
m = ct.models.MLModel(path, compute_units=units)
for L in [int(x) for x in sys.argv[2].split(",")]:
outs = []
for t in texts:
ids = np.zeros((1, L), dtype=np.int32); enc = tok(t)["input_ids"][:L]; ids[0, :len(enc)] = enc
outs.append(m.predict({"input_ids": ids})["embedding"][0])
outs = np.array(outs)
start = time.time()
for _ in range(20): m.predict({"input_ids": ids})
ms = (time.time() - start) / 20 * 1000
print(f"L={L}: coseno con ufficiale {np.round((outs*ref).sum(1),4)} · {ms:.1f} ms per pezzo")
print("similarità QA:", np.round(outs @ outs.T, 3)[0], "dolce:", np.round(outs @ outs.T, 3)[3])