85 lines
2.8 KiB
C
85 lines
2.8 KiB
C
/* SPDX-License-Identifier: AGPL-3.0-or-later */
|
|
/* Copyright (C) 2026 David (Corey) Herrera */
|
|
/*
|
|
* ternarize-sweep: Stream forward+backward through all layers.
|
|
* Saves activation snapshots + gradient stats per layer.
|
|
*
|
|
* Usage:
|
|
* ternarize-sweep --workdir ./work --calib calib.bin [--batch-size 128]
|
|
*/
|
|
|
|
#include "../ternarize/ternarize.h"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
static void usage(const char *prog) {
|
|
fprintf(stderr, "Usage: %s --workdir <dir> --calib <calib.bin> [options]\n", prog);
|
|
fprintf(stderr, "\nOptions:\n");
|
|
fprintf(stderr, " --workdir Work directory (from ternarize-split)\n");
|
|
fprintf(stderr, " --calib Calibration data binary file\n");
|
|
fprintf(stderr, " --config Path to config.json (re-parse architecture)\n");
|
|
fprintf(stderr, " --batch-size Batch size for forward/backward (default: 128)\n");
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
ft_config cfg = ft_config_defaults();
|
|
const char *workdir = NULL;
|
|
const char *calib_path = NULL;
|
|
const char *config_path = NULL;
|
|
|
|
for (int i = 1; i < argc; i++) {
|
|
if (strcmp(argv[i], "--workdir") == 0 && i + 1 < argc) {
|
|
workdir = argv[++i];
|
|
} else if (strcmp(argv[i], "--calib") == 0 && i + 1 < argc) {
|
|
calib_path = argv[++i];
|
|
} else if (strcmp(argv[i], "--config") == 0 && i + 1 < argc) {
|
|
config_path = argv[++i];
|
|
} else if (strcmp(argv[i], "--batch-size") == 0 && i + 1 < argc) {
|
|
cfg.batch_size = atoi(argv[++i]);
|
|
} else if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "-h") == 0) {
|
|
usage(argv[0]);
|
|
return 0;
|
|
} else {
|
|
fprintf(stderr, "Unknown option: %s\n", argv[i]);
|
|
usage(argv[0]);
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
if (!workdir || !calib_path) {
|
|
usage(argv[0]);
|
|
return 1;
|
|
}
|
|
|
|
/* Load config from workdir status or re-parse */
|
|
if (config_path) {
|
|
if (!ft_config_from_json(&cfg, config_path)) {
|
|
fprintf(stderr, "ERROR: failed to parse %s\n", config_path);
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
snprintf(cfg.workdir, sizeof(cfg.workdir), "%s", workdir);
|
|
snprintf(cfg.calib_path, sizeof(cfg.calib_path), "%s", calib_path);
|
|
|
|
/* Read status to get n_layers if not parsed from config */
|
|
if (cfg.n_layers == 0) {
|
|
ft_status st = ft_status_read(&cfg);
|
|
cfg.n_layers = st.n_layers;
|
|
}
|
|
|
|
fprintf(stderr, "ternarize-sweep\n");
|
|
fprintf(stderr, " Workdir: %s\n", workdir);
|
|
fprintf(stderr, " Calib: %s\n", calib_path);
|
|
fprintf(stderr, " Batch size: %d\n", cfg.batch_size);
|
|
fprintf(stderr, " Layers: %d\n", cfg.n_layers);
|
|
|
|
if (!ft_sweep(&cfg)) {
|
|
fprintf(stderr, "ERROR: sweep failed\n");
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|