warpvector 0.1.1 → 0.1.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/index.d.mts +13 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +253 -89
- package/dist/index.mjs +253 -89
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -533,6 +533,7 @@ declare class MlpAdapter implements WarpAdapter {
|
|
|
533
533
|
private layerDimsPtr;
|
|
534
534
|
private activationsPtr;
|
|
535
535
|
private bufferPtr;
|
|
536
|
+
private bufBPtr;
|
|
536
537
|
constructor(layers: MlpLayer[]);
|
|
537
538
|
/**
|
|
538
539
|
* WASMの初期化と、MLP構造をWASMメモリに書き込む準備を行います。
|
|
@@ -585,6 +586,10 @@ declare class WhiteningAdapter implements WarpAdapter {
|
|
|
585
586
|
private count;
|
|
586
587
|
private learningRate;
|
|
587
588
|
private numComponents;
|
|
589
|
+
private componentsPtr;
|
|
590
|
+
private xResidualPtr;
|
|
591
|
+
private isWasmReady;
|
|
592
|
+
init(): Promise<void>;
|
|
588
593
|
/**
|
|
589
594
|
* 新しい WhiteningAdapter を作成します。
|
|
590
595
|
* @param dim ベクトルの次元数
|
|
@@ -837,6 +842,12 @@ interface QuantizationConfig {
|
|
|
837
842
|
* 量子化するベクトルの次元数
|
|
838
843
|
*/
|
|
839
844
|
dim: number;
|
|
845
|
+
/**
|
|
846
|
+
* 動的キャリブレーション(スケール算出)を有効にするか。
|
|
847
|
+
* trueの場合、ベクトルの絶対値の最大値 max(abs(v)) を算出し、
|
|
848
|
+
* scale = 127 / max(abs(v)) を用いて量子化します。
|
|
849
|
+
*/
|
|
850
|
+
dynamic?: boolean;
|
|
840
851
|
}
|
|
841
852
|
/**
|
|
842
853
|
* QuantizationAdapter は、Float32のベクトルを Int8 や Binary に圧縮し、
|
|
@@ -845,6 +856,7 @@ interface QuantizationConfig {
|
|
|
845
856
|
declare class QuantizationAdapter implements WarpAdapter {
|
|
846
857
|
private type;
|
|
847
858
|
private dim;
|
|
859
|
+
private dynamic;
|
|
848
860
|
constructor(config: QuantizationConfig);
|
|
849
861
|
tune(vector: number[] | Float32Array): Int8Array | Uint8Array;
|
|
850
862
|
/**
|
|
@@ -854,6 +866,7 @@ declare class QuantizationAdapter implements WarpAdapter {
|
|
|
854
866
|
static hammingDistance(a: Uint8Array, b: Uint8Array): number;
|
|
855
867
|
/**
|
|
856
868
|
* Int8量子化された2つのベクトル間のドット積(内積)を計算します。
|
|
869
|
+
* 動的スケーリングが埋め込まれている場合はスケールを戻して計算します。
|
|
857
870
|
*/
|
|
858
871
|
static int8DotProduct(a: Int8Array, b: Int8Array): number;
|
|
859
872
|
exportState(): string;
|
package/dist/index.d.ts
CHANGED
|
@@ -533,6 +533,7 @@ declare class MlpAdapter implements WarpAdapter {
|
|
|
533
533
|
private layerDimsPtr;
|
|
534
534
|
private activationsPtr;
|
|
535
535
|
private bufferPtr;
|
|
536
|
+
private bufBPtr;
|
|
536
537
|
constructor(layers: MlpLayer[]);
|
|
537
538
|
/**
|
|
538
539
|
* WASMの初期化と、MLP構造をWASMメモリに書き込む準備を行います。
|
|
@@ -585,6 +586,10 @@ declare class WhiteningAdapter implements WarpAdapter {
|
|
|
585
586
|
private count;
|
|
586
587
|
private learningRate;
|
|
587
588
|
private numComponents;
|
|
589
|
+
private componentsPtr;
|
|
590
|
+
private xResidualPtr;
|
|
591
|
+
private isWasmReady;
|
|
592
|
+
init(): Promise<void>;
|
|
588
593
|
/**
|
|
589
594
|
* 新しい WhiteningAdapter を作成します。
|
|
590
595
|
* @param dim ベクトルの次元数
|
|
@@ -837,6 +842,12 @@ interface QuantizationConfig {
|
|
|
837
842
|
* 量子化するベクトルの次元数
|
|
838
843
|
*/
|
|
839
844
|
dim: number;
|
|
845
|
+
/**
|
|
846
|
+
* 動的キャリブレーション(スケール算出)を有効にするか。
|
|
847
|
+
* trueの場合、ベクトルの絶対値の最大値 max(abs(v)) を算出し、
|
|
848
|
+
* scale = 127 / max(abs(v)) を用いて量子化します。
|
|
849
|
+
*/
|
|
850
|
+
dynamic?: boolean;
|
|
840
851
|
}
|
|
841
852
|
/**
|
|
842
853
|
* QuantizationAdapter は、Float32のベクトルを Int8 や Binary に圧縮し、
|
|
@@ -845,6 +856,7 @@ interface QuantizationConfig {
|
|
|
845
856
|
declare class QuantizationAdapter implements WarpAdapter {
|
|
846
857
|
private type;
|
|
847
858
|
private dim;
|
|
859
|
+
private dynamic;
|
|
848
860
|
constructor(config: QuantizationConfig);
|
|
849
861
|
tune(vector: number[] | Float32Array): Int8Array | Uint8Array;
|
|
850
862
|
/**
|
|
@@ -854,6 +866,7 @@ declare class QuantizationAdapter implements WarpAdapter {
|
|
|
854
866
|
static hammingDistance(a: Uint8Array, b: Uint8Array): number;
|
|
855
867
|
/**
|
|
856
868
|
* Int8量子化された2つのベクトル間のドット積(内積)を計算します。
|
|
869
|
+
* 動的スケーリングが埋め込まれている場合はスケールを戻して計算します。
|
|
857
870
|
*/
|
|
858
871
|
static int8DotProduct(a: Int8Array, b: Int8Array): number;
|
|
859
872
|
exportState(): string;
|
package/dist/index.js
CHANGED
|
@@ -829,7 +829,7 @@ function applyAffine(matrix, bias, vector, result, inDim, outDim = inDim) {
|
|
|
829
829
|
}
|
|
830
830
|
|
|
831
831
|
// src/wasm/wasm-binary.ts
|
|
832
|
-
var wasmBase64 = "
|
|
832
|
+
var wasmBase64 = "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";
|
|
833
833
|
|
|
834
834
|
// src/wasm/wasm-loader.ts
|
|
835
835
|
var wasmInstance = null;
|
|
@@ -867,6 +867,22 @@ function ensureWasmMemory(requiredBytes) {
|
|
|
867
867
|
return false;
|
|
868
868
|
}
|
|
869
869
|
}
|
|
870
|
+
var globalOffset = 65536;
|
|
871
|
+
function allocateWasmMemory(bytes) {
|
|
872
|
+
const ptr = globalOffset;
|
|
873
|
+
globalOffset += bytes;
|
|
874
|
+
if (globalOffset % 4 !== 0) {
|
|
875
|
+
globalOffset += 4 - globalOffset % 4;
|
|
876
|
+
}
|
|
877
|
+
ensureWasmMemory(globalOffset);
|
|
878
|
+
return ptr;
|
|
879
|
+
}
|
|
880
|
+
function getWasmAllocatorOffset() {
|
|
881
|
+
return globalOffset;
|
|
882
|
+
}
|
|
883
|
+
function setWasmAllocatorOffset(offset) {
|
|
884
|
+
globalOffset = offset;
|
|
885
|
+
}
|
|
870
886
|
function writeFloat32ArrayToWasm(memory, data, byteOffset) {
|
|
871
887
|
const f32 = new Float32Array(memory.buffer);
|
|
872
888
|
const floatOffset = byteOffset / 4;
|
|
@@ -1706,6 +1722,7 @@ var MlpAdapter = class _MlpAdapter {
|
|
|
1706
1722
|
layerDimsPtr = 0;
|
|
1707
1723
|
activationsPtr = 0;
|
|
1708
1724
|
bufferPtr = 0;
|
|
1725
|
+
bufBPtr = 0;
|
|
1709
1726
|
constructor(layers) {
|
|
1710
1727
|
if (layers.length === 0) {
|
|
1711
1728
|
throw new Error("MlpAdapter requires at least one layer.");
|
|
@@ -1756,21 +1773,13 @@ var MlpAdapter = class _MlpAdapter {
|
|
|
1756
1773
|
}
|
|
1757
1774
|
this.inputDim = layerDims[0];
|
|
1758
1775
|
this.outputDim = layerDims[layerDims.length - 1];
|
|
1759
|
-
|
|
1760
|
-
this.
|
|
1761
|
-
|
|
1762
|
-
this.
|
|
1763
|
-
|
|
1764
|
-
this.
|
|
1765
|
-
|
|
1766
|
-
this.activationsPtr = offset;
|
|
1767
|
-
offset += this.numLayers * 4;
|
|
1768
|
-
if (offset % 4 !== 0) offset += 4 - offset % 4;
|
|
1769
|
-
this.weightsPtr = offset;
|
|
1770
|
-
offset += totalWeights * 4;
|
|
1771
|
-
this.bufferPtr = offset;
|
|
1772
|
-
offset += maxDim * 8 + 8192;
|
|
1773
|
-
ensureWasmMemory(offset);
|
|
1776
|
+
this.inputPtr = allocateWasmMemory(this.inputDim * 4);
|
|
1777
|
+
this.outputPtr = allocateWasmMemory(this.outputDim * 4);
|
|
1778
|
+
this.layerDimsPtr = allocateWasmMemory((this.numLayers + 1) * 4);
|
|
1779
|
+
this.activationsPtr = allocateWasmMemory(this.numLayers * 4);
|
|
1780
|
+
this.weightsPtr = allocateWasmMemory(totalWeights * 4);
|
|
1781
|
+
this.bufferPtr = allocateWasmMemory(maxDim * 4);
|
|
1782
|
+
this.bufBPtr = allocateWasmMemory(maxDim * 4);
|
|
1774
1783
|
const memoryBuffer = memory.buffer;
|
|
1775
1784
|
const f32 = new Float32Array(memoryBuffer);
|
|
1776
1785
|
const i32 = new Int32Array(memoryBuffer);
|
|
@@ -1830,7 +1839,8 @@ var MlpAdapter = class _MlpAdapter {
|
|
|
1830
1839
|
this.layerDimsPtr,
|
|
1831
1840
|
this.activationsPtr,
|
|
1832
1841
|
this.numLayers,
|
|
1833
|
-
this.bufferPtr
|
|
1842
|
+
this.bufferPtr,
|
|
1843
|
+
this.bufBPtr
|
|
1834
1844
|
);
|
|
1835
1845
|
const result = new Float32Array(this.outputDim);
|
|
1836
1846
|
const outF32 = new Float32Array(memory.buffer);
|
|
@@ -1884,6 +1894,19 @@ var WhiteningAdapter = class _WhiteningAdapter {
|
|
|
1884
1894
|
count = 0;
|
|
1885
1895
|
learningRate;
|
|
1886
1896
|
numComponents;
|
|
1897
|
+
componentsPtr = 0;
|
|
1898
|
+
xResidualPtr = 0;
|
|
1899
|
+
isWasmReady = false;
|
|
1900
|
+
async init() {
|
|
1901
|
+
const instance = await initWasm();
|
|
1902
|
+
if (instance) {
|
|
1903
|
+
const componentsSize = this.numComponents * this.dim * 4;
|
|
1904
|
+
const xResidualSize = this.dim * 4;
|
|
1905
|
+
this.componentsPtr = allocateWasmMemory(componentsSize);
|
|
1906
|
+
this.xResidualPtr = allocateWasmMemory(xResidualSize);
|
|
1907
|
+
this.isWasmReady = true;
|
|
1908
|
+
}
|
|
1909
|
+
}
|
|
1887
1910
|
/**
|
|
1888
1911
|
* 新しい WhiteningAdapter を作成します。
|
|
1889
1912
|
* @param dim ベクトルの次元数
|
|
@@ -1927,13 +1950,17 @@ var WhiteningAdapter = class _WhiteningAdapter {
|
|
|
1927
1950
|
}
|
|
1928
1951
|
const x_residual = new Float32Array(x);
|
|
1929
1952
|
const instance = getWasmInstance();
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1953
|
+
if (instance && instance.exports.sangerUpdateWasm) {
|
|
1954
|
+
if (!this.isWasmReady) {
|
|
1955
|
+
const componentsSize = this.numComponents * this.dim * 4;
|
|
1956
|
+
const xResidualSize = this.dim * 4;
|
|
1957
|
+
this.componentsPtr = allocateWasmMemory(componentsSize);
|
|
1958
|
+
this.xResidualPtr = allocateWasmMemory(xResidualSize);
|
|
1959
|
+
this.isWasmReady = true;
|
|
1960
|
+
}
|
|
1934
1961
|
const memory = instance.exports.memory;
|
|
1935
|
-
const componentsPtr =
|
|
1936
|
-
const xResidualPtr =
|
|
1962
|
+
const componentsPtr = this.componentsPtr;
|
|
1963
|
+
const xResidualPtr = this.xResidualPtr;
|
|
1937
1964
|
const f32 = new Float32Array(memory.buffer);
|
|
1938
1965
|
for (let k = 0; k < this.numComponents; k++) {
|
|
1939
1966
|
const comp = this.components[k];
|
|
@@ -2048,19 +2075,22 @@ var ColbertAdapter = class {
|
|
|
2048
2075
|
const { memory, colbertMaxSimWasm } = this.wasm.exports;
|
|
2049
2076
|
const queryBytes = queryTokens.byteLength;
|
|
2050
2077
|
const docBytes = documentTokens.byteLength;
|
|
2051
|
-
const
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2078
|
+
const initialOffset = getWasmAllocatorOffset();
|
|
2079
|
+
try {
|
|
2080
|
+
const queryPtr = allocateWasmMemory(queryBytes);
|
|
2081
|
+
const docPtr = allocateWasmMemory(docBytes);
|
|
2082
|
+
writeFloat32ArrayToWasm(memory, queryTokens, queryPtr);
|
|
2083
|
+
writeFloat32ArrayToWasm(memory, documentTokens, docPtr);
|
|
2084
|
+
return colbertMaxSimWasm(
|
|
2085
|
+
queryPtr,
|
|
2086
|
+
docPtr,
|
|
2087
|
+
numQueryTokens,
|
|
2088
|
+
numDocTokens,
|
|
2089
|
+
dim
|
|
2090
|
+
);
|
|
2091
|
+
} finally {
|
|
2092
|
+
setWasmAllocatorOffset(initialOffset);
|
|
2093
|
+
}
|
|
2064
2094
|
}
|
|
2065
2095
|
/**
|
|
2066
2096
|
* クエリと複数のドキュメント間の MaxSim スコアを計算し、スコアの降順にソートして返します。
|
|
@@ -2084,27 +2114,30 @@ var ColbertAdapter = class {
|
|
|
2084
2114
|
}
|
|
2085
2115
|
const queryBytes = queryTokens.byteLength;
|
|
2086
2116
|
const maxDocBytes = maxDocLen * Float32Array.BYTES_PER_ELEMENT;
|
|
2087
|
-
const
|
|
2088
|
-
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
|
|
2106
|
-
|
|
2107
|
-
|
|
2117
|
+
const initialOffset = getWasmAllocatorOffset();
|
|
2118
|
+
try {
|
|
2119
|
+
const queryPtr = allocateWasmMemory(queryBytes);
|
|
2120
|
+
const docPtr = allocateWasmMemory(maxDocBytes);
|
|
2121
|
+
writeFloat32ArrayToWasm(memory, queryTokens, queryPtr);
|
|
2122
|
+
const results = documentTokensArray.map((doc, index) => {
|
|
2123
|
+
const numDocTokens = doc.length / dim;
|
|
2124
|
+
if (numDocTokens % 1 !== 0) {
|
|
2125
|
+
throw new Error(`Invalid documentTokens length at index ${index}`);
|
|
2126
|
+
}
|
|
2127
|
+
writeFloat32ArrayToWasm(memory, doc, docPtr);
|
|
2128
|
+
const score = colbertMaxSimWasm(
|
|
2129
|
+
queryPtr,
|
|
2130
|
+
docPtr,
|
|
2131
|
+
numQueryTokens,
|
|
2132
|
+
numDocTokens,
|
|
2133
|
+
dim
|
|
2134
|
+
);
|
|
2135
|
+
return { index, score };
|
|
2136
|
+
});
|
|
2137
|
+
return results.sort((a, b) => b.score - a.score);
|
|
2138
|
+
} finally {
|
|
2139
|
+
setWasmAllocatorOffset(initialOffset);
|
|
2140
|
+
}
|
|
2108
2141
|
}
|
|
2109
2142
|
};
|
|
2110
2143
|
|
|
@@ -2124,6 +2157,13 @@ var VectorDBAdapter = class {
|
|
|
2124
2157
|
* @returns {string} `'[0.1, 0.2, 0.3]'` のような文字列表現
|
|
2125
2158
|
*/
|
|
2126
2159
|
static toPgvector(vector) {
|
|
2160
|
+
if (vector instanceof Uint8Array) {
|
|
2161
|
+
let bitString = "";
|
|
2162
|
+
for (let i = 0; i < vector.length; i++) {
|
|
2163
|
+
bitString += vector[i].toString(2).padStart(8, "0");
|
|
2164
|
+
}
|
|
2165
|
+
return bitString;
|
|
2166
|
+
}
|
|
2127
2167
|
return `[${Array.from(vector).join(", ")}]`;
|
|
2128
2168
|
}
|
|
2129
2169
|
/**
|
|
@@ -2187,18 +2227,37 @@ var withWarpVector = (config) => {
|
|
|
2187
2227
|
*/
|
|
2188
2228
|
async searchByVector(args) {
|
|
2189
2229
|
const context = import_extension.Prisma.getExtensionContext(this);
|
|
2190
|
-
const tableName = context.$name;
|
|
2230
|
+
const tableName = context.$name || "document";
|
|
2231
|
+
if (!/^[a-zA-Z0-9_]+$/.test(tableName)) {
|
|
2232
|
+
throw new Error(`Invalid table name: ${tableName}`);
|
|
2233
|
+
}
|
|
2234
|
+
if (!/^[a-zA-Z0-9_]+$/.test(vectorField)) {
|
|
2235
|
+
throw new Error(`Invalid vector field name: ${vectorField}`);
|
|
2236
|
+
}
|
|
2237
|
+
if (!["<->", "<#>", "<=>"].includes(distanceOp)) {
|
|
2238
|
+
throw new Error(`Invalid distance operator: ${distanceOp}`);
|
|
2239
|
+
}
|
|
2240
|
+
let whereClause = "";
|
|
2241
|
+
if (args.where) {
|
|
2242
|
+
const trimmedWhere = args.where.trim();
|
|
2243
|
+
if (/;|--|\/\*/.test(trimmedWhere)) {
|
|
2244
|
+
throw new Error("Potential SQL injection detected in where clause.");
|
|
2245
|
+
}
|
|
2246
|
+
whereClause = `WHERE ${trimmedWhere}`;
|
|
2247
|
+
}
|
|
2248
|
+
const limit = args.topK ?? 10;
|
|
2249
|
+
if (typeof limit !== "number" || isNaN(limit) || limit < 0) {
|
|
2250
|
+
throw new Error("Invalid topK value.");
|
|
2251
|
+
}
|
|
2191
2252
|
const tunedVector = config.adapter.tune(args.vector);
|
|
2192
2253
|
const pgVectorStr = VectorDBAdapter.toPgvector(tunedVector);
|
|
2193
|
-
const limit = args.topK ?? 10;
|
|
2194
|
-
const whereClause = args.where ? `WHERE ${args.where}` : "";
|
|
2195
2254
|
const sql = `
|
|
2196
2255
|
SELECT *
|
|
2197
2256
|
FROM "${tableName}"
|
|
2198
2257
|
${whereClause}
|
|
2199
2258
|
ORDER BY "${vectorField}" ${distanceOp} '${pgVectorStr}'::vector
|
|
2200
2259
|
LIMIT ${limit};
|
|
2201
|
-
|
|
2260
|
+
`.trim();
|
|
2202
2261
|
return client.$queryRawUnsafe(sql);
|
|
2203
2262
|
}
|
|
2204
2263
|
}
|
|
@@ -2570,9 +2629,11 @@ var WarpLlamaIndexEmbeddings = class {
|
|
|
2570
2629
|
var QuantizationAdapter = class _QuantizationAdapter {
|
|
2571
2630
|
type;
|
|
2572
2631
|
dim;
|
|
2632
|
+
dynamic;
|
|
2573
2633
|
constructor(config) {
|
|
2574
2634
|
this.type = config.type;
|
|
2575
2635
|
this.dim = config.dim;
|
|
2636
|
+
this.dynamic = config.dynamic ?? false;
|
|
2576
2637
|
if (this.type === "binary" && this.dim % 8 !== 0) {
|
|
2577
2638
|
throw new Error(
|
|
2578
2639
|
`Binary quantization requires dimension to be a multiple of 8. Got ${this.dim}`
|
|
@@ -2582,14 +2643,33 @@ var QuantizationAdapter = class _QuantizationAdapter {
|
|
|
2582
2643
|
tune(vector) {
|
|
2583
2644
|
assertDimension(vector, this.dim, "QuantizationAdapter.tune");
|
|
2584
2645
|
if (this.type === "int8") {
|
|
2585
|
-
|
|
2586
|
-
|
|
2587
|
-
let
|
|
2588
|
-
|
|
2589
|
-
|
|
2590
|
-
|
|
2646
|
+
if (this.dynamic) {
|
|
2647
|
+
let maxVal = 1e-8;
|
|
2648
|
+
for (let i = 0; i < this.dim; i++) {
|
|
2649
|
+
const abs = Math.abs(vector[i]);
|
|
2650
|
+
if (abs > maxVal) maxVal = abs;
|
|
2651
|
+
}
|
|
2652
|
+
const scale = 127 / maxVal;
|
|
2653
|
+
const result = new Int8Array(this.dim + 4);
|
|
2654
|
+
for (let i = 0; i < this.dim; i++) {
|
|
2655
|
+
let val = Math.round(vector[i] * scale);
|
|
2656
|
+
if (val > 127) val = 127;
|
|
2657
|
+
if (val < -128) val = -128;
|
|
2658
|
+
result[i] = val;
|
|
2659
|
+
}
|
|
2660
|
+
const view = new DataView(result.buffer, result.byteOffset, result.byteLength);
|
|
2661
|
+
view.setFloat32(this.dim, maxVal, true);
|
|
2662
|
+
return result;
|
|
2663
|
+
} else {
|
|
2664
|
+
const result = new Int8Array(this.dim);
|
|
2665
|
+
for (let i = 0; i < this.dim; i++) {
|
|
2666
|
+
let val = Math.round(vector[i] * 127);
|
|
2667
|
+
if (val > 127) val = 127;
|
|
2668
|
+
if (val < -128) val = -128;
|
|
2669
|
+
result[i] = val;
|
|
2670
|
+
}
|
|
2671
|
+
return result;
|
|
2591
2672
|
}
|
|
2592
|
-
return result;
|
|
2593
2673
|
} else if (this.type === "binary") {
|
|
2594
2674
|
const bytesLength = this.dim / 8;
|
|
2595
2675
|
const result = new Uint8Array(bytesLength);
|
|
@@ -2622,17 +2702,45 @@ var QuantizationAdapter = class _QuantizationAdapter {
|
|
|
2622
2702
|
}
|
|
2623
2703
|
/**
|
|
2624
2704
|
* Int8量子化された2つのベクトル間のドット積(内積)を計算します。
|
|
2705
|
+
* 動的スケーリングが埋め込まれている場合はスケールを戻して計算します。
|
|
2625
2706
|
*/
|
|
2626
2707
|
static int8DotProduct(a, b) {
|
|
2627
2708
|
if (a.length !== b.length) throw new Error("Length mismatch");
|
|
2628
|
-
|
|
2629
|
-
|
|
2630
|
-
|
|
2709
|
+
const hasScaleBytes = a.length > 4;
|
|
2710
|
+
let isDynamic = false;
|
|
2711
|
+
let maxA = 1;
|
|
2712
|
+
let maxB = 1;
|
|
2713
|
+
if (hasScaleBytes) {
|
|
2714
|
+
const dim = a.length - 4;
|
|
2715
|
+
try {
|
|
2716
|
+
const viewA = new DataView(a.buffer, a.byteOffset, a.byteLength);
|
|
2717
|
+
const viewB = new DataView(b.buffer, b.byteOffset, b.byteLength);
|
|
2718
|
+
maxA = viewA.getFloat32(dim, true);
|
|
2719
|
+
maxB = viewB.getFloat32(dim, true);
|
|
2720
|
+
if (!isNaN(maxA) && !isNaN(maxB) && maxA > 0 && maxA < 1e3 && maxB > 0 && maxB < 1e3) {
|
|
2721
|
+
isDynamic = true;
|
|
2722
|
+
}
|
|
2723
|
+
} catch (e) {
|
|
2724
|
+
isDynamic = false;
|
|
2725
|
+
}
|
|
2726
|
+
}
|
|
2727
|
+
if (isDynamic) {
|
|
2728
|
+
const dim = a.length - 4;
|
|
2729
|
+
let dot = 0;
|
|
2730
|
+
for (let i = 0; i < dim; i++) {
|
|
2731
|
+
dot += a[i] * b[i];
|
|
2732
|
+
}
|
|
2733
|
+
return dot * (maxA / 127) * (maxB / 127);
|
|
2734
|
+
} else {
|
|
2735
|
+
let dot = 0;
|
|
2736
|
+
for (let i = 0; i < a.length; i++) {
|
|
2737
|
+
dot += a[i] * b[i];
|
|
2738
|
+
}
|
|
2739
|
+
return dot;
|
|
2631
2740
|
}
|
|
2632
|
-
return dot;
|
|
2633
2741
|
}
|
|
2634
2742
|
exportState() {
|
|
2635
|
-
return JSON.stringify({ type: this.type, dim: this.dim });
|
|
2743
|
+
return JSON.stringify({ type: this.type, dim: this.dim, dynamic: this.dynamic });
|
|
2636
2744
|
}
|
|
2637
2745
|
static importState(stateJson) {
|
|
2638
2746
|
const config = JSON.parse(stateJson);
|
|
@@ -2667,22 +2775,78 @@ var AbstractAdamTrainer = class {
|
|
|
2667
2775
|
const beta1 = 0.9;
|
|
2668
2776
|
const beta2 = 0.999;
|
|
2669
2777
|
const epsilon = 1e-8;
|
|
2670
|
-
|
|
2671
|
-
|
|
2672
|
-
|
|
2673
|
-
|
|
2674
|
-
const
|
|
2675
|
-
const
|
|
2676
|
-
|
|
2677
|
-
const
|
|
2678
|
-
|
|
2679
|
-
const
|
|
2680
|
-
const
|
|
2681
|
-
|
|
2682
|
-
|
|
2683
|
-
const
|
|
2684
|
-
const
|
|
2685
|
-
|
|
2778
|
+
const instance = getWasmInstance();
|
|
2779
|
+
if (instance && instance.exports.adamUpdateWasm) {
|
|
2780
|
+
const memory = instance.exports.memory;
|
|
2781
|
+
const matrixBytes = matrix.byteLength;
|
|
2782
|
+
const biasBytes = bias.byteLength;
|
|
2783
|
+
const inputBytes = sDim * 4;
|
|
2784
|
+
const gradBytes = tDim * 4;
|
|
2785
|
+
const initialOffset = getWasmAllocatorOffset();
|
|
2786
|
+
try {
|
|
2787
|
+
const matrixPtr = allocateWasmMemory(matrixBytes);
|
|
2788
|
+
const biasPtr = allocateWasmMemory(biasBytes);
|
|
2789
|
+
const mMatrixPtr = allocateWasmMemory(matrixBytes);
|
|
2790
|
+
const vMatrixPtr = allocateWasmMemory(matrixBytes);
|
|
2791
|
+
const mBiasPtr = allocateWasmMemory(biasBytes);
|
|
2792
|
+
const vBiasPtr = allocateWasmMemory(biasBytes);
|
|
2793
|
+
const inputPtr = allocateWasmMemory(inputBytes);
|
|
2794
|
+
const gradPtr = allocateWasmMemory(gradBytes);
|
|
2795
|
+
writeFloat32ArrayToWasm(memory, matrix, matrixPtr);
|
|
2796
|
+
writeFloat32ArrayToWasm(memory, bias, biasPtr);
|
|
2797
|
+
writeFloat32ArrayToWasm(memory, mMatrix, mMatrixPtr);
|
|
2798
|
+
writeFloat32ArrayToWasm(memory, vMatrix, vMatrixPtr);
|
|
2799
|
+
writeFloat32ArrayToWasm(memory, mBias, mBiasPtr);
|
|
2800
|
+
writeFloat32ArrayToWasm(memory, vBias, vBiasPtr);
|
|
2801
|
+
writeFloat32ArrayToWasm(memory, input, inputPtr);
|
|
2802
|
+
writeFloat32ArrayToWasm(memory, outputGradients, gradPtr);
|
|
2803
|
+
const adamUpdateWasm = instance.exports.adamUpdateWasm;
|
|
2804
|
+
adamUpdateWasm(
|
|
2805
|
+
matrixPtr,
|
|
2806
|
+
biasPtr,
|
|
2807
|
+
mMatrixPtr,
|
|
2808
|
+
vMatrixPtr,
|
|
2809
|
+
mBiasPtr,
|
|
2810
|
+
vBiasPtr,
|
|
2811
|
+
inputPtr,
|
|
2812
|
+
gradPtr,
|
|
2813
|
+
lr,
|
|
2814
|
+
reg,
|
|
2815
|
+
beta1,
|
|
2816
|
+
beta2,
|
|
2817
|
+
epsilon,
|
|
2818
|
+
t,
|
|
2819
|
+
sDim,
|
|
2820
|
+
tDim
|
|
2821
|
+
);
|
|
2822
|
+
const f32 = new Float32Array(memory.buffer);
|
|
2823
|
+
matrix.set(f32.subarray(matrixPtr / 4, matrixPtr / 4 + matrix.length));
|
|
2824
|
+
bias.set(f32.subarray(biasPtr / 4, biasPtr / 4 + bias.length));
|
|
2825
|
+
mMatrix.set(f32.subarray(mMatrixPtr / 4, mMatrixPtr / 4 + mMatrix.length));
|
|
2826
|
+
vMatrix.set(f32.subarray(vMatrixPtr / 4, vMatrixPtr / 4 + vMatrix.length));
|
|
2827
|
+
mBias.set(f32.subarray(mBiasPtr / 4, mBiasPtr / 4 + mBias.length));
|
|
2828
|
+
vBias.set(f32.subarray(vBiasPtr / 4, vBiasPtr / 4 + vBias.length));
|
|
2829
|
+
} finally {
|
|
2830
|
+
setWasmAllocatorOffset(initialOffset);
|
|
2831
|
+
}
|
|
2832
|
+
} else {
|
|
2833
|
+
for (let i = 0; i < tDim; i++) {
|
|
2834
|
+
const bGrad = outputGradients[i];
|
|
2835
|
+
mBias[i] = beta1 * mBias[i] + (1 - beta1) * bGrad;
|
|
2836
|
+
vBias[i] = beta2 * vBias[i] + (1 - beta2) * (bGrad * bGrad);
|
|
2837
|
+
const mHatB = mBias[i] / (1 - Math.pow(beta1, t));
|
|
2838
|
+
const vHatB = vBias[i] / (1 - Math.pow(beta2, t));
|
|
2839
|
+
bias[i] -= lr * mHatB / (Math.sqrt(vHatB) + epsilon);
|
|
2840
|
+
const rowOffset = i * sDim;
|
|
2841
|
+
for (let j = 0; j < sDim; j++) {
|
|
2842
|
+
const wIdx = rowOffset + j;
|
|
2843
|
+
const wGrad = bGrad * input[j] + reg * matrix[wIdx];
|
|
2844
|
+
mMatrix[wIdx] = beta1 * mMatrix[wIdx] + (1 - beta1) * wGrad;
|
|
2845
|
+
vMatrix[wIdx] = beta2 * vMatrix[wIdx] + (1 - beta2) * (wGrad * wGrad);
|
|
2846
|
+
const mHatW = mMatrix[wIdx] / (1 - Math.pow(beta1, t));
|
|
2847
|
+
const vHatW = vMatrix[wIdx] / (1 - Math.pow(beta2, t));
|
|
2848
|
+
matrix[wIdx] -= lr * mHatW / (Math.sqrt(vHatW) + epsilon);
|
|
2849
|
+
}
|
|
2686
2850
|
}
|
|
2687
2851
|
}
|
|
2688
2852
|
}
|
package/dist/index.mjs
CHANGED
|
@@ -788,7 +788,7 @@ function applyAffine(matrix, bias, vector, result, inDim, outDim = inDim) {
|
|
|
788
788
|
}
|
|
789
789
|
|
|
790
790
|
// src/wasm/wasm-binary.ts
|
|
791
|
-
var wasmBase64 = "
|
|
791
|
+
var wasmBase64 = "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";
|
|
792
792
|
|
|
793
793
|
// src/wasm/wasm-loader.ts
|
|
794
794
|
var wasmInstance = null;
|
|
@@ -826,6 +826,22 @@ function ensureWasmMemory(requiredBytes) {
|
|
|
826
826
|
return false;
|
|
827
827
|
}
|
|
828
828
|
}
|
|
829
|
+
var globalOffset = 65536;
|
|
830
|
+
function allocateWasmMemory(bytes) {
|
|
831
|
+
const ptr = globalOffset;
|
|
832
|
+
globalOffset += bytes;
|
|
833
|
+
if (globalOffset % 4 !== 0) {
|
|
834
|
+
globalOffset += 4 - globalOffset % 4;
|
|
835
|
+
}
|
|
836
|
+
ensureWasmMemory(globalOffset);
|
|
837
|
+
return ptr;
|
|
838
|
+
}
|
|
839
|
+
function getWasmAllocatorOffset() {
|
|
840
|
+
return globalOffset;
|
|
841
|
+
}
|
|
842
|
+
function setWasmAllocatorOffset(offset) {
|
|
843
|
+
globalOffset = offset;
|
|
844
|
+
}
|
|
829
845
|
function writeFloat32ArrayToWasm(memory, data, byteOffset) {
|
|
830
846
|
const f32 = new Float32Array(memory.buffer);
|
|
831
847
|
const floatOffset = byteOffset / 4;
|
|
@@ -1665,6 +1681,7 @@ var MlpAdapter = class _MlpAdapter {
|
|
|
1665
1681
|
layerDimsPtr = 0;
|
|
1666
1682
|
activationsPtr = 0;
|
|
1667
1683
|
bufferPtr = 0;
|
|
1684
|
+
bufBPtr = 0;
|
|
1668
1685
|
constructor(layers) {
|
|
1669
1686
|
if (layers.length === 0) {
|
|
1670
1687
|
throw new Error("MlpAdapter requires at least one layer.");
|
|
@@ -1715,21 +1732,13 @@ var MlpAdapter = class _MlpAdapter {
|
|
|
1715
1732
|
}
|
|
1716
1733
|
this.inputDim = layerDims[0];
|
|
1717
1734
|
this.outputDim = layerDims[layerDims.length - 1];
|
|
1718
|
-
|
|
1719
|
-
this.
|
|
1720
|
-
|
|
1721
|
-
this.
|
|
1722
|
-
|
|
1723
|
-
this.
|
|
1724
|
-
|
|
1725
|
-
this.activationsPtr = offset;
|
|
1726
|
-
offset += this.numLayers * 4;
|
|
1727
|
-
if (offset % 4 !== 0) offset += 4 - offset % 4;
|
|
1728
|
-
this.weightsPtr = offset;
|
|
1729
|
-
offset += totalWeights * 4;
|
|
1730
|
-
this.bufferPtr = offset;
|
|
1731
|
-
offset += maxDim * 8 + 8192;
|
|
1732
|
-
ensureWasmMemory(offset);
|
|
1735
|
+
this.inputPtr = allocateWasmMemory(this.inputDim * 4);
|
|
1736
|
+
this.outputPtr = allocateWasmMemory(this.outputDim * 4);
|
|
1737
|
+
this.layerDimsPtr = allocateWasmMemory((this.numLayers + 1) * 4);
|
|
1738
|
+
this.activationsPtr = allocateWasmMemory(this.numLayers * 4);
|
|
1739
|
+
this.weightsPtr = allocateWasmMemory(totalWeights * 4);
|
|
1740
|
+
this.bufferPtr = allocateWasmMemory(maxDim * 4);
|
|
1741
|
+
this.bufBPtr = allocateWasmMemory(maxDim * 4);
|
|
1733
1742
|
const memoryBuffer = memory.buffer;
|
|
1734
1743
|
const f32 = new Float32Array(memoryBuffer);
|
|
1735
1744
|
const i32 = new Int32Array(memoryBuffer);
|
|
@@ -1789,7 +1798,8 @@ var MlpAdapter = class _MlpAdapter {
|
|
|
1789
1798
|
this.layerDimsPtr,
|
|
1790
1799
|
this.activationsPtr,
|
|
1791
1800
|
this.numLayers,
|
|
1792
|
-
this.bufferPtr
|
|
1801
|
+
this.bufferPtr,
|
|
1802
|
+
this.bufBPtr
|
|
1793
1803
|
);
|
|
1794
1804
|
const result = new Float32Array(this.outputDim);
|
|
1795
1805
|
const outF32 = new Float32Array(memory.buffer);
|
|
@@ -1843,6 +1853,19 @@ var WhiteningAdapter = class _WhiteningAdapter {
|
|
|
1843
1853
|
count = 0;
|
|
1844
1854
|
learningRate;
|
|
1845
1855
|
numComponents;
|
|
1856
|
+
componentsPtr = 0;
|
|
1857
|
+
xResidualPtr = 0;
|
|
1858
|
+
isWasmReady = false;
|
|
1859
|
+
async init() {
|
|
1860
|
+
const instance = await initWasm();
|
|
1861
|
+
if (instance) {
|
|
1862
|
+
const componentsSize = this.numComponents * this.dim * 4;
|
|
1863
|
+
const xResidualSize = this.dim * 4;
|
|
1864
|
+
this.componentsPtr = allocateWasmMemory(componentsSize);
|
|
1865
|
+
this.xResidualPtr = allocateWasmMemory(xResidualSize);
|
|
1866
|
+
this.isWasmReady = true;
|
|
1867
|
+
}
|
|
1868
|
+
}
|
|
1846
1869
|
/**
|
|
1847
1870
|
* 新しい WhiteningAdapter を作成します。
|
|
1848
1871
|
* @param dim ベクトルの次元数
|
|
@@ -1886,13 +1909,17 @@ var WhiteningAdapter = class _WhiteningAdapter {
|
|
|
1886
1909
|
}
|
|
1887
1910
|
const x_residual = new Float32Array(x);
|
|
1888
1911
|
const instance = getWasmInstance();
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1912
|
+
if (instance && instance.exports.sangerUpdateWasm) {
|
|
1913
|
+
if (!this.isWasmReady) {
|
|
1914
|
+
const componentsSize = this.numComponents * this.dim * 4;
|
|
1915
|
+
const xResidualSize = this.dim * 4;
|
|
1916
|
+
this.componentsPtr = allocateWasmMemory(componentsSize);
|
|
1917
|
+
this.xResidualPtr = allocateWasmMemory(xResidualSize);
|
|
1918
|
+
this.isWasmReady = true;
|
|
1919
|
+
}
|
|
1893
1920
|
const memory = instance.exports.memory;
|
|
1894
|
-
const componentsPtr =
|
|
1895
|
-
const xResidualPtr =
|
|
1921
|
+
const componentsPtr = this.componentsPtr;
|
|
1922
|
+
const xResidualPtr = this.xResidualPtr;
|
|
1896
1923
|
const f32 = new Float32Array(memory.buffer);
|
|
1897
1924
|
for (let k = 0; k < this.numComponents; k++) {
|
|
1898
1925
|
const comp = this.components[k];
|
|
@@ -2007,19 +2034,22 @@ var ColbertAdapter = class {
|
|
|
2007
2034
|
const { memory, colbertMaxSimWasm } = this.wasm.exports;
|
|
2008
2035
|
const queryBytes = queryTokens.byteLength;
|
|
2009
2036
|
const docBytes = documentTokens.byteLength;
|
|
2010
|
-
const
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
|
|
2015
|
-
|
|
2016
|
-
|
|
2017
|
-
|
|
2018
|
-
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
2022
|
-
|
|
2037
|
+
const initialOffset = getWasmAllocatorOffset();
|
|
2038
|
+
try {
|
|
2039
|
+
const queryPtr = allocateWasmMemory(queryBytes);
|
|
2040
|
+
const docPtr = allocateWasmMemory(docBytes);
|
|
2041
|
+
writeFloat32ArrayToWasm(memory, queryTokens, queryPtr);
|
|
2042
|
+
writeFloat32ArrayToWasm(memory, documentTokens, docPtr);
|
|
2043
|
+
return colbertMaxSimWasm(
|
|
2044
|
+
queryPtr,
|
|
2045
|
+
docPtr,
|
|
2046
|
+
numQueryTokens,
|
|
2047
|
+
numDocTokens,
|
|
2048
|
+
dim
|
|
2049
|
+
);
|
|
2050
|
+
} finally {
|
|
2051
|
+
setWasmAllocatorOffset(initialOffset);
|
|
2052
|
+
}
|
|
2023
2053
|
}
|
|
2024
2054
|
/**
|
|
2025
2055
|
* クエリと複数のドキュメント間の MaxSim スコアを計算し、スコアの降順にソートして返します。
|
|
@@ -2043,27 +2073,30 @@ var ColbertAdapter = class {
|
|
|
2043
2073
|
}
|
|
2044
2074
|
const queryBytes = queryTokens.byteLength;
|
|
2045
2075
|
const maxDocBytes = maxDocLen * Float32Array.BYTES_PER_ELEMENT;
|
|
2046
|
-
const
|
|
2047
|
-
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2076
|
+
const initialOffset = getWasmAllocatorOffset();
|
|
2077
|
+
try {
|
|
2078
|
+
const queryPtr = allocateWasmMemory(queryBytes);
|
|
2079
|
+
const docPtr = allocateWasmMemory(maxDocBytes);
|
|
2080
|
+
writeFloat32ArrayToWasm(memory, queryTokens, queryPtr);
|
|
2081
|
+
const results = documentTokensArray.map((doc, index) => {
|
|
2082
|
+
const numDocTokens = doc.length / dim;
|
|
2083
|
+
if (numDocTokens % 1 !== 0) {
|
|
2084
|
+
throw new Error(`Invalid documentTokens length at index ${index}`);
|
|
2085
|
+
}
|
|
2086
|
+
writeFloat32ArrayToWasm(memory, doc, docPtr);
|
|
2087
|
+
const score = colbertMaxSimWasm(
|
|
2088
|
+
queryPtr,
|
|
2089
|
+
docPtr,
|
|
2090
|
+
numQueryTokens,
|
|
2091
|
+
numDocTokens,
|
|
2092
|
+
dim
|
|
2093
|
+
);
|
|
2094
|
+
return { index, score };
|
|
2095
|
+
});
|
|
2096
|
+
return results.sort((a, b) => b.score - a.score);
|
|
2097
|
+
} finally {
|
|
2098
|
+
setWasmAllocatorOffset(initialOffset);
|
|
2099
|
+
}
|
|
2067
2100
|
}
|
|
2068
2101
|
};
|
|
2069
2102
|
|
|
@@ -2083,6 +2116,13 @@ var VectorDBAdapter = class {
|
|
|
2083
2116
|
* @returns {string} `'[0.1, 0.2, 0.3]'` のような文字列表現
|
|
2084
2117
|
*/
|
|
2085
2118
|
static toPgvector(vector) {
|
|
2119
|
+
if (vector instanceof Uint8Array) {
|
|
2120
|
+
let bitString = "";
|
|
2121
|
+
for (let i = 0; i < vector.length; i++) {
|
|
2122
|
+
bitString += vector[i].toString(2).padStart(8, "0");
|
|
2123
|
+
}
|
|
2124
|
+
return bitString;
|
|
2125
|
+
}
|
|
2086
2126
|
return `[${Array.from(vector).join(", ")}]`;
|
|
2087
2127
|
}
|
|
2088
2128
|
/**
|
|
@@ -2146,18 +2186,37 @@ var withWarpVector = (config) => {
|
|
|
2146
2186
|
*/
|
|
2147
2187
|
async searchByVector(args) {
|
|
2148
2188
|
const context = Prisma.getExtensionContext(this);
|
|
2149
|
-
const tableName = context.$name;
|
|
2189
|
+
const tableName = context.$name || "document";
|
|
2190
|
+
if (!/^[a-zA-Z0-9_]+$/.test(tableName)) {
|
|
2191
|
+
throw new Error(`Invalid table name: ${tableName}`);
|
|
2192
|
+
}
|
|
2193
|
+
if (!/^[a-zA-Z0-9_]+$/.test(vectorField)) {
|
|
2194
|
+
throw new Error(`Invalid vector field name: ${vectorField}`);
|
|
2195
|
+
}
|
|
2196
|
+
if (!["<->", "<#>", "<=>"].includes(distanceOp)) {
|
|
2197
|
+
throw new Error(`Invalid distance operator: ${distanceOp}`);
|
|
2198
|
+
}
|
|
2199
|
+
let whereClause = "";
|
|
2200
|
+
if (args.where) {
|
|
2201
|
+
const trimmedWhere = args.where.trim();
|
|
2202
|
+
if (/;|--|\/\*/.test(trimmedWhere)) {
|
|
2203
|
+
throw new Error("Potential SQL injection detected in where clause.");
|
|
2204
|
+
}
|
|
2205
|
+
whereClause = `WHERE ${trimmedWhere}`;
|
|
2206
|
+
}
|
|
2207
|
+
const limit = args.topK ?? 10;
|
|
2208
|
+
if (typeof limit !== "number" || isNaN(limit) || limit < 0) {
|
|
2209
|
+
throw new Error("Invalid topK value.");
|
|
2210
|
+
}
|
|
2150
2211
|
const tunedVector = config.adapter.tune(args.vector);
|
|
2151
2212
|
const pgVectorStr = VectorDBAdapter.toPgvector(tunedVector);
|
|
2152
|
-
const limit = args.topK ?? 10;
|
|
2153
|
-
const whereClause = args.where ? `WHERE ${args.where}` : "";
|
|
2154
2213
|
const sql = `
|
|
2155
2214
|
SELECT *
|
|
2156
2215
|
FROM "${tableName}"
|
|
2157
2216
|
${whereClause}
|
|
2158
2217
|
ORDER BY "${vectorField}" ${distanceOp} '${pgVectorStr}'::vector
|
|
2159
2218
|
LIMIT ${limit};
|
|
2160
|
-
|
|
2219
|
+
`.trim();
|
|
2161
2220
|
return client.$queryRawUnsafe(sql);
|
|
2162
2221
|
}
|
|
2163
2222
|
}
|
|
@@ -2529,9 +2588,11 @@ var WarpLlamaIndexEmbeddings = class {
|
|
|
2529
2588
|
var QuantizationAdapter = class _QuantizationAdapter {
|
|
2530
2589
|
type;
|
|
2531
2590
|
dim;
|
|
2591
|
+
dynamic;
|
|
2532
2592
|
constructor(config) {
|
|
2533
2593
|
this.type = config.type;
|
|
2534
2594
|
this.dim = config.dim;
|
|
2595
|
+
this.dynamic = config.dynamic ?? false;
|
|
2535
2596
|
if (this.type === "binary" && this.dim % 8 !== 0) {
|
|
2536
2597
|
throw new Error(
|
|
2537
2598
|
`Binary quantization requires dimension to be a multiple of 8. Got ${this.dim}`
|
|
@@ -2541,14 +2602,33 @@ var QuantizationAdapter = class _QuantizationAdapter {
|
|
|
2541
2602
|
tune(vector) {
|
|
2542
2603
|
assertDimension(vector, this.dim, "QuantizationAdapter.tune");
|
|
2543
2604
|
if (this.type === "int8") {
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
|
-
let
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
2605
|
+
if (this.dynamic) {
|
|
2606
|
+
let maxVal = 1e-8;
|
|
2607
|
+
for (let i = 0; i < this.dim; i++) {
|
|
2608
|
+
const abs = Math.abs(vector[i]);
|
|
2609
|
+
if (abs > maxVal) maxVal = abs;
|
|
2610
|
+
}
|
|
2611
|
+
const scale = 127 / maxVal;
|
|
2612
|
+
const result = new Int8Array(this.dim + 4);
|
|
2613
|
+
for (let i = 0; i < this.dim; i++) {
|
|
2614
|
+
let val = Math.round(vector[i] * scale);
|
|
2615
|
+
if (val > 127) val = 127;
|
|
2616
|
+
if (val < -128) val = -128;
|
|
2617
|
+
result[i] = val;
|
|
2618
|
+
}
|
|
2619
|
+
const view = new DataView(result.buffer, result.byteOffset, result.byteLength);
|
|
2620
|
+
view.setFloat32(this.dim, maxVal, true);
|
|
2621
|
+
return result;
|
|
2622
|
+
} else {
|
|
2623
|
+
const result = new Int8Array(this.dim);
|
|
2624
|
+
for (let i = 0; i < this.dim; i++) {
|
|
2625
|
+
let val = Math.round(vector[i] * 127);
|
|
2626
|
+
if (val > 127) val = 127;
|
|
2627
|
+
if (val < -128) val = -128;
|
|
2628
|
+
result[i] = val;
|
|
2629
|
+
}
|
|
2630
|
+
return result;
|
|
2550
2631
|
}
|
|
2551
|
-
return result;
|
|
2552
2632
|
} else if (this.type === "binary") {
|
|
2553
2633
|
const bytesLength = this.dim / 8;
|
|
2554
2634
|
const result = new Uint8Array(bytesLength);
|
|
@@ -2581,17 +2661,45 @@ var QuantizationAdapter = class _QuantizationAdapter {
|
|
|
2581
2661
|
}
|
|
2582
2662
|
/**
|
|
2583
2663
|
* Int8量子化された2つのベクトル間のドット積(内積)を計算します。
|
|
2664
|
+
* 動的スケーリングが埋め込まれている場合はスケールを戻して計算します。
|
|
2584
2665
|
*/
|
|
2585
2666
|
static int8DotProduct(a, b) {
|
|
2586
2667
|
if (a.length !== b.length) throw new Error("Length mismatch");
|
|
2587
|
-
|
|
2588
|
-
|
|
2589
|
-
|
|
2668
|
+
const hasScaleBytes = a.length > 4;
|
|
2669
|
+
let isDynamic = false;
|
|
2670
|
+
let maxA = 1;
|
|
2671
|
+
let maxB = 1;
|
|
2672
|
+
if (hasScaleBytes) {
|
|
2673
|
+
const dim = a.length - 4;
|
|
2674
|
+
try {
|
|
2675
|
+
const viewA = new DataView(a.buffer, a.byteOffset, a.byteLength);
|
|
2676
|
+
const viewB = new DataView(b.buffer, b.byteOffset, b.byteLength);
|
|
2677
|
+
maxA = viewA.getFloat32(dim, true);
|
|
2678
|
+
maxB = viewB.getFloat32(dim, true);
|
|
2679
|
+
if (!isNaN(maxA) && !isNaN(maxB) && maxA > 0 && maxA < 1e3 && maxB > 0 && maxB < 1e3) {
|
|
2680
|
+
isDynamic = true;
|
|
2681
|
+
}
|
|
2682
|
+
} catch (e) {
|
|
2683
|
+
isDynamic = false;
|
|
2684
|
+
}
|
|
2685
|
+
}
|
|
2686
|
+
if (isDynamic) {
|
|
2687
|
+
const dim = a.length - 4;
|
|
2688
|
+
let dot = 0;
|
|
2689
|
+
for (let i = 0; i < dim; i++) {
|
|
2690
|
+
dot += a[i] * b[i];
|
|
2691
|
+
}
|
|
2692
|
+
return dot * (maxA / 127) * (maxB / 127);
|
|
2693
|
+
} else {
|
|
2694
|
+
let dot = 0;
|
|
2695
|
+
for (let i = 0; i < a.length; i++) {
|
|
2696
|
+
dot += a[i] * b[i];
|
|
2697
|
+
}
|
|
2698
|
+
return dot;
|
|
2590
2699
|
}
|
|
2591
|
-
return dot;
|
|
2592
2700
|
}
|
|
2593
2701
|
exportState() {
|
|
2594
|
-
return JSON.stringify({ type: this.type, dim: this.dim });
|
|
2702
|
+
return JSON.stringify({ type: this.type, dim: this.dim, dynamic: this.dynamic });
|
|
2595
2703
|
}
|
|
2596
2704
|
static importState(stateJson) {
|
|
2597
2705
|
const config = JSON.parse(stateJson);
|
|
@@ -2626,22 +2734,78 @@ var AbstractAdamTrainer = class {
|
|
|
2626
2734
|
const beta1 = 0.9;
|
|
2627
2735
|
const beta2 = 0.999;
|
|
2628
2736
|
const epsilon = 1e-8;
|
|
2629
|
-
|
|
2630
|
-
|
|
2631
|
-
|
|
2632
|
-
|
|
2633
|
-
const
|
|
2634
|
-
const
|
|
2635
|
-
|
|
2636
|
-
const
|
|
2637
|
-
|
|
2638
|
-
const
|
|
2639
|
-
const
|
|
2640
|
-
|
|
2641
|
-
|
|
2642
|
-
const
|
|
2643
|
-
const
|
|
2644
|
-
|
|
2737
|
+
const instance = getWasmInstance();
|
|
2738
|
+
if (instance && instance.exports.adamUpdateWasm) {
|
|
2739
|
+
const memory = instance.exports.memory;
|
|
2740
|
+
const matrixBytes = matrix.byteLength;
|
|
2741
|
+
const biasBytes = bias.byteLength;
|
|
2742
|
+
const inputBytes = sDim * 4;
|
|
2743
|
+
const gradBytes = tDim * 4;
|
|
2744
|
+
const initialOffset = getWasmAllocatorOffset();
|
|
2745
|
+
try {
|
|
2746
|
+
const matrixPtr = allocateWasmMemory(matrixBytes);
|
|
2747
|
+
const biasPtr = allocateWasmMemory(biasBytes);
|
|
2748
|
+
const mMatrixPtr = allocateWasmMemory(matrixBytes);
|
|
2749
|
+
const vMatrixPtr = allocateWasmMemory(matrixBytes);
|
|
2750
|
+
const mBiasPtr = allocateWasmMemory(biasBytes);
|
|
2751
|
+
const vBiasPtr = allocateWasmMemory(biasBytes);
|
|
2752
|
+
const inputPtr = allocateWasmMemory(inputBytes);
|
|
2753
|
+
const gradPtr = allocateWasmMemory(gradBytes);
|
|
2754
|
+
writeFloat32ArrayToWasm(memory, matrix, matrixPtr);
|
|
2755
|
+
writeFloat32ArrayToWasm(memory, bias, biasPtr);
|
|
2756
|
+
writeFloat32ArrayToWasm(memory, mMatrix, mMatrixPtr);
|
|
2757
|
+
writeFloat32ArrayToWasm(memory, vMatrix, vMatrixPtr);
|
|
2758
|
+
writeFloat32ArrayToWasm(memory, mBias, mBiasPtr);
|
|
2759
|
+
writeFloat32ArrayToWasm(memory, vBias, vBiasPtr);
|
|
2760
|
+
writeFloat32ArrayToWasm(memory, input, inputPtr);
|
|
2761
|
+
writeFloat32ArrayToWasm(memory, outputGradients, gradPtr);
|
|
2762
|
+
const adamUpdateWasm = instance.exports.adamUpdateWasm;
|
|
2763
|
+
adamUpdateWasm(
|
|
2764
|
+
matrixPtr,
|
|
2765
|
+
biasPtr,
|
|
2766
|
+
mMatrixPtr,
|
|
2767
|
+
vMatrixPtr,
|
|
2768
|
+
mBiasPtr,
|
|
2769
|
+
vBiasPtr,
|
|
2770
|
+
inputPtr,
|
|
2771
|
+
gradPtr,
|
|
2772
|
+
lr,
|
|
2773
|
+
reg,
|
|
2774
|
+
beta1,
|
|
2775
|
+
beta2,
|
|
2776
|
+
epsilon,
|
|
2777
|
+
t,
|
|
2778
|
+
sDim,
|
|
2779
|
+
tDim
|
|
2780
|
+
);
|
|
2781
|
+
const f32 = new Float32Array(memory.buffer);
|
|
2782
|
+
matrix.set(f32.subarray(matrixPtr / 4, matrixPtr / 4 + matrix.length));
|
|
2783
|
+
bias.set(f32.subarray(biasPtr / 4, biasPtr / 4 + bias.length));
|
|
2784
|
+
mMatrix.set(f32.subarray(mMatrixPtr / 4, mMatrixPtr / 4 + mMatrix.length));
|
|
2785
|
+
vMatrix.set(f32.subarray(vMatrixPtr / 4, vMatrixPtr / 4 + vMatrix.length));
|
|
2786
|
+
mBias.set(f32.subarray(mBiasPtr / 4, mBiasPtr / 4 + mBias.length));
|
|
2787
|
+
vBias.set(f32.subarray(vBiasPtr / 4, vBiasPtr / 4 + vBias.length));
|
|
2788
|
+
} finally {
|
|
2789
|
+
setWasmAllocatorOffset(initialOffset);
|
|
2790
|
+
}
|
|
2791
|
+
} else {
|
|
2792
|
+
for (let i = 0; i < tDim; i++) {
|
|
2793
|
+
const bGrad = outputGradients[i];
|
|
2794
|
+
mBias[i] = beta1 * mBias[i] + (1 - beta1) * bGrad;
|
|
2795
|
+
vBias[i] = beta2 * vBias[i] + (1 - beta2) * (bGrad * bGrad);
|
|
2796
|
+
const mHatB = mBias[i] / (1 - Math.pow(beta1, t));
|
|
2797
|
+
const vHatB = vBias[i] / (1 - Math.pow(beta2, t));
|
|
2798
|
+
bias[i] -= lr * mHatB / (Math.sqrt(vHatB) + epsilon);
|
|
2799
|
+
const rowOffset = i * sDim;
|
|
2800
|
+
for (let j = 0; j < sDim; j++) {
|
|
2801
|
+
const wIdx = rowOffset + j;
|
|
2802
|
+
const wGrad = bGrad * input[j] + reg * matrix[wIdx];
|
|
2803
|
+
mMatrix[wIdx] = beta1 * mMatrix[wIdx] + (1 - beta1) * wGrad;
|
|
2804
|
+
vMatrix[wIdx] = beta2 * vMatrix[wIdx] + (1 - beta2) * (wGrad * wGrad);
|
|
2805
|
+
const mHatW = mMatrix[wIdx] / (1 - Math.pow(beta1, t));
|
|
2806
|
+
const vHatW = vMatrix[wIdx] / (1 - Math.pow(beta2, t));
|
|
2807
|
+
matrix[wIdx] -= lr * mHatW / (Math.sqrt(vHatW) + epsilon);
|
|
2808
|
+
}
|
|
2645
2809
|
}
|
|
2646
2810
|
}
|
|
2647
2811
|
}
|
package/package.json
CHANGED