@tuned-tensor/local 0.2.7 → 0.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/README.md +147 -2
  3. package/dist/artifacts.d.ts +92 -0
  4. package/dist/artifacts.js +591 -3
  5. package/dist/artifacts.js.map +1 -1
  6. package/dist/contracts.d.ts +5 -2
  7. package/dist/contracts.js +15 -10
  8. package/dist/contracts.js.map +1 -1
  9. package/dist/dataset.d.ts +3 -0
  10. package/dist/dataset.js +87 -5
  11. package/dist/dataset.js.map +1 -1
  12. package/dist/doctor.d.ts +13 -2
  13. package/dist/doctor.js +372 -49
  14. package/dist/doctor.js.map +1 -1
  15. package/dist/evaluation.d.ts +15 -0
  16. package/dist/evaluation.js +120 -16
  17. package/dist/evaluation.js.map +1 -1
  18. package/dist/huggingface-cache.d.ts +26 -0
  19. package/dist/huggingface-cache.js +68 -0
  20. package/dist/huggingface-cache.js.map +1 -0
  21. package/dist/index.d.ts +3 -0
  22. package/dist/index.js +742 -76
  23. package/dist/index.js.map +1 -1
  24. package/dist/local-project.d.ts +11 -0
  25. package/dist/local-project.js +96 -3
  26. package/dist/local-project.js.map +1 -1
  27. package/dist/model-registry.d.ts +21 -0
  28. package/dist/model-registry.js +198 -0
  29. package/dist/model-registry.js.map +1 -1
  30. package/dist/model-server.d.ts +32 -0
  31. package/dist/model-server.js +158 -0
  32. package/dist/model-server.js.map +1 -0
  33. package/dist/orchestrator.d.ts +3 -0
  34. package/dist/orchestrator.js +1001 -142
  35. package/dist/orchestrator.js.map +1 -1
  36. package/dist/prefetch.d.ts +13 -0
  37. package/dist/prefetch.js +107 -19
  38. package/dist/prefetch.js.map +1 -1
  39. package/dist/process-runner.d.ts +7 -0
  40. package/dist/process-runner.js +171 -16
  41. package/dist/process-runner.js.map +1 -1
  42. package/dist/process-training.d.ts +5 -1
  43. package/dist/process-training.js +32 -16
  44. package/dist/process-training.js.map +1 -1
  45. package/dist/run-reporter.d.ts +2 -0
  46. package/dist/run-reporter.js +10 -0
  47. package/dist/run-reporter.js.map +1 -1
  48. package/dist/store.d.ts +16 -2
  49. package/dist/store.js +189 -24
  50. package/dist/store.js.map +1 -1
  51. package/docs/architecture.md +32 -0
  52. package/docs/local-workflow-remediation-2026-07-13.md +130 -0
  53. package/docs/local-workflow-ux-review-2026-07-13.md +458 -0
  54. package/package.json +4 -2
  55. package/training/local-runner/src/evaluate.py +80 -20
  56. package/training/local-runner/src/prefetch.py +107 -8
  57. package/training/local-runner/src/serve.py +329 -0
  58. package/training/local-runner/src/train.py +47 -22
  59. package/training/local-runner/src/train_dpo.py +41 -25
  60. package/training/local-runner/uv.lock +2401 -0
@@ -0,0 +1,32 @@
1
+ import type { LocalRunnerConfig } from "./contracts.js";
2
+ import type { LocalModelRecord } from "./store.js";
3
+ export interface LocalModelServeOptions {
4
+ host?: string;
5
+ port?: number;
6
+ device?: "auto" | "cpu" | "cuda" | "mps";
7
+ maxTokens?: number;
8
+ temperature?: number;
9
+ topP?: number;
10
+ systemPrompt?: string;
11
+ allowRemote?: boolean;
12
+ apiKeyEnv?: string;
13
+ maxConcurrentRequests?: number;
14
+ baseModelRevision?: string;
15
+ baseModelArtifactUri?: string;
16
+ }
17
+ export interface LocalModelServerLaunch {
18
+ command: string;
19
+ commandArgs: string[];
20
+ displayCommand: string[];
21
+ cwd?: string;
22
+ env: NodeJS.ProcessEnv;
23
+ url: string;
24
+ modelName: string;
25
+ artifactPath: string;
26
+ }
27
+ export declare function buildLocalModelServerLaunch(args: {
28
+ model: LocalModelRecord;
29
+ config: LocalRunnerConfig;
30
+ options?: LocalModelServeOptions;
31
+ }): LocalModelServerLaunch;
32
+ export declare function serveLocalModel(launch: LocalModelServerLaunch): Promise<void>;
@@ -0,0 +1,158 @@
1
+ import { spawn } from "node:child_process";
2
+ import { resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { minimalMachineLearningEnvironment, withHuggingFaceCacheEnvironment } from "./huggingface-cache.js";
5
+ import { resolveTrainingModel } from "./model-registry.js";
6
+ import { buildEntrypointCommand } from "./process-runner.js";
7
+ function localArtifactPath(uri) {
8
+ if (uri.startsWith("file://"))
9
+ return fileURLToPath(uri);
10
+ if (/^[a-z][a-z0-9+.-]*:/i.test(uri)) {
11
+ throw new Error(`TT Local serving requires a local file artifact, got: ${uri}`);
12
+ }
13
+ return resolve(uri);
14
+ }
15
+ function boundedNumber(name, value, minimum, maximum, integer = false) {
16
+ if (!Number.isFinite(value) || value < minimum || value > maximum || (integer && !Number.isInteger(value))) {
17
+ throw new Error(`${name} must be between ${minimum} and ${maximum}`);
18
+ }
19
+ return value;
20
+ }
21
+ function isLoopbackHost(host) {
22
+ return host === "127.0.0.1" || host === "localhost" || host === "::1" || host === "[::1]";
23
+ }
24
+ function httpHost(host) {
25
+ return host.includes(":") && !host.startsWith("[") ? `[${host}]` : host;
26
+ }
27
+ export function buildLocalModelServerLaunch(args) {
28
+ const options = args.options ?? {};
29
+ const host = options.host ?? "127.0.0.1";
30
+ const remote = !isLoopbackHost(host);
31
+ if (remote && !options.allowRemote) {
32
+ throw new Error("Refusing a non-loopback model server bind without --allow-remote.");
33
+ }
34
+ const apiKey = options.apiKeyEnv ? process.env[options.apiKeyEnv]?.trim() : undefined;
35
+ if (options.apiKeyEnv && !apiKey)
36
+ throw new Error(`${options.apiKeyEnv} is not set.`);
37
+ if (remote && !apiKey) {
38
+ throw new Error("Non-loopback serving requires --api-key-env with a populated environment variable.");
39
+ }
40
+ const port = boundedNumber("port", options.port ?? 8000, 1, 65_535, true);
41
+ const maxTokens = boundedNumber("maxTokens", options.maxTokens ?? 512, 1, 8192, true);
42
+ const temperature = boundedNumber("temperature", options.temperature ?? 0, 0, 5);
43
+ const topP = boundedNumber("topP", options.topP ?? 1, 0, 1);
44
+ const maxConcurrentRequests = boundedNumber("maxConcurrentRequests", options.maxConcurrentRequests ?? 1, 1, 8, true);
45
+ const artifactPath = localArtifactPath(args.model.artifact_uri);
46
+ const recordedBaseModelPath = options.baseModelArtifactUri
47
+ ? localArtifactPath(options.baseModelArtifactUri)
48
+ : undefined;
49
+ const configuredBaseModelPath = args.config.paths.baseModel
50
+ ? resolve(args.config.paths.baseModel)
51
+ : undefined;
52
+ if (recordedBaseModelPath
53
+ && configuredBaseModelPath
54
+ && resolve(recordedBaseModelPath) !== configuredBaseModelPath) {
55
+ throw new Error(`Configured paths.baseModel ${configuredBaseModelPath} does not match the base model recorded for this artifact: `
56
+ + recordedBaseModelPath);
57
+ }
58
+ const localBaseModelPath = recordedBaseModelPath ?? configuredBaseModelPath;
59
+ const resolvedModel = resolveTrainingModel(args.model.base_model);
60
+ const entrypoint = buildEntrypointCommand({
61
+ backend: "uv",
62
+ project: args.config.evaluation.inference.project ?? "training/local-runner",
63
+ cwd: args.config.evaluation.inference.cwd,
64
+ script: "training/local-runner/src/serve.py",
65
+ });
66
+ const modelName = args.model.id;
67
+ const env = withHuggingFaceCacheEnvironment({
68
+ ...minimalMachineLearningEnvironment(process.env, { includeHfToken: resolvedModel.requiresHfToken }),
69
+ ...args.config.evaluation.inference.env,
70
+ TT_MODEL_ARTIFACT: artifactPath,
71
+ TT_BASE_MODEL: localBaseModelPath ?? args.model.base_model,
72
+ ...(options.baseModelRevision && !localBaseModelPath
73
+ ? { TT_BASE_MODEL_REVISION: options.baseModelRevision }
74
+ : {}),
75
+ TT_MODEL_NAME: modelName,
76
+ TT_MODEL_LOADER: resolvedModel.loader,
77
+ TT_HOST: host,
78
+ TT_PORT: String(port),
79
+ TT_DEVICE: options.device ?? args.config.evaluation.inference.device,
80
+ TT_MAX_TOKENS: String(maxTokens),
81
+ TT_TEMPERATURE: String(temperature),
82
+ TT_TOP_P: String(topP),
83
+ TT_TRUST_REMOTE_CODE: String(resolvedModel.trustRemoteCode && args.config.evaluation.inference.trustRemoteCode),
84
+ TT_MAX_CONCURRENT_REQUESTS: String(maxConcurrentRequests),
85
+ TT_CHAT_TEMPLATE_KWARGS: JSON.stringify(args.config.evaluation.inference.chatTemplateKwargs ?? {}),
86
+ ...(options.systemPrompt ? { TT_SYSTEM_PROMPT: options.systemPrompt } : {}),
87
+ ...(apiKey ? { TT_API_KEY: apiKey } : {}),
88
+ }, args.config.paths.modelCache);
89
+ return {
90
+ command: entrypoint.command,
91
+ commandArgs: entrypoint.commandArgs,
92
+ displayCommand: entrypoint.displayCommand,
93
+ cwd: entrypoint.kind === "uv" ? args.config.evaluation.inference.cwd : undefined,
94
+ env,
95
+ url: `http://${httpHost(host)}:${port}`,
96
+ modelName,
97
+ artifactPath,
98
+ };
99
+ }
100
+ export async function serveLocalModel(launch) {
101
+ await new Promise((resolveServer, reject) => {
102
+ const child = spawn(launch.command, launch.commandArgs, {
103
+ cwd: launch.cwd,
104
+ env: launch.env,
105
+ stdio: "inherit",
106
+ detached: process.platform !== "win32",
107
+ });
108
+ let stopping = false;
109
+ let forceKillTimer;
110
+ const killProcessGroup = (signal) => {
111
+ if (child.pid && process.platform !== "win32") {
112
+ try {
113
+ process.kill(-child.pid, signal);
114
+ return;
115
+ }
116
+ catch {
117
+ // Fall through when the process group has already exited.
118
+ }
119
+ }
120
+ child.kill(signal);
121
+ };
122
+ const stop = (signal) => {
123
+ if (stopping)
124
+ return;
125
+ stopping = true;
126
+ killProcessGroup(signal);
127
+ forceKillTimer = setTimeout(() => killProcessGroup("SIGKILL"), 5_000);
128
+ forceKillTimer.unref();
129
+ };
130
+ const onSigint = () => stop("SIGINT");
131
+ const onSigterm = () => stop("SIGTERM");
132
+ const cleanup = () => {
133
+ process.off("SIGINT", onSigint);
134
+ process.off("SIGTERM", onSigterm);
135
+ if (forceKillTimer)
136
+ clearTimeout(forceKillTimer);
137
+ };
138
+ process.once("SIGINT", onSigint);
139
+ process.once("SIGTERM", onSigterm);
140
+ child.once("error", (error) => {
141
+ cleanup();
142
+ reject(error);
143
+ });
144
+ child.once("close", (code, signal) => {
145
+ cleanup();
146
+ if (stopping || signal === "SIGINT" || signal === "SIGTERM") {
147
+ resolveServer();
148
+ }
149
+ else if (code === 0) {
150
+ resolveServer();
151
+ }
152
+ else {
153
+ reject(new Error(`Local model server exited with code ${code ?? "unknown"}.`));
154
+ }
155
+ });
156
+ });
157
+ }
158
+ //# sourceMappingURL=model-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-server.js","sourceRoot":"","sources":["../src/model-server.ts"],"names":[],"mappings":"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"}
@@ -20,11 +20,14 @@ export interface LocalStageRunResult {
20
20
  baseline_eval: string;
21
21
  candidate_eval: string;
22
22
  report: string;
23
+ artifact_manifest: string;
23
24
  };
24
25
  }
25
26
  export declare function loadJsonFile<T>(path: string): Promise<T>;
26
27
  export declare function loadRunRequest(path: string): Promise<FineTuneRunRequest>;
27
28
  export declare function loadLocalRunnerConfig(path?: string): Promise<LocalRunnerConfig>;
29
+ /** Hash a local base model while permitting Hugging Face snapshot file links. */
30
+ export declare function fingerprintLocalBaseModel(uri: string): Promise<string>;
28
31
  export declare function runLocalFineTuneStage(input: {
29
32
  request: FineTuneRunRequest;
30
33
  config: LocalRunnerConfig;