Files
llm-atlas/scripts/build-deepseek-chat-sampling-compact.mjs
T
2026-07-30 02:01:50 +08:00

335 lines
11 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { createHash } from "node:crypto";
import { readFileSync, statSync, writeFileSync } from "node:fs";
import { resolve } from "node:path";
const root = resolve(import.meta.dirname, "..");
const paths = {
sampling: resolve(
root,
"src/data/deepseek-v2-lite-chat-sampling.json",
),
evaluation: resolve(
root,
"src/data/deepseek-v2-lite-chat-sampling-eval.json",
),
rerun: resolve(
root,
"src/data/deepseek-v2-lite-chat-sampling-repro-r0r1.json",
),
reproduction: resolve(
root,
"src/data/deepseek-v2-lite-chat-sampling-reproduction.json",
),
output: resolve(
root,
"src/data/deepseek-v2-lite-chat-sampling-compact.json",
),
};
const readJson = (path) => JSON.parse(readFileSync(path, "utf8"));
const sha256 = (path) => createHash("sha256")
.update(readFileSync(path))
.digest("hex");
const artifact = (path) => ({
bytes: statSync(path).size,
sha256: sha256(path),
});
const mean = (values) => (
values.length
? values.reduce((total, value) => total + value, 0) / values.length
: null
);
const sampling = readJson(paths.sampling);
const evaluation = readJson(paths.evaluation);
const reproduction = readJson(paths.reproduction);
const samplingArtifact = artifact(paths.sampling);
const evaluationArtifact = artifact(paths.evaluation);
const rerunArtifact = artifact(paths.rerun);
if (evaluation.input.sampling_sha256 !== samplingArtifact.sha256) {
throw new Error("sampling evaluator input hash contract failed");
}
if (reproduction.formal.sha256 !== samplingArtifact.sha256) {
throw new Error("reproduction formal hash contract failed");
}
if (reproduction.rerun.sha256 !== rerunArtifact.sha256) {
throw new Error("reproduction rerun hash contract failed");
}
if (
reproduction.summary.all_preregistered_fields_exact
!== reproduction.summary.cells
) {
throw new Error("sampling reproduction is not exact");
}
const conditions = sampling.seed_contract.condition_row_order;
const edges = Object.keys(
sampling.summary.by_source_edge[sampling.sources[0].id],
);
const edgeLabels = {
system_eos: "System on − off · EOS",
system_bos: "System on − off · BOS",
system_x: "System on − off · x",
system_period: "System on − off · 句点",
bos_at_s0: "BOS − EOS · system off",
bos_at_s1: "BOS − EOS · system on",
x_at_s0: "x − EOS · system off",
x_at_s1: "x − EOS · system on",
period_at_s0: "句点 − EOS · system off",
period_at_s1: "句点 − EOS · system on",
};
const evalKey = (sourceId, baseSeed, condition) => (
`${sourceId}\0${baseSeed}\0${condition}`
);
const evaluationByKey = new Map(
evaluation.rows.map((row) => [
evalKey(row.source_id, row.base_seed, row.condition),
row,
]),
);
const sourceRows = sampling.sources.map((source) => {
const conditionRows = Object.fromEntries(conditions.map((condition) => {
const rawSummary = sampling.summary.by_source_condition[
source.id
][condition];
const evalSummary = evaluation.summary.by_source_condition[
source.id
][condition];
const samples = source.runs.map((run) => {
const output = run.outputs.find(
(candidate) => candidate.condition === condition,
);
const assessed = evaluationByKey.get(
evalKey(source.id, run.base_seed, condition),
);
if (!output || !assessed) {
throw new Error(
`sample/evaluation row missing: ${source.id}/${run.base_seed}/${condition}`,
);
}
return {
replicate: run.replicate_label,
baseSeed: run.base_seed,
runSeed: run.run_seed,
generatedTokens: output.generated_tokens,
hitEos: output.hit_eos,
truncated: output.stopped_at_max_new_tokens,
trajectoryHash: output.generated_token_ids_sha256,
textHash: output.text_sha256,
preview: output.text.replace(/\s+/g, " ").trim().slice(0, 220),
completionClass: assessed.completion_class,
math: assessed.task_evaluation && source.domain === "math"
? {
predicted: assessed.task_evaluation.predicted_final,
gold: assessed.task_evaluation.gold_final,
exact: assessed.task_evaluation.fixed_budget_numeric_exact,
method: assessed.task_evaluation.extraction_method,
}
: null,
code: assessed.task_evaluation && source.domain === "code"
? {
ast: assessed.task_evaluation.python_ast_parse,
status: assessed.task_evaluation.execution.status,
passed: assessed.task_evaluation.fixed_budget_tests_pass,
cacheHit: assessed.task_evaluation.execution_cache_hit,
}
: null,
};
});
return [condition, {
samples: rawSummary.samples,
naturalEos: rawSummary.natural_eos,
truncated: rawSummary.budget_truncated,
uniqueTrajectories: rawSummary.unique_generated_token_hashes,
greedyInSamples: rawSummary.greedy_full_trajectory_in_sample_set,
pairwiseSimilarity: rawSummary.pairwise_token_similarity,
generatedTokens: rawSummary.generated_tokens,
evaluation: evalSummary,
trajectories: samples,
}];
}));
return {
id: source.id,
domain: source.domain,
label: source.label,
sourceCharacters: source.source_characters,
sourceTokens: source.source_tokens,
conditions: conditionRows,
edges: Object.fromEntries(edges.map((edge) => [
edge,
{
...sampling.summary.by_source_edge[source.id][edge],
evaluation: evaluation.summary.by_source_edge[source.id][edge],
},
])),
};
});
const conditionSummary = Object.fromEntries(conditions.map((condition) => {
const sourceConditions = sourceRows.map(
(source) => source.conditions[condition],
);
const assessed = evaluation.summary.by_condition[condition];
return [condition, {
outputs: assessed.outputs,
naturalEos: assessed.natural_eos,
truncated: assessed.budget_truncated,
meanGeneratedTokens: assessed.mean_generated_tokens,
uniqueTrajectoriesAcrossSourceSets: sourceConditions.reduce(
(total, row) => total + row.uniqueTrajectories,
0,
),
fullEightWayDiversitySets: sourceConditions.filter(
(row) => row.uniqueTrajectories === 8,
).length,
greedyIncludedSourceSets: sourceConditions.filter(
(row) => row.greedyInSamples,
).length,
math: assessed.math,
code: assessed.code,
}];
}));
const edgeSummary = Object.fromEntries(edges.map((edge) => {
const rows = sourceRows.map((source) => source.edges[edge]);
return [edge, {
label: edgeLabels[edge],
sources: rows.length,
meanAlignedSimilarity: mean(rows.map(
(row) => row.batch_seed_aligned_similarity.mean,
)),
meanSymmetricNearestSimilarity: mean(rows.map(
(row) => row.symmetric_mean_nearest_neighbor_similarity,
)),
exactHashIntersections: rows.reduce(
(total, row) => total + row.generated_hash_set_intersection,
0,
),
exactHashUnion: rows.reduce(
(total, row) => total + row.generated_hash_set_union,
0,
),
naturalEosDeltaRightMinusLeft: rows.reduce(
(total, row) => (
total + row.natural_eos_count_difference_right_minus_left
),
0,
),
}];
}));
const result = {
schemaVersion: 1,
generatedAt: new Date().toISOString(),
contract: {
protocolId: sampling.protocol_id,
model: sampling.model.repo,
revision: sampling.model.revision,
checkpointIdentity: sampling.model.checkpoint_identity,
conditions,
conditionFactors: sampling.generation_contract.conditions,
edges,
edgeLabels,
sources: sampling.sources.length,
replicates: sampling.seed_contract.executed_base_seeds.length,
baseSeeds: sampling.seed_contract.executed_base_seeds,
decode: {
doSample: sampling.generation_contract.do_sample,
temperature: sampling.generation_contract.temperature,
topP: sampling.generation_contract.top_p,
topK: sampling.generation_contract.top_k,
maxNewTokens: sampling.generation_contract.max_new_tokens,
},
batchSeedAlignedNotCommonRandomNumbers: (
sampling.seed_contract.batch_seed_aligned_not_common_random_numbers
),
counterfactualBoundary: (
sampling.generation_contract.counterfactual_boundary
),
},
headline: {
outputs: sampling.summary.outputs,
naturalEos: sampling.summary.natural_eos,
truncated: sampling.summary.budget_truncated,
uniqueTrajectoryHashes: (
sampling.summary.unique_generated_token_hashes
),
firstTwoSeedComparableCells: (
sampling.summary.first_two_seeds.comparable_cells
),
firstTwoSeedDifferentTrajectories: (
sampling.summary.first_two_seeds.different_trajectories
),
promptHashExact: (
sampling.source_contract.prompt_hash_audit.exact
),
promptHashCells: (
sampling.source_contract.prompt_hash_audit.cells
),
greedyIncludedSourceConditionSets: sourceRows.reduce(
(total, source) => total + conditions.filter(
(condition) => source.conditions[condition].greedyInSamples,
).length,
0,
),
sourceConditionSets: sourceRows.length * conditions.length,
mathExact: evaluation.summary.math.fixed_budget_exact,
mathOutputs: evaluation.summary.math.outputs,
mathMajority: evaluation.summary.math.unique_absolute_majority,
mathGold: evaluation.summary.math.gold,
codePassed: evaluation.summary.code.tests_pass,
codeOutputs: evaluation.summary.code.outputs,
codeUniqueExecutionKeys: (
evaluation.sandbox.unique_code_cache_entries
),
reproducedCells: (
reproduction.summary.all_preregistered_fields_exact
),
reproductionCells: reproduction.summary.cells,
},
conditions: conditionSummary,
edges: edgeSummary,
sources: sourceRows,
reproduction: reproduction.summary,
artifacts: {
sampling: samplingArtifact,
evaluation: evaluationArtifact,
rerun: rerunArtifact,
reproduction: artifact(paths.reproduction),
},
execution: {
generationSeconds: sampling.sources.reduce(
(total, source) => total + source.runs.reduce(
(sourceTotal, run) => sourceTotal + run.generation_seconds,
0,
),
0,
),
peakCudaMemoryAllocatedBytes: (
sampling.execution.peak_cuda_memory_allocated_bytes
),
deviceMap: sampling.execution.device_map,
transformers: sampling.execution.transformers,
torch: sampling.execution.torch,
sandbox: evaluation.sandbox,
},
claimBoundary: [
...sampling.claim_boundary,
...evaluation.claim_boundary,
...reproduction.claim_boundary,
],
};
writeFileSync(
paths.output,
`${JSON.stringify(result, null, 2)}\n`,
);
console.log(JSON.stringify({
output: paths.output,
...artifact(paths.output),
headline: result.headline,
}, null, 2));