File size: 8,991 Bytes
05090eb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/* alphaBell Model Observatory trace import checks. No data is changed here. */
(function (root) {
  'use strict';
  const LIMITS = Object.freeze({ frames: 256, context: 2048, tokenText: 8192, prompt: 4000 });
  const EPSILON = 0.00001;
  const object = value => value !== null && typeof value === 'object' && !Array.isArray(value);
  const number = value => typeof value === 'number' && Number.isFinite(value);
  const nonnegative = value => number(value) && value >= 0;
  const probability = value => nonnegative(value) && value <= 1 + EPSILON;
  const integer = (value, minimum, maximum) => Number.isInteger(value) && value >= minimum && value <= maximum;
  const text = value => typeof value === 'string' && value.length <= LIMITS.tokenText;
  function requireValue(condition, message) {
    if (!condition) throw new Error(message);
  }
  function vector(value, length, predicate, message) {
    requireValue(Array.isArray(value) && value.length === length && value.every(predicate), message);
  }
  function validateObservatoryTrace(d, models) {
    requireValue(object(d) && Array.isArray(models), 'This file is not a supported model trace.');
    requireValue(['flint.trace.v1', 'model.trace.v1'].includes(d.schema), 'This file is not a supported model trace.');
    const id = d.model?.id || (d.schema === 'flint.trace.v1' ? 'flint' : null);
    const model = models.find(item => item.id === id);
    requireValue(Boolean(model) && (d.schema !== 'flint.trace.v1' || id === 'flint'), 'The trace identifies an unsupported model.');
    const c = model.architecture;
    requireValue(object(c) && object(d.architecture), 'The trace has no supported architecture.');
    const requiredKeys = [
      'num_hidden_layers', 'num_attention_heads', 'num_key_value_heads', 'hidden_size',
      'head_dim', 'intermediate_size', 'layer_types'
    ];
    const defaultZero = ['num_experts', 'num_experts_per_tok', 'first_k_dense_replace'];
    const defaultArray = ['mlp_only_layers', 'no_rope_layer_indices'];
    const conditionalKeys = [
      'sliding_window', 'moe_intermediate_size', 'shared_expert_intermediate_size',
      'linear_num_key_heads', 'linear_num_value_heads', 'linear_key_head_dim', 'linear_value_head_dim'
    ];
    const mismatch = 'The trace architecture does not match ' + model.short_name + '.';
    for (const key of requiredKeys) {
      requireValue(JSON.stringify(d.architecture[key]) === JSON.stringify(c[key]), mismatch);
    }
    for (const key of defaultZero) requireValue((d.architecture[key] ?? 0) === (c[key] ?? 0), mismatch);
    for (const key of defaultArray) {
      requireValue(JSON.stringify(d.architecture[key] ?? []) === JSON.stringify(c[key] ?? []), mismatch);
    }
    for (const key of conditionalKeys) {
      if (c[key] !== undefined) requireValue(d.architecture[key] === c[key], mismatch);
    }
    if (d.model?.quantization !== undefined) {
      requireValue(d.model.quantization === model.quantization, 'The trace quantization does not match the selected model.');
    }
    requireValue(Array.isArray(d.frames) && d.frames.length > 0 && d.frames.length <= LIMITS.frames,
      'The trace must contain between 1 and 256 measured frames.');
    requireValue(object(d.start) && Array.isArray(d.start.tokens) && d.start.tokens.length > 0 &&
      d.start.tokens.length <= LIMITS.context && d.start.tokens.every(text), 'The trace has invalid prompt tokens.');
    if (d.start.prompt_tokens !== undefined) {
      requireValue(d.start.prompt_tokens === d.start.tokens.length, 'The trace prompt-token count is inconsistent.');
    }
    if (d.prompt !== undefined) {
      requireValue(typeof d.prompt === 'string' && d.prompt.length <= LIMITS.prompt, 'The trace prompt is invalid.');
    }
    if (d.settings !== undefined) {
      requireValue(object(d.settings), 'The trace settings are invalid.');
      const settings = d.settings;
      if (settings.max_tokens !== undefined) requireValue(integer(settings.max_tokens, 1, LIMITS.frames), 'The output limit is invalid.');
      if (settings.temperature !== undefined) requireValue(nonnegative(settings.temperature) && settings.temperature <= 1.5, 'The temperature is invalid.');
      if (settings.seed !== undefined) requireValue(integer(settings.seed, 0, 2147483647), 'The seed is invalid.');
      if (settings.reasoning !== undefined) requireValue(typeof settings.reasoning === 'boolean', 'The reasoning setting is invalid.');
    }
    let previousElapsed = -1;
    for (let frameIndex = 0; frameIndex < d.frames.length; frameIndex++) {
      const f = d.frames[frameIndex];
      requireValue(object(f) && text(f.text), 'The trace contains invalid token text.');
      requireValue(integer(f.input_position, 0, LIMITS.context - 1) &&
        f.input_position === d.start.tokens.length - 1 + frameIndex, 'The trace input position is inconsistent.');
      if (f.model !== undefined) requireValue(f.model === id, 'A trace frame identifies a different model.');
      if (f.step !== undefined) requireValue(f.step === frameIndex, 'The trace token order is inconsistent.');
      requireValue(integer(f.token_id, 0, (c.vocab_size || Number.MAX_SAFE_INTEGER) - 1), 'The trace contains an invalid token ID.');
      requireValue(nonnegative(f.duration) && nonnegative(f.elapsed) && f.elapsed >= previousElapsed,
        'The trace contains invalid token timings.');
      previousElapsed = f.elapsed;
      if (f.input_text !== undefined) requireValue(text(f.input_text), 'The trace contains invalid input-token text.');
      if (f.token_bytes !== undefined) {
        requireValue(Array.isArray(f.token_bytes) && f.token_bytes.length <= LIMITS.tokenText &&
          f.token_bytes.every(value => integer(value, 0, 255)), 'The trace contains invalid token bytes.');
      }
      requireValue(Array.isArray(f.layers) && f.layers.length === c.num_hidden_layers, 'The trace contains an incomplete frame.');
      for (let i = 0; i < c.num_hidden_layers; i++) {
        const l = f.layers[i];
        const linear = c.layer_types[i] === 'linear_attention';
        const heads = linear ? c.linear_num_value_heads : c.num_attention_heads;
        const moe = Boolean(c.num_experts) && !(c.mlp_only_layers || []).includes(i) && i >= (c.first_k_dense_replace || 0);
        requireValue(object(l), 'The trace contains an invalid layer.');
        if (l.index !== undefined) requireValue(l.index === i, 'The trace layer order is inconsistent.');
        vector(l.heads, heads, nonnegative, 'The trace contains invalid head measurements.');
        requireValue(nonnegative(l.ffn) && nonnegative(l.residual), 'The trace contains invalid layer output measurements.');
        if (moe) {
          vector(l.experts, c.num_experts_per_tok, value => integer(value, 0, c.num_experts - 1), 'The trace contains invalid expert routing.');
          requireValue(new Set(l.experts).size === c.num_experts_per_tok, 'The trace repeats a routed expert.');
          vector(l.weights, c.num_experts_per_tok, probability, 'The trace contains invalid expert weights.');
          requireValue(Math.abs(l.weights.reduce((sum, value) => sum + value, 0) - 1) <= 0.0001,
            'The trace expert weights are not normalized.');
          requireValue(nonnegative(l.shared) && nonnegative(l.routed), 'The trace contains invalid expert output measurements.');
        }
        if (linear) {
          vector(l.write_gate, heads, probability, 'The trace contains invalid write gates.');
          vector(l.retention, heads, probability, 'The trace contains invalid retention gates.');
          vector(l.state_rms, heads, nonnegative, 'The trace contains invalid recurrent state measurements.');
        } else {
          vector(l.attention, heads, object, 'The trace contains invalid attention measurements.');
          for (const a of l.attention) {
            requireValue(nonnegative(a.entropy), 'The trace contains invalid attention entropy.');
            if (model.learned_sink || a.sink !== undefined) {
              requireValue(probability(a.sink), 'The trace contains an invalid attention sink.');
            }
            requireValue(Array.isArray(a.top) && a.top.length <= 8 && a.top.length > 0 &&
              a.top.every(pair => Array.isArray(pair) && pair.length === 2 && integer(pair[0], 0, f.input_position) && probability(pair[1])),
            'The trace contains invalid attention positions.');
            requireValue(new Set(a.top.map(pair => pair[0])).size === a.top.length,
              'The trace repeats an attention position.');
            requireValue(a.top.reduce((sum, pair) => sum + pair[1], 0) + (a.sink || 0) <= 1 + EPSILON,
              'The trace attention mass exceeds one.');
          }
        }
      }
    }
    return model;
  }
  root.validateObservatoryTrace = validateObservatoryTrace;
  if (typeof module !== 'undefined' && module.exports) module.exports = { validateObservatoryTrace, LIMITS };
})(typeof globalThis !== 'undefined' ? globalThis : this);