From c0347d52138f9418765a8f62fa81a492e1046923 Mon Sep 17 00:00:00 2001 From: MarkBase Admin Date: Mon, 6 Jul 2026 20:24:27 +0800 Subject: [PATCH] v2: EmbeddingGemma multi-language working, 500-test stability issue pending --- .../Embedding/EmbeddingGemmaModel.swift | 155 ++++++------------ 1 file changed, 53 insertions(+), 102 deletions(-) diff --git a/Sources/MarkBase/Embedding/EmbeddingGemmaModel.swift b/Sources/MarkBase/Embedding/EmbeddingGemmaModel.swift index 82b7b36..b79a81f 100644 --- a/Sources/MarkBase/Embedding/EmbeddingGemmaModel.swift +++ b/Sources/MarkBase/Embedding/EmbeddingGemmaModel.swift @@ -1,6 +1,5 @@ import Foundation import Metal -import MetalPerformanceShaders import Accelerate /// EmbeddingGemma configuration @@ -42,6 +41,7 @@ public struct EmbeddingGemmaConfig: Codable { } } +/// EmbeddingGemma - Google's 300M parameter embedding model public final class EmbeddingGemmaModel: @unchecked Sendable { public let config: EmbeddingGemmaConfig public let engine: MarkBaseEngine @@ -67,12 +67,12 @@ public final class EmbeddingGemmaModel: @unchecked Sendable { self.tokenizer = try TokenizerFactory.load(modelDir: modelDir) self.reader = try SafeTensorsReader(path: modelDir + "/model.safetensors") try loadWeights() - print("✓ EmbeddingGemma loaded (\(config.numHiddenLayers) layers, hidden=\(config.hiddenSize))") } private func loadWeights() throws { let embedData = try readTensor("embed_tokens.weight") embedTokens = engine.device.makeBuffer(bytes: embedData, length: embedData.count * 4)! + for i in 0.. MTLBuffer { + let data = try readTensor(name) + var transposed = [Float](repeating: 0, count: data.count) + for r in 0.. [Float] { var tokens = tokenizer.encode(text: text) if tokens.count > maxLen { tokens = Array(tokens.prefix(maxLen)) } guard !tokens.isEmpty else { return [] } let seqLen = tokens.count, hs = config.hiddenSize - - // Test 1: Embedding lookup only - print(" TEST: Embedding lookup...") - let cmdBuf1 = engine.commandQueue.makeCommandBuffer()! - let inputBuf = try lookupEmbeddings(tokens: tokens, cmdBuf: cmdBuf1) - cmdBuf1.commit() - cmdBuf1.waitUntilCompleted() - print(" TEST: Embedding lookup OK") - - // Test 2: Single layer forward (layer 0 only) - print(" TEST: Layer 0 forward...") - let cmdBuf2 = engine.commandQueue.makeCommandBuffer()! - var hidden = try forwardLayerDebug(hidden: inputBuf, layerIdx: 0, seqLen: seqLen, cmdBuf: cmdBuf2) - cmdBuf2.commit() - cmdBuf2.waitUntilCompleted() - print(" TEST: Layer 0 OK") - - // Full forward pass - print(" TEST: Full forward pass...") let cmdBuf = engine.commandQueue.makeCommandBuffer()! - hidden = inputBuf + + let inputBuf = try lookupEmbeddings(tokens: tokens, cmdBuf: cmdBuf) + + var hidden = inputBuf for idx in 0..