diff --git a/Sources/MarkBase/Embedding/EmbeddingGemmaModel.swift b/Sources/MarkBase/Embedding/EmbeddingGemmaModel.swift index 6a183b6..4a5c404 100644 --- a/Sources/MarkBase/Embedding/EmbeddingGemmaModel.swift +++ b/Sources/MarkBase/Embedding/EmbeddingGemmaModel.swift @@ -41,14 +41,12 @@ 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 public let tokenizer: Tokenizer public let reader: SafeTensorsReader - // GPU Buffers public var embedTokens: MTLBuffer! public var finalNorm: MTLBuffer! public var layerNorms: [[MTLBuffer]] = [] @@ -67,7 +65,6 @@ public final class EmbeddingGemmaModel: @unchecked Sendable { self.config = try EmbeddingGemmaConfig.load(from: modelDir) 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))") } @@ -75,7 +72,6 @@ public final class EmbeddingGemmaModel: @unchecked Sendable { 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.. [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 - print(" embed: seqLen=\(seqLen)") - // Use single command buffer for entire forward pass + // 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()! - - // Embedding lookup - print(" embed: lookupEmbeddings") - let inputBuf = try lookupEmbeddings(tokens: tokens, cmdBuf: cmdBuf) - print(" embed: lookupEmbeddings done") - - // Forward through layers - var hidden = inputBuf + hidden = inputBuf for idx in 0..