@imaduddin/fastbrain 1.1.1-patch → 2.0.0

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 (115) hide show
  1. package/dist/Embedding/index.d.ts +24 -0
  2. package/dist/Embedding/index.js +93 -0
  3. package/dist/FFN/index.d.ts +20 -0
  4. package/dist/FFN/index.js +51 -0
  5. package/dist/Gelu/index.d.ts +15 -0
  6. package/dist/Gelu/index.js +58 -0
  7. package/dist/Linear/index.d.ts +31 -0
  8. package/dist/Linear/index.js +136 -0
  9. package/dist/RMSNorm/index.d.ts +16 -0
  10. package/dist/RMSNorm/index.js +63 -0
  11. package/dist/Relu/index.d.ts +15 -0
  12. package/dist/Relu/index.js +58 -0
  13. package/dist/SelfAttention/index.d.ts +47 -0
  14. package/dist/SelfAttention/index.js +186 -0
  15. package/dist/Softmax/index.d.ts +18 -0
  16. package/dist/Softmax/index.js +96 -0
  17. package/dist/Tokenizer/index.d.ts +15 -0
  18. package/dist/Tokenizer/index.js +58 -0
  19. package/dist/TransformerBlock/index.d.ts +21 -0
  20. package/dist/TransformerBlock/index.js +43 -0
  21. package/dist/fileManager.d.ts +6 -0
  22. package/dist/fileManager.js +34 -0
  23. package/dist/index.d.ts +10 -0
  24. package/dist/index.js +10 -0
  25. package/dist/residualConnection/index.d.ts +9 -0
  26. package/dist/residualConnection/index.js +25 -0
  27. package/package.json +14 -3
  28. package/shaders/add.wgsl +22 -0
  29. package/shaders/embedding/backward.wgsl +36 -0
  30. package/shaders/embedding/forward.wgsl +35 -0
  31. package/shaders/linear/ComputeDinput.wgsl +72 -0
  32. package/shaders/linear/forward.wgsl +63 -0
  33. package/shaders/linear/updateBias.wgsl +33 -0
  34. package/shaders/linear/updateWeights.wgsl +38 -0
  35. package/shaders/relu/backward.wgsl +43 -0
  36. package/shaders/relu/forward.wgsl +28 -0
  37. package/shaders/rmsnorm/backward.wgsl +54 -0
  38. package/shaders/rmsnorm/forward.wgsl +51 -0
  39. package/shaders/selfAttention/SB.wgsl +30 -0
  40. package/shaders/selfAttention/add3.wgsl +27 -0
  41. package/shaders/selfAttention/matMul.wgsl +63 -0
  42. package/shaders/selfAttention/qK.wgsl +66 -0
  43. package/shaders/selfAttention/transpose.wgsl +24 -0
  44. package/shaders/softmax/backward.wgsl +36 -0
  45. package/shaders/softmax/crossEntropy.wgsl +36 -0
  46. package/shaders/softmax/forward.wgsl +68 -0
  47. package/src/Embedding/index.ts +81 -0
  48. package/src/FFN/index.ts +47 -0
  49. package/src/Gelu/index.ts +53 -0
  50. package/src/Linear/index.ts +122 -0
  51. package/src/RMSNorm/index.ts +56 -0
  52. package/src/SelfAttention/index.ts +177 -0
  53. package/src/Softmax/index.ts +82 -0
  54. package/src/Tokenizer/index.ts +60 -0
  55. package/src/TransformerBlock/index.ts +41 -0
  56. package/src/fileManager.ts +46 -0
  57. package/src/index.ts +10 -0
  58. package/src/residualConnection/index.ts +24 -0
  59. package/tsconfig.json +27 -0
  60. package/index.js +0 -22
  61. package/src/Embedding/index.d.ts +0 -21
  62. package/src/Embedding/index.js +0 -140
  63. package/src/FFN/index.d.ts +0 -23
  64. package/src/FFN/index.js +0 -45
  65. package/src/Linear/index.d.ts +0 -31
  66. package/src/Linear/index.js +0 -196
  67. package/src/OperationManager.js +0 -169
  68. package/src/PositionEmbedding/index.d.ts +0 -30
  69. package/src/PositionEmbedding/index.js +0 -70
  70. package/src/RMSNorm/index.d.ts +0 -30
  71. package/src/RMSNorm/index.js +0 -91
  72. package/src/Relu/index.d.ts +0 -25
  73. package/src/Relu/index.js +0 -108
  74. package/src/SelfAttention/index.d.ts +0 -28
  75. package/src/SelfAttention/index.js +0 -138
  76. package/src/Softmax/index.d.ts +0 -26
  77. package/src/Softmax/index.js +0 -195
  78. package/src/Tokenizer/index.d.ts +0 -12
  79. package/src/Tokenizer/index.js +0 -164
  80. package/src/Tokenizer/vocabs.json +0 -19618
  81. package/src/TransformerBlock/index.d.ts +0 -28
  82. package/src/TransformerBlock/index.js +0 -78
  83. package/src/getVec.js +0 -30
  84. package/src/gpu.js +0 -0
  85. package/src/model/index.d.ts +0 -43
  86. package/src/model/index.js +0 -82
  87. package/src/residualConnection/index.js +0 -31
  88. package/src/shaders/CalculateAcc.wgsl +0 -50
  89. package/src/shaders/CalculateLoss.wgsl +0 -33
  90. package/src/shaders/ComputeDInput.wgsl +0 -46
  91. package/src/shaders/EB.wgsl +0 -33
  92. package/src/shaders/EF.wgsl +0 -25
  93. package/src/shaders/LB.wgsl +0 -71
  94. package/src/shaders/LF.wgsl +0 -60
  95. package/src/shaders/Norm/rmsBackward.wgsl +0 -65
  96. package/src/shaders/Norm/rmsForward.wgsl +0 -30
  97. package/src/shaders/Norm/sumSquare.wgsl +0 -38
  98. package/src/shaders/Norm/updateGamma.wgsl +0 -54
  99. package/src/shaders/PB.wgsl +0 -25
  100. package/src/shaders/PF.wgsl +0 -24
  101. package/src/shaders/RB.wgsl +0 -37
  102. package/src/shaders/RF.wgsl +0 -33
  103. package/src/shaders/ReductionFunction.wgsl +0 -28
  104. package/src/shaders/SB.wgsl +0 -41
  105. package/src/shaders/SF.wgsl +0 -75
  106. package/src/shaders/SoftmaxBackward.wgsl +0 -31
  107. package/src/shaders/add.wgsl +0 -30
  108. package/src/shaders/attentionShader/CompueFinalForwardOutput.wgsl +0 -29
  109. package/src/shaders/attentionShader/ComputeDA.wgsl +0 -30
  110. package/src/shaders/attentionShader/ComputeDV.wgsl +0 -37
  111. package/src/shaders/attentionShader/ComputeK.wgsl +0 -30
  112. package/src/shaders/attentionShader/ComputedQ.wgsl +0 -31
  113. package/src/shaders/attentionShader/attentionSocres.wgsl +0 -40
  114. package/src/shaders/attentionShader/sumGradient.wgsl +0 -24
  115. package/src/shaders/calculateTotal.wgsl +0 -26
@@ -1,30 +0,0 @@
1
- @group(0) @binding(0)
2
- var<storage, read> reduce: array<f32>;
3
-
4
- @group(0) @binding(1)
5
- var<storage, read> vector: array<f32>;
6
-
7
- @group(0) @binding(2)
8
- var<storage, read_write> output: array<f32>;
9
-
10
- @group(0) @binding(3)
11
- var<storage, read> gamma: array<f32>;
12
-
13
- @compute @workgroup_size(64)
14
- fn main(@builtin(global_invocation_id) id: vec3<u32>) {
15
- let x = id.x;
16
-
17
- if (x >= arrayLength(&vector)) {
18
- return;
19
- }
20
-
21
- let dim = %embeddingSize%u;
22
- let token = x / dim;
23
- let d = x % dim;
24
-
25
- let rms = sqrt(
26
- reduce[token] / f32(dim) + 1e-6
27
- );
28
-
29
- output[x] = (vector[x] / rms) * gamma[d];
30
- }
@@ -1,38 +0,0 @@
1
-
2
- @group(0) @binding(0)
3
- var<storage, read> input: array<f32>;
4
-
5
- @group(0) @binding(1)
6
- var<storage, read_write> out: array<f32>;
7
-
8
- var<workgroup> partial: array<f32, 64>;
9
- const D: u32 = %embeddingSize%u;
10
- @compute @workgroup_size(64)
11
- fn main(@builtin(local_invocation_index) lid: u32, @builtin(workgroup_id) wid: vec3<u32>) {
12
- let base = wid.x * D;
13
- var sum = 0.0;
14
- var d = lid;
15
- while (d < D) {
16
- let idx = base + d;
17
- if (idx < arrayLength(&input)) {
18
- sum += input[idx] * input[idx];
19
- }
20
- d += 64u;
21
- }
22
- partial[lid] = sum;
23
- workgroupBarrier();
24
- var stride = 32u;
25
- loop {
26
- if (stride == 0u) {
27
- break;
28
- }
29
- if (lid < stride) {
30
- partial[lid] += partial[lid + stride];
31
- }
32
- workgroupBarrier();
33
- stride /= 2u;
34
- }
35
- if (lid == 0u) {
36
- out[wid.x] = partial[0];
37
- }
38
- }
@@ -1,54 +0,0 @@
1
- struct Params{
2
- lr: f32
3
- }
4
- @group(0) @binding(0)
5
- var<storage, read> input: array<f32>;
6
-
7
- @group(0) @binding(1)
8
- var<storage, read> gradOutput: array<f32>;
9
-
10
- @group(0) @binding(2)
11
- var<storage, read> sumSquares: array<f32>;
12
-
13
- @group(0) @binding(3)
14
- var<storage, read_write> gamma: array<f32>;
15
-
16
- @group(0) @binding(4)
17
- var<uniform> params: Params;
18
-
19
- var<workgroup> partial: array<f32, 64>;
20
-
21
- const D: u32 = %embeddingSize%u;
22
- const EPSILON: f32 = 1e-6;
23
-
24
- @compute @workgroup_size(64)
25
- fn main(@builtin(local_invocation_index) lid: u32, @builtin(workgroup_id) wid: vec3<u32>) {
26
- let dim = wid.x;
27
- let T = arrayLength(&sumSquares);
28
- var sum = 0.0;
29
- if (dim < D) {
30
- var token = lid;
31
- while (token < T) {
32
- let idx = token * D + dim;
33
- let rms = sqrt(sumSquares[token] / f32(D) + EPSILON);
34
- sum += gradOutput[idx] * input[idx] / rms;
35
- token += 64u;
36
- }
37
- }
38
- partial[lid] = sum;
39
- workgroupBarrier();
40
- var stride = 32u;
41
- loop {
42
- if (stride == 0u) {
43
- break;
44
- }
45
- if (lid < stride) {
46
- partial[lid] += partial[lid + stride];
47
- }
48
- workgroupBarrier();
49
- stride /= 2u;
50
- }
51
- if (lid == 0u && dim < D) {
52
- gamma[dim] -= params.lr * partial[0] / f32(T);
53
- }
54
- }
@@ -1,25 +0,0 @@
1
- struct Params{
2
- lr : f32
3
- }
4
-
5
- @group(0) @binding(0)
6
- var <storage, read_write> posVec: array<f32>;
7
-
8
- @group(0) @binding(1)
9
-
10
- var <storage, read> outputGradient : array<f32>;
11
-
12
-
13
- @group(0) @binding(2)
14
-
15
- var <uniform> params: Params;
16
-
17
- @compute @workgroup_size(64)
18
-
19
- fn main(@builtin(global_invocation_id) id : vec3<u32>){
20
- let x = id.x;
21
- if(x >= arrayLength(&outputGradient)){
22
- return;
23
- }
24
- posVec[x] -= params.lr * outputGradient[x];
25
- }
@@ -1,24 +0,0 @@
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
- @group(0) @binding(2)
10
-
11
- var <storage, read_write> output : array<f32>;
12
-
13
-
14
-
15
-
16
- @compute @workgroup_size(64)
17
-
18
- fn main(@builtin(global_invocation_id) id : vec3<u32>){
19
- let x = id.x;
20
- if(x >= arrayLength(&vecs)){
21
- return;
22
- }
23
- output[x] = vecs[x] + posVec[x];
24
- }
@@ -1,37 +0,0 @@
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
- }
@@ -1,33 +0,0 @@
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
- }
@@ -1,28 +0,0 @@
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
- }
@@ -1,41 +0,0 @@
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
-
20
- @group(0) @binding(4)
21
-
22
- var<storage, read_write> dLogits: array<f32>;
23
-
24
- @compute @workgroup_size(256)
25
-
26
- fn main(@builtin(global_invocation_id) id: vec3<u32>) {
27
- let index = id.x;
28
- let token = index / params.vocabSize;
29
- let vocabIndex = index % params.vocabSize;
30
- let start = token * params.vocabSize;
31
- let end = start + params.vocabSize;
32
- let total = params.tokenCount * params.vocabSize;
33
- if (index >= total) {
34
- return;
35
- }
36
- var targetIndex = targetToken[token];
37
- dLogits[index] = probs[index];
38
- if(vocabIndex == u32(targetIndex)){
39
- dLogits[index] -= 1;
40
- }
41
- }
@@ -1,75 +0,0 @@
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
- }
@@ -1,31 +0,0 @@
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
- }
@@ -1,30 +0,0 @@
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
-
@@ -1,29 +0,0 @@
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
- }
@@ -1,30 +0,0 @@
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
- }
@@ -1,37 +0,0 @@
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
- }
@@ -1,30 +0,0 @@
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
- }
@@ -1,31 +0,0 @@
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
- }
@@ -1,40 +0,0 @@
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
- }
@@ -1,24 +0,0 @@
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
- }