| 83 | } |
| 84 | |
| 85 | int main(int argc, char ** argv) { |
| 86 | if (argc < 2) { |
| 87 | fprintf(stderr, "Usage: %s <model.ggml> [ref_dir]\n", argv[0]); |
| 88 | fprintf(stderr, "Default ref_dir: tests/ref_phase3\n"); |
| 89 | return 1; |
| 90 | } |
| 91 | |
| 92 | const std::string model_path = argv[1]; |
| 93 | const std::string ref_dir = argc >= 3 ? argv[2] : "tests/ref_phase3"; |
| 94 | |
| 95 | auto preprocessed = load_ref_f32(ref_dir + "/preprocessed"); |
| 96 | if (preprocessed.data.empty()) { |
| 97 | fprintf(stderr, "failed to load %s/preprocessed.bin\n", ref_dir.c_str()); |
| 98 | return 1; |
| 99 | } |
| 100 | if (preprocessed.shape.size() != 4) { |
| 101 | fprintf(stderr, "unexpected preprocessed shape rank: %zu\n", preprocessed.shape.size()); |
| 102 | return 1; |
| 103 | } |
| 104 | |
| 105 | const int img_size = preprocessed.shape[2]; |
| 106 | std::vector<std::string> checkpoints = { |
| 107 | "dbg_patch_embed", |
| 108 | "dbg_after_pos_embed", |
| 109 | "dbg_ln_pre_norm", |
| 110 | "dbg_ln_pre_scale", |
| 111 | "dbg_after_ln_pre", |
| 112 | "dbg_block_15_norm1", |
| 113 | "dbg_block_15_attn_out", |
| 114 | "dbg_block_15_attn_proj", |
| 115 | "dbg_block_15_resid1", |
| 116 | "dbg_block_15_norm2", |
| 117 | "dbg_block_15_mlp", |
| 118 | }; |
| 119 | for (int i = 0; i < 31; ++i) { |
| 120 | checkpoints.emplace_back("dbg_block_" + std::to_string(i) + "_out"); |
| 121 | } |
| 122 | checkpoints.emplace_back("vit_output"); |
| 123 | checkpoints.emplace_back("neck_trk_0"); |
| 124 | checkpoints.emplace_back("neck_trk_1"); |
| 125 | checkpoints.emplace_back("neck_trk_2"); |
| 126 | |
| 127 | const std::string cpu_dir = "/tmp/sam3_cpu_checkpoints"; |
| 128 | const std::string metal_dir = "/tmp/sam3_metal_checkpoints"; |
| 129 | ensure_dir(cpu_dir); |
| 130 | ensure_dir(metal_dir); |
| 131 | |
| 132 | double cpu_ms = 0.0; |
| 133 | double metal_ms = 0.0; |
| 134 | |
| 135 | fprintf(stderr, "\n=== CPU Run ===\n"); |
| 136 | if (!run_backend(model_path, preprocessed.data, img_size, false, 8, checkpoints, cpu_dir, cpu_ms)) { |
| 137 | return 1; |
| 138 | } |
| 139 | fprintf(stderr, "CPU encoder wall time: %.1f ms\n", cpu_ms); |
| 140 | |
| 141 | fprintf(stderr, "\n=== Metal Run ===\n"); |
| 142 | if (!run_backend(model_path, preprocessed.data, img_size, true, 8, checkpoints, metal_dir, metal_ms)) { |
nothing calls this directly
no test coverage detected