feat: first cut at actual token generation and model loading
This commit is contained in:
63
metal/glu.metal
Normal file
63
metal/glu.metal
Normal file
@@ -0,0 +1,63 @@
|
||||
struct ds4_metal_args_glu {
|
||||
int32_t ne00;
|
||||
uint64_t nb01;
|
||||
int32_t ne10;
|
||||
uint64_t nb11;
|
||||
int32_t ne0;
|
||||
uint64_t nb1;
|
||||
int32_t i00;
|
||||
int32_t i10;
|
||||
float alpha;
|
||||
float limit;
|
||||
};
|
||||
|
||||
// SwiGLU activation for the FFN inner state. DS4 clamps the shared expert with
|
||||
// the same swiglu_limit used by routed experts.
|
||||
kernel void kernel_swiglu_f32(
|
||||
constant ds4_metal_args_glu & args,
|
||||
device const char * src0,
|
||||
device const char * src1,
|
||||
device char * dst,
|
||||
uint tgpig[[threadgroup_position_in_grid]],
|
||||
uint tpitg[[thread_position_in_threadgroup]],
|
||||
uint ntg[[threads_per_threadgroup]]) {
|
||||
device const float * src0_row = (device const float *) ((device const char *) src0 + tgpig*args.nb01) + args.i00;
|
||||
device const float * src1_row = (device const float *) ((device const char *) src1 + tgpig*args.nb11) + args.i10;
|
||||
device float * dst_row = (device float *) ((device char *) dst + tgpig*args.nb1);
|
||||
|
||||
for (int i0 = tpitg; i0 < args.ne0; i0 += ntg) {
|
||||
float x0 = src0_row[i0];
|
||||
float x1 = src1_row[i0];
|
||||
if (args.limit > 1.0e-6f) {
|
||||
x0 = min(x0, args.limit);
|
||||
x1 = clamp(x1, -args.limit, args.limit);
|
||||
}
|
||||
|
||||
const float silu = x0 / (1.0f + exp(-x0));
|
||||
|
||||
dst_row[i0] = silu*x1*args.alpha;
|
||||
}
|
||||
}
|
||||
|
||||
kernel void kernel_swiglu_flat_f32(
|
||||
constant ds4_metal_args_glu & args,
|
||||
device const char * src0,
|
||||
device const char * src1,
|
||||
device char * dst,
|
||||
uint i [[thread_position_in_grid]]) {
|
||||
if (i >= (uint)args.ne0) return;
|
||||
|
||||
device const float * src0_f32 = (device const float *) src0 + args.i00;
|
||||
device const float * src1_f32 = (device const float *) src1 + args.i10;
|
||||
device float * dst_f32 = (device float *) dst;
|
||||
|
||||
float x0 = src0_f32[i];
|
||||
float x1 = src1_f32[i];
|
||||
if (args.limit > 1.0e-6f) {
|
||||
x0 = min(x0, args.limit);
|
||||
x1 = clamp(x1, -args.limit, args.limit);
|
||||
}
|
||||
|
||||
const float silu = x0 / (1.0f + exp(-x0));
|
||||
dst_f32[i] = silu*x1*args.alpha;
|
||||
}
|
||||
Reference in New Issue
Block a user