@atomic-chat/core 0.21.1 → 0.21.2
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.
- package/dist/backend/advisor/advisor.js +11 -2
- package/dist/backend/advisor/advisor.js.map +1 -1
- package/dist/backend/install/cuda-guard.d.ts +62 -0
- package/dist/backend/install/cuda-guard.js +80 -0
- package/dist/backend/install/cuda-guard.js.map +1 -0
- package/dist/backend/install/cuda-runtime-source.d.ts +76 -0
- package/dist/backend/install/cuda-runtime-source.js +294 -0
- package/dist/backend/install/cuda-runtime-source.js.map +1 -0
- package/dist/backend/install/index.d.ts +3 -0
- package/dist/backend/install/index.js +3 -0
- package/dist/backend/install/index.js.map +1 -1
- package/dist/backend/install/runtime-backend.d.ts +30 -3
- package/dist/backend/install/runtime-backend.js +106 -28
- package/dist/backend/install/runtime-backend.js.map +1 -1
- package/dist/backend/install/service.d.ts +40 -4
- package/dist/backend/install/service.js +175 -31
- package/dist/backend/install/service.js.map +1 -1
- package/dist/backend/install/windows-launch-check.d.ts +72 -0
- package/dist/backend/install/windows-launch-check.js +173 -0
- package/dist/backend/install/windows-launch-check.js.map +1 -0
- package/dist/backend/installed/installed.d.ts +13 -0
- package/dist/backend/installed/installed.js +32 -0
- package/dist/backend/installed/installed.js.map +1 -1
- package/dist/backend/select/bad-backends.d.ts +68 -0
- package/dist/backend/select/bad-backends.js +136 -0
- package/dist/backend/select/bad-backends.js.map +1 -0
- package/dist/backend/select/features.d.ts +18 -1
- package/dist/backend/select/features.js +29 -1
- package/dist/backend/select/features.js.map +1 -1
- package/dist/backend/select/index.d.ts +1 -0
- package/dist/backend/select/index.js +1 -0
- package/dist/backend/select/index.js.map +1 -1
- package/dist/backend/turboquant.d.ts +8 -0
- package/dist/backend/turboquant.js +37 -9
- package/dist/backend/turboquant.js.map +1 -1
- package/dist/cli/main.d.ts +1 -1
- package/dist/contracts/diagnostics.d.ts +1 -1
- package/dist/contracts/diagnostics.js +1 -0
- package/dist/contracts/diagnostics.js.map +1 -1
- package/dist/contracts/errors.d.ts +3 -3
- package/dist/contracts/errors.js +15 -0
- package/dist/contracts/errors.js.map +1 -1
- package/dist/contracts/hardware.d.ts +8 -0
- package/dist/contracts/index.d.ts +1 -0
- package/dist/contracts/index.js +1 -0
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/load-diag.d.ts +34 -0
- package/dist/contracts/load-diag.js +48 -0
- package/dist/contracts/load-diag.js.map +1 -0
- package/dist/core/atomic-core.d.ts +1 -1
- package/dist/core/create.js +16 -13
- package/dist/core/create.js.map +1 -1
- package/dist/downloads/archive.js +8 -3
- package/dist/downloads/archive.js.map +1 -1
- package/dist/downloads/disk.d.ts +18 -0
- package/dist/downloads/disk.js +32 -1
- package/dist/downloads/disk.js.map +1 -1
- package/dist/downloads/downloader.js +7 -4
- package/dist/downloads/downloader.js.map +1 -1
- package/dist/downloads/fs-retry.d.ts +27 -0
- package/dist/downloads/fs-retry.js +40 -0
- package/dist/downloads/fs-retry.js.map +1 -0
- package/dist/downloads/index.d.ts +1 -0
- package/dist/downloads/index.js +1 -0
- package/dist/downloads/index.js.map +1 -1
- package/dist/hardware/index.d.ts +1 -0
- package/dist/hardware/index.js +1 -0
- package/dist/hardware/index.js.map +1 -1
- package/dist/hardware/probe-common.d.ts +9 -1
- package/dist/hardware/probe-common.js.map +1 -1
- package/dist/hardware/probe-windows.d.ts +10 -2
- package/dist/hardware/probe-windows.js +65 -10
- package/dist/hardware/probe-windows.js.map +1 -1
- package/dist/hardware/probe.js +1 -1
- package/dist/hardware/probe.js.map +1 -1
- package/dist/hardware/service.d.ts +11 -0
- package/dist/hardware/service.js +31 -4
- package/dist/hardware/service.js.map +1 -1
- package/dist/hardware/windows-registry.d.ts +80 -0
- package/dist/hardware/windows-registry.js +197 -0
- package/dist/hardware/windows-registry.js.map +1 -0
- package/dist/runtime/llamacpp/args.d.ts +11 -0
- package/dist/runtime/llamacpp/args.js +28 -3
- package/dist/runtime/llamacpp/args.js.map +1 -1
- package/dist/runtime/llamacpp/devices.d.ts +11 -0
- package/dist/runtime/llamacpp/devices.js +22 -0
- package/dist/runtime/llamacpp/devices.js.map +1 -1
- package/dist/runtime/llamacpp/errors.d.ts +32 -2
- package/dist/runtime/llamacpp/errors.js +77 -4
- package/dist/runtime/llamacpp/errors.js.map +1 -1
- package/dist/runtime/llamacpp/index.d.ts +1 -0
- package/dist/runtime/llamacpp/index.js +1 -0
- package/dist/runtime/llamacpp/index.js.map +1 -1
- package/dist/runtime/llamacpp/load-failure.d.ts +52 -0
- package/dist/runtime/llamacpp/load-failure.js +105 -0
- package/dist/runtime/llamacpp/load-failure.js.map +1 -0
- package/dist/runtime/llamacpp/load-plan.d.ts +5 -0
- package/dist/runtime/llamacpp/load-plan.js +34 -4
- package/dist/runtime/llamacpp/load-plan.js.map +1 -1
- package/dist/runtime/llamacpp/runtime.d.ts +24 -1
- package/dist/runtime/llamacpp/runtime.js +116 -27
- package/dist/runtime/llamacpp/runtime.js.map +1 -1
- package/dist/runtime/shared/env.js +13 -15
- package/dist/runtime/shared/env.js.map +1 -1
- package/dist/telemetry/diagnostics.js +4 -0
- package/dist/telemetry/diagnostics.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Put a Windows CUDA pack's runtime beside it — `cudart64_<N>`, `cublas64_<N>`, `cublasLt64_<N>` —
|
|
3
|
+
* from the best source this machine has, so a CUDA build never runs without it (and never quietly
|
|
4
|
+
* runs on the CPU). Sources, in order, until the whole set is in the pack's `build/bin`:
|
|
5
|
+
*
|
|
6
|
+
* 1. Already there.
|
|
7
|
+
* 2. Offline: another installed llama.cpp pack of any provider with the same CUDA major and at least
|
|
8
|
+
* the same minor, or the legacy `<data>/llamacpp/lib` folder.
|
|
9
|
+
* 3. Offline: a CUDA toolkit installed on the host (`CUDA_PATH*`, `Program Files\NVIDIA GPU Computing
|
|
10
|
+
* Toolkit\CUDA\vX.Y`), from `bin\x64` (CUDA 13) or `bin` (CUDA 12), same major, minor at least.
|
|
11
|
+
* 4. The pack's own ggml-org companion for its release tag (the caller passes it, with its sha256
|
|
12
|
+
* when the release list names it).
|
|
13
|
+
* 5. NVIDIA's own redistributable archives (`cuda_cudart` + `libcublas`, windows-x86_64) from the
|
|
14
|
+
* `redistrib_<X.Y.Z>.json` manifest of the same major and the nearest minor, verified by sha256.
|
|
15
|
+
* 6. The pinned ggml-org companions below, verified by GitHub's digests.
|
|
16
|
+
*
|
|
17
|
+
* An incomplete runtime is replaced as a whole from one source: existing cuBLAS and cuBLASLt may
|
|
18
|
+
* belong to different releases, so filling only the missing filenames is not enough. A failed copy is never reported as a successful repair; the caller decides how to
|
|
19
|
+
* handle a pack that remains unusable.
|
|
20
|
+
*/
|
|
21
|
+
import { copyFile, mkdir, readdir, rm } from 'node:fs/promises';
|
|
22
|
+
import { join } from 'node:path';
|
|
23
|
+
import { AtomicCoreError } from '../../contracts/index.js';
|
|
24
|
+
import { DOWNLOAD_CANCELLED, extractArchive } from '../../downloads/index.js';
|
|
25
|
+
import { getCudaToolkitVersion, windowsCudaBackendArch } from '../catalog/index.js';
|
|
26
|
+
import { missingWindowsCudaRuntimeDlls, windowsCudaRuntimeDlls } from '../installed/index.js';
|
|
27
|
+
import { turboquantCudaToolkit } from '../turboquant.js';
|
|
28
|
+
import { parseRustU32 } from '../version.js';
|
|
29
|
+
export const NVIDIA_CUDA_REDIST_BASE = 'https://developer.download.nvidia.com/compute/cuda/redist';
|
|
30
|
+
/** ggml-org's Windows runtime companions with GitHub's digests; the fallback when nothing better answers. */
|
|
31
|
+
export const PINNED_WINDOWS_CUDA_RUNTIMES = [
|
|
32
|
+
{
|
|
33
|
+
toolkit: '12.4',
|
|
34
|
+
arch: 'x64',
|
|
35
|
+
url: 'https://github.com/ggml-org/llama.cpp/releases/download/b10205/cudart-llama-bin-win-cuda-12.4-x64.zip',
|
|
36
|
+
sha256: '8c79a9b226de4b3cacfd1f83d24f962d0773be79f1e7b75c6af4ded7e32ae1d6',
|
|
37
|
+
size: 391_443_627,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
toolkit: '13.3',
|
|
41
|
+
arch: 'x64',
|
|
42
|
+
url: 'https://github.com/ggml-org/llama.cpp/releases/download/b10205/cudart-llama-bin-win-cuda-13.3-x64.zip',
|
|
43
|
+
sha256: '1462a050eb4c684921ba51dcc4cc488a036674c3e73e9945ee705b854808d03e',
|
|
44
|
+
size: 390_970_417,
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
toolkit: '13.4',
|
|
48
|
+
arch: 'x64',
|
|
49
|
+
url: 'https://github.com/ggml-org/llama.cpp/releases/download/b12019/cudart-llama-bin-win-cuda-13.4-x64.zip',
|
|
50
|
+
sha256: '738f8c251ac22b70c3ae6f83a10cf222725df0395246a2cf58f32bdb85fbe668',
|
|
51
|
+
size: 423_535_356,
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
toolkit: '13.4',
|
|
55
|
+
arch: 'arm64',
|
|
56
|
+
url: 'https://github.com/ggml-org/llama.cpp/releases/download/b12019/cudart-llama-bin-win-cuda-13.4-arm64.zip',
|
|
57
|
+
sha256: '642dcde8805b3e3165ca710a5443b3b4044b27d96bd3ee3132473988c9bcb774',
|
|
58
|
+
size: 153_262_407,
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
function parseToolkit(text) {
|
|
62
|
+
const [major, minor] = (text ?? '').split('.');
|
|
63
|
+
const ma = parseRustU32(major ?? '');
|
|
64
|
+
const mi = parseRustU32(minor ?? '0');
|
|
65
|
+
return ma === undefined || mi === undefined ? undefined : { major: ma, minor: mi };
|
|
66
|
+
}
|
|
67
|
+
/** Same major, and at least the minor the pack was built with. */
|
|
68
|
+
function satisfies(candidate, wanted) {
|
|
69
|
+
return candidate !== undefined && candidate.major === wanted.major && candidate.minor >= wanted.minor;
|
|
70
|
+
}
|
|
71
|
+
export function cudaToolkitOfPack(provider, backend) {
|
|
72
|
+
return provider === 'llamacpp' ? turboquantCudaToolkit(backend) : getCudaToolkitVersion(backend);
|
|
73
|
+
}
|
|
74
|
+
function archOfPack(provider, backend) {
|
|
75
|
+
return provider === 'llamacpp' ? 'x64' : (windowsCudaBackendArch(backend) ?? 'x64');
|
|
76
|
+
}
|
|
77
|
+
const defaultList = (dir) => readdir(dir).catch(() => []);
|
|
78
|
+
/** Copy `names` from `fromDir` into `toDir` when it has every one of them (case-insensitive). */
|
|
79
|
+
async function copyAllFrom(fromDir, toDir, names, list) {
|
|
80
|
+
const byLower = new Map((await list(fromDir)).map((name) => [name.toLowerCase(), name]));
|
|
81
|
+
const sources = names.map((name) => byLower.get(name.toLowerCase()));
|
|
82
|
+
if (sources.some((s) => s === undefined))
|
|
83
|
+
return false;
|
|
84
|
+
await mkdir(toDir, { recursive: true });
|
|
85
|
+
for (const [i, name] of names.entries())
|
|
86
|
+
await copyFile(join(fromDir, sources[i]), join(toDir, name));
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
/** Installed packs and the legacy lib folder that may lend the runtime, best match first. */
|
|
90
|
+
async function localDonors(target, wanted, arch, deps, list) {
|
|
91
|
+
const scored = [];
|
|
92
|
+
for (const provider of ['llamacpp-upstream', 'llamacpp', 'atomic-prism']) {
|
|
93
|
+
const root = deps.layout.provider(provider).backendsDir;
|
|
94
|
+
for (const version of await list(root)) {
|
|
95
|
+
for (const backend of await list(join(root, version))) {
|
|
96
|
+
if (provider === target.provider && version === target.version && backend === target.backend)
|
|
97
|
+
continue;
|
|
98
|
+
const toolkit = parseToolkit(cudaToolkitOfPack(provider, backend));
|
|
99
|
+
if (!satisfies(toolkit, wanted) || archOfPack(provider, backend) !== arch)
|
|
100
|
+
continue;
|
|
101
|
+
scored.push({ dir: join(root, version, backend, 'build', 'bin'), minor: toolkit.minor });
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// The nearest minor first: the runtime closest to what the pack was built with.
|
|
106
|
+
scored.sort((a, b) => a.minor - b.minor);
|
|
107
|
+
return [...scored.map((s) => s.dir), join(deps.layout.root, 'llamacpp', 'lib')];
|
|
108
|
+
}
|
|
109
|
+
/** Host CUDA toolkits' DLL folders, nearest minor first. Windows only: other hosts have none. */
|
|
110
|
+
async function hostToolkitDirs(wanted, env, list) {
|
|
111
|
+
const roots = new Map();
|
|
112
|
+
const versionIn = (text) => {
|
|
113
|
+
const m = /v(\d+)\.(\d+)/i.exec(text);
|
|
114
|
+
return m ? parseToolkit(`${m[1]}.${m[2]}`) : undefined;
|
|
115
|
+
};
|
|
116
|
+
for (const [key, value] of Object.entries(env)) {
|
|
117
|
+
if (!value)
|
|
118
|
+
continue;
|
|
119
|
+
const keyed = /^CUDA_PATH_V(\d+)_(\d+)$/i.exec(key);
|
|
120
|
+
if (keyed)
|
|
121
|
+
roots.set(value, parseToolkit(`${keyed[1]}.${keyed[2]}`));
|
|
122
|
+
else if (key.toUpperCase() === 'CUDA_PATH' && !roots.has(value))
|
|
123
|
+
roots.set(value, versionIn(value));
|
|
124
|
+
}
|
|
125
|
+
const programFiles = env['ProgramFiles'] ?? 'C:\\Program Files';
|
|
126
|
+
const toolkits = join(programFiles, 'NVIDIA GPU Computing Toolkit', 'CUDA');
|
|
127
|
+
for (const name of await list(toolkits)) {
|
|
128
|
+
const root = join(toolkits, name);
|
|
129
|
+
if (!roots.has(root))
|
|
130
|
+
roots.set(root, versionIn(name));
|
|
131
|
+
}
|
|
132
|
+
return [...roots.entries()]
|
|
133
|
+
.filter(([, toolkit]) => satisfies(toolkit, wanted))
|
|
134
|
+
.sort((a, b) => a[1].minor - b[1].minor)
|
|
135
|
+
.flatMap(([root]) => [join(root, 'bin', 'x64'), join(root, 'bin')]);
|
|
136
|
+
}
|
|
137
|
+
/** Download archives into a scratch folder, extract them, and copy `names` out if all are inside. */
|
|
138
|
+
async function fromArchives(items, binDir, names, deps) {
|
|
139
|
+
const scratch = join(deps.layout.provider('llamacpp-upstream').tmpDir, `cuda-runtime-${Date.now()}`);
|
|
140
|
+
await mkdir(scratch, { recursive: true });
|
|
141
|
+
try {
|
|
142
|
+
const download = items.map(({ name, ...item }) => ({
|
|
143
|
+
...item,
|
|
144
|
+
save_path: join(scratch, name),
|
|
145
|
+
...(deps.proxy ? { proxy: deps.proxy } : {}),
|
|
146
|
+
}));
|
|
147
|
+
await deps.downloader.download(deps.taskId, download);
|
|
148
|
+
const found = new Map();
|
|
149
|
+
for (const [i, item] of items.entries()) {
|
|
150
|
+
const out = join(scratch, `x${i}`);
|
|
151
|
+
await mkdir(out, { recursive: true });
|
|
152
|
+
await extractArchive(join(scratch, item.name), out);
|
|
153
|
+
const stack = [out];
|
|
154
|
+
while (stack.length > 0) {
|
|
155
|
+
const dir = stack.pop();
|
|
156
|
+
for (const entry of await readdir(dir, { withFileTypes: true })) {
|
|
157
|
+
const path = join(dir, entry.name);
|
|
158
|
+
if (entry.isDirectory())
|
|
159
|
+
stack.push(path);
|
|
160
|
+
else if (entry.name.toLowerCase().endsWith('.dll'))
|
|
161
|
+
found.set(entry.name.toLowerCase(), path);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const sources = names.map((name) => found.get(name.toLowerCase()));
|
|
166
|
+
if (sources.some((s) => s === undefined))
|
|
167
|
+
return false;
|
|
168
|
+
await mkdir(binDir, { recursive: true });
|
|
169
|
+
for (const [i, name] of names.entries())
|
|
170
|
+
await copyFile(sources[i], join(binDir, name));
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
await rm(scratch, { recursive: true, force: true }).catch(() => { });
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/** NVIDIA's cudart + cuBLAS archives for the nearest release of the same major, or nothing. */
|
|
178
|
+
export async function nvidiaRedistArchives(wanted, fetchImpl) {
|
|
179
|
+
const index = await fetchImpl(`${NVIDIA_CUDA_REDIST_BASE}/`);
|
|
180
|
+
if (!index.ok)
|
|
181
|
+
return undefined;
|
|
182
|
+
const releases = [
|
|
183
|
+
...new Set([...(await index.text()).matchAll(/redistrib_(\d+)\.(\d+)\.(\d+)\.json/g)].map((m) => m[0])),
|
|
184
|
+
]
|
|
185
|
+
.map((file) => {
|
|
186
|
+
const [, ma, mi, pa] = /redistrib_(\d+)\.(\d+)\.(\d+)\.json/.exec(file);
|
|
187
|
+
return { file, major: Number(ma), minor: Number(mi), patch: Number(pa) };
|
|
188
|
+
})
|
|
189
|
+
.filter((r) => r.major === wanted.major && r.minor >= wanted.minor)
|
|
190
|
+
// The same minor's newest patch first, then the next minors up.
|
|
191
|
+
.sort((a, b) => a.minor - b.minor || b.patch - a.patch);
|
|
192
|
+
for (const release of releases) {
|
|
193
|
+
const res = await fetchImpl(`${NVIDIA_CUDA_REDIST_BASE}/${release.file}`);
|
|
194
|
+
if (!res.ok)
|
|
195
|
+
continue;
|
|
196
|
+
const manifest = (await res.json());
|
|
197
|
+
const cudart = manifest['cuda_cudart']?.['windows-x86_64'];
|
|
198
|
+
const cublas = manifest['libcublas']?.['windows-x86_64'];
|
|
199
|
+
if (!cudart?.relative_path || !cublas?.relative_path || !cudart.sha256 || !cublas.sha256)
|
|
200
|
+
continue;
|
|
201
|
+
return [cudart, cublas].map((entry) => ({
|
|
202
|
+
url: `${NVIDIA_CUDA_REDIST_BASE}/${entry.relative_path}`,
|
|
203
|
+
sha256: entry.sha256,
|
|
204
|
+
size: Number(entry.size),
|
|
205
|
+
name: entry.relative_path.split('/').pop(),
|
|
206
|
+
}));
|
|
207
|
+
}
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Make `target` carry its whole CUDA runtime; answer where it came from. Not a CUDA pack, or not
|
|
212
|
+
* Windows: `'present'` with nothing done. Throws `ENGINE_BINARY_BROKEN` naming the missing DLLs and
|
|
213
|
+
* every source tried when none could supply them.
|
|
214
|
+
*/
|
|
215
|
+
export async function deliverWindowsCudaRuntime(target, deps) {
|
|
216
|
+
const toolkitText = cudaToolkitOfPack(target.provider, target.backend);
|
|
217
|
+
const wanted = parseToolkit(toolkitText);
|
|
218
|
+
if (!toolkitText || !wanted)
|
|
219
|
+
return 'present';
|
|
220
|
+
const list = deps.listDir ?? defaultList;
|
|
221
|
+
const binDir = join(target.packDir, 'build', 'bin');
|
|
222
|
+
const arch = archOfPack(target.provider, target.backend);
|
|
223
|
+
const missing = () => missingWindowsCudaRuntimeDlls(binDir, toolkitText, list);
|
|
224
|
+
const tried = [];
|
|
225
|
+
const log = (source, from) => deps.log?.(`CUDA runtime for ${target.version}/${target.backend}: ${source} (${from})`);
|
|
226
|
+
let need = await missing();
|
|
227
|
+
if (need.length === 0)
|
|
228
|
+
return 'present';
|
|
229
|
+
const runtimeDlls = windowsCudaRuntimeDlls(toolkitText) ?? need;
|
|
230
|
+
for (const dir of await localDonors(target, wanted, arch, deps, list)) {
|
|
231
|
+
if (await copyAllFrom(dir, binDir, runtimeDlls, list)) {
|
|
232
|
+
log('installed-pack', dir);
|
|
233
|
+
return 'installed-pack';
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
tried.push('installed packs');
|
|
237
|
+
for (const dir of await hostToolkitDirs(wanted, deps.env ?? process.env, list)) {
|
|
238
|
+
if (await copyAllFrom(dir, binDir, runtimeDlls, list)) {
|
|
239
|
+
log('host-toolkit', dir);
|
|
240
|
+
return 'host-toolkit';
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
tried.push('CUDA toolkit on this computer');
|
|
244
|
+
const attempt = async (source, label, items) => {
|
|
245
|
+
try {
|
|
246
|
+
if (await fromArchives(items, binDir, runtimeDlls, deps)) {
|
|
247
|
+
log(source, label);
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
tried.push(`${label}: did not contain ${runtimeDlls.join(', ')}`);
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
if (error instanceof Error && error.message === DOWNLOAD_CANCELLED)
|
|
254
|
+
throw error;
|
|
255
|
+
tried.push(`${label}: ${error instanceof Error ? error.message : String(error)}`);
|
|
256
|
+
}
|
|
257
|
+
return false;
|
|
258
|
+
};
|
|
259
|
+
const companion = deps.releaseCompanion;
|
|
260
|
+
if (companion) {
|
|
261
|
+
const name = companion.url.split('/').pop() || 'cudart.zip';
|
|
262
|
+
const item = {
|
|
263
|
+
url: companion.url,
|
|
264
|
+
name,
|
|
265
|
+
...(companion.sha256 ? { sha256: companion.sha256 } : {}),
|
|
266
|
+
...(companion.size ? { size: companion.size } : {}),
|
|
267
|
+
};
|
|
268
|
+
if (await attempt('release-companion', companion.url, [item]))
|
|
269
|
+
return 'release-companion';
|
|
270
|
+
}
|
|
271
|
+
if (deps.fetch && arch === 'x64') {
|
|
272
|
+
const archives = await nvidiaRedistArchives(wanted, deps.fetch).catch((error) => {
|
|
273
|
+
tried.push(`NVIDIA redist manifest: ${error instanceof Error ? error.message : String(error)}`);
|
|
274
|
+
return undefined;
|
|
275
|
+
});
|
|
276
|
+
if (archives && (await attempt('nvidia-redist', 'NVIDIA CUDA redistributables', archives)))
|
|
277
|
+
return 'nvidia-redist';
|
|
278
|
+
if (!archives)
|
|
279
|
+
tried.push('NVIDIA redist: no release for this CUDA version');
|
|
280
|
+
}
|
|
281
|
+
const pinned = PINNED_WINDOWS_CUDA_RUNTIMES.filter((p) => p.arch === arch && satisfies(parseToolkit(p.toolkit), wanted)).sort((a, b) => parseToolkit(a.toolkit).minor - parseToolkit(b.toolkit).minor);
|
|
282
|
+
for (const p of pinned) {
|
|
283
|
+
if (companion && companion.url === p.url)
|
|
284
|
+
continue;
|
|
285
|
+
const name = p.url.split('/').pop();
|
|
286
|
+
if (await attempt('pinned-companion', p.url, [{ url: p.url, name, sha256: p.sha256, size: p.size }]))
|
|
287
|
+
return 'pinned-companion';
|
|
288
|
+
}
|
|
289
|
+
need = await missing();
|
|
290
|
+
if (need.length === 0)
|
|
291
|
+
need = runtimeDlls;
|
|
292
|
+
throw new AtomicCoreError('ENGINE_BINARY_BROKEN', `The ${target.version}/${target.backend} backend is missing its CUDA runtime (${need.join(', ')}) and it could not be downloaded. Check the connection and install the backend again, or install the NVIDIA CUDA Toolkit ${toolkitText}.`, `tried: ${tried.join('; ')}`);
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=cuda-runtime-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cuda-runtime-source.js","sourceRoot":"","sources":["../../../src/backend/install/cuda-runtime-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
/** Installing and updating backends, and resolving the installed backend a runtime runs on. */
|
|
2
2
|
export * from './runtime-backend.js';
|
|
3
3
|
export * from './service.js';
|
|
4
|
+
export * from './windows-launch-check.js';
|
|
5
|
+
export * from './cuda-guard.js';
|
|
6
|
+
export * from './cuda-runtime-source.js';
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
/** Installing and updating backends, and resolving the installed backend a runtime runs on. */
|
|
2
2
|
export * from './runtime-backend.js';
|
|
3
3
|
export * from './service.js';
|
|
4
|
+
export * from './windows-launch-check.js';
|
|
5
|
+
export * from './cuda-guard.js';
|
|
6
|
+
export * from './cuda-runtime-source.js';
|
|
4
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/backend/install/index.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,cAAc,sBAAsB,CAAA;AACpC,cAAc,cAAc,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/backend/install/index.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,cAAc,sBAAsB,CAAA;AACpC,cAAc,cAAc,CAAA;AAC5B,cAAc,2BAA2B,CAAA;AACzC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,0BAA0B,CAAA"}
|
|
@@ -3,13 +3,16 @@ import type { DataLayout } from '../../config/index.js';
|
|
|
3
3
|
import type { RuntimeSettings } from '../../runtime/llamacpp/index.js';
|
|
4
4
|
import type { SettingsStore } from '../../settings/index.js';
|
|
5
5
|
import type { HardwareFactsSource } from '../../hardware/index.js';
|
|
6
|
+
import type { BadBackendEntry } from '../select/index.js';
|
|
6
7
|
import type { RocmHostProbe } from '../turboquant.js';
|
|
7
8
|
/** Provider settings plus the engine-level keys the load plan reads. */
|
|
8
9
|
export declare function readRuntimeSettings(settings: SettingsStore, provider: LocalProviderId, layout: DataLayout, hardware: HardwareFactsSource): Promise<RuntimeSettings>;
|
|
9
10
|
/**
|
|
10
|
-
* The installed backend a load runs on: the configured pack when it is on disk
|
|
11
|
-
* compatible installed one
|
|
12
|
-
*
|
|
11
|
+
* The installed backend a load runs on: the configured pack when it is on disk and has not failed on
|
|
12
|
+
* this machine, otherwise the best compatible installed one; a pack that failed here is still used
|
|
13
|
+
* when nothing else is installed. `repair` runs on the pack that will be used before it is returned —
|
|
14
|
+
* the TurboQuant provider puts a missing CUDA runtime back there, as its extension did before every
|
|
15
|
+
* load.
|
|
13
16
|
*/
|
|
14
17
|
export declare function ensureBackend(layout: DataLayout, provider: LocalProviderId, backend: string, version: string, hardware: HardwareFactsSource, hostArch?: NodeJS.Architecture, repair?: (backend: string, version: string) => Promise<void>): Promise<{
|
|
15
18
|
version: string;
|
|
@@ -18,5 +21,29 @@ export declare function ensureBackend(layout: DataLayout, provider: LocalProvide
|
|
|
18
21
|
}>;
|
|
19
22
|
/** Choose among installed packs using the hardware facts (probe or override), never directory order. */
|
|
20
23
|
export declare function selectInstalledBackend(layout: DataLayout, provider: LocalProviderId, hardware: HardwareFactsSource, hostArch?: NodeJS.Architecture, probeRocm?: () => Promise<RocmHostProbe>): Promise<import("../installed/scan.js").DiscoveredBackendBinary | undefined>;
|
|
24
|
+
/** `<data>/atomic-core/bad-backends.json`: the llama.cpp packs that could not run on this machine. */
|
|
25
|
+
export declare function badBackendsPath(layout: DataLayout): string;
|
|
26
|
+
/** The records on disk; a missing or unreadable file is none. */
|
|
27
|
+
export declare function readBadBackends(layout: DataLayout): Promise<BadBackendEntry[]>;
|
|
28
|
+
/** Add or replace one record, written whole through a temporary file so a crash leaves the old one. */
|
|
29
|
+
export declare function rememberBadBackend(layout: DataLayout, entry: BadBackendEntry): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* The runtime's one-shot fallback (`LlamacppRuntimeOptions.backendFallback`): remember that `failed`
|
|
32
|
+
* could not run on this machine (`reason`, keyed by its GPU driver), then answer the next installed
|
|
33
|
+
* compatible pack down the fallback order — CUDA 13 → CUDA 12 → Vulkan → CPU — or nothing. A record
|
|
34
|
+
* that cannot be written does not stop the fallback; it is reported through `log`.
|
|
35
|
+
*/
|
|
36
|
+
export declare function llamaBackendFallback(layout: DataLayout, provider: LocalProviderId, hardware: HardwareFactsSource, failed: {
|
|
37
|
+
version: string;
|
|
38
|
+
backend: string;
|
|
39
|
+
}, reason: string, options?: {
|
|
40
|
+
hostArch?: string;
|
|
41
|
+
probeRocm?: () => Promise<RocmHostProbe>;
|
|
42
|
+
now?: () => Date;
|
|
43
|
+
log?: (message: string) => void;
|
|
44
|
+
}): Promise<{
|
|
45
|
+
version: string;
|
|
46
|
+
backend: string;
|
|
47
|
+
} | undefined>;
|
|
21
48
|
/** Node's `process.arch` in the Rust spelling the backend and CPU policies expect; the rule is `hardware/facts.ts`'s `rustArch`. */
|
|
22
49
|
export declare function platformArch(arch: string): string;
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
/** Resolve the installed backend a runtime may actually execute on this host. */
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
2
5
|
import { AtomicCoreError } from '../../contracts/index.js';
|
|
3
6
|
import { isConcreteVersionBackend } from '../../runtime/llamacpp/index.js';
|
|
4
7
|
import { canonicalProviderDefaults } from '../../settings/index.js';
|
|
5
8
|
import { rustArch } from '../../hardware/index.js';
|
|
6
9
|
import { prismTagBuild } from '../catalog/index.js';
|
|
7
10
|
import { discoverBackendBinary, resolveBackendExe, scanInstalledBackends } from '../installed/index.js';
|
|
8
|
-
import { determineBestBackend, determineBestPrismBackend, determinePrismSupportedBackends, determineSupportedBackends, filterBackendsBySupport, filterPrismBackendsBySupport, getPrismSupportedFeatures, getSupportedFeatures, } from '../select/index.js';
|
|
11
|
+
import { BAD_BACKENDS_FILE, determineBestBackend, determineBestPrismBackend, determinePrismSupportedBackends, determineSupportedBackends, filterBackendsBySupport, filterPrismBackendsBySupport, getPrismSupportedFeatures, getSupportedFeatures, gpuDriverKey, isBackendMarkedBad, nextFallbackBackend, parseBadBackends, serializeBadBackends, withBadBackend, } from '../select/index.js';
|
|
9
12
|
import { determineBestTurboquantBackend, determineTurboquantSupportedBackends, filterTurboquantBackendsBySupport, getTurboquantSupportedFeatures, probeLinuxRocmHost, } from '../turboquant.js';
|
|
10
13
|
/** Provider settings plus the engine-level keys the load plan reads. */
|
|
11
14
|
export async function readRuntimeSettings(settings, provider, layout, hardware) {
|
|
@@ -28,21 +31,28 @@ export async function readRuntimeSettings(settings, provider, layout, hardware)
|
|
|
28
31
|
};
|
|
29
32
|
}
|
|
30
33
|
/**
|
|
31
|
-
* The installed backend a load runs on: the configured pack when it is on disk
|
|
32
|
-
* compatible installed one
|
|
33
|
-
*
|
|
34
|
+
* The installed backend a load runs on: the configured pack when it is on disk and has not failed on
|
|
35
|
+
* this machine, otherwise the best compatible installed one; a pack that failed here is still used
|
|
36
|
+
* when nothing else is installed. `repair` runs on the pack that will be used before it is returned —
|
|
37
|
+
* the TurboQuant provider puts a missing CUDA runtime back there, as its extension did before every
|
|
38
|
+
* load.
|
|
34
39
|
*/
|
|
35
40
|
export async function ensureBackend(layout, provider, backend, version, hardware, hostArch = process.arch, repair) {
|
|
36
41
|
const exact = await resolveBackendExe(layout, provider, version, backend);
|
|
37
|
-
|
|
42
|
+
const skipExact = exact !== undefined && (await badBackendFilter(layout, provider, hardware))(backend, version);
|
|
43
|
+
if (exact && !skipExact) {
|
|
38
44
|
await repair?.(backend, version);
|
|
39
45
|
return { version, backend, exePath: exact };
|
|
40
46
|
}
|
|
41
47
|
const discovered = await selectInstalledBackend(layout, provider, hardware, hostArch);
|
|
42
|
-
if (discovered) {
|
|
48
|
+
if (discovered && !(exact && discovered.path === exact)) {
|
|
43
49
|
await repair?.(discovered.backend, discovered.version);
|
|
44
50
|
return { version: discovered.version, backend: discovered.backend, exePath: discovered.path };
|
|
45
51
|
}
|
|
52
|
+
if (exact) {
|
|
53
|
+
await repair?.(backend, version);
|
|
54
|
+
return { version, backend, exePath: exact };
|
|
55
|
+
}
|
|
46
56
|
throw new AtomicCoreError('BINARY_NOT_FOUND', 'No llama.cpp backend is installed in this data folder.', `looked for ${version}/${backend} under ${layout.provider(provider).backendsDir}`);
|
|
47
57
|
}
|
|
48
58
|
/** Choose among installed packs using the hardware facts (probe or override), never directory order. */
|
|
@@ -50,46 +60,114 @@ export async function selectInstalledBackend(layout, provider, hardware, hostArc
|
|
|
50
60
|
const installed = await scanInstalledBackends(layout, provider);
|
|
51
61
|
if (installed.length === 0)
|
|
52
62
|
return discoverBackendBinary(layout, provider);
|
|
63
|
+
const { compatible, gpus } = await compatibleBackends(installed, provider, hardware, hostArch, probeRocm);
|
|
64
|
+
// A pack that failed on this machine is passed over while another compatible one is installed.
|
|
65
|
+
const isBad = await badBackendFilter(layout, provider, hardware);
|
|
66
|
+
const usable = compatible.filter((pack) => !isBad(pack.backend, pack.version));
|
|
67
|
+
const pool = usable.length > 0 ? usable : compatible;
|
|
68
|
+
if (pool.length === 0)
|
|
69
|
+
return undefined;
|
|
70
|
+
const selected = provider === 'llamacpp'
|
|
71
|
+
? determineBestTurboquantBackend(pool, gpus)
|
|
72
|
+
: provider === 'atomic-prism'
|
|
73
|
+
? determineBestPrismBackend(pool, gpus)
|
|
74
|
+
: determineBestBackend(pool, gpus);
|
|
75
|
+
const [version, backend] = selected.split('/');
|
|
76
|
+
if (!version || !backend)
|
|
77
|
+
return undefined;
|
|
78
|
+
const path = await resolveBackendExe(layout, provider, version, backend);
|
|
79
|
+
return path ? { path, version_backend: selected, version, backend } : undefined;
|
|
80
|
+
}
|
|
81
|
+
/** The installed packs this host's hardware may run, by the provider's own matrix and ids. */
|
|
82
|
+
async function compatibleBackends(installed, provider, hardware, hostArch, probeRocm) {
|
|
53
83
|
const facts = await hardware.facts();
|
|
54
84
|
const osType = facts.osType;
|
|
55
85
|
const arch = platformArch(hostArch);
|
|
56
86
|
const gpus = facts.gpus;
|
|
57
87
|
// Unknown flags read as none here: the feature gates only add tiers for flags that are present.
|
|
58
88
|
const cpuExtensions = facts.cpuExtensions ?? [];
|
|
59
|
-
let selected;
|
|
60
89
|
if (provider === 'llamacpp') {
|
|
61
90
|
// The fork's own matrix, ids and priorities: the upstream ones filter every TurboQuant pack out.
|
|
62
91
|
const rocm = osType === 'linux' ? await probeRocm() : undefined;
|
|
63
92
|
const features = getTurboquantSupportedFeatures(osType, cpuExtensions, gpus, rocm);
|
|
64
93
|
const supported = determineTurboquantSupportedBackends(osType, arch, features);
|
|
65
|
-
|
|
66
|
-
if (compatible.length === 0)
|
|
67
|
-
return undefined;
|
|
68
|
-
selected = determineBestTurboquantBackend(compatible, gpus);
|
|
94
|
+
return { compatible: filterTurboquantBackendsBySupport(installed, supported), gpus };
|
|
69
95
|
}
|
|
70
|
-
|
|
96
|
+
if (provider === 'atomic-prism') {
|
|
71
97
|
const rocm = osType === 'linux' ? await probeRocm() : undefined;
|
|
72
98
|
const features = getPrismSupportedFeatures(osType, cpuExtensions, gpus, rocm);
|
|
73
99
|
// A pack under another release train's tag was not installed from the Prism manifest.
|
|
74
100
|
const prismPacks = installed.filter((pack) => prismTagBuild(pack.version) !== null);
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
return undefined;
|
|
78
|
-
selected = determineBestPrismBackend(compatible, gpus);
|
|
101
|
+
const supported = determinePrismSupportedBackends(osType, arch, features);
|
|
102
|
+
return { compatible: filterPrismBackendsBySupport(prismPacks, supported), gpus };
|
|
79
103
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
104
|
+
const features = getSupportedFeatures(osType, cpuExtensions, gpus);
|
|
105
|
+
const supported = determineSupportedBackends(osType, arch, features);
|
|
106
|
+
return { compatible: filterBackendsBySupport(installed, supported, osType), gpus };
|
|
107
|
+
}
|
|
108
|
+
/** `<data>/atomic-core/bad-backends.json`: the llama.cpp packs that could not run on this machine. */
|
|
109
|
+
export function badBackendsPath(layout) {
|
|
110
|
+
return join(layout.core.dir, BAD_BACKENDS_FILE);
|
|
111
|
+
}
|
|
112
|
+
/** The records on disk; a missing or unreadable file is none. */
|
|
113
|
+
export async function readBadBackends(layout) {
|
|
114
|
+
const text = await readFile(badBackendsPath(layout), 'utf8').catch(() => '');
|
|
115
|
+
if (!text.trim())
|
|
116
|
+
return [];
|
|
117
|
+
try {
|
|
118
|
+
return parseBadBackends(JSON.parse(text));
|
|
87
119
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
120
|
+
catch {
|
|
121
|
+
return [];
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/** Add or replace one record, written whole through a temporary file so a crash leaves the old one. */
|
|
125
|
+
export async function rememberBadBackend(layout, entry) {
|
|
126
|
+
const path = badBackendsPath(layout);
|
|
127
|
+
const next = withBadBackend(await readBadBackends(layout), entry);
|
|
128
|
+
const temporary = `${path}.tmp-${randomUUID()}`;
|
|
129
|
+
await mkdir(dirname(path), { recursive: true });
|
|
130
|
+
try {
|
|
131
|
+
await writeFile(temporary, serializeBadBackends(next), 'utf8');
|
|
132
|
+
await rename(temporary, path);
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
await rm(temporary, { force: true }).catch(() => { });
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Whether a backend of `provider` failed on this machine with its current GPU driver. The hardware is
|
|
141
|
+
* asked only when the file names a pack of this provider at all.
|
|
142
|
+
*/
|
|
143
|
+
async function badBackendFilter(layout, provider, hardware) {
|
|
144
|
+
const entries = (await readBadBackends(layout)).filter((e) => e.provider === provider);
|
|
145
|
+
if (entries.length === 0)
|
|
146
|
+
return () => false;
|
|
147
|
+
const driver = gpuDriverKey((await hardware.facts()).gpus);
|
|
148
|
+
return (backend, version) => isBackendMarkedBad(entries, provider, backend, driver, version);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* The runtime's one-shot fallback (`LlamacppRuntimeOptions.backendFallback`): remember that `failed`
|
|
152
|
+
* could not run on this machine (`reason`, keyed by its GPU driver), then answer the next installed
|
|
153
|
+
* compatible pack down the fallback order — CUDA 13 → CUDA 12 → Vulkan → CPU — or nothing. A record
|
|
154
|
+
* that cannot be written does not stop the fallback; it is reported through `log`.
|
|
155
|
+
*/
|
|
156
|
+
export async function llamaBackendFallback(layout, provider, hardware, failed, reason, options = {}) {
|
|
157
|
+
const driver = gpuDriverKey((await hardware.facts()).gpus);
|
|
158
|
+
await rememberBadBackend(layout, {
|
|
159
|
+
provider,
|
|
160
|
+
backend: failed.backend,
|
|
161
|
+
driver,
|
|
162
|
+
reason,
|
|
163
|
+
version: failed.version,
|
|
164
|
+
at: (options.now ?? (() => new Date()))().toISOString(),
|
|
165
|
+
}).catch((error) => options.log?.(`could not remember ${failed.version}/${failed.backend} as unusable here: ${String(error)}`));
|
|
166
|
+
const installed = await scanInstalledBackends(layout, provider);
|
|
167
|
+
const { compatible } = await compatibleBackends(installed, provider, hardware, options.hostArch ?? process.arch, options.probeRocm ?? probeLinuxRocmHost);
|
|
168
|
+
const isBad = await badBackendFilter(layout, provider, hardware);
|
|
169
|
+
const next = nextFallbackBackend(failed, compatible, isBad);
|
|
170
|
+
return next ? { version: next.version, backend: next.backend } : undefined;
|
|
93
171
|
}
|
|
94
172
|
/** Node's `process.arch` in the Rust spelling the backend and CPU policies expect; the rule is `hardware/facts.ts`'s `rustArch`. */
|
|
95
173
|
export function platformArch(arch) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-backend.js","sourceRoot":"","sources":["../../../src/backend/install/runtime-backend.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAI1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAA;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA;AAEnE,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AACvG,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,+BAA+B,EAC/B,0BAA0B,EAC1B,uBAAuB,EACvB,4BAA4B,EAC5B,yBAAyB,EACzB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"runtime-backend.js","sourceRoot":"","sources":["../../../src/backend/install/runtime-backend.ts"],"names":[],"mappings":"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"}
|