@imaduddin/fastbrain 1.1.1 → 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 -83
- 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
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
struct Params {
|
|
2
|
+
inputSize: f32,
|
|
3
|
+
outputSize: f32,
|
|
4
|
+
tokenCount: f32,
|
|
5
|
+
lr : f32
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
@group(0) @binding(0)
|
|
9
|
+
|
|
10
|
+
var <storage, read> weights: array<f32>;
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@group(0) @binding(1)
|
|
14
|
+
|
|
15
|
+
var <storage, read> outputGradient : array<f32>;
|
|
16
|
+
|
|
17
|
+
@group(0) @binding(2)
|
|
18
|
+
|
|
19
|
+
var <storage, read_write> dinput : array<f32>;
|
|
20
|
+
|
|
21
|
+
@group(0) @binding(3)
|
|
22
|
+
|
|
23
|
+
var <uniform> params : Params;
|
|
24
|
+
|
|
25
|
+
var <workgroup> sdata : array<f32, 64>;
|
|
26
|
+
|
|
27
|
+
@compute @workgroup_size(64)
|
|
28
|
+
|
|
29
|
+
fn main(@builtin(workgroup_id) wid: vec3<u32>, @builtin(local_invocation_id) lid: vec3<u32>){
|
|
30
|
+
var x = wid.x;
|
|
31
|
+
var y = wid.y;
|
|
32
|
+
var tid = lid.x;
|
|
33
|
+
var isCorrect = x >= u32(params.tokenCount) || y >= u32(params.inputSize);
|
|
34
|
+
if(!isCorrect){
|
|
35
|
+
var local_sum = 0.0;
|
|
36
|
+
for(var out = tid; out < u32(params.outputSize); out += 64){
|
|
37
|
+
let dOut = outputGradient[x * u32(params.outputSize) + out];
|
|
38
|
+
let w = weights[out * u32(params.inputSize) + y];
|
|
39
|
+
local_sum += dOut * w;
|
|
40
|
+
}
|
|
41
|
+
sdata[tid] = local_sum;
|
|
42
|
+
workgroupBarrier();
|
|
43
|
+
|
|
44
|
+
if(tid < 32u){
|
|
45
|
+
sdata[tid] += sdata[tid + 32u];
|
|
46
|
+
}
|
|
47
|
+
workgroupBarrier();
|
|
48
|
+
if(tid < 16u){
|
|
49
|
+
sdata[tid] += sdata[tid + 16u];
|
|
50
|
+
}
|
|
51
|
+
workgroupBarrier();
|
|
52
|
+
if(tid < 8u){
|
|
53
|
+
sdata[tid] += sdata[tid + 8u];
|
|
54
|
+
}
|
|
55
|
+
workgroupBarrier();
|
|
56
|
+
if(tid < 4u){
|
|
57
|
+
sdata[tid] += sdata[tid + 4u];
|
|
58
|
+
}
|
|
59
|
+
workgroupBarrier();
|
|
60
|
+
if(tid < 2u){
|
|
61
|
+
sdata[tid] += sdata[tid + 2u];
|
|
62
|
+
}
|
|
63
|
+
workgroupBarrier();
|
|
64
|
+
if(tid < 1u){
|
|
65
|
+
sdata[tid] += sdata[tid + 1u];
|
|
66
|
+
}
|
|
67
|
+
workgroupBarrier();
|
|
68
|
+
if(tid == 0u){
|
|
69
|
+
dinput[x * u32(params.inputSize) + y] = sdata[0u];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
|
|
2
|
+
struct Params {
|
|
3
|
+
inputSize: u32,
|
|
4
|
+
outputSize: u32,
|
|
5
|
+
tokenCount: u32,
|
|
6
|
+
};
|
|
7
|
+
@group(0) @binding(0)
|
|
8
|
+
var<storage, read> input: array<f32>;
|
|
9
|
+
@group(0) @binding(1)
|
|
10
|
+
var<storage, read> weights: array<f32>;
|
|
11
|
+
@group(0) @binding(2)
|
|
12
|
+
var<storage, read> bias: array<f32>;
|
|
13
|
+
@group(0) @binding(3)
|
|
14
|
+
var<storage, read_write> output: array<f32>;
|
|
15
|
+
@group(0) @binding(4)
|
|
16
|
+
var<uniform> params: Params;
|
|
17
|
+
|
|
18
|
+
var <workgroup> sdata: array<f32, 64>;
|
|
19
|
+
@compute @workgroup_size(64)
|
|
20
|
+
fn main(@builtin(workgroup_id) wid: vec3<u32>, @builtin(local_invocation_id) lid: vec3<u32>) {
|
|
21
|
+
var vocabIndex = wid.x;
|
|
22
|
+
var tokenIndex = wid.y;
|
|
23
|
+
var lane = lid.x;
|
|
24
|
+
let isCorrect = vocabIndex >= params.outputSize || tokenIndex >= params.tokenCount;
|
|
25
|
+
if (!isCorrect) {
|
|
26
|
+
var sum = 0.0;
|
|
27
|
+
for (var i = lane; i < params.inputSize; i+= 64u) {
|
|
28
|
+
let inputIndex = tokenIndex * params.inputSize + i;
|
|
29
|
+
let weightIndex = vocabIndex * params.inputSize + i;
|
|
30
|
+
sum += input[inputIndex] * weights[weightIndex];
|
|
31
|
+
}
|
|
32
|
+
sdata[lane] = sum;
|
|
33
|
+
workgroupBarrier();
|
|
34
|
+
if(lane < 32u){
|
|
35
|
+
sdata[lane] += sdata[lane + 32u];
|
|
36
|
+
}
|
|
37
|
+
workgroupBarrier();
|
|
38
|
+
if(lane < 16u){
|
|
39
|
+
sdata[lane] += sdata[lane + 16u];
|
|
40
|
+
}
|
|
41
|
+
workgroupBarrier();
|
|
42
|
+
if(lane < 8u){
|
|
43
|
+
sdata[lane] += sdata[lane + 8u];
|
|
44
|
+
}
|
|
45
|
+
workgroupBarrier();
|
|
46
|
+
if(lane < 4u){
|
|
47
|
+
sdata[lane] += sdata[lane + 4u];
|
|
48
|
+
}
|
|
49
|
+
workgroupBarrier();
|
|
50
|
+
if(lane < 2u){
|
|
51
|
+
sdata[lane] += sdata[lane + 2u];
|
|
52
|
+
}
|
|
53
|
+
workgroupBarrier();
|
|
54
|
+
if(lane < 1u){
|
|
55
|
+
sdata[lane] += sdata[lane + 1u];
|
|
56
|
+
}
|
|
57
|
+
workgroupBarrier();
|
|
58
|
+
if(lane == 0u){
|
|
59
|
+
output[tokenIndex * params.outputSize + vocabIndex] = sdata[0u] + bias[vocabIndex];
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
struct Params {
|
|
2
|
+
inputSize: f32,
|
|
3
|
+
outputSize: f32,
|
|
4
|
+
tokenCount: f32,
|
|
5
|
+
lr : f32
|
|
6
|
+
}
|
|
7
|
+
@group(0) @binding(0)
|
|
8
|
+
|
|
9
|
+
var <storage, read_write> bias : array<f32>;
|
|
10
|
+
|
|
11
|
+
@group(0) @binding(1)
|
|
12
|
+
|
|
13
|
+
var <storage, read> outputGradient: array<f32>;
|
|
14
|
+
|
|
15
|
+
@group(0) @binding(2)
|
|
16
|
+
|
|
17
|
+
var <uniform> params: Params;
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@compute @workgroup_size(32)
|
|
21
|
+
|
|
22
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>){
|
|
23
|
+
let vocab = gid.x;
|
|
24
|
+
if(vocab >= u32(params.outputSize)){
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
var grad = 0.0;
|
|
28
|
+
for(var a = 0u; a < u32(params.tokenCount); a++){
|
|
29
|
+
let gradIndex = a * u32(params.outputSize) + vocab;
|
|
30
|
+
grad += outputGradient[gradIndex];
|
|
31
|
+
}
|
|
32
|
+
bias[vocab] -= params.lr * grad;
|
|
33
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
struct Params {
|
|
2
|
+
inputSize: f32,
|
|
3
|
+
outputSize: f32,
|
|
4
|
+
tokenCount: f32,
|
|
5
|
+
lr : f32
|
|
6
|
+
}
|
|
7
|
+
@group(0) @binding(0)
|
|
8
|
+
|
|
9
|
+
var <storage, read_write> weights : array<f32>;
|
|
10
|
+
|
|
11
|
+
@group(0) @binding(1)
|
|
12
|
+
|
|
13
|
+
var <storage, read> outputGradient: array<f32>;
|
|
14
|
+
|
|
15
|
+
@group(0) @binding(2)
|
|
16
|
+
|
|
17
|
+
var <uniform> params: Params;
|
|
18
|
+
|
|
19
|
+
@group(0) @binding(3)
|
|
20
|
+
|
|
21
|
+
var <storage, read> input: array<f32>;
|
|
22
|
+
|
|
23
|
+
@compute @workgroup_size(16, 32)
|
|
24
|
+
|
|
25
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>){
|
|
26
|
+
let dim = gid.x;
|
|
27
|
+
let vocab = gid.y;
|
|
28
|
+
if(dim >= u32(params.inputSize) || vocab >= u32(params.outputSize)){
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
let index = u32(vocab) * u32(params.inputSize) + u32(dim);
|
|
32
|
+
var grad = 0.0;
|
|
33
|
+
for(var a = 0u; a < u32(params.tokenCount); a++){
|
|
34
|
+
let gradIndex = a * u32( params.outputSize) + vocab;
|
|
35
|
+
grad += outputGradient[gradIndex] * input[a * u32( params.inputSize) + dim];
|
|
36
|
+
}
|
|
37
|
+
weights[index] -= params.lr * grad;
|
|
38
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
struct Params{
|
|
2
|
+
dimSize: 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 <storage, read_write> output : array<f32>;
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@group(0) @binding(2)
|
|
16
|
+
|
|
17
|
+
var <storage, read_write> grad : array<f32>;
|
|
18
|
+
|
|
19
|
+
@group(0) @binding(3)
|
|
20
|
+
var <uniform> params : Params;
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@compute @workgroup_size(16,16)
|
|
24
|
+
fn main(@builtin(global_invocation_id) id : vec3<u32>){
|
|
25
|
+
var dim = id.x;
|
|
26
|
+
var token = id.y;
|
|
27
|
+
if(dim >= params.dimSize || token >= params.tokenCount){
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
var index = token * params.dimSize + dim;
|
|
31
|
+
let x = input[index];
|
|
32
|
+
let go = grad[index];
|
|
33
|
+
let c0 = sqrt(2 / 3.141592653589793);
|
|
34
|
+
let c1 = 0.044715;
|
|
35
|
+
let x3 = x * x * x;
|
|
36
|
+
let inner = c0 * (x + c1 * x3);
|
|
37
|
+
let tanh_inner = tanh(inner);
|
|
38
|
+
let left = 0.5 * (1.0 + tanh_inner);
|
|
39
|
+
let sech2 = 1.0 - tanh_inner * tanh_inner;
|
|
40
|
+
let right = 0.5 * x * sech2 * c0 * (1.0 + 3.0 * c1 * x * x);
|
|
41
|
+
let dgelu = left + right;
|
|
42
|
+
output[index] = go * dgelu;
|
|
43
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
struct Params{
|
|
2
|
+
dimSize: 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 <storage, read_write> output : array<f32>;
|
|
13
|
+
|
|
14
|
+
@group(0) @binding(2)
|
|
15
|
+
|
|
16
|
+
var <uniform> params : Params;
|
|
17
|
+
|
|
18
|
+
@compute @workgroup_size(16,16)
|
|
19
|
+
fn main(@builtin(global_invocation_id) id : vec3<u32>){
|
|
20
|
+
var dim = id.x;
|
|
21
|
+
var token = id.y;
|
|
22
|
+
if(dim >= params.dimSize || token >= params.tokenCount){
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
var index = token * params.dimSize + dim;
|
|
26
|
+
let x = input[index];
|
|
27
|
+
output[index] = 0.5 * x * (1 + tanh(sqrt(2 / 3.141592653589793) * (x + 0.044715 * x * x * x)));
|
|
28
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
struct Params {
|
|
2
|
+
dim: u32,
|
|
3
|
+
tokenCount: u32,
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
@group(0) @binding(0)
|
|
7
|
+
var<storage, read> input: array<f32>;
|
|
8
|
+
|
|
9
|
+
@group(0) @binding(1)
|
|
10
|
+
var<storage, read> rstd: array<f32>;
|
|
11
|
+
|
|
12
|
+
@group(0) @binding(2)
|
|
13
|
+
var<storage, read> dout: array<f32>;
|
|
14
|
+
|
|
15
|
+
@group(0) @binding(3)
|
|
16
|
+
var<storage, read_write> din: array<f32>;
|
|
17
|
+
|
|
18
|
+
@group(0) @binding(4)
|
|
19
|
+
var<uniform> params: Params;
|
|
20
|
+
|
|
21
|
+
var<workgroup> shared1: array<f32, 256>;
|
|
22
|
+
|
|
23
|
+
@compute @workgroup_size(256)
|
|
24
|
+
fn main(@builtin(local_invocation_id) lid: vec3<u32>, @builtin(workgroup_id) wid: vec3<u32>) {
|
|
25
|
+
let token = wid.x;
|
|
26
|
+
let lane = lid.x;
|
|
27
|
+
|
|
28
|
+
if (token >= params.tokenCount) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
let base = token * params.dim;
|
|
33
|
+
let inv_rms = rstd[token];
|
|
34
|
+
var local_sum = 0.0;
|
|
35
|
+
for (var i = lane; i < params.dim; i += 256u) {
|
|
36
|
+
local_sum += dout[base + i] * input[base + i];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
shared1[lane] = local_sum;
|
|
40
|
+
workgroupBarrier();
|
|
41
|
+
for (var stride = 128u; stride > 0u; stride >>= 1u) {
|
|
42
|
+
if (lane < stride) {
|
|
43
|
+
shared1[lane] += shared1[lane + stride];
|
|
44
|
+
}
|
|
45
|
+
workgroupBarrier();
|
|
46
|
+
}
|
|
47
|
+
let mean_term = (shared1[0] * inv_rms * inv_rms) / f32(params.dim);
|
|
48
|
+
for (var i = lane; i < params.dim; i += 256u) {
|
|
49
|
+
let x = input[base + i];
|
|
50
|
+
let dy = dout[base + i];
|
|
51
|
+
|
|
52
|
+
din[base + i] = inv_rms * (dy - x * mean_term);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
struct Params {
|
|
2
|
+
dim: u32,
|
|
3
|
+
tokenCount: u32,
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
@group(0) @binding(0)
|
|
7
|
+
var<storage, read> input: array<f32>;
|
|
8
|
+
|
|
9
|
+
@group(0) @binding(1)
|
|
10
|
+
var<storage, read_write> output: array<f32>;
|
|
11
|
+
|
|
12
|
+
@group(0) @binding(2)
|
|
13
|
+
var<storage, read_write> rstd: array<f32>;
|
|
14
|
+
|
|
15
|
+
@group(0) @binding(3)
|
|
16
|
+
var<uniform> params: Params;
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
var<workgroup> shared1: array<f32, 256>;
|
|
21
|
+
|
|
22
|
+
@compute @workgroup_size(256)
|
|
23
|
+
fn main(@builtin(local_invocation_id) lid: vec3<u32>, @builtin(workgroup_id) wid: vec3<u32>) {
|
|
24
|
+
let token = wid.x;
|
|
25
|
+
let lane = lid.x;
|
|
26
|
+
if (token >= params.tokenCount) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
let base = token * params.dim;
|
|
30
|
+
var local_sum = 0.0;
|
|
31
|
+
for (var i = lane; i < params.dim; i += 256u) {
|
|
32
|
+
let x = input[base + i];
|
|
33
|
+
local_sum += x * x;
|
|
34
|
+
}
|
|
35
|
+
shared1[lane] = local_sum;
|
|
36
|
+
workgroupBarrier();
|
|
37
|
+
for (var stride = 128u; stride > 0u; stride >>= 1u) {
|
|
38
|
+
if (lane < stride) {
|
|
39
|
+
shared1[lane] += shared1[lane + stride];
|
|
40
|
+
}
|
|
41
|
+
workgroupBarrier();
|
|
42
|
+
}
|
|
43
|
+
let inv_rms = 1.0 / sqrt(shared1[0] / f32(params.dim) + 1e-8);
|
|
44
|
+
if (lane == 0u) {
|
|
45
|
+
rstd[token] = inv_rms;
|
|
46
|
+
}
|
|
47
|
+
workgroupBarrier();
|
|
48
|
+
for (var i = lane; i < params.dim; i += 256u) {
|
|
49
|
+
output[base + i] = input[base + i] * inv_rms;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
|
|
2
|
+
struct Params {
|
|
3
|
+
size: u32,
|
|
4
|
+
D: u32
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
@group(0) @binding(0)
|
|
8
|
+
var<storage, read> probs: array<f32>;
|
|
9
|
+
@group(0) @binding(1)
|
|
10
|
+
var<storage, read> dProbs: array<f32>;
|
|
11
|
+
@group(0) @binding(2)
|
|
12
|
+
var<storage, read_write> dScores: array<f32>;
|
|
13
|
+
@group(0) @binding(3)
|
|
14
|
+
var<uniform> params: Params;
|
|
15
|
+
|
|
16
|
+
@compute @workgroup_size(16, 16)
|
|
17
|
+
fn main(@builtin(global_invocation_id) id: vec3<u32>) {
|
|
18
|
+
let row = id.y;
|
|
19
|
+
let col = id.x;
|
|
20
|
+
if (row >= params.size || col >= params.size) { return; }
|
|
21
|
+
let idx = row * params.size + col;
|
|
22
|
+
let p = probs[idx];
|
|
23
|
+
var sum = 0.0;
|
|
24
|
+
for (var j = 0u; j < params.size; j++) {
|
|
25
|
+
sum += probs[row * params.size + j] * dProbs[row * params.size + j];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
dScores[idx] = p * (dProbs[idx] - sum);
|
|
29
|
+
dScores[idx] /= sqrt(f32(params.D));
|
|
30
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
struct Params {
|
|
2
|
+
size: u32,
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
@group(0) @binding(0)
|
|
6
|
+
var<storage, read> a: array<f32>;
|
|
7
|
+
|
|
8
|
+
@group(0) @binding(1)
|
|
9
|
+
var<storage, read> b: array<f32>;
|
|
10
|
+
|
|
11
|
+
@group(0) @binding(2)
|
|
12
|
+
var<storage, read> c: array<f32>;
|
|
13
|
+
|
|
14
|
+
@group(0) @binding(3)
|
|
15
|
+
var<storage, read_write> d: array<f32>;
|
|
16
|
+
|
|
17
|
+
@group(0) @binding(4)
|
|
18
|
+
var<uniform> params: Params;
|
|
19
|
+
|
|
20
|
+
@compute @workgroup_size(256)
|
|
21
|
+
fn main(@builtin(global_invocation_id) id: vec3<u32>) {
|
|
22
|
+
let i = id.x;
|
|
23
|
+
if (i >= params.size) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
d[i] = a[i] + b[i] + c[i];
|
|
27
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
struct Params{
|
|
2
|
+
M: u32,
|
|
3
|
+
N: u32,
|
|
4
|
+
K: u32
|
|
5
|
+
}
|
|
6
|
+
@group(0) @binding(0)
|
|
7
|
+
var <storage, read> a : array<f32>;
|
|
8
|
+
|
|
9
|
+
@group(0) @binding(1)
|
|
10
|
+
var <storage, read> b : array<f32>;
|
|
11
|
+
|
|
12
|
+
@group(0) @binding(2)
|
|
13
|
+
var <storage, read_write> c : array<f32>;
|
|
14
|
+
|
|
15
|
+
@group(0) @binding(3)
|
|
16
|
+
var <uniform> params : Params;
|
|
17
|
+
|
|
18
|
+
var <workgroup> sdata: array<f32, 64>;
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@compute @workgroup_size(64)
|
|
22
|
+
|
|
23
|
+
fn main(@builtin(workgroup_id) id : vec3<u32>, @builtin(local_invocation_id) lid : vec3<u32>){
|
|
24
|
+
let row = id.y;
|
|
25
|
+
let col = id.x;
|
|
26
|
+
let tane = lid.x;
|
|
27
|
+
let isCorrect = row >= params.M || col >= params.N;
|
|
28
|
+
if(!isCorrect){
|
|
29
|
+
var sum = 0.0;
|
|
30
|
+
for(var k = tane; k < params.K; k+= 64u){
|
|
31
|
+
sum += a[row * params.K + k] * b[k * params.N + col];
|
|
32
|
+
}
|
|
33
|
+
sdata[tane] = sum;
|
|
34
|
+
workgroupBarrier();
|
|
35
|
+
if(tane < 32u){
|
|
36
|
+
sdata[tane] += sdata[tane + 32u];
|
|
37
|
+
}
|
|
38
|
+
workgroupBarrier() ;
|
|
39
|
+
if(tane < 16u){
|
|
40
|
+
sdata[tane] += sdata[tane + 16u];
|
|
41
|
+
}
|
|
42
|
+
workgroupBarrier();
|
|
43
|
+
if(tane < 8u){
|
|
44
|
+
sdata[tane] += sdata[tane + 8u];
|
|
45
|
+
}
|
|
46
|
+
workgroupBarrier();
|
|
47
|
+
if(tane < 4u){
|
|
48
|
+
sdata[tane] += sdata[tane + 4u];
|
|
49
|
+
}
|
|
50
|
+
workgroupBarrier() ;
|
|
51
|
+
if(tane < 2u){
|
|
52
|
+
sdata[tane] += sdata[tane + 2u];
|
|
53
|
+
}
|
|
54
|
+
workgroupBarrier() ;
|
|
55
|
+
if(tane < 1u){
|
|
56
|
+
sdata[tane] += sdata[tane + 1u];
|
|
57
|
+
}
|
|
58
|
+
workgroupBarrier() ;
|
|
59
|
+
if(tane == 0u){
|
|
60
|
+
c[row * params.N + col] = sdata[0u];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
struct Params{
|
|
2
|
+
M: u32,
|
|
3
|
+
N: u32,
|
|
4
|
+
K: u32
|
|
5
|
+
}
|
|
6
|
+
@group(0) @binding(0)
|
|
7
|
+
var <storage, read> a : array<f32>;
|
|
8
|
+
|
|
9
|
+
@group(0) @binding(1)
|
|
10
|
+
var <storage, read> b : array<f32>;
|
|
11
|
+
|
|
12
|
+
@group(0) @binding(2)
|
|
13
|
+
var <storage, read_write> c : array<f32>;
|
|
14
|
+
|
|
15
|
+
@group(0) @binding(3)
|
|
16
|
+
var <uniform> params : Params;
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
var <workgroup> sdata : array<f32, 64>;
|
|
20
|
+
@compute @workgroup_size(64)
|
|
21
|
+
|
|
22
|
+
fn main(@builtin(workgroup_id) id : vec3<u32>, @builtin(local_invocation_id) lid: vec3<u32>){
|
|
23
|
+
let row = id.y;
|
|
24
|
+
let col = id.x;
|
|
25
|
+
let tane = lid.x;
|
|
26
|
+
let isCorrect = row >= params.M || col >= params.N;
|
|
27
|
+
if(!isCorrect){
|
|
28
|
+
var sum = 0.0;
|
|
29
|
+
for(var k = tane; k < params.K; k+= 64u){
|
|
30
|
+
sum += a[row * params.K + k] * b[k * params.N + col];
|
|
31
|
+
}
|
|
32
|
+
sdata[tane] = sum;
|
|
33
|
+
workgroupBarrier();
|
|
34
|
+
if(tane < 32u){
|
|
35
|
+
sdata[tane] += sdata[tane + 32u];
|
|
36
|
+
}
|
|
37
|
+
workgroupBarrier() ;
|
|
38
|
+
if(tane < 16u){
|
|
39
|
+
sdata[tane] += sdata[tane + 16u];
|
|
40
|
+
}
|
|
41
|
+
workgroupBarrier();
|
|
42
|
+
if(tane < 8u){
|
|
43
|
+
sdata[tane] += sdata[tane + 8u];
|
|
44
|
+
}
|
|
45
|
+
workgroupBarrier();
|
|
46
|
+
if(tane < 4u){
|
|
47
|
+
sdata[tane] += sdata[tane + 4u];
|
|
48
|
+
}
|
|
49
|
+
workgroupBarrier() ;
|
|
50
|
+
if(tane < 2u){
|
|
51
|
+
sdata[tane] += sdata[tane + 2u];
|
|
52
|
+
}
|
|
53
|
+
workgroupBarrier() ;
|
|
54
|
+
if(tane < 1u){
|
|
55
|
+
sdata[tane] += sdata[tane + 1u];
|
|
56
|
+
}
|
|
57
|
+
workgroupBarrier() ;
|
|
58
|
+
if(tane == 0u){
|
|
59
|
+
sum = sdata[0u] / sqrt(f32(params.K));
|
|
60
|
+
if(col > row){
|
|
61
|
+
sum = -1e9;
|
|
62
|
+
}
|
|
63
|
+
c[row * params.N + col] = sum ;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
struct Params{
|
|
2
|
+
M: u32,
|
|
3
|
+
N: u32,
|
|
4
|
+
K: u32
|
|
5
|
+
}
|
|
6
|
+
@group(0) @binding(0)
|
|
7
|
+
var <storage, read> a : array<f32>;
|
|
8
|
+
|
|
9
|
+
@group(0) @binding(1)
|
|
10
|
+
var <storage, read_write> b : array<f32>;
|
|
11
|
+
|
|
12
|
+
@group(0) @binding(2)
|
|
13
|
+
var <uniform> params : Params;
|
|
14
|
+
|
|
15
|
+
@compute @workgroup_size(16, 16)
|
|
16
|
+
|
|
17
|
+
fn main(@builtin(global_invocation_id) id : vec3<u32>){
|
|
18
|
+
let x = id.x;
|
|
19
|
+
let y = id.y;
|
|
20
|
+
if(y >= params.M || x >= params.N){
|
|
21
|
+
return ;
|
|
22
|
+
}
|
|
23
|
+
b[x * params.M + y] = a[y * params.N + x];
|
|
24
|
+
}
|
|
@@ -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> probs: array<f32>;
|
|
9
|
+
|
|
10
|
+
@group(0) @binding(1)
|
|
11
|
+
|
|
12
|
+
var <storage, read_write> dLogits: array<f32>;
|
|
13
|
+
|
|
14
|
+
@group(0) @binding(2)
|
|
15
|
+
|
|
16
|
+
var <storage, read> targetBuffer: array<u32>;
|
|
17
|
+
|
|
18
|
+
@group(0) @binding(3)
|
|
19
|
+
|
|
20
|
+
var <uniform> params: Params;
|
|
21
|
+
|
|
22
|
+
@compute @workgroup_size(64, 1)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
fn main(@builtin(global_invocation_id) id : vec3<u32>){
|
|
26
|
+
let x = id.x;
|
|
27
|
+
let y = id.y;
|
|
28
|
+
if(x >= params.vocabSize || y >= params.tokenCount){
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
let index = y * params.vocabSize + x;
|
|
32
|
+
dLogits[index] = probs[index];
|
|
33
|
+
if(x == targetBuffer[y]){
|
|
34
|
+
dLogits[index] -= 1;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
struct Params{
|
|
2
|
+
vocabSize: u32,
|
|
3
|
+
tokenCount: u32
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@group(0) @binding(0)
|
|
8
|
+
|
|
9
|
+
var <storage, read> probs: array<f32>;
|
|
10
|
+
|
|
11
|
+
@group(0) @binding(1)
|
|
12
|
+
|
|
13
|
+
var <storage, read> targetBuffer: array<u32>;
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@group(0) @binding(2)
|
|
17
|
+
|
|
18
|
+
var <storage, read_write> loss: array<f32>;
|
|
19
|
+
|
|
20
|
+
@group(0) @binding(3)
|
|
21
|
+
|
|
22
|
+
var <uniform> params: Params;
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@compute @workgroup_size(16)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
fn main(@builtin(global_invocation_id) id : vec3<u32>){
|
|
29
|
+
let token = id.x;
|
|
30
|
+
if(token >= params.tokenCount){
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
let targetToken = targetBuffer[token];
|
|
34
|
+
let index = token * params.vocabSize + targetToken;
|
|
35
|
+
loss[token] = - log(probs[index] + 1e-9);
|
|
36
|
+
}
|