From 07459e8ee398297dce586b808b23b9459412abad Mon Sep 17 00:00:00 2001 From: MarkBase Admin Date: Sun, 5 Jul 2026 23:33:42 +0800 Subject: [PATCH] v2: add 12B model test (Model12BTest) --- .gitignore | 1 + Tests/01_Model/Model12BTest.swift | 55 +++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 Tests/01_Model/Model12BTest.swift diff --git a/.gitignore b/.gitignore index ba0205b..9442175 100644 --- a/.gitignore +++ b/.gitignore @@ -7,5 +7,6 @@ Package.resolved *.xcodeproj/ *.xcworkspace/ .DS_Store +blobs/ test_summary.md.runner .runner diff --git a/Tests/01_Model/Model12BTest.swift b/Tests/01_Model/Model12BTest.swift new file mode 100644 index 0000000..acda036 --- /dev/null +++ b/Tests/01_Model/Model12BTest.swift @@ -0,0 +1,55 @@ +import XCTest +@testable import MarkBase + +final class Model12BTest: XCTestCase { + + var engine: MarkBaseEngine! + var model: E4BModel! + let modelDir = "/Users/accusys/MarkBaseEngine/models/gemma-4-12b-it-4bit" + let maxCtx = 64 + + override func setUp() { + super.setUp() + guard FileManager.default.fileExists(atPath: modelDir + "/model.safetensors.index.json") else { + return + } + engine = try? MarkBaseEngine(autoCompile: true) + model = try? E4BModel(modelDir: modelDir, engine: engine, maxContextLength: maxCtx) + } + + func testModelLoads() throws { + try XCTSkipIf(model == nil, "gemma-4-12b-it-4bit model not found") + XCTAssertNotNil(model) + XCTAssertEqual(model.hiddenSize, 3840) + XCTAssertEqual(model.numHiddenLayers, 48) + XCTAssertEqual(model.vocabSize, 262144) + } + + func testBosTokenLogitsNoNaN() throws { + try XCTSkipIf(model == nil, "gemma-4-12b-it-4bit model not found") + let logits = try model.forward(tokenId: 2, position: 0) + XCTAssertEqual(logits.count, model.vocabSize) + let nanCount = logits.filter { $0.isNaN }.count + XCTAssertEqual(nanCount, 0, "No NaN values in logits") + } + + func testLogitSoftcapping() throws { + try XCTSkipIf(model == nil, "gemma-4-12b-it-4bit model not found") + let logits = try model.forward(tokenId: 2, position: 0) + let softcap: Float = 30.0 + for logit in logits { + XCTAssertLessThanOrEqual(abs(logit), softcap + 0.1, + "Logit \(logit) exceeds softcap \(softcap)") + } + } + + func testMultipleTokensProduceDifferentLogits() throws { + try XCTSkipIf(model == nil, "gemma-4-12b-it-4bit model not found") + let tokens = [2, 100, 1000] + for (pos, tokenId) in tokens.enumerated() { + let logits = try model.forward(tokenId: tokenId, position: pos) + let nanCount = logits.filter { $0.isNaN }.count + XCTAssertEqual(nanCount, 0, "NaN for token=\(tokenId) pos=\(pos)") + } + } +}