Initial commit: E4B-MarkBase model integration with passing tests
CI / build-and-test (push) Has been cancelled
CI / build-and-test (push) Has been cancelled
- E4B-MarkBase model (42 layers, 4.4GB) loaded successfully - All Phase 1-6 tests passed (model loading, forward pass, vision/audio towers, token generation, performance) - All stress tests passed (5/5 in 127.6s) - Concurrent inference - Memory stress (67.5 tok/s, 0 NaN) - Continuous generation - Batch processing - Long-running stability - Swift Metal inference engine with multimodal support
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
import XCTest
|
||||
@testable import MarkBase
|
||||
|
||||
class Model12BArchitectureTest: XCTestCase {
|
||||
|
||||
func testModel12BFullArchitecture() throws {
|
||||
print("\n═══════════════════════════════════════════════════════════════════")
|
||||
print(" 12B Standard Complete Architecture Check")
|
||||
print("═══════════════════════════════════════════════════════════════════\n")
|
||||
|
||||
let modelPath = "/Users/accusys/.cache/huggingface/hub/models--mlx-community--gemma-4-12B-it-4bit/snapshots/73bcf09092aa277861d5a191b989b666f7f32e8f"
|
||||
|
||||
guard FileManager.default.fileExists(atPath: modelPath) else {
|
||||
print("⚠ Model not found")
|
||||
return
|
||||
}
|
||||
|
||||
// Load tensors
|
||||
let index = try SafeTensorsIndex(modelDir: modelPath)
|
||||
var readers: [String: SafeTensorsReader] = [:]
|
||||
for shardFile in Set(index.weightMap.values) {
|
||||
readers[shardFile] = try SafeTensorsReader(path: "\(modelPath)/\(shardFile)")
|
||||
}
|
||||
|
||||
let allTensors = readers.values.flatMap { $0.allTensors }
|
||||
|
||||
print("1. Total Tensors: \(allTensors.count)")
|
||||
|
||||
// Audio tower analysis
|
||||
print("\n2. Audio Tower:")
|
||||
let audioTensors = allTensors.filter { $0.name.contains("audio_tower") || $0.name.contains("audio_model") }
|
||||
print(" Audio tensors: \(audioTensors.count)")
|
||||
if !audioTensors.isEmpty {
|
||||
print(" Sample tensors:")
|
||||
for tensor in audioTensors.prefix(10) {
|
||||
print(" \(tensor.name): shape=\(tensor.shape)")
|
||||
}
|
||||
}
|
||||
|
||||
// Vision tower analysis
|
||||
print("\n3. Vision Tower:")
|
||||
let visionTensors = allTensors.filter { $0.name.contains("vision_tower") || $0.name.contains("vision_model") }
|
||||
print(" Vision tensors: \(visionTensors.count)")
|
||||
if !visionTensors.isEmpty {
|
||||
print(" Sample tensors:")
|
||||
for tensor in visionTensors.prefix(10) {
|
||||
print(" \(tensor.name): shape=\(tensor.shape)")
|
||||
}
|
||||
}
|
||||
|
||||
// TEXT model analysis
|
||||
print("\n4. TEXT Model:")
|
||||
let textTensors = allTensors.filter { $0.name.contains("language_model") || $0.name.contains("layers.") }
|
||||
print(" TEXT-related tensors: \(textTensors.count)")
|
||||
|
||||
// Embed tokens
|
||||
let embedTokens = allTensors.filter { $0.name.contains("embed_tokens") }
|
||||
print(" Embed tokens: \(embedTokens.count)")
|
||||
for tensor in embedTokens.prefix(5) {
|
||||
print(" \(tensor.name): shape=\(tensor.shape)")
|
||||
}
|
||||
|
||||
// Summary
|
||||
print("\n═══════════════════════════════════════════════════════════════════")
|
||||
print(" Architecture Summary")
|
||||
print("═══════════════════════════════════════════════════════════════════\n")
|
||||
|
||||
if audioTensors.count > 0 {
|
||||
print("✓ 12B HAS AUDIO TOWER: \(audioTensors.count) tensors")
|
||||
} else {
|
||||
print("✗ 12B NO AUDIO TOWER")
|
||||
}
|
||||
|
||||
if visionTensors.count > 0 {
|
||||
print("✓ 12B HAS VISION TOWER: \(visionTensors.count) tensors")
|
||||
} else {
|
||||
print("✗ 12B NO VISION TOWER")
|
||||
}
|
||||
|
||||
print("✓ TEXT Model: \(textTensors.count) tensors")
|
||||
|
||||
print("\nModel Type: \(audioTensors.count > 0 || visionTensors.count > 0 ? "Multimodal" : "Pure TEXT")")
|
||||
|
||||
print("\n═══════════════════════════════════════════════════════════════════")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user