@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.
- package/dist/Embedding/index.d.ts +24 -0
- package/dist/Embedding/index.js +93 -0
- package/dist/FFN/index.d.ts +20 -0
- package/dist/FFN/index.js +51 -0
- package/dist/Gelu/index.d.ts +15 -0
- package/dist/Gelu/index.js +58 -0
- package/dist/Linear/index.d.ts +31 -0
- package/dist/Linear/index.js +136 -0
- package/dist/RMSNorm/index.d.ts +16 -0
- package/dist/RMSNorm/index.js +63 -0
- package/dist/Relu/index.d.ts +15 -0
- package/dist/Relu/index.js +58 -0
- package/dist/SelfAttention/index.d.ts +47 -0
- package/dist/SelfAttention/index.js +186 -0
- package/dist/Softmax/index.d.ts +18 -0
- package/dist/Softmax/index.js +96 -0
- package/dist/Tokenizer/index.d.ts +15 -0
- package/dist/Tokenizer/index.js +58 -0
- package/dist/TransformerBlock/index.d.ts +21 -0
- package/dist/TransformerBlock/index.js +43 -0
- package/dist/fileManager.d.ts +6 -0
- package/dist/fileManager.js +34 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +10 -0
- package/dist/residualConnection/index.d.ts +9 -0
- package/dist/residualConnection/index.js +25 -0
- package/package.json +14 -3
- package/shaders/add.wgsl +22 -0
- package/shaders/embedding/backward.wgsl +36 -0
- package/shaders/embedding/forward.wgsl +35 -0
- package/shaders/linear/ComputeDinput.wgsl +72 -0
- package/shaders/linear/forward.wgsl +63 -0
- package/shaders/linear/updateBias.wgsl +33 -0
- package/shaders/linear/updateWeights.wgsl +38 -0
- package/shaders/relu/backward.wgsl +43 -0
- package/shaders/relu/forward.wgsl +28 -0
- package/shaders/rmsnorm/backward.wgsl +54 -0
- package/shaders/rmsnorm/forward.wgsl +51 -0
- package/shaders/selfAttention/SB.wgsl +30 -0
- package/shaders/selfAttention/add3.wgsl +27 -0
- package/shaders/selfAttention/matMul.wgsl +63 -0
- package/shaders/selfAttention/qK.wgsl +66 -0
- package/shaders/selfAttention/transpose.wgsl +24 -0
- package/shaders/softmax/backward.wgsl +36 -0
- package/shaders/softmax/crossEntropy.wgsl +36 -0
- package/shaders/softmax/forward.wgsl +68 -0
- package/src/Embedding/index.ts +81 -0
- package/src/FFN/index.ts +47 -0
- package/src/Gelu/index.ts +53 -0
- package/src/Linear/index.ts +122 -0
- package/src/RMSNorm/index.ts +56 -0
- package/src/SelfAttention/index.ts +177 -0
- package/src/Softmax/index.ts +82 -0
- package/src/Tokenizer/index.ts +60 -0
- package/src/TransformerBlock/index.ts +41 -0
- package/src/fileManager.ts +46 -0
- package/src/index.ts +10 -0
- package/src/residualConnection/index.ts +24 -0
- package/tsconfig.json +27 -0
- package/index.js +0 -22
- package/src/Embedding/index.d.ts +0 -21
- package/src/Embedding/index.js +0 -140
- package/src/FFN/index.d.ts +0 -23
- package/src/FFN/index.js +0 -45
- package/src/Linear/index.d.ts +0 -31
- package/src/Linear/index.js +0 -196
- package/src/OperationManager.js +0 -169
- package/src/PositionEmbedding/index.d.ts +0 -30
- package/src/PositionEmbedding/index.js +0 -70
- package/src/RMSNorm/index.d.ts +0 -30
- package/src/RMSNorm/index.js +0 -91
- package/src/Relu/index.d.ts +0 -25
- package/src/Relu/index.js +0 -108
- package/src/SelfAttention/index.d.ts +0 -28
- package/src/SelfAttention/index.js +0 -138
- package/src/Softmax/index.d.ts +0 -26
- package/src/Softmax/index.js +0 -195
- package/src/Tokenizer/index.d.ts +0 -12
- package/src/Tokenizer/index.js +0 -164
- package/src/Tokenizer/vocabs.json +0 -19618
- package/src/TransformerBlock/index.d.ts +0 -28
- package/src/TransformerBlock/index.js +0 -78
- package/src/getVec.js +0 -30
- package/src/gpu.js +0 -0
- package/src/model/index.d.ts +0 -43
- package/src/model/index.js +0 -82
- package/src/residualConnection/index.js +0 -31
- package/src/shaders/CalculateAcc.wgsl +0 -50
- package/src/shaders/CalculateLoss.wgsl +0 -33
- package/src/shaders/ComputeDInput.wgsl +0 -46
- package/src/shaders/EB.wgsl +0 -33
- package/src/shaders/EF.wgsl +0 -25
- package/src/shaders/LB.wgsl +0 -71
- package/src/shaders/LF.wgsl +0 -60
- package/src/shaders/Norm/rmsBackward.wgsl +0 -65
- package/src/shaders/Norm/rmsForward.wgsl +0 -30
- package/src/shaders/Norm/sumSquare.wgsl +0 -38
- package/src/shaders/Norm/updateGamma.wgsl +0 -54
- package/src/shaders/PB.wgsl +0 -25
- package/src/shaders/PF.wgsl +0 -24
- package/src/shaders/RB.wgsl +0 -37
- package/src/shaders/RF.wgsl +0 -33
- package/src/shaders/ReductionFunction.wgsl +0 -28
- package/src/shaders/SB.wgsl +0 -41
- package/src/shaders/SF.wgsl +0 -75
- package/src/shaders/SoftmaxBackward.wgsl +0 -31
- package/src/shaders/add.wgsl +0 -30
- package/src/shaders/attentionShader/CompueFinalForwardOutput.wgsl +0 -29
- package/src/shaders/attentionShader/ComputeDA.wgsl +0 -30
- package/src/shaders/attentionShader/ComputeDV.wgsl +0 -37
- package/src/shaders/attentionShader/ComputeK.wgsl +0 -30
- package/src/shaders/attentionShader/ComputedQ.wgsl +0 -31
- package/src/shaders/attentionShader/attentionSocres.wgsl +0 -40
- package/src/shaders/attentionShader/sumGradient.wgsl +0 -24
- 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
|
-
}
|
package/src/shaders/PB.wgsl
DELETED
|
@@ -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
|
-
}
|
package/src/shaders/PF.wgsl
DELETED
|
@@ -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
|
-
}
|
package/src/shaders/RB.wgsl
DELETED
|
@@ -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
|
-
}
|
package/src/shaders/RF.wgsl
DELETED
|
@@ -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
|
-
}
|
package/src/shaders/SB.wgsl
DELETED
|
@@ -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
|
-
}
|
package/src/shaders/SF.wgsl
DELETED
|
@@ -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
|
-
}
|
package/src/shaders/add.wgsl
DELETED
|
@@ -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
|
-
}
|