@imaduddin/fastbrain 0.0.0-stage → 1.0.1

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.
Files changed (57) hide show
  1. package/index.js +20 -0
  2. package/package.json +29 -6
  3. package/readme.md +959 -0
  4. package/src/Embedding/index.d.ts +21 -0
  5. package/src/Embedding/index.js +140 -0
  6. package/src/FFN/index.d.ts +23 -0
  7. package/src/FFN/index.js +45 -0
  8. package/src/Linear/index.d.ts +31 -0
  9. package/src/Linear/index.js +197 -0
  10. package/src/OperationManager.js +169 -0
  11. package/src/PositionEmbedding/index.d.ts +30 -0
  12. package/src/PositionEmbedding/index.js +65 -0
  13. package/src/RMSNorm/index.d.ts +30 -0
  14. package/src/RMSNorm/index.js +95 -0
  15. package/src/Relu/index.d.ts +25 -0
  16. package/src/Relu/index.js +108 -0
  17. package/src/SelfAttention/index.d.ts +28 -0
  18. package/src/SelfAttention/index.js +138 -0
  19. package/src/Softmax/index.d.ts +26 -0
  20. package/src/Softmax/index.js +224 -0
  21. package/src/Tokenizer/index.d.ts +12 -0
  22. package/src/Tokenizer/index.js +164 -0
  23. package/src/Tokenizer/vocabs.json +19618 -0
  24. package/src/TransformerBlock/index.d.ts +28 -0
  25. package/src/TransformerBlock/index.js +78 -0
  26. package/src/getVec.js +30 -0
  27. package/src/gpu.js +0 -0
  28. package/src/residualConnection/index.js +32 -0
  29. package/src/shaders/CalculateAcc.wgsl +50 -0
  30. package/src/shaders/CalculateLoss.wgsl +30 -0
  31. package/src/shaders/ComputeDInput.wgsl +32 -0
  32. package/src/shaders/EB.wgsl +33 -0
  33. package/src/shaders/EF.wgsl +25 -0
  34. package/src/shaders/LB.wgsl +75 -0
  35. package/src/shaders/LF.wgsl +60 -0
  36. package/src/shaders/Norm/rmsBackward.wgsl +65 -0
  37. package/src/shaders/Norm/rmsForward.wgsl +30 -0
  38. package/src/shaders/Norm/sumSquare.wgsl +38 -0
  39. package/src/shaders/Norm/updateGamma.wgsl +52 -0
  40. package/src/shaders/PB.wgsl +25 -0
  41. package/src/shaders/PF.wgsl +19 -0
  42. package/src/shaders/RB.wgsl +37 -0
  43. package/src/shaders/RF.wgsl +33 -0
  44. package/src/shaders/ReductionFunction.wgsl +28 -0
  45. package/src/shaders/SB.wgsl +36 -0
  46. package/src/shaders/SF.wgsl +75 -0
  47. package/src/shaders/SoftmaxBackward.wgsl +31 -0
  48. package/src/shaders/add.wgsl +30 -0
  49. package/src/shaders/attentionShader/CompueFinalForwardOutput.wgsl +29 -0
  50. package/src/shaders/attentionShader/ComputeDA.wgsl +30 -0
  51. package/src/shaders/attentionShader/ComputeDV.wgsl +37 -0
  52. package/src/shaders/attentionShader/ComputeK.wgsl +30 -0
  53. package/src/shaders/attentionShader/ComputedQ.wgsl +31 -0
  54. package/src/shaders/attentionShader/attentionSocres.wgsl +40 -0
  55. package/src/shaders/attentionShader/sumGradient.wgsl +24 -0
  56. package/src/shaders/calculateTotal.wgsl +26 -0
  57. package/README.md +0 -3
@@ -0,0 +1,19 @@
1
+ @group(0) @binding(0)
2
+ var <storage, read> posVec: array<f32>;
3
+
4
+ @group(0) @binding(1)
5
+
6
+ var <storage, read_write> vecs : array<f32>;
7
+
8
+
9
+
10
+
11
+ @compute @workgroup_size(64)
12
+
13
+ fn main(@builtin(global_invocation_id) id : vec3<u32>){
14
+ let x = id.x;
15
+ if(x >= arrayLength(&vecs)){
16
+ return;
17
+ }
18
+ vecs[x] = vecs[x] + posVec[x];
19
+ }
@@ -0,0 +1,37 @@
1
+ struct Param {
2
+ embeddingSize: u32,
3
+ tokenCount: u32
4
+ }
5
+
6
+ @group(0) @binding(0)
7
+
8
+ var<storage, read> input: array<f32>;
9
+
10
+ @group(0) @binding(1)
11
+
12
+ var<uniform> params: Param;
13
+
14
+ @group(0) @binding(2)
15
+
16
+ var<storage, read_write> output: vec2<f32>;
17
+
18
+ @group(0) @binding(3)
19
+
20
+ var<storage, read_write> inputGradient: array<f32>;
21
+ @compute @workgroup_size(256)
22
+
23
+ fn main(@builtin(global_invocation_id) id: vec3<u32>) {
24
+ let index = id.x;
25
+ let total = params.embeddingSize * params.tokenCount;
26
+ if (index >= total) {
27
+ return;
28
+ }
29
+ let x = input[index];
30
+ let grad = inputGradient[index];
31
+ if (x > 0) {
32
+ output[index] = grad;
33
+ }
34
+ else {
35
+ output[index] = grad * 0.02;
36
+ }
37
+ }
@@ -0,0 +1,33 @@
1
+ struct Param {
2
+ embeddingSize: u32,
3
+ tokenCount: u32
4
+ }
5
+
6
+ @group(0) @binding(0)
7
+
8
+ var<storage, read> input: array<f32>;
9
+
10
+ @group(0) @binding(1)
11
+
12
+ var<uniform> params: Param;
13
+
14
+ @group(0) @binding(2)
15
+
16
+ var<storage, read_write> output: array<f32>;
17
+
18
+ @compute @workgroup_size(256)
19
+
20
+ fn main(@builtin(global_invocation_id) id: vec3<u32>) {
21
+ let index = id.x;
22
+ let total = params.embeddingSize * params.tokenCount;
23
+ if (index >= total) {
24
+ return;
25
+ }
26
+ let x = input[index];
27
+ if (x > 0) {
28
+ output[index] = x;
29
+ }
30
+ else {
31
+ output[index] = x * 0.02;
32
+ }
33
+ }
@@ -0,0 +1,28 @@
1
+ struct Parmas {
2
+ vocabSize: u32,
3
+ count: u32
4
+ }
5
+
6
+ @group(0) @binding(0)
7
+
8
+ var<storage, read> data: array<f32>;
9
+
10
+ @group(0) @binding(1)
11
+
12
+ var<storage, read_write> result: array<f32>;
13
+
14
+ @group(0) @binding(2)
15
+
16
+ var<uniform> params: Parmas;
17
+
18
+ @compute @workgroup_size(1)
19
+
20
+ fn main(@builtin(global_invocation_id) id: vec3<u32>) {
21
+ let index = id.x;
22
+ var sum = 0.0;
23
+ for (var i = 0u; i < params.count; i++) {
24
+ sum += data[i];
25
+ }
26
+ sum /= f32(params.count);
27
+ result[index] = sum;
28
+ }
@@ -0,0 +1,36 @@
1
+ struct Params {
2
+ vocabSize: u32,
3
+ tokenCount: u32
4
+ }
5
+
6
+ @group(0) @binding(0)
7
+
8
+ var<storage, read_write> probs: array<f32>;
9
+
10
+
11
+ @group(0) @binding(2)
12
+
13
+ var<storage, read_write> targetToken: array<f32>;
14
+
15
+ @group(0) @binding(3)
16
+
17
+ var<uniform> params: Params;
18
+
19
+ @compute @workgroup_size(256)
20
+
21
+ fn main(@builtin(global_invocation_id) id: vec3<u32>) {
22
+ let index = id.x;
23
+ let token = index / params.vocabSize;
24
+ let vocabIndex = index % params.vocabSize;
25
+ let start = token * params.vocabSize;
26
+ let end = start + params.vocabSize;
27
+ let total = params.tokenCount * params.vocabSize;
28
+ if (index >= total) {
29
+ return;
30
+ }
31
+ var targetIndex = targetToken[token];
32
+ probs[index] = probs[index];
33
+ if(vocabIndex == u32(targetIndex)){
34
+ probs[index] -= 1;
35
+ }
36
+ }
@@ -0,0 +1,75 @@
1
+ struct Params {
2
+ vocabSize: u32,
3
+ tokenCount: u32,
4
+ }
5
+
6
+ @group(0) @binding(0)
7
+ var<storage, read> logits: array<f32>;
8
+
9
+ @group(0) @binding(1)
10
+ var<storage, read_write> output: array<f32>;
11
+
12
+ @group(0) @binding(2)
13
+ var<uniform> params: Params;
14
+
15
+ var<workgroup> sharedMax: array<f32, 256>;
16
+ var<workgroup> sharedSum: array<f32, 256>;
17
+
18
+ @compute @workgroup_size(256)
19
+ fn main(@builtin(workgroup_id) wg: vec3<u32>, @builtin(local_invocation_id) lid: vec3<u32>) {
20
+ let token = wg.x;
21
+ let tid = lid.x;
22
+ if (token < params.tokenCount) {
23
+ let start = token * params.vocabSize;
24
+ var localMax = -3.402823e38;
25
+ var i = tid;
26
+
27
+ while (i < params.vocabSize) {
28
+ localMax = max(localMax, logits[start + i]);
29
+ i += 256u;
30
+ }
31
+
32
+ sharedMax[tid] = localMax;
33
+ workgroupBarrier();
34
+
35
+ var stride = 128u;
36
+ while (stride > 0u) {
37
+ if (tid < stride) {
38
+ sharedMax[tid] = max(
39
+ sharedMax[tid],
40
+ sharedMax[tid + stride]
41
+ );
42
+ }
43
+ workgroupBarrier();
44
+ stride /= 2u;
45
+ }
46
+ let maxLogit = sharedMax[0];
47
+
48
+ var localSum = 0.0;
49
+ i = tid;
50
+
51
+ while (i < params.vocabSize) {
52
+ let e = exp(logits[start + i] - maxLogit);
53
+ output[start + i] = e;
54
+ localSum += e;
55
+ i += 256u;
56
+ }
57
+
58
+ sharedSum[tid] = localSum;
59
+ workgroupBarrier();
60
+ stride = 128u;
61
+ while (stride > 0u) {
62
+ if (tid < stride) {
63
+ sharedSum[tid] += sharedSum[tid + stride];
64
+ }
65
+ workgroupBarrier();
66
+ stride /= 2u;
67
+ }
68
+ let total = max(sharedSum[0], 1e-20);
69
+ i = tid;
70
+ while (i < params.vocabSize) {
71
+ output[start + i] /= total;
72
+ i += 256u;
73
+ }
74
+ }
75
+ }
@@ -0,0 +1,31 @@
1
+ struct Params {
2
+ tokens: u32,
3
+ embeddingSize: u32,
4
+ }
5
+ @group(0) @binding(0)
6
+ var<storage, read> P: array<f32>;
7
+ @group(0) @binding(1)
8
+ var<storage, read> dP: array<f32>;
9
+ @group(0) @binding(2)
10
+ var<storage, read_write> output: array<f32>;
11
+ @group(0) @binding(3)
12
+ var<uniform> params: Params;
13
+
14
+ @compute @workgroup_size(256)
15
+
16
+ fn main(@builtin(global_invocation_id) id: vec3<u32>) {
17
+ let index = id.x;
18
+ let total = params.tokens * params.tokens;
19
+ if (index >= total) {
20
+ return;
21
+ }
22
+ let row = index / params.tokens;
23
+ var dot = 0.0;
24
+ for (var i = 0u; i < params.tokens; i++) {
25
+ let pos = row * params.tokens + i;
26
+ dot += P[pos] * dP[pos];
27
+ }
28
+ let p = P[index];
29
+ let dp = dP[index];
30
+ output[index] = p * (dp - dot);
31
+ }
@@ -0,0 +1,30 @@
1
+ struct Params{
2
+ size: u32
3
+ }
4
+
5
+ @group(0) @binding(0)
6
+
7
+ var <storage, read> a : array<f32>;
8
+
9
+ @group(0) @binding(1)
10
+
11
+ var <storage, read> b : array<f32>;
12
+
13
+ @group(0) @binding(2)
14
+
15
+ var <storage, read_write> output : array<f32>;
16
+ @group(0) @binding(3)
17
+
18
+ var <uniform> params : Params;
19
+
20
+ @compute @workgroup_size(64)
21
+
22
+ fn main(@builtin(global_invocation_id) id : vec3<u32>){
23
+ let index = id.x;
24
+ if(index >= params.size){
25
+ return;
26
+ }
27
+ let mainOut = a[index] + b[index];
28
+ output[index] = mainOut;
29
+ }
30
+
@@ -0,0 +1,29 @@
1
+ struct Params {
2
+ tokens: u32,
3
+ embeddingSize: u32,
4
+ }
5
+ @group(0) @binding(0)
6
+ var<storage, read> weights: array<f32>;
7
+ @group(0) @binding(1)
8
+ var<storage, read> value: array<f32>;
9
+ @group(0) @binding(2)
10
+ var<storage, read_write> output: array<f32>;
11
+ @group(0) @binding(3)
12
+ var<uniform> params: Params;
13
+ @compute @workgroup_size(256)
14
+ fn main(@builtin(global_invocation_id) id: vec3<u32>) {
15
+ let index = id.x;
16
+ let total =params.tokens * params.embeddingSize;
17
+ if (index >= total) {
18
+ return;
19
+ }
20
+ let row = index / params.embeddingSize;
21
+ let dim = index % params.embeddingSize;
22
+ var sum = 0.0;
23
+ for (var j = 0u; j < params.tokens; j++) {
24
+ let weight = weights[row * params.tokens + j];
25
+ let v =value[j * params.embeddingSize + dim];
26
+ sum += weight * v;
27
+ }
28
+ output[index] = sum;
29
+ }
@@ -0,0 +1,30 @@
1
+ struct Params {
2
+ contextSize: u32,
3
+ embeddingSize: u32,
4
+ }
5
+ @group(0) @binding(0)
6
+ var<storage, read> dOutput: array<f32>;
7
+ @group(0) @binding(1)
8
+ var<storage, read> V: array<f32>;
9
+ @group(0) @binding(2)
10
+ var<storage, read_write> dA: array<f32>;
11
+ @group(0) @binding(3)
12
+ var<uniform> params: Params;
13
+ @compute @workgroup_size(16, 16)
14
+ fn main(@builtin(global_invocation_id) id: vec3<u32>) {
15
+ let row = id.x;
16
+ let col = id.y;
17
+ let T = params.contextSize;
18
+ let D = params.embeddingSize;
19
+ if (row >= T || col >= T) {
20
+ return;
21
+ }
22
+ var sum = 0.0;
23
+ for (var k = 0u; k < D; k++) {
24
+ let dOutputIndex = row * D + k;
25
+ let vIndex = col * D + k;
26
+ sum += dOutput[dOutputIndex] * V[vIndex];
27
+ }
28
+ let outputIndex = row * T + col;
29
+ dA[outputIndex] = sum;
30
+ }
@@ -0,0 +1,37 @@
1
+ struct Params {
2
+ contextSize: u32,
3
+ embeddingSize: u32,
4
+ }
5
+
6
+ @group(0) @binding(0)
7
+ var<storage, read> A: array<f32>;
8
+
9
+ @group(0) @binding(1)
10
+ var<storage, read> dOutput: array<f32>;
11
+
12
+ @group(0) @binding(2)
13
+ var<storage, read_write> dV: array<f32>;
14
+
15
+ @group(0) @binding(3)
16
+ var<uniform> params: Params;
17
+
18
+
19
+ @compute @workgroup_size(16, 16)
20
+ fn main(@builtin(global_invocation_id) id: vec3<u32>)
21
+ {
22
+ let row = id.x;
23
+ let col = id.y;
24
+ let T = params.contextSize;
25
+ let D = params.embeddingSize;
26
+ if (row >= T || col >= D) {
27
+ return;
28
+ }
29
+ var sum = 0.0;
30
+ for (var i = 0u; i < T; i++) {
31
+ let aIndex = i * T + row;
32
+ let gradIndex = i * D + col;
33
+ sum += A[aIndex] * dOutput[gradIndex];
34
+ }
35
+ let outputIndex = row * D + col;
36
+ dV[outputIndex] = sum;
37
+ }
@@ -0,0 +1,30 @@
1
+ struct Params {
2
+ contextSize: u32,
3
+ embeddingSize: u32,
4
+ }
5
+ @group(0) @binding(0)
6
+ var<storage, read> dS: array<f32>;
7
+ @group(0) @binding(1)
8
+ var<storage, read> Q: array<f32>;
9
+ @group(0) @binding(2)
10
+ var<storage, read_write> dK: array<f32>;
11
+ @group(0) @binding(3)
12
+ var<uniform> params: Params;
13
+ @compute @workgroup_size(16, 16)
14
+ fn main(@builtin(global_invocation_id) id: vec3<u32>) {
15
+ let row = id.x;
16
+ let col = id.y;
17
+ let T = params.contextSize;
18
+ let D = params.embeddingSize;
19
+ if (row >= T || col >= D) {
20
+ return;
21
+ }
22
+ var sum = 0.0;
23
+ for (var i = 0u; i < T; i++) {
24
+ let dsIndex = i * T + row;
25
+ let qIndex = i * D + col;
26
+ sum += dS[dsIndex] * Q[qIndex];
27
+ }
28
+ let scale = sqrt(f32(D));
29
+ dK[row * D + col] = sum / scale;
30
+ }
@@ -0,0 +1,31 @@
1
+ struct Params {
2
+ contextSize: u32,
3
+ embeddingSize: u32,
4
+ }
5
+ @group(0) @binding(0)
6
+ var<storage, read> dS: array<f32>;
7
+ @group(0) @binding(1)
8
+ var<storage, read> K: array<f32>;
9
+ @group(0) @binding(2)
10
+ var<storage, read_write> dQ: array<f32>;
11
+ @group(0) @binding(3)
12
+ var<uniform> params: Params;
13
+ @compute @workgroup_size(16, 16)
14
+ fn main(@builtin(global_invocation_id) id: vec3<u32>) {
15
+ let row = id.x;
16
+ let col = id.y;
17
+ let T = params.contextSize;
18
+ let D = params.embeddingSize;
19
+ if (row >= T || col >= D) {
20
+ return;
21
+ }
22
+ var sum = 0.0;
23
+ for (var i = 0u; i < T; i++) {
24
+ let dsIndex = row * T + i;
25
+ let kIndex = i * D + col;
26
+
27
+ sum += dS[dsIndex] * K[kIndex];
28
+ }
29
+ let scale = sqrt(f32(D));
30
+ dQ[row * D + col] = sum / scale;
31
+ }
@@ -0,0 +1,40 @@
1
+ struct Params {
2
+ contextSize: u32,
3
+ embeddingSize: u32,
4
+ }
5
+
6
+ @group(0) @binding(0)
7
+ var<storage, read> Q: array<f32>;
8
+
9
+ @group(0) @binding(1)
10
+ var<storage, read> K: array<f32>;
11
+
12
+ @group(0) @binding(2)
13
+ var<storage, read_write> scores: array<f32>;
14
+
15
+ @group(0) @binding(3)
16
+ var<uniform> params: Params;
17
+
18
+ @compute @workgroup_size(16, 16)
19
+ fn main(@builtin(global_invocation_id) id: vec3<u32>) {
20
+ let row = id.x;
21
+ let col = id.y;
22
+
23
+ if (row >= params.contextSize || col >= params.contextSize) {
24
+ return;
25
+ }
26
+ var sum = 0.0;
27
+ for (var k = 0u; k < params.embeddingSize; k++) {
28
+ let qIndex = row * params.embeddingSize + k;
29
+ let kIndex = col * params.embeddingSize + k;
30
+ sum += Q[qIndex] * K[kIndex];
31
+ }
32
+
33
+ let outIndex = row * params.contextSize + col;
34
+ if (col > row) {
35
+ scores[outIndex] = - 1e9;
36
+ return;
37
+ }
38
+ let scale = sqrt(f32(params.embeddingSize));
39
+ scores[outIndex] = sum / scale;
40
+ }
@@ -0,0 +1,24 @@
1
+ struct Params {
2
+ contextSize: u32,
3
+ embeddingSize: u32,
4
+ }
5
+
6
+ @group(0) @binding(0)
7
+ var<storage, read> dXq: array<f32>;
8
+ @group(0) @binding(1)
9
+ var<storage, read> dXk: array<f32>;
10
+ @group(0) @binding(2)
11
+ var<storage, read> dXv: array<f32>;
12
+ @group(0) @binding(3)
13
+ var<storage, read_write> dX: array<f32>;
14
+ @group(0) @binding(4)
15
+ var<uniform> params: Params;
16
+ @compute @workgroup_size(256)
17
+ fn main(@builtin(global_invocation_id) id: vec3<u32>) {
18
+ let index = id.x;
19
+ let total = params.contextSize * params.embeddingSize;
20
+ if (index >= total) {
21
+ return;
22
+ }
23
+ dX[index] =dXq[index] +dXk[index] +dXv[index];
24
+ }
@@ -0,0 +1,26 @@
1
+ @group(0) @binding(0)
2
+ var <storage, read> losses : array<f32>;
3
+
4
+ @group(0) @binding(1)
5
+
6
+ var <storage, read> acces : array<f32>;
7
+
8
+ @group(0) @binding(2)
9
+
10
+ var <storage, read_write> totalLoss : array<f32>;
11
+
12
+ @group(0) @binding(3)
13
+
14
+ var <storage, read_write> totalAcc : array<f32>;
15
+
16
+ @compute @workgroup_size(1)
17
+
18
+ fn main(){
19
+ var lossSum = 0.0;
20
+ for(var a = 0u; a < arrayLength(&losses); a++){
21
+ lossSum += losses[a];
22
+ }
23
+ lossSum /= f32(arrayLength(&losses));
24
+ totalAcc[0u] += acces[0];
25
+ totalLoss[0u] += lossSum;
26
+ }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.