7254f7b4d1
Build / Build (macos-latest) (push) Has been cancelled
Build / Build (ubuntu-latest) (push) Has been cancelled
Build / Build (windows-latest) (push) Has been cancelled
Build / Analyze (javascript) (push) Has been cancelled
Build / Analyze (python) (push) Has been cancelled
147 lines
4.8 KiB
JavaScript
147 lines
4.8 KiB
JavaScript
|
|
import * as base from './base.js';
|
|
import * as flatbuffers from './flatbuffers.js';
|
|
|
|
const jax = {};
|
|
|
|
jax.ModelFactory = class {
|
|
|
|
async match(context) {
|
|
const stream = context.stream;
|
|
if (stream && stream.length > 4) {
|
|
const reader = flatbuffers.BinaryReader.open(stream);
|
|
if (reader) {
|
|
return context.set('jax.flatbuffers', reader);
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
async open(context) {
|
|
const reader = context.value;
|
|
jax.schema = await context.require('./jax-schema');
|
|
const exported = jax.schema.jax_export.serialization.Exported.create(reader);
|
|
const mlir_module = exported.mlir_module_serialized;
|
|
let model = null;
|
|
if (mlir_module && mlir_module.length > 0) {
|
|
const buffer = new Uint8Array(mlir_module.buffer, mlir_module.byteOffset, mlir_module.byteLength);
|
|
const stream = new base.BinaryStream(buffer);
|
|
const content = context.context('module.mlirbc', stream);
|
|
const mlir = await import('./mlir.js');
|
|
const factory = new mlir.ModelFactory();
|
|
const type = await factory.match(content);
|
|
if (type) {
|
|
model = await factory.open(content);
|
|
}
|
|
}
|
|
if (!model) {
|
|
model = new jax.Model(exported);
|
|
}
|
|
model.format = `JAX Export v${exported.serialization_version}`;
|
|
if (exported.function_name) {
|
|
model.metadata.push({ name: 'function_name', value: exported.function_name });
|
|
}
|
|
if (exported.calling_convention_version) {
|
|
model.metadata.push({ name: 'calling_convention_version', value: exported.calling_convention_version.toString() });
|
|
}
|
|
return model;
|
|
}
|
|
};
|
|
|
|
jax.Model = class {
|
|
|
|
constructor(exported) {
|
|
this.metadata = [];
|
|
this.modules = [new jax.Graph(exported)];
|
|
}
|
|
};
|
|
|
|
jax.Graph = class {
|
|
|
|
constructor(exported) {
|
|
this.inputs = [];
|
|
this.outputs = [];
|
|
this.nodes = [];
|
|
if (exported.in_avals) {
|
|
for (let i = 0; i < exported.in_avals.length; i++) {
|
|
const aval = exported.in_avals[i];
|
|
const name = `input_${i}`;
|
|
const type = aval ? new jax.TensorType(aval) : null;
|
|
const value = new jax.Value(name, type);
|
|
this.inputs.push(new jax.Argument(name, [value]));
|
|
}
|
|
}
|
|
if (exported.out_avals) {
|
|
for (let i = 0; i < exported.out_avals.length; i++) {
|
|
const aval = exported.out_avals[i];
|
|
const name = `output_${i}`;
|
|
const type = aval ? new jax.TensorType(aval) : null;
|
|
const value = new jax.Value(name, type);
|
|
this.outputs.push(new jax.Argument(name, [value]));
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
jax.Argument = class {
|
|
|
|
constructor(name, value) {
|
|
this.name = name;
|
|
this.value = value;
|
|
}
|
|
};
|
|
|
|
jax.Value = class {
|
|
|
|
constructor(name, type) {
|
|
this.name = name;
|
|
this.type = type || null;
|
|
}
|
|
};
|
|
|
|
jax.TensorType = class {
|
|
|
|
constructor(aval) {
|
|
switch (aval.dtype) {
|
|
case 1: this.dataType = 'bool'; break;
|
|
case 2: this.dataType = 'int8'; break;
|
|
case 3: this.dataType = 'int16'; break;
|
|
case 4: this.dataType = 'int32'; break;
|
|
case 5: this.dataType = 'int64'; break;
|
|
case 6: this.dataType = 'uint8'; break;
|
|
case 7: this.dataType = 'uint16'; break;
|
|
case 8: this.dataType = 'uint32'; break;
|
|
case 9: this.dataType = 'uint64'; break;
|
|
case 10: this.dataType = 'float16'; break;
|
|
case 11: this.dataType = 'float32'; break;
|
|
case 12: this.dataType = 'float64'; break;
|
|
case 13: this.dataType = 'complex64'; break;
|
|
case 14: this.dataType = 'complex128'; break;
|
|
case 15: this.dataType = 'bfloat16'; break;
|
|
case 16: this.dataType = 'int4'; break;
|
|
case 17: this.dataType = 'uint4'; break;
|
|
case 18: this.dataType = 'float8e4m3b11fnuz'; break;
|
|
case 19: this.dataType = 'float8e4m3fn'; break;
|
|
case 20: this.dataType = 'float8e4m3fnuz'; break;
|
|
case 21: this.dataType = 'float8e5m2'; break;
|
|
case 22: this.dataType = 'float8e5m2fnuz'; break;
|
|
default: throw new jax.Error(`Unsupported dtype '${aval.dtype}'.`);
|
|
}
|
|
this.shape = aval.shape && aval.shape.length > 0 ? { dimensions: Array.from(aval.shape) } : null;
|
|
}
|
|
|
|
toString() {
|
|
return this.dataType + (this.shape ? `[${this.shape.dimensions.join(',')}]` : '');
|
|
}
|
|
};
|
|
|
|
jax.Error = class extends Error {
|
|
|
|
constructor(message) {
|
|
super(message);
|
|
this.name = 'Error loading JAX model.';
|
|
}
|
|
};
|
|
|
|
export const ModelFactory = jax.ModelFactory;
|