From 79476f66a61c9a947cb6511414c4aa47662e19b2 Mon Sep 17 00:00:00 2001 From: josc146 Date: Tue, 28 May 2024 21:15:47 +0800 Subject: [PATCH] deprecate rwkv-beta --- backend-golang/rwkv.go | 2 +- backend-python/main.py | 5 - backend-python/rwkv_pip/beta/cuda/att_one.cu | 124 -- .../rwkv_pip/beta/cuda/att_one_v5.cu | 109 - backend-python/rwkv_pip/beta/cuda/att_seq.cu | 178 -- .../rwkv_pip/beta/cuda/element_wise.h | 21 - backend-python/rwkv_pip/beta/cuda/ffn.cu | 165 -- .../rwkv_pip/beta/cuda/gemm_fp16_cublas.cpp | 128 -- .../rwkv_pip/beta/cuda/operators.cu | 246 --- backend-python/rwkv_pip/beta/cuda/util.h | 7 - backend-python/rwkv_pip/beta/cuda/wrapper.cpp | 181 -- backend-python/rwkv_pip/beta/model.py | 1821 ----------------- backend-python/rwkv_pip/beta/wkv_cuda.pyd | Bin 640512 -> 0 bytes backend-python/utils/rwkv.py | 8 +- 14 files changed, 2 insertions(+), 2993 deletions(-) delete mode 100644 backend-python/rwkv_pip/beta/cuda/att_one.cu delete mode 100644 backend-python/rwkv_pip/beta/cuda/att_one_v5.cu delete mode 100644 backend-python/rwkv_pip/beta/cuda/att_seq.cu delete mode 100644 backend-python/rwkv_pip/beta/cuda/element_wise.h delete mode 100644 backend-python/rwkv_pip/beta/cuda/ffn.cu delete mode 100644 backend-python/rwkv_pip/beta/cuda/gemm_fp16_cublas.cpp delete mode 100644 backend-python/rwkv_pip/beta/cuda/operators.cu delete mode 100644 backend-python/rwkv_pip/beta/cuda/util.h delete mode 100644 backend-python/rwkv_pip/beta/cuda/wrapper.cpp delete mode 100644 backend-python/rwkv_pip/beta/model.py delete mode 100644 backend-python/rwkv_pip/beta/wkv_cuda.pyd diff --git a/backend-golang/rwkv.go b/backend-golang/rwkv.go index 7dd7e88..563f5eb 100644 --- a/backend-golang/rwkv.go +++ b/backend-golang/rwkv.go @@ -28,7 +28,7 @@ func (a *App) StartServer(python string, port int, host string, webui bool, rwkv args = append(args, "--webui") } if rwkvBeta { - args = append(args, "--rwkv-beta") + // args = append(args, "--rwkv-beta") } if rwkvcpp { args = append(args, "--rwkv.cpp") diff --git a/backend-python/main.py b/backend-python/main.py index 92d6b20..a38285b 100644 --- a/backend-python/main.py +++ b/backend-python/main.py @@ -27,11 +27,6 @@ def get_args(args: Union[Sequence[str], None] = None): action="store_true", help="whether to enable WebUI (default: False)", ) - group.add_argument( - "--rwkv-beta", - action="store_true", - help="whether to use rwkv-beta (default: False)", - ) group.add_argument( "--rwkv.cpp", action="store_true", diff --git a/backend-python/rwkv_pip/beta/cuda/att_one.cu b/backend-python/rwkv_pip/beta/cuda/att_one.cu deleted file mode 100644 index 743fc12..0000000 --- a/backend-python/rwkv_pip/beta/cuda/att_one.cu +++ /dev/null @@ -1,124 +0,0 @@ -#include "ATen/ATen.h" -#include -#include -#include - -#include "element_wise.h" -#include "util.h" - -// Equivalent Python code: -// ww = t_first + k -// p = torch.maximum(pp, ww) -// e1 = torch.exp(pp - p) -// e2 = torch.exp(ww - p) -// wkv = ((e1 * aa + e2 * v) / (e1 * bb + e2)).to(dtype=x.dtype) -// ww = t_decay + pp -// p = torch.maximum(ww, k) -// e1 = torch.exp(ww - p) -// e2 = torch.exp(k - p) -// t1 = e1 * aa + e2 * v -// t2 = e1 * bb + e2 -// r = r * wkv -// return t1, t2, p, r -struct WkvForwardOne { - const float *t_first; - const float *k; - const float *pp; - const float *aa; - const float *bb; - const float *t_decay; - const float *v; - /* out */ float *t1; - /* out */ float *t2; - /* out */ float *p; - /* in & out */ half *r; - - __device__ void operator()(int i) const { - float ww = t_first[i] + k[i]; - float pp_ = pp[i]; - float p_ = (pp_ > ww) ? pp_ : ww; - float e1 = expf(pp_ - p_); - float e2 = expf(ww - p_); - float aa_ = aa[i]; - float bb_ = bb[i]; - float v_ = v[i]; - r[i] = __hmul(r[i], __float2half(((e1 * aa_ + e2 * v_) / (e1 * bb_ + e2)))); - ww = t_decay[i] + pp_; - float k_ = k[i]; - p_ = (ww > k_) ? ww : k_; - e1 = expf(ww - p_); - e2 = expf(k_ - p_); - t1[i] = e1 * aa_ + e2 * v_; - t2[i] = e1 * bb_ + e2; - p[i] = p_; - } -}; - -/* - Equivalent Python code: - kx = xx * k_mix + sx * (1 - k_mix) - vx = xx * v_mix + sx * (1 - v_mix) - rx = xx * r_mix + sx * (1 - r_mix) -*/ - -struct Mix { - const half *xx; - const half *sx; - const half *k_mix; - const half *v_mix; - const half *r_mix; - /* out */ half *kx; - /* out */ half *vx; - /* out */ half *rx; - - __device__ void operator()(int i) const { - half xx_ = xx[i]; - half sx_ = sx[i]; - half k_mix_ = k_mix[i]; - half v_mix_ = v_mix[i]; - half r_mix_ = r_mix[i]; - kx[i] = __hadd(__hmul(xx_, k_mix_), - __hmul(sx_, __hsub(__float2half(1), k_mix_))); - vx[i] = __hadd(__hmul(xx_, v_mix_), - __hmul(sx_, __hsub(__float2half(1), v_mix_))); - rx[i] = __hadd(__hmul(xx_, r_mix_), - __hmul(sx_, __hsub(__float2half(1), r_mix_))); - } -}; - -using torch::Tensor; - -void gemm_fp16_cublas_tensor(Tensor a, Tensor b, Tensor c); - -Tensor att_one(Tensor x, Tensor ln_w, Tensor ln_b, Tensor sx, Tensor k_mix, - Tensor v_mix, Tensor r_mix, Tensor kw, - /* imm */ Tensor kx, Tensor vw, /* imm */ Tensor vx, Tensor rw, - /* imm */ Tensor rx, Tensor ow, Tensor t_first, - /* imm */ Tensor k, Tensor pp, Tensor ww, Tensor aa, Tensor bb, - Tensor t_decay, /* imm */ Tensor v, /* in & out */ Tensor r, - /* out */ Tensor x_plus_out, /* out */ Tensor t1, - /* out */ Tensor t2, /* out */ Tensor p) { - Tensor xx = at::layer_norm(x, {x.size(-1)}, ln_w, ln_b); - element_wise(Mix{data_ptr(xx), data_ptr(sx), - data_ptr(k_mix), data_ptr(v_mix), - data_ptr(r_mix), data_ptr(kx), - data_ptr(vx), data_ptr(rx)}, - x.numel()); - - gemm_fp16_cublas_tensor(kx, kw, k); - gemm_fp16_cublas_tensor(vx, vw, v); - gemm_fp16_cublas_tensor(rx, rw, r); - at::sigmoid_(r); - - element_wise(WkvForwardOne{data_ptr(t_first), data_ptr(k), - data_ptr(pp), data_ptr(aa), - data_ptr(bb), data_ptr(t_decay), - data_ptr(v), data_ptr(t1), - data_ptr(t2), data_ptr(p), - data_ptr(r)}, - x.numel()); - - gemm_fp16_cublas_tensor(r, ow, x_plus_out); - x_plus_out += x; - return xx; -} diff --git a/backend-python/rwkv_pip/beta/cuda/att_one_v5.cu b/backend-python/rwkv_pip/beta/cuda/att_one_v5.cu deleted file mode 100644 index 98f811e..0000000 --- a/backend-python/rwkv_pip/beta/cuda/att_one_v5.cu +++ /dev/null @@ -1,109 +0,0 @@ -#include "ATen/ATen.h" -#include -#include -#include - -#include "element_wise.h" -#include "util.h" - -// Equivalent Python code: -// s1 = t_first * a + s -// s2 = a + t_decay * s -struct Fused1 { - const float *t_first; - const float *t_decay; - const float *a; - const float *s; - const int32_t inner_size; - /* out */ float *s1; - /* out */ float *s2; - - __device__ void operator()(int i) const { - const int j = i / inner_size; - s1[i] = t_first[j] * a[i] + s[i]; - s2[i] = a[i] + t_decay[j] * s[i]; - } -}; - -/* - Equivalent Python code: - kx = xx * k_mix + sx * (1 - k_mix) - vx = xx * v_mix + sx * (1 - v_mix) - rx = xx * r_mix + sx * (1 - r_mix) -*/ - -struct Mix { - const half *xx; - const half *sx; - const half *k_mix; - const half *v_mix; - const half *r_mix; - /* out */ half *kx; - /* out */ half *vx; - /* out */ half *rx; - - __device__ void operator()(int i) const { - half xx_ = xx[i]; - half sx_ = sx[i]; - half k_mix_ = k_mix[i]; - half v_mix_ = v_mix[i]; - half r_mix_ = r_mix[i]; - kx[i] = __hadd(__hmul(xx_, k_mix_), - __hmul(sx_, __hsub(__float2half(1), k_mix_))); - vx[i] = __hadd(__hmul(xx_, v_mix_), - __hmul(sx_, __hsub(__float2half(1), v_mix_))); - rx[i] = __hadd(__hmul(xx_, r_mix_), - __hmul(sx_, __hsub(__float2half(1), r_mix_))); - } -}; - -using torch::Tensor; - -void gemm_fp16_cublas_tensor(Tensor a, Tensor b, Tensor c); - -Tensor att_one_v5(Tensor x, Tensor sx, Tensor s, Tensor ln_w, Tensor ln_b, - Tensor lx_w, Tensor lx_b, Tensor k_mix, Tensor v_mix, - Tensor r_mix, Tensor kw, - /* imm */ Tensor kx, Tensor vw, /* imm */ Tensor vx, - Tensor rw, - /* imm */ Tensor rx, Tensor ow, Tensor t_first, - /* imm */ Tensor k, Tensor t_decay, /* imm */ Tensor v, - /* imm */ Tensor r, /* imm */ Tensor s1, - /* out */ Tensor x_plus_out, /* out */ Tensor s2) { - Tensor xx = at::layer_norm(x, {x.size(-1)}, ln_w, ln_b); - element_wise(Mix{data_ptr(xx), data_ptr(sx), - data_ptr(k_mix), data_ptr(v_mix), - data_ptr(r_mix), data_ptr(kx), - data_ptr(vx), data_ptr(rx)}, - x.numel()); - - int H = t_decay.size(0); - int S = x.size(-1) / H; - gemm_fp16_cublas_tensor(rx, rw, r); - r = at::reshape(r, {H, 1, S}); - gemm_fp16_cublas_tensor(kx, kw, k); - k = at::reshape(k, {H, S, 1}); - gemm_fp16_cublas_tensor(vx, vw, v); - v = at::reshape(v, {H, 1, S}); - - { - Tensor a = at::matmul(k, v); - - // s1 = t_first * a + s - // s2 = a + t_decay * s - element_wise(Fused1{data_ptr(t_first), data_ptr(t_decay), - data_ptr(a), data_ptr(s), - static_cast(a.size(1) * a.size(2)), - data_ptr(s1), data_ptr(s2)}, - a.numel()); - } - - Tensor out = at::matmul(r, s1); - out = at::flatten(out); - out = at::squeeze(at::group_norm(at::unsqueeze(out, 0), H, lx_w, lx_b), 0); - out = at::_cast_Half(out); - - gemm_fp16_cublas_tensor(out, ow, x_plus_out); - x_plus_out += x; - return xx; -} diff --git a/backend-python/rwkv_pip/beta/cuda/att_seq.cu b/backend-python/rwkv_pip/beta/cuda/att_seq.cu deleted file mode 100644 index c8db033..0000000 --- a/backend-python/rwkv_pip/beta/cuda/att_seq.cu +++ /dev/null @@ -1,178 +0,0 @@ -#include "ATen/ATen.h" -#include -#include -#include - -#include "util.h" -#include "element_wise.h" - -using torch::Tensor; - -void gemm_fp16_cublas(const void *a, const void *b, void *c, int m, - int n, int k, bool output_fp32); - -// based on `kernel_wkv_forward`, fusing more operations -__global__ void kernel_wkv_forward_new( - const int B, const int T, const int C, const float *__restrict__ const _w, - const float *__restrict__ const _u, const float *__restrict__ const _k, - const float *__restrict__ const _v, const half *__restrict__ const r, - half *__restrict__ const _y, float *__restrict__ const _aa, - float *__restrict__ const _bb, float *__restrict__ const _pp) { - const int idx = blockIdx.x * blockDim.x + threadIdx.x; - const int _b = idx / C; - const int _c = idx % C; - const int _offset = _b * T * C + _c; - const int _state_offset = _b * C + _c; - - float u = _u[_c]; - float w = _w[_c]; - const float *__restrict__ const k = _k + _offset; - const float *__restrict__ const v = _v + _offset; - half *__restrict__ const y = _y + _offset; - - float aa = _aa[_state_offset]; - float bb = _bb[_state_offset]; - float pp = _pp[_state_offset]; - for (int i = 0; i < T; i++) { - const int ii = i * C; - const float kk = k[ii]; - const float vv = v[ii]; - float ww = u + kk; - float p = max(pp, ww); - float e1 = exp(pp - p); - float e2 = exp(ww - p); - y[ii] = __float2half((e1 * aa + e2 * vv) / (e1 * bb + e2)); - ww = w + pp; - p = max(ww, kk); - e1 = exp(ww - p); - e2 = exp(kk - p); - aa = e1 * aa + e2 * vv; - bb = e1 * bb + e2; - pp = p; - } - _aa[_state_offset] = aa; - _bb[_state_offset] = bb; - _pp[_state_offset] = pp; -} - -void cuda_wkv_forward_new(int B, int T, int C, float *w, float *u, float *k, - float *v, half *r, half *y, float *aa, float *bb, - float *pp) { - dim3 threadsPerBlock(min(C, 32)); - assert(B * C % threadsPerBlock.x == 0); - dim3 numBlocks(B * C / threadsPerBlock.x); - kernel_wkv_forward_new<<>>(B, T, C, w, u, k, v, r, - y, aa, bb, pp); -} - -__global__ void _att_mix(const half *xx, const half *sx, const half *k_mix, - const half *v_mix, const half *r_mix, - const int outer_size, const int inner_size, half *kx, - half *vx, half *rx) { - for (int idx2 = blockIdx.x * blockDim.x + threadIdx.x; idx2 < inner_size; - idx2 += blockDim.x * gridDim.x) { - half k_mix_ = k_mix[idx2]; - half v_mix_ = v_mix[idx2]; - half r_mix_ = r_mix[idx2]; - for (int row = 0; row < outer_size; ++row) { - int idx1 = row * inner_size + idx2; - half xx_ = xx[idx1]; - half sx_ = sx[idx1]; - kx[idx1] = __hadd(__hmul(xx_, k_mix_), - __hmul(sx_, __hsub(__float2half(1), k_mix_))); - vx[idx1] = __hadd(__hmul(xx_, v_mix_), - __hmul(sx_, __hsub(__float2half(1), v_mix_))); - rx[idx1] = __hadd(__hmul(xx_, r_mix_), - __hmul(sx_, __hsub(__float2half(1), r_mix_))); - } - } -} - -void att_mix(const half *xx, const half *sx, const half *k_mix, - const half *v_mix, const half *r_mix, const int outer_size, - const int inner_size, half *kx, half *vx, half *rx) { - // 256 is good enough on most GPUs - const int32_t BLOCK_SIZE = 256; - assert(inner_size % BLOCK_SIZE == 0); - _att_mix<<>>( - xx, sx, k_mix, v_mix, r_mix, outer_size, inner_size, kx, vx, rx); -} - -struct InplaceSigmoid { - __device__ __forceinline__ half operator()(int i) const { - ptr[i] = __float2half(1.0 / (1.0 + exp(-__half2float(ptr[i])))); - } - half *ptr; -}; - -struct InplaceMul { - __device__ __forceinline__ half operator()(int i) const { - y[i] = __hmul(x[i], y[i]); - } - half *y; - half *x; -}; - -/* - Equivalent Python code: - - xx = F.layer_norm(x, (x.shape[-1],), weight=ln_w, bias=ln_b) - sx = torch.cat((sx.unsqueeze(0), xx[:-1,:])) - kx = xx * k_mix + sx * (1 - k_mix) - vx = xx * v_mix + sx * (1 - v_mix) - rx = xx * r_mix + sx * (1 - r_mix) - - r = torch.sigmoid(gemm(rx, rw)) - k = gemm(kx, kw, output_dtype=torch.float32) - v = gemm(vx, vw, output_dtype=torch.float32) - - T = x.shape[0] - for t in range(T): - kk = k[t] - vv = v[t] - ww = t_first + kk - p = torch.maximum(pp, ww) - e1 = torch.exp(pp - p) - e2 = torch.exp(ww - p) - sx[t] = ((e1 * aa + e2 * vv) / (e1 * bb + e2)).to(dtype=x.dtype) - ww = t_decay + pp - p = torch.maximum(ww, kk) - e1 = torch.exp(ww - p) - e2 = torch.exp(kk - p) - aa = e1 * aa + e2 * vv - bb = e1 * bb + e2 - pp = p - out = gemm(r * sx, ow) - return x + out, xx[-1,:], aa, bb, pp -*/ -Tensor att_seq(Tensor x, Tensor sx, Tensor ln_w, Tensor ln_b, Tensor k_mix, - Tensor v_mix, Tensor r_mix, Tensor kw, Tensor vw, Tensor rw, - Tensor ow, Tensor t_first, Tensor pp, Tensor aa, Tensor bb, - Tensor t_decay, /* imm */ Tensor buf, /* out */ Tensor x_plus_out) { - Tensor xx = at::layer_norm(x, {x.size(-1)}, ln_w, ln_b); - sx = at::cat({sx.unsqueeze(0), xx.slice(0, 0, -1)}, 0); - char* buf_ptr = (char*)buf.data_ptr(); - half* kx = (half*)buf_ptr; - half* vx = kx + x.numel(); - half* rx = vx + x.numel(); - half* wkv_y = rx + x.numel(); - att_mix(data_ptr(xx), data_ptr(sx), data_ptr(k_mix), - data_ptr(v_mix), data_ptr(r_mix), xx.size(0), xx.size(1), - kx, vx, rx); - float* k = reinterpret_cast(wkv_y + x.numel()); - float* v = k + x.size(0) * kw.size(1); - half* r = reinterpret_cast(v + x.size(0) * vw.size(1)); - - gemm_fp16_cublas(kx, kw.data_ptr(), k, x.size(0), kw.size(1), kw.size(0), true); - gemm_fp16_cublas(vx, vw.data_ptr(), v, x.size(0), vw.size(1), vw.size(0), true); - gemm_fp16_cublas(rx, rw.data_ptr(), r, x.size(0), rw.size(1), rw.size(0), false); - element_wise(InplaceSigmoid{r}, x.size(0) * rw.size(1)); - cuda_wkv_forward_new(1, x.size(0), x.size(1), data_ptr(t_decay), - data_ptr(t_first), k, v, r, - wkv_y, data_ptr(aa), - data_ptr(bb), data_ptr(pp)); - element_wise(InplaceMul{wkv_y, r}, x.numel()); - gemm_fp16_cublas(wkv_y, ow.data_ptr(), x_plus_out.data_ptr(), x.size(0), ow.size(1), ow.size(0), false); - x_plus_out += x; - return xx; -} diff --git a/backend-python/rwkv_pip/beta/cuda/element_wise.h b/backend-python/rwkv_pip/beta/cuda/element_wise.h deleted file mode 100644 index eedc2f9..0000000 --- a/backend-python/rwkv_pip/beta/cuda/element_wise.h +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include -#include - -template __global__ void _element_wise(Func func, int n) { - for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < n; - i += blockDim.x * gridDim.x) { - func(i); - } -} - -// NOTE: packed data type (e.g. float4) is a overkill for current sizes -// (4096 in 7B model and 768 in 0.1B model), -// and is not faster than the plain float version. -template -void element_wise(Func func, int n) { - // 256 is good enough on most GPUs - const int32_t BLOCK_SIZE = 256; - assert(n % BLOCK_SIZE == 0); - _element_wise<<>>(func, n); -} diff --git a/backend-python/rwkv_pip/beta/cuda/ffn.cu b/backend-python/rwkv_pip/beta/cuda/ffn.cu deleted file mode 100644 index c1c2c80..0000000 --- a/backend-python/rwkv_pip/beta/cuda/ffn.cu +++ /dev/null @@ -1,165 +0,0 @@ -#include "ATen/ATen.h" -#include -#include -#include - -#include "element_wise.h" -#include "util.h" - -using torch::Tensor; - -void gemm_fp16_cublas(const void *a, const void *b, void *c, int ori_m, - int ori_n, int ori_k, bool output_fp32); - -__global__ void _ffn_seq_mix(const half *xx, const half *sx, const half *k_mix, - const half *r_mix, const int outer_size, - const int inner_size, half *kx, half *rx) { - for (int idx2 = blockIdx.x * blockDim.x + threadIdx.x; idx2 < inner_size; - idx2 += blockDim.x * gridDim.x) { - half k_mix_ = k_mix[idx2]; - half r_mix_ = r_mix[idx2]; - for (int row = 0; row < outer_size; ++row) { - int idx1 = row * inner_size + idx2; - half xx_ = xx[idx1]; - half sx_ = sx[idx1]; - kx[idx1] = __hadd(__hmul(xx_, k_mix_), - __hmul(sx_, __hsub(__float2half(1), k_mix_))); - rx[idx1] = __hadd(__hmul(xx_, r_mix_), - __hmul(sx_, __hsub(__float2half(1), r_mix_))); - } - } -} - -void ffn_seq_mix(const half *xx, const half *sx, const half *k_mix, - const half *r_mix, const int outer_size, const int inner_size, - half *kx, half *rx) { - // 256 is good enough on most GPUs - const int32_t BLOCK_SIZE = 256; - assert(inner_size % BLOCK_SIZE == 0); - _ffn_seq_mix<<>>( - xx, sx, k_mix, r_mix, outer_size, inner_size, kx, rx); -} - -struct InplaceSigmoid { - __device__ __forceinline__ void operator()(int i) const { - ptr[i] = __float2half(1.0 / (1.0 + exp(-__half2float(ptr[i])))); - } - half *ptr; -}; - -struct InplaceReLUAndSquare { - __device__ __forceinline__ void operator()(int i) const { - // __hmax is not defined in old cuda - if (__hgt(ptr[i], __float2half(0))) { - ptr[i] = __hmul(ptr[i], ptr[i]); - } else { - ptr[i] = __float2half(0); - } - } - half *ptr; -}; - -struct InplaceFma { - __device__ __forceinline__ void operator()(int i) const { - a[i] = __hfma(a[i], b[i], c[i]); - } - half *a; - const half *b; - const half *c; -}; - -/* - Equivalent Python code: - - xx = F.layer_norm(x, (x.shape[-1],), weight=ln_w, bias=ln_b) - sx = torch.cat((sx.unsqueeze(0), xx[:-1,:])) - kx = xx * k_mix + sx * (1 - k_mix) - rx = xx * r_mix + sx * (1 - r_mix) - - r = torch.sigmoid(gemm(rx, rw)) - vx = torch.square(torch.relu(gemm(kx, kw))) - out = r * gemm(vx, vw) - return x + out, xx[-1,:] -*/ -Tensor ffn_seq(Tensor x, Tensor sx, Tensor ln_w, Tensor ln_b, Tensor k_mix, - Tensor r_mix, Tensor kw, Tensor vw, Tensor rw, - /* imm */ Tensor buf, - /* out */ Tensor x_plus_out) { - Tensor xx = at::layer_norm(x, {x.size(-1)}, ln_w, ln_b); - sx = at::cat({sx.unsqueeze(0), xx.slice(0, 0, -1)}, 0); - char *buf_ptr = (char *)buf.data_ptr(); - half *kx = (half *)buf_ptr; - half *rx = kx + x.numel(); - half *vx = rx + x.numel(); - half *r = vx + x.size(0) * kw.size(1); - ffn_seq_mix(data_ptr(xx), data_ptr(sx), data_ptr(k_mix), - data_ptr(r_mix), xx.size(0), xx.size(1), kx, rx); - - gemm_fp16_cublas(rx, rw.data_ptr(), r, x.size(0), rw.size(1), x.size(1), - false); - element_wise(InplaceSigmoid{r}, x.size(0) * rw.size(1)); - gemm_fp16_cublas(kx, kw.data_ptr(), vx, x.size(0), kw.size(1), x.size(1), - false); - element_wise(InplaceReLUAndSquare{vx}, x.size(0) * kw.size(1)); - gemm_fp16_cublas(vx, vw.data_ptr(), x_plus_out.data_ptr(), x.size(0), - vw.size(1), vw.size(0), false); - element_wise(InplaceFma{data_ptr(x_plus_out), r, data_ptr(x)}, - x_plus_out.numel()); - return xx; -} - -struct FfnOneMix { - __device__ __forceinline__ void operator()(int idx) { - half k_mix_ = k_mix[idx]; - half r_mix_ = r_mix[idx]; - half xx_ = xx[idx]; - half sx_ = sx[idx]; - kx[idx] = __hadd(__hmul(xx_, k_mix_), - __hmul(sx_, __hsub(__float2half(1), k_mix_))); - rx[idx] = __hadd(__hmul(xx_, r_mix_), - __hmul(sx_, __hsub(__float2half(1), r_mix_))); - } - half *k_mix; - half *r_mix; - half *xx; - half *sx; - half *kx; - half *rx; -}; - -/* - Equivalent Python code: - - xx = F.layer_norm(x, (x.shape[-1],), weight=ln_w, bias=ln_b) - kx = xx * k_mix + sx * (1 - k_mix) - rx = xx * r_mix + sx * (1 - r_mix) - - r = torch.sigmoid(gemm(rx, rw)) - vx = torch.square(torch.relu(gemm(kx, kw))) - out = r * gemm(vx, vw) - return x + out, xx -*/ -Tensor ffn_one(Tensor x, Tensor sx, Tensor ln_w, Tensor ln_b, Tensor k_mix, - Tensor r_mix, Tensor kw, Tensor vw, Tensor rw, - /* imm */ Tensor buf, - /* out */ Tensor x_plus_out) { - Tensor xx = at::layer_norm(x, {x.size(-1)}, ln_w, ln_b); - char *buf_ptr = (char *)buf.data_ptr(); - half *kx = (half *)buf_ptr; - half *rx = kx + x.numel(); - half *vx = rx + x.numel(); - half *r = vx + x.size(0) * kw.size(1); - element_wise(FfnOneMix{data_ptr(k_mix), data_ptr(r_mix), - data_ptr(xx), data_ptr(sx), kx, rx}, - x.numel()); - // vector * matrix, so m = 1 - gemm_fp16_cublas(rx, rw.data_ptr(), r, 1, rw.size(1), rw.size(0), false); - element_wise(InplaceSigmoid{r}, rw.size(1)); - gemm_fp16_cublas(kx, kw.data_ptr(), vx, 1, kw.size(1), kw.size(0), false); - element_wise(InplaceReLUAndSquare{vx}, kw.size(1)); - gemm_fp16_cublas(vx, vw.data_ptr(), x_plus_out.data_ptr(), 1, vw.size(1), - vw.size(0), false); - element_wise(InplaceFma{data_ptr(x_plus_out), r, data_ptr(x)}, - x_plus_out.numel()); - return xx; -} diff --git a/backend-python/rwkv_pip/beta/cuda/gemm_fp16_cublas.cpp b/backend-python/rwkv_pip/beta/cuda/gemm_fp16_cublas.cpp deleted file mode 100644 index e1162ad..0000000 --- a/backend-python/rwkv_pip/beta/cuda/gemm_fp16_cublas.cpp +++ /dev/null @@ -1,128 +0,0 @@ -#include -#include -#include -#include -#include - -#define CUBLAS_CHECK(condition) \ - for (cublasStatus_t _cublas_check_status = (condition); \ - _cublas_check_status != CUBLAS_STATUS_SUCCESS;) \ - throw std::runtime_error("cuBLAS error " + \ - std::to_string(_cublas_check_status) + " at " + \ - std::to_string(__LINE__)); - -#define CUDA_CHECK(condition) \ - for (cudaError_t _cuda_check_status = (condition); \ - _cuda_check_status != cudaSuccess;) \ - throw std::runtime_error( \ - "CUDA error " + std::string(cudaGetErrorString(_cuda_check_status)) + \ - " at " + std::to_string(__LINE__)); - -cublasHandle_t get_cublas_handle() { - static cublasHandle_t cublas_handle = []() { - cublasHandle_t handle = nullptr; - CUBLAS_CHECK(cublasCreate(&handle)); -#if CUDA_VERSION < 11000 - CUBLAS_CHECK(cublasSetMathMode(handle, CUBLAS_TENSOR_OP_MATH)); -#else - CUBLAS_CHECK(cublasSetMathMode(handle, CUBLAS_DEFAULT_MATH)); -#endif // CUDA_VERSION < 11000 - return handle; - }(); - return cublas_handle; -} - -/* - NOTE: blas gemm is column-major by default, but we need row-major output. - The data of row-major, transposed matrix is exactly the same as the - column-major, non-transposed matrix, and C = A * B ---> C^T = B^T * A^T - */ -void gemm_fp16_cublas(const void *a, const void *b, void *c, int ori_m, - int ori_n, int ori_k, bool output_fp32) { - const auto cuda_data_type = CUDA_R_16F; - const auto cuda_c_data_type = output_fp32 ? CUDA_R_32F : CUDA_R_16F; - const auto compute_type = CUDA_R_32F; - const float sp_alpha = 1.f; - // use CUBLAS_OP_N. see the notes above - const cublasOperation_t cublas_trans_a = CUBLAS_OP_N; - const cublasOperation_t cublas_trans_b = CUBLAS_OP_N; - // m = (B^T).size(0) = B.size(1) = n; - const int cublas_m = ori_n; - const int cublas_k = ori_k; - // comptiable with rwkv one mode, where 1-D tensor * 2-D tensor - // const int n = a.dense_dim() == 1 ? 1 : a.size(0); - const int cublas_n = ori_m; - const int cublas_lda = cublas_m; - const int cublas_ldb = cublas_k; - const int cublas_ldc = cublas_m; - cublasHandle_t cublas_handle = get_cublas_handle(); - -#if CUDA_VERSION >= 11000 - cublasGemmAlgo_t algo = CUBLAS_GEMM_DEFAULT; -#else - cublasGemmAlgo_t algo = CUBLAS_GEMM_DFALT_TENSOR_OP; -#endif - const float sp_beta = 0.f; - CUBLAS_CHECK(cublasGemmEx( - cublas_handle, cublas_trans_a, cublas_trans_b, cublas_m, cublas_n, - cublas_k, &sp_alpha, b, cuda_data_type, cublas_lda, - a, cuda_data_type, cublas_ldb, &sp_beta, c, - cuda_c_data_type, cublas_ldc, compute_type, algo)); -} - -/* - NOTE: blas gemm is column-major by default, but we need row-major output. - The data of row-major, transposed matrix is exactly the same as the - column-major, non-transposed matrix, and C = A * B ---> C^T = B^T * A^T - */ -void gemm_fp16_cublas_tensor(torch::Tensor a, torch::Tensor b, torch::Tensor c) { - if (a.sizes().size() == 1) { - assert(b.sizes().size() == 2); - a = at::unsqueeze(a, 0); - } - const auto cuda_data_type = CUDA_R_16F; - const auto cuda_c_data_type = - c.dtype() == torch::kFloat32 ? CUDA_R_32F : CUDA_R_16F; - const auto compute_type = CUDA_R_32F; - const float sp_alpha = 1.f; - // swap a and b, and use CUBLAS_OP_N. see the notes above - std::swap(a, b); - const cublasOperation_t cublas_trans_a = CUBLAS_OP_N; - const cublasOperation_t cublas_trans_b = CUBLAS_OP_N; - // m = (B^T).size(0) = B.size(1), and = A.size(1) after swap, - // negative axis is used because of the existence of batch matmul. - const int m = a.size(-1); - const int k = a.size(-2); - const int n = b.size(-2); - const int cublas_lda = m; - const int cublas_ldb = k; - const int cublas_ldc = m; - cublasHandle_t cublas_handle = get_cublas_handle(); - -#if CUDA_VERSION >= 11000 - cublasGemmAlgo_t algo = CUBLAS_GEMM_DEFAULT; -#else - cublasGemmAlgo_t algo = CUBLAS_GEMM_DFALT_TENSOR_OP; -#endif - const float sp_beta = 0.f; - if (a.sizes().size() == 2 && b.sizes().size() == 2) { - CUBLAS_CHECK(cublasGemmEx( - cublas_handle, cublas_trans_a, cublas_trans_b, m, n, k, &sp_alpha, - a.data_ptr(), cuda_data_type, cublas_lda, b.data_ptr(), cuda_data_type, - cublas_ldb, &sp_beta, c.data_ptr(), cuda_c_data_type, cublas_ldc, - compute_type, algo)); - } else { - // batch matmul - assert(a.sizes().size() == 3 && b.sizes().size() == 3); - - const long long int cublas_stride_a = m * k; - const long long int cublas_stride_b = k * n; - const long long int cublas_stride_c = m * n; - CUBLAS_CHECK(cublasGemmStridedBatchedEx( - cublas_handle, cublas_trans_a, cublas_trans_b, m, - n, k, &sp_alpha, a.data_ptr(), cuda_data_type, cublas_lda, - cublas_stride_a, b.data_ptr(), cuda_data_type, cublas_ldb, cublas_stride_b, - &sp_beta, c.data_ptr(), cuda_c_data_type, cublas_ldc, cublas_stride_c, - a.size(0), compute_type, algo)); - } -} diff --git a/backend-python/rwkv_pip/beta/cuda/operators.cu b/backend-python/rwkv_pip/beta/cuda/operators.cu deleted file mode 100644 index fa5a44f..0000000 --- a/backend-python/rwkv_pip/beta/cuda/operators.cu +++ /dev/null @@ -1,246 +0,0 @@ -#include -#include -#include "ATen/ATen.h" -#include -#define MIN_VALUE (-1e38) -typedef at::Half fp16; -__half *cast(fp16 *ptr) { - return reinterpret_cast<__half *>(ptr); -} - -template -__global__ void kernel_wkv_forward(const int B, const int T, const int C, - const float *__restrict__ const _w, const float *__restrict__ const _u, const F *__restrict__ const _k, const F *__restrict__ const _v, - F *__restrict__ const _y, float *__restrict__ const _aa, float *__restrict__ const _bb, float *__restrict__ const _pp) { - const int idx = blockIdx.x * blockDim.x + threadIdx.x; - const int _b = idx / C; - const int _c = idx % C; - const int _offset = _b * T * C + _c; - const int _state_offset = _b * C + _c; - - float u = _u[_c]; - float w = _w[_c]; - const F *__restrict__ const k = _k + _offset; - const F *__restrict__ const v = _v + _offset; - F *__restrict__ const y = _y + _offset; - - float aa = _aa[_state_offset]; - float bb = _bb[_state_offset]; - float pp = _pp[_state_offset]; - for (int i = 0; i < T; i++) { - const int ii = i * C; - const float kk = float(k[ii]); - const float vv = float(v[ii]); - float ww = u + kk; - float p = max(pp, ww); - float e1 = exp(pp - p); - float e2 = exp(ww - p); - y[ii] = F((e1 * aa + e2 * vv) / (e1 * bb + e2)); - ww = w + pp; - p = max(ww, kk); - e1 = exp(ww - p); - e2 = exp(kk - p); - aa = e1 * aa + e2 * vv; - bb = e1 * bb + e2; - pp = p; - } - _aa[_state_offset] = aa; - _bb[_state_offset] = bb; - _pp[_state_offset] = pp; -} - -template -void cuda_wkv_forward(int B, int T, int C, float *w, float *u, F *k, F *v, F *y, float *aa, float *bb, float *pp) { - dim3 threadsPerBlock( min(C, 32) ); - assert(B * C % threadsPerBlock.x == 0); - dim3 numBlocks(B * C / threadsPerBlock.x); - kernel_wkv_forward<<>>(B, T, C, w, u, k, v, y, aa, bb, pp); -} - -template void cuda_wkv_forward( - int B, int T, int C, - float *w, float *u, fp16 *k, fp16 *v, fp16 *y, - float *aa, float *bb, float *pp); -template void cuda_wkv_forward( - int B, int T, int C, - float *w, float *u, float *k, float *v, float *y, - float *aa, float *bb, float *pp); - -__global__ void kernel_mm_seq_fp32i8( - const int B, const int N, const int M, - const float *__restrict__ const x, const int x_stride, - const uint8_t *__restrict__ const w, const int w_stride, - const float *__restrict__ const mx, - const float *__restrict__ const rx, - const float *__restrict__ const my, - const float *__restrict__ const ry, - float *__restrict__ const y, const int y_stride) { - - const int i = blockIdx.x * blockDim.x + threadIdx.x; - const int k = blockIdx.y * blockDim.y + threadIdx.y; - - if (i < B && k < M) { - float y_local = 0; - for (int j = 0; j < N; ++j) { - y_local += x[i * x_stride + j] * ( - (float(w[j * w_stride + k]) + 0.5f) - * rx[k] * ry[j] + mx[k] + my[j] - ); - } - y[i * y_stride + k] = y_local; - } -} - -template -void cuda_mm8_seq(int B, int N, int M, - F *x, int x_stride, - uint8_t *w, int w_stride, - F *mx, F *rx, - F *my, F *ry, - F *y, int y_stride); - -template <> -void cuda_mm8_seq(int B, int N, int M, - float *x, int x_stride, - uint8_t *w, int w_stride, - float *mx, float *rx, - float *my, float *ry, - float *y, int y_stride) { - dim3 blockSize(1, 128); - dim3 gridSize((B + blockSize.x - 1) / blockSize.x, (M + blockSize.y - 1) / blockSize.y); - kernel_mm_seq_fp32i8<<>>( - B, N, M, x, x_stride, w, w_stride, - mx, rx, my, ry, y, y_stride); -} - -__global__ void kernel_mm_seq_fp16i8( - const int B, const int N, const int M, - const __half *__restrict__ const x, const int x_stride, - const uint8_t *__restrict__ const w, const int w_stride, - const __half *__restrict__ const mx, - const __half *__restrict__ const rx, - const __half *__restrict__ const my, - const __half *__restrict__ const ry, - __half *__restrict__ const y, const int y_stride) { - - const int i = blockIdx.x * blockDim.x + threadIdx.x; - const int k = blockIdx.y * blockDim.y + threadIdx.y; - - if (i < B && k < M) { - float y_local = 0; - for (int j = 0; j < N; ++j) { - y_local += __half2float(x[i * x_stride + j]) * ( - (float(w[j * w_stride + k]) + 0.5f) - * __half2float(rx[k]) * __half2float(ry[j]) - + __half2float(mx[k]) + __half2float(my[j]) - ); - } - y[i * y_stride + k] = __float2half(y_local); - } -} - -template <> -void cuda_mm8_seq(int B, int N, int M, - fp16 *x, int x_stride, - uint8_t *w, int w_stride, - fp16 *mx, fp16 *rx, - fp16 *my, fp16 *ry, - fp16 *y, int y_stride) { - dim3 blockSize(1, 128); - dim3 gridSize((B + blockSize.x - 1) / blockSize.x, (M + blockSize.y - 1) / blockSize.y); - kernel_mm_seq_fp16i8<<>>( - B, N, M, cast(x), x_stride, w, w_stride, - cast(mx), cast(rx), cast(my), cast(ry), cast(y), y_stride); -} - -#define MM8_ONE_JSPLIT 24 -#define MM8_ONE_TILE 1024 - -__global__ void kernel_mm_one_fp32i8( - const int N, const int M, - const float *__restrict__ const x, - const uint8_t *__restrict__ const w, const int w_stride, - const float *__restrict__ const mx, - const float *__restrict__ const rx, - const float *__restrict__ const my, - const float *__restrict__ const ry, - float *__restrict__ const y) { - - const int k = blockIdx.y * blockDim.y + threadIdx.y; - const int j0 = min(N, blockIdx.x * ((N + MM8_ONE_JSPLIT - 1) / MM8_ONE_JSPLIT)); - const int j1 = min(N, (blockIdx.x + 1) * ((N + MM8_ONE_JSPLIT - 1) / MM8_ONE_JSPLIT)); - - if (k < M) { - float y_local = 0; - for (int j = j0; j < j1; ++j) { - y_local += x[j] * ( - (float(w[j * w_stride + k]) + 0.5f) - * rx[k] * ry[j] + mx[k] + my[j] - ); - } - atomicAdd(&y[k], y_local); - } -} - -template -void cuda_mm8_one(int N, int M, - F *x, - uint8_t *w, int w_stride, - F *mx, F *rx, - F *my, F *ry, - float *y); - -template <> -void cuda_mm8_one(int N, int M, - float *x, - uint8_t *w, int w_stride, - float *mx, float *rx, - float *my, float *ry, - float *y) { - dim3 blockSize(1, MM8_ONE_TILE); - dim3 gridSize(MM8_ONE_JSPLIT, (M + blockSize.y - 1) / blockSize.y); - kernel_mm_one_fp32i8<<>>( - N, M, x, w, w_stride, - mx, rx, my, ry, y); -} - -__global__ void kernel_mm_one_fp16i8( - const int N, const int M, - const __half *__restrict__ const x, - const uint8_t *__restrict__ const w, const int w_stride, - const __half *__restrict__ const mx, - const __half *__restrict__ const rx, - const __half *__restrict__ const my, - const __half *__restrict__ const ry, - float *__restrict__ const y) { - - const int k = blockIdx.y * blockDim.y + threadIdx.y; - const int j0 = min(N, blockIdx.x * ((N + MM8_ONE_JSPLIT - 1) / MM8_ONE_JSPLIT)); - const int j1 = min(N, (blockIdx.x + 1) * ((N + MM8_ONE_JSPLIT - 1) / MM8_ONE_JSPLIT)); - - if (k < M) { - float y_local = 0; - for (int j = j0; j < j1; ++j) { - y_local += __half2float(x[j]) * ( - (float(w[j * w_stride + k]) + 0.5f) - * __half2float(rx[k]) * __half2float(ry[j]) - + __half2float(mx[k]) + __half2float(my[j]) - ); - } - atomicAdd(&y[k], y_local); - } -} - -template <> -void cuda_mm8_one(int N, int M, - fp16 *x, - uint8_t *w, int w_stride, - fp16 *mx, fp16 *rx, - fp16 *my, fp16 *ry, - float *y) { - dim3 blockSize(1, MM8_ONE_TILE); - dim3 gridSize(MM8_ONE_JSPLIT, (M + blockSize.y - 1) / blockSize.y); - kernel_mm_one_fp16i8<<>>( - N, M, cast(x), w, w_stride, - cast(mx), cast(rx), cast(my), cast(ry), y); -} diff --git a/backend-python/rwkv_pip/beta/cuda/util.h b/backend-python/rwkv_pip/beta/cuda/util.h deleted file mode 100644 index f00af22..0000000 --- a/backend-python/rwkv_pip/beta/cuda/util.h +++ /dev/null @@ -1,7 +0,0 @@ -#include "ATen/ATen.h" -#include - -template T *data_ptr(torch::Tensor x) { return x.data_ptr(); } -template <> inline half *data_ptr(torch::Tensor x) { - return reinterpret_cast(x.data_ptr()); -} diff --git a/backend-python/rwkv_pip/beta/cuda/wrapper.cpp b/backend-python/rwkv_pip/beta/cuda/wrapper.cpp deleted file mode 100644 index 5121499..0000000 --- a/backend-python/rwkv_pip/beta/cuda/wrapper.cpp +++ /dev/null @@ -1,181 +0,0 @@ -#include -#include "ATen/ATen.h" -#include -#include - -typedef at::Half fp16; - -template -void cuda_wkv_forward(int B, int T, int C, - float *w, float *u, F *k, F *v, F *y, - float *aa, float *bb, float *pp); -template -void cuda_mm8_seq(int B, int N, int M, - F *x, int x_stride, - uint8_t *w, int w_stride, - F *mx, F *rx, - F *my, F *ry, - F *y, int y_stride); -template -void cuda_mm8_one(int N, int M, - F *x, - uint8_t *w, int w_stride, - F *mx, F *rx, - F *my, F *ry, - float *y); - -void wkv_forward(int64_t B, int64_t T, int64_t C, - torch::Tensor &w, torch::Tensor &u, - torch::Tensor &k, torch::Tensor &v, torch::Tensor &y, - torch::Tensor &aa, torch::Tensor &bb, torch::Tensor &pp) { - const at::cuda::OptionalCUDAGuard device_guard(device_of(w)); - switch (k.scalar_type()) { - case c10::ScalarType::Half: - cuda_wkv_forward(B, T, C, - w.data_ptr(), u.data_ptr(), - k.data_ptr(), v.data_ptr(), y.data_ptr(), - aa.data_ptr(), bb.data_ptr(), pp.data_ptr()); - break; - case c10::ScalarType::Float: - cuda_wkv_forward(B, T, C, - w.data_ptr(), u.data_ptr(), - k.data_ptr(), v.data_ptr(), y.data_ptr(), - aa.data_ptr(), bb.data_ptr(), pp.data_ptr()); - break; - default: - assert(false && "Only FP16 and FP32 are currently supported"); - } -} - -void mm8_seq(int64_t B, int64_t N, int64_t M, - torch::Tensor &x, torch::Tensor &w, - torch::Tensor &mx, torch::Tensor &rx, - torch::Tensor &my, torch::Tensor &ry, - torch::Tensor &y) { - assert(x.stride(1) == 1); - assert(w.stride(1) == 1); - assert(mx.stride(0) == 1 && rx.stride(0) == 1); - assert(my.stride(0) == 1 && ry.stride(0) == 1); - assert(y.stride(1) == 1); - const at::cuda::OptionalCUDAGuard device_guard(device_of(w)); - switch (x.scalar_type()) { - case c10::ScalarType::Half: - cuda_mm8_seq( - B, N, M, - x.data_ptr(), x.stride(0), - w.data_ptr(), w.stride(0), - mx.data_ptr(), rx.data_ptr(), - my.data_ptr(), ry.data_ptr(), - y.data_ptr(), y.stride(0)); - break; - case c10::ScalarType::Float: - cuda_mm8_seq( - B, N, M, - x.data_ptr(), x.stride(0), - w.data_ptr(), w.stride(0), - mx.data_ptr(), rx.data_ptr(), - my.data_ptr(), ry.data_ptr(), - y.data_ptr(), y.stride(0)); - break; - default: - assert(false && "Only FP16 and FP32 are currently supported"); - } -} -void mm8_one(int64_t N, int64_t M, - torch::Tensor &x, torch::Tensor &w, - torch::Tensor &mx, torch::Tensor &rx, - torch::Tensor &my, torch::Tensor &ry, - torch::Tensor &y) { - assert(x.stride(0) == 1); - assert(w.stride(1) == 1); - assert(mx.stride(0) == 1 && rx.stride(0) == 1); - assert(my.stride(0) == 1 && ry.stride(0) == 1); - assert(y.stride(0) == 1); - const at::cuda::OptionalCUDAGuard device_guard(device_of(w)); - switch (x.scalar_type()) { - case c10::ScalarType::Half: - cuda_mm8_one( - N, M, - x.data_ptr(), - w.data_ptr(), w.stride(0), - mx.data_ptr(), rx.data_ptr(), - my.data_ptr(), ry.data_ptr(), - y.data_ptr()); - break; - case c10::ScalarType::Float: - cuda_mm8_one( - N, M, - x.data_ptr(), - w.data_ptr(), w.stride(0), - mx.data_ptr(), rx.data_ptr(), - my.data_ptr(), ry.data_ptr(), - y.data_ptr()); - break; - default: - assert(false && "Only FP16 and FP32 are currently supported"); - } -} - -using torch::Tensor; - -#ifndef DISABLE_CUBLAS_GEMM -void gemm_fp16_cublas_tensor(Tensor a, Tensor b, Tensor c); -#endif - -Tensor att_one(Tensor x, Tensor ln_w, Tensor ln_b, Tensor sx, Tensor k_mix, - Tensor v_mix, Tensor r_mix, Tensor kw, - /* imm */ Tensor kx, Tensor vw, /* imm */ Tensor vx, Tensor rw, - /* imm */ Tensor rx, Tensor ow, Tensor t_first, - /* imm */ Tensor k, Tensor pp, Tensor ww, Tensor aa, Tensor bb, - Tensor t_decay, /* imm */ Tensor v, /* in & out */ Tensor r, - /* out */ Tensor x_plus_out, /* out */ Tensor t1, - /* out */ Tensor t2, /* out */ Tensor p); - -Tensor att_seq(Tensor x, Tensor sx, Tensor ln_w, Tensor ln_b, Tensor k_mix, - Tensor v_mix, Tensor r_mix, Tensor kw, Tensor vw, Tensor rw, - Tensor ow, Tensor t_first, Tensor pp, Tensor aa, Tensor bb, - Tensor t_decay, /* imm */ Tensor buf, /* out */ Tensor x_plus_out); - -Tensor att_one_v5(Tensor x, Tensor sx, Tensor s, Tensor ln_w, Tensor ln_b, - Tensor lx_w, Tensor lx_b, Tensor k_mix, Tensor v_mix, - Tensor r_mix, Tensor kw, - /* imm */ Tensor kx, Tensor vw, /* imm */ Tensor vx, - Tensor rw, - /* imm */ Tensor rx, Tensor ow, Tensor t_first, - /* imm */ Tensor k, Tensor t_decay, /* imm */ Tensor v, - /* imm */ Tensor r, /* imm */ Tensor s1, - /* out */ Tensor x_plus_out, /* out */ Tensor s2); - -Tensor ffn_seq(Tensor x, Tensor sx, Tensor ln_w, Tensor ln_b, Tensor k_mix, - Tensor r_mix, Tensor kw, Tensor vw, Tensor rw, - /* imm */ Tensor buf, - /* out */ Tensor x_plus_out); - -Tensor ffn_one(Tensor x, Tensor sx, Tensor ln_w, Tensor ln_b, Tensor k_mix, - Tensor r_mix, Tensor kw, Tensor vw, Tensor rw, - /* imm */ Tensor buf, - /* out */ Tensor x_plus_out); - -PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { - m.def("wkv_forward", &wkv_forward, "wkv forward"); - m.def("mm8_seq", &mm8_seq, "mm8 seq"); - m.def("mm8_one", &mm8_one, "mm8 one"); - m.def("gemm_fp16_cublas", &gemm_fp16_cublas_tensor, "gemv fp16 cublas"); - m.def("att_one", &att_one, "att one"); - m.def("att_one_v5", &att_one_v5, "att one v5"); - m.def("att_seq", &att_seq, "att seq"); - m.def("ffn_seq", &ffn_seq, "ffn seq"); - m.def("ffn_one", &ffn_one, "ffn one"); -} - -TORCH_LIBRARY(rwkv, m) { - m.def("wkv_forward", wkv_forward); - m.def("mm8_seq", mm8_seq); - m.def("mm8_one", mm8_one); - m.def("gemm_fp16_cublas", gemm_fp16_cublas_tensor); - m.def("att_one", att_one); - m.def("att_one_v5", &att_one_v5); - m.def("att_seq", att_seq); - m.def("ffn_seq", ffn_seq); - m.def("ffn_one", ffn_one); -} diff --git a/backend-python/rwkv_pip/beta/model.py b/backend-python/rwkv_pip/beta/model.py deleted file mode 100644 index f38038f..0000000 --- a/backend-python/rwkv_pip/beta/model.py +++ /dev/null @@ -1,1821 +0,0 @@ -######################################################################################################## -# The RWKV Language Model - https://github.com/BlinkDL/RWKV-LM -######################################################################################################## - -from typing import Optional -import types, gc, os, time, re, platform -import torch -from torch.nn import functional as F - -torch.backends.cudnn.benchmark = True -torch.backends.cudnn.allow_tf32 = True -torch.backends.cuda.matmul.allow_tf32 = True -current_path = os.path.dirname(os.path.abspath(__file__)) - - -# https://zhuanlan.zhihu.com/p/612879065 -def LoadPreCompileLibrary(file): - import importlib - import os - - import torch - - # load the custom_op_library and register the custom ops - lib_dir = os.path.dirname(__file__) - if os.name == "nt": - # Register the main torchvision library location on the default DLL path - import ctypes - import sys - - kernel32 = ctypes.WinDLL("kernel32.dll", use_last_error=True) - with_load_library_flags = hasattr(kernel32, "AddDllDirectory") - prev_error_mode = kernel32.SetErrorMode(0x0001) - - if with_load_library_flags: - kernel32.AddDllDirectory.restype = ctypes.c_void_p - - if sys.version_info >= (3, 8): - os.add_dll_directory(lib_dir) - elif with_load_library_flags: - res = kernel32.AddDllDirectory(lib_dir) - if res is None: - err = ctypes.WinError(ctypes.get_last_error()) - err.strerror += f' Error adding "{lib_dir}" to the DLL directories.' - raise ValueError(err) - - kernel32.SetErrorMode(prev_error_mode) - - loader_details = ( - importlib.machinery.ExtensionFileLoader, - importlib.machinery.EXTENSION_SUFFIXES, - ) - - extfinder = importlib.machinery.FileFinder(lib_dir, loader_details) - ext_specs = extfinder.find_spec(file) - if ext_specs is None: - return False - - try: - torch.ops.load_library(ext_specs.origin) - except OSError as exc: - return False - return True - - -######################################################################################################## - -if os.environ.get("RWKV_JIT_ON") != "0": - os.environ["RWKV_JIT_ON"] = "1" - MyModule = torch.jit.ScriptModule - MyFunction = torch.jit.script_method - MyStatic = torch.jit.script -else: - MyModule = torch.nn.Module - - def __nop(ob): - return ob - - MyFunction = __nop - MyStatic = __nop - -if os.environ.get("RWKV_CUDA_ON") == "1": - if LoadPreCompileLibrary("wkv_cuda") is False: - from torch.utils.cpp_extension import load - - load( - name=f"wkv_cuda", - sources=[ - f"{current_path}/cuda/wrapper.cpp", - f"{current_path}/cuda/operators.cu", - f"{current_path}/cuda/gemm_fp16_cublas.cpp", - f"{current_path}/cuda/att_one.cu", - f"{current_path}/cuda/att_seq.cu", - f"{current_path}/cuda/ffn.cu", - f"{current_path}/cuda/att_one_v5.cu", - ], - verbose=True, - extra_ldflags=["cublas.lib" if os.name == "nt" else ""], - extra_cuda_cflags=[ - "-t 4", - "-std=c++17", - "--use_fast_math", - "-O3", - "--extra-device-vectorization", - ], - is_python_module=False, - ) - - @MyStatic - def cuda_wkv(T: int, C: int, w, u, k, v, aa, bb, pp): - assert 1 * C % min(C, 32) == 0 - assert ( - k.dtype == v.dtype == torch.float16 or k.dtype == v.dtype == torch.float32 - ) - assert w.dtype == u.dtype == aa.dtype == bb.dtype == pp.dtype == torch.float32 - w = w.contiguous() - u = u.contiguous() - k = k.contiguous() - v = v.contiguous() - y = torch.empty( - (T, C), - device=w.device, - memory_format=torch.contiguous_format, - dtype=k.dtype, - ) - torch.ops.rwkv.wkv_forward(1, T, C, w, u, k, v, y, aa, bb, pp) - return y, aa, bb, pp - - @MyStatic - def cuda_mm8_seq(B: int, N: int, M: int, x, w, mx, rx, my, ry): - assert x.dtype == mx.dtype == rx.dtype == my.dtype == ry.dtype - assert x.dtype == torch.float32 or x.dtype == torch.float16 - assert w.dtype == torch.uint8 - assert x.shape == (B, N) - assert w.shape == (N, M) - assert rx.shape == mx.shape == (M,) - assert ry.shape == my.shape == (N, 1) - y = torch.empty((B, M), device=w.device, dtype=x.dtype) - torch.ops.rwkv.mm8_seq(B, N, M, x, w, mx, rx, my, ry, y) - return y - - @MyStatic - def cuda_mm8_one(N: int, M: int, x, w, mx, rx, my, ry): - assert x.dtype == mx.dtype == rx.dtype == my.dtype == ry.dtype - assert x.dtype == torch.float32 or x.dtype == torch.float16 - assert w.dtype == torch.uint8 - assert x.shape == (N,) - assert w.shape == (N, M) - assert rx.shape == mx.shape == (M,) - assert ry.shape == my.shape == (N, 1) - y = torch.zeros((M,), device=w.device, dtype=torch.float32) - torch.ops.rwkv.mm8_one(N, M, x, w, mx, rx, my, ry, y) - return y.to(dtype=x.dtype) - -else: - os.environ["RWKV_CUDA_ON"] = "0" - -if os.environ.get("RWKV_CUDA_ON") == "1": - - @MyStatic - def gemm(a, b, output_dtype: Optional[torch.dtype] = None): - if output_dtype is None: - output_dtype = a.dtype - if a.dtype == b.dtype == torch.float16 and a.device.type == "cuda": - if len(a.shape) == 1: - assert len(b.shape) == 2 - c = torch.empty((b.shape[-1],), dtype=output_dtype, device=a.device) - a = a.unsqueeze(0) - else: - assert len(a.shape) == len(b.shape) - assert len(a.shape) == 2 or len(a.shape) == 3 - # torch.empty((*a.shape[:-1], b.shape[-1])) doesn't work with jit - if len(a.shape) == 2: - c = torch.empty( - (a.shape[0], b.shape[-1]), dtype=output_dtype, device=a.device - ) - else: - c = torch.empty( - (a.shape[0], a.shape[1], b.shape[-1]), - dtype=output_dtype, - device=a.device, - ) - torch.ops.rwkv.gemm_fp16_cublas(a, b, c) - return c - else: - return (a @ b).to(output_dtype) - -else: - - def gemm(a, b, output_dtype: Optional[torch.dtype] = None): - if output_dtype is None: - output_dtype = a.dtype - return (a @ b).to(output_dtype) - - -######################################################################################################## - - -class RWKV(MyModule): - def __init__(self, model, strategy, verbose=True, convert_and_save_and_exit=None): - super().__init__() - if verbose: - prxxx = lambda *args, **kwargs: print(*args, **kwargs) - else: - prxxx = lambda *args, **kwargs: None - - STRATEGY_REGEX = r"^(?:(?:^|->) *(?:cuda(?::[\d]+)?|cpu|mps) (?:fp(?:16|32)|bf16)(?:i8|i4|i3)?(?: \*[\d]+\+?)? *)+$" - if not re.match(STRATEGY_REGEX, strategy): - raise ValueError( - "Invalid strategy. Please read https://pypi.org/project/rwkv/" - ) - - strategy = ("->".join([x.strip() for x in strategy.split("->")])).replace( - "->", " -> " - ) - self.args = types.SimpleNamespace() - args = self.args - args.MODEL_NAME = model - args.strategy_string = strategy - - # Rescale for fp16 mode: set x = x/2 every X layer (to avoid fp16 overflow) - self.RESCALE_LAYER = 6 if "fp16" in strategy else 0 - prxxx( - f'RWKV_JIT_ON {os.environ["RWKV_JIT_ON"]} RWKV_CUDA_ON {os.environ["RWKV_CUDA_ON"]} RESCALE_LAYER {self.RESCALE_LAYER}\n' - ) - - args.MODEL_NAME = args.MODEL_NAME.strip() - if not args.MODEL_NAME.endswith(".pth"): - args.MODEL_NAME += ".pth" - prxxx(f"Loading {args.MODEL_NAME} ...") - with torch.no_grad(): - self.w = torch.load( - args.MODEL_NAME, map_location="cpu" - ) # load model to CPU first - # it is supported to load a pure meta-tensor state dict (e.g. for quick testing) - for k, v in self.w.items(): - if isinstance(v, torch.Tensor) and v.is_meta: - # torch.zeros_like(v, device='cpu') doesn't produce an all-zero tensor - # if v is a meta tensor - self.w[k] = torch.zeros(v.shape, dtype=v.dtype, device="cpu") - gc.collect() - w = self.w - - ALREADY_CONVERTED = False - if "_strategy" in w: - ALREADY_CONVERTED = True - assert ( - convert_and_save_and_exit == None - ) # you should only convert a raw model - prxxx( - f"Converted model: strategy {w['_strategy']}, version {w['_version']}\n" - ) - assert ( - w["_strategy"] == args.strategy_string - ), "model has been converted and does not match current strategy; if you are using a new strategy, re-convert the model" - assert ( - float(w["_version"]) >= 0.7 - ) # sometimes you should re-convert using latest convert_model.py - assert w["_rescale_layer"] == self.RESCALE_LAYER - del w["_strategy"] - del w["_version"] - del w["_rescale_layer"] - - args.n_embd = w["emb.weight"].shape[1] - args.n_layer = 0 - keys = list(w.keys()) - self.version = 4 - for x in keys: - layer_id = int(x.split(".")[1]) if ("blocks." in x) else 0 - args.n_layer = max(args.n_layer, layer_id + 1) - if "ln_x" in x: - self.version = 5 - if self.version == 5 and "att.time_decay" in x: - args.n_head = w[x].shape[0] - - ####################### Compute strategy - - s = [x.strip().split(" ") for x in strategy.split("->")] - plan = [0] * len(s) - stream_i = -1 - stream_count = 0 - to_allocate = args.n_layer + 1 - allocated = 0 - free_slots = 0 - for i in range(len(s)): - si = s[i] - si1 = si[1] - if si1.startswith("fp32"): - si[1] = [torch.float] - elif si1.startswith("fp16"): - si[1] = [torch.float16] - elif si1.startswith("bf16"): - si[1] = [torch.bfloat16] - if si1.endswith("i8"): - si[1] += [torch.uint8] - else: - si[1] += [si[1][0]] - if len(si) > 2: - ss = si[2] - assert ss.startswith("*") - if ss.endswith("+"): - plan[i] = int(ss[1:-1]) - stream_i = i - else: - plan[i] = int(ss[1:]) - allocated += plan[i] - if allocated >= to_allocate: - plan[i] += to_allocate - allocated - break - else: - free_slots += 1 - if stream_i < 0: - if free_slots > 0 and to_allocate > allocated: - for i in range(len(s)): - if plan[i] == 0: - plan[i] = (to_allocate - allocated) // free_slots - allocated += plan[i] - free_slots -= 1 - if to_allocate > allocated: - plan[len(s) - 1] += to_allocate - allocated - else: - if to_allocate > allocated: - stream_count = to_allocate - allocated - plan[stream_i] += stream_count - prxxx(f"Strategy: (total {args.n_layer}+1={args.n_layer+1} layers)") - for i in range(len(s)): - ss = s[i] - if i != stream_i: - prxxx( - f'* {ss[0]} {str(ss[1]).replace("torch.","")}, store {plan[i]} layers' - ) - else: - prxxx( - f'* {ss[0]} {str(ss[1]).replace("torch.","")}, store {plan[i]-stream_count} layers, stream {stream_count} layers' - ) - plan[i] += 0 if i == 0 else plan[i - 1] - self.strategy = [None] * (args.n_layer + 1) - strategy = self.strategy - for n in range(args.n_layer + 1): - for i in range(len(s)): - if n < plan[i]: - strategy[n] = types.SimpleNamespace() - strategy[n].device = s[i][0] - strategy[n].atype = s[i][1][0] - strategy[n].wtype = s[i][1][1] - strategy[n].stream = False - if i == stream_i and n >= (plan[i] - stream_count): - strategy[n].stream = True - break - prxxx( - f"{n}-{strategy[n].device}-{str(strategy[n].atype).replace('torch.','')}-{str(strategy[n].wtype).replace('torch.','')}{'-stream' if strategy[n].stream else ''}", - end=" ", - ) - prxxx() - - ####################### Load weights to self.w - - if not ALREADY_CONVERTED: - try: # precompute embedding - w["emb.weight"] = F.layer_norm( - w["emb.weight"], - (args.n_embd,), - weight=w["blocks.0.ln0.weight"], - bias=w["blocks.0.ln0.bias"], - ) - except: - w["emb.weight"] = F.layer_norm( - w["emb.weight"].float(), - (args.n_embd,), - weight=w["blocks.0.ln0.weight"].float(), - bias=w["blocks.0.ln0.bias"].float(), - ) - del w["blocks.0.ln0.weight"] - del w["blocks.0.ln0.bias"] - - print_need_newline = False - - REAL_TIME_FIRST = False - for x in list(w.keys()): - if ".time_faaaa" in x: - REAL_TIME_FIRST = True - if REAL_TIME_FIRST: - w = { - k.replace(".time_faaaa", ".time_first") - if ".time_faaaa" in k - else k: v - for k, v in w.items() - } - self.w = w - - keys = list(w.keys()) - for x in keys: - w[x].requires_grad = False - layer_id = int(x.split(".")[1]) if ("blocks." in x) else 0 - if ("ln_out." in x) or ("head." in x): - layer_id = args.n_layer - dd = strategy[layer_id] - DEVICE = dd.device - ATYPE = dd.atype - WTYPE = dd.wtype - - if not ALREADY_CONVERTED: - if self.RESCALE_LAYER > 0: - if "att.output.weight" in x: - w[x] = w[x] / (2 ** int(layer_id // self.RESCALE_LAYER)) - if "ffn.value.weight" in x: - w[x] = w[x] / (2 ** int(layer_id // self.RESCALE_LAYER)) - - if ".time_" in x: - w[x] = w[x].squeeze() - if ( - "key.weight" in x - or "value.weight" in x - or "receptance.weight" in x - or "output.weight" in x - or "head.weight" in x - ): - w[x] = w[x].t() - - if ".time_decay" in x: # need fp32 for this - if self.version == 4: - w[x] = -torch.exp(w[x].float()) - elif self.version == 5: - w[x] = torch.exp(-torch.exp(w[x].float())).reshape(-1, 1, 1) - elif ".time_first" in x: # need fp32 for this - if self.version == 4: - w[x] = w[x].float() - elif self.version == 5: - if REAL_TIME_FIRST: - w[x] = w[x].float().reshape(-1, 1, 1) - else: - w[x] = torch.exp(w[x].float()).reshape(-1, 1, 1) - elif ".ln_x" in x: # need fp32 for group_norm - w[x] = w[x].float() - else: - if (len(w[x].shape) == 2) and ("emb" not in x): - if WTYPE != torch.uint8: - w[x] = w[x].to(dtype=WTYPE) - else: - w[x] = w[x].float() - - if w[x].shape[0] > w[x].shape[1]: - w[x + "_my"] = torch.amin(w[x], dim=1).unsqueeze(1) - w[x] = w[x] - w[x + "_my"] - w[x + "_mx"] = torch.amin(w[x], dim=0) - w[x] = w[x] - w[x + "_mx"] - w[x + "_rx"] = torch.amax(w[x], dim=0) - w[x] = w[x] / w[x + "_rx"] - w[x + "_ry"] = torch.amax(w[x], dim=1).unsqueeze(1) - w[x] = w[x] / w[x + "_ry"] - else: - w[x + "_mx"] = torch.amin(w[x], dim=0) - w[x] = w[x] - w[x + "_mx"] - w[x + "_my"] = torch.amin(w[x], dim=1).unsqueeze(1) - w[x] = w[x] - w[x + "_my"] - w[x + "_rx"] = torch.amax(w[x], dim=0) - w[x] = w[x] / w[x + "_rx"] - w[x + "_ry"] = torch.amax(w[x], dim=1).unsqueeze(1) - w[x] = w[x] / w[x + "_ry"] - - w[x] = torch.clip( - torch.floor(w[x] * 256), min=0, max=255 - ).to(dtype=torch.uint8) - w[x + "_mx"] = w[x + "_mx"].to(dtype=ATYPE).contiguous() - w[x + "_rx"] = ( - (w[x + "_rx"] / 16).to(dtype=ATYPE).contiguous() - ) - w[x + "_my"] = w[x + "_my"].to(dtype=ATYPE).contiguous() - w[x + "_ry"] = ( - (w[x + "_ry"] / 16).to(dtype=ATYPE).contiguous() - ) - else: - w[x] = w[x].to(dtype=ATYPE) - - if convert_and_save_and_exit == None: - if "emb." in x: - w[x] = w[x].contiguous() - elif (dd.stream) and ( - x.endswith("key.weight") - or x.endswith("value.weight") - or x.endswith("receptance.weight") - or x.endswith("output.weight") - ): - try: - w[x] = ( - w[x].contiguous().pin_memory() - ) # if you see "CUDA error: out of memory" here, that's out of CPU RAM, not VRAM. Get more RAM :) - except: - print( - "Note: You are running out of RAM. Get more CPU RAM. Now this will run much slower." - ) - elif DEVICE != "cpu": - w[x] = w[x].to(device=DEVICE).contiguous() - - if (dd.stream) or (DEVICE != "cpu"): - try: - w[x + "_mx"] = w[x + "_mx"].to(device=DEVICE).contiguous() - w[x + "_rx"] = w[x + "_rx"].to(device=DEVICE).contiguous() - w[x + "_my"] = w[x + "_my"].to(device=DEVICE).contiguous() - w[x + "_ry"] = w[x + "_ry"].to(device=DEVICE).contiguous() - except: - pass - - if "ffn.value.weight" in x: - gc.collect() - if "cuda" in args.strategy_string: - torch.cuda.empty_cache() - - shape = [i for i in w[x].shape if i != 1] - if len(shape) > 1: - shape = f" {str(shape[0]).rjust(5)} {str(shape[1]).rjust(5)}" - else: - shape = f" {str(shape[0]).rjust(5)} " - if layer_id == 0 or layer_id >= args.n_layer - 1: - if print_need_newline: - prxxx("\n", end="") - print_need_newline = False - dt = str(w[x].dtype).replace("torch.", "") - dt = ( - dt.replace("float32", "f32") - .replace("bfloat16", "bf16") - .replace("float16", "f16") - .replace("uint8", "i8") - ) - prxxx( - x.ljust(32), - dt.rjust(4), - str(w[x].device).rjust(8), - shape, - " (pinned)" if w[x].is_pinned() else "", - ) - else: - print_need_newline = True - prxxx(".", end="", flush=True) - - if convert_and_save_and_exit: - w["_strategy"] = args.strategy_string - w["_rescale_layer"] = self.RESCALE_LAYER - w["_version"] = "0.7" - if not convert_and_save_and_exit.endswith(".pth"): - convert_and_save_and_exit += ".pth" - prxxx(f"Saving to {convert_and_save_and_exit}...") - torch.save(w, convert_and_save_and_exit) - prxxx(f"Converted and saved. Now this will exit.") - exit(0) - - gc.collect() - if "cuda" in args.strategy_string: - torch.cuda.empty_cache() - - @MyFunction - def torch_mm8_seq(self, x, w, mx, rx, my, ry): - return x @ ((w.to(dtype=x.dtype) + 0.5) * ry * rx + my + mx) - - @MyFunction - def torch_mm8_one(self, x, w, mx, rx, my, ry): - return x @ ((w.to(dtype=x.dtype) + 0.5) * ry * rx + my + mx) - - if os.environ.get("RWKV_CUDA_ON") == "1": - - @MyFunction - def mm8_seq(self, x, w, mx, rx, my, ry): - if w.device.type == "cuda" and x.dtype == torch.float16: - B, N, M = x.shape[0], w.shape[0], w.shape[1] - return cuda_mm8_seq(B, N, M, x, w, mx, rx, my, ry) - else: - return self.torch_mm8_seq(x, w, mx, rx, my, ry) - - @MyFunction - def mm8_one(self, x, w, mx, rx, my, ry): - if w.device.type == "cuda": - N, M = w.shape[0], w.shape[1] - return cuda_mm8_one(N, M, x, w, mx, rx, my, ry) - else: - return self.torch_mm8_one(x, w, mx, rx, my, ry) - - else: - - @MyFunction - def mm8_seq(self, x, w, mx, rx, my, ry): - return self.torch_mm8_seq(x, w, mx, rx, my, ry) - - @MyFunction - def mm8_one(self, x, w, mx, rx, my, ry): - return self.torch_mm8_one(x, w, mx, rx, my, ry) - - ######################################################################################################## - - @MyFunction - def ffn_one( - self, - x, - sx, - ln_w, - ln_b, - k_mix, - r_mix, - kw, - vw, - rw, - kmx, - krx, - kmy, - kry, - vmx, - vrx, - vmy, - vry, - rmx, - rrx, - rmy, - rry, - ): - xx = F.layer_norm(x, (x.shape[-1],), weight=ln_w, bias=ln_b) - kx = xx * k_mix + sx * (1 - k_mix) - rx = xx * r_mix + sx * (1 - r_mix) - - r = torch.sigmoid(gemm(rx, rw)) - vx = torch.square(torch.relu(gemm(kx, kw))) - out = r * gemm(vx, vw) - return x + out, xx - - @MyFunction - def ffn_one_i8( - self, - x, - sx, - ln_w, - ln_b, - k_mix, - r_mix, - kw, - vw, - rw, - kmx, - krx, - kmy, - kry, - vmx, - vrx, - vmy, - vry, - rmx, - rrx, - rmy, - rry, - ): - xx = F.layer_norm(x, (x.shape[-1],), weight=ln_w, bias=ln_b) - kx = xx * k_mix + sx * (1 - k_mix) - rx = xx * r_mix + sx * (1 - r_mix) - - r = torch.sigmoid(self.mm8_one(rx, rw, rmx, rrx, rmy, rry)) - vx = torch.square(torch.relu(self.mm8_one(kx, kw, kmx, krx, kmy, kry))) - out = r * (self.mm8_one(vx, vw, vmx, vrx, vmy, vry)) - return x + out, xx - - ######################################################################################################## - - @MyFunction - def ffn_seq( - self, - x, - sx, - ln_w, - ln_b, - k_mix, - r_mix, - kw, - vw, - rw, - kmx, - krx, - kmy, - kry, - vmx, - vrx, - vmy, - vry, - rmx, - rrx, - rmy, - rry, - ): - xx = F.layer_norm(x, (x.shape[-1],), weight=ln_w, bias=ln_b) - sx = torch.cat((sx.unsqueeze(0), xx[:-1, :])) - kx = xx * k_mix + sx * (1 - k_mix) - rx = xx * r_mix + sx * (1 - r_mix) - - r = torch.sigmoid(gemm(rx, rw)) - vx = torch.square(torch.relu(gemm(kx, kw))) - out = r * gemm(vx, vw) - return x + out, xx[-1, :] - - @MyFunction - def ffn_seq_i8( - self, - x, - sx, - ln_w, - ln_b, - k_mix, - r_mix, - kw, - vw, - rw, - kmx, - krx, - kmy, - kry, - vmx, - vrx, - vmy, - vry, - rmx, - rrx, - rmy, - rry, - ): - xx = F.layer_norm(x, (x.shape[-1],), weight=ln_w, bias=ln_b) - sx = torch.cat((sx.unsqueeze(0), xx[:-1, :])) - kx = xx * k_mix + sx * (1 - k_mix) - rx = xx * r_mix + sx * (1 - r_mix) - - r = torch.sigmoid(self.mm8_seq(rx, rw, rmx, rrx, rmy, rry)) - vx = torch.square(torch.relu(self.mm8_seq(kx, kw, kmx, krx, kmy, kry))) - out = r * (self.mm8_seq(vx, vw, vmx, vrx, vmy, vry)) - return x + out, xx[-1, :] - - ######################################################################################################## - - @MyFunction - def att_one( - self, - x, - sx, - aa, - bb, - pp, - ln_w, - ln_b, - k_mix, - v_mix, - r_mix, - t_decay, - t_first, - kw, - vw, - rw, - ow, - kmx, - krx, - kmy, - kry, - vmx, - vrx, - vmy, - vry, - rmx, - rrx, - rmy, - rry, - omx, - orx, - omy, - ory, - ): - xx = F.layer_norm(x, (x.shape[-1],), weight=ln_w, bias=ln_b) - kx = xx * k_mix + sx * (1 - k_mix) - vx = xx * v_mix + sx * (1 - v_mix) - rx = xx * r_mix + sx * (1 - r_mix) - - r = torch.sigmoid(gemm(rx, rw)) - k = gemm(kx, kw, output_dtype=torch.float32) - v = gemm(vx, vw, output_dtype=torch.float32) - - ww = t_first + k - p = torch.maximum(pp, ww) - e1 = torch.exp(pp - p) - e2 = torch.exp(ww - p) - wkv = ((e1 * aa + e2 * v) / (e1 * bb + e2)).to(dtype=x.dtype) - ww = t_decay + pp - p = torch.maximum(ww, k) - e1 = torch.exp(ww - p) - e2 = torch.exp(k - p) - - out = gemm(r * wkv, ow) - return x + out, xx, e1 * aa + e2 * v, e1 * bb + e2, p - - @MyFunction - def att_one_i8( - self, - x, - sx, - aa, - bb, - pp, - ln_w, - ln_b, - k_mix, - v_mix, - r_mix, - t_decay, - t_first, - kw, - vw, - rw, - ow, - kmx, - krx, - kmy, - kry, - vmx, - vrx, - vmy, - vry, - rmx, - rrx, - rmy, - rry, - omx, - orx, - omy, - ory, - ): - xx = F.layer_norm(x, (x.shape[-1],), weight=ln_w, bias=ln_b) - kx = xx * k_mix + sx * (1 - k_mix) - vx = xx * v_mix + sx * (1 - v_mix) - rx = xx * r_mix + sx * (1 - r_mix) - - r = torch.sigmoid(self.mm8_one(rx, rw, rmx, rrx, rmy, rry)) - k = (self.mm8_one(kx, kw, kmx, krx, kmy, kry)).float() - v = (self.mm8_one(vx, vw, vmx, vrx, vmy, vry)).float() - - ww = t_first + k - p = torch.maximum(pp, ww) - e1 = torch.exp(pp - p) - e2 = torch.exp(ww - p) - wkv = ((e1 * aa + e2 * v) / (e1 * bb + e2)).to(dtype=x.dtype) - ww = t_decay + pp - p = torch.maximum(ww, k) - e1 = torch.exp(ww - p) - e2 = torch.exp(k - p) - - out = self.mm8_one(r * wkv, ow, omx, orx, omy, ory) - return x + out, xx, e1 * aa + e2 * v, e1 * bb + e2, p - - ######################################################################################################## - - @MyFunction - def att_seq( - self, - x, - sx, - aa, - bb, - pp, - ln_w, - ln_b, - k_mix, - v_mix, - r_mix, - t_decay, - t_first, - kw, - vw, - rw, - ow, - kmx, - krx, - kmy, - kry, - vmx, - vrx, - vmy, - vry, - rmx, - rrx, - rmy, - rry, - omx, - orx, - omy, - ory, - ): - xx = F.layer_norm(x, (x.shape[-1],), weight=ln_w, bias=ln_b) - sx = torch.cat((sx.unsqueeze(0), xx[:-1, :])) - kx = xx * k_mix + sx * (1 - k_mix) - vx = xx * v_mix + sx * (1 - v_mix) - rx = xx * r_mix + sx * (1 - r_mix) - - r = torch.sigmoid(gemm(rx, rw)) - k = gemm(kx, kw, output_dtype=torch.float32) - v = gemm(vx, vw, output_dtype=torch.float32) - - T = x.shape[0] - for t in range(T): - kk = k[t] - vv = v[t] - ww = t_first + kk - p = torch.maximum(pp, ww) - e1 = torch.exp(pp - p) - e2 = torch.exp(ww - p) - sx[t] = ((e1 * aa + e2 * vv) / (e1 * bb + e2)).to(dtype=x.dtype) - ww = t_decay + pp - p = torch.maximum(ww, kk) - e1 = torch.exp(ww - p) - e2 = torch.exp(kk - p) - aa = e1 * aa + e2 * vv - bb = e1 * bb + e2 - pp = p - out = gemm(r * sx, ow) - return x + out, xx[-1, :], aa, bb, pp - - @MyFunction - def att_seq_i8( - self, - x, - sx, - aa, - bb, - pp, - ln_w, - ln_b, - k_mix, - v_mix, - r_mix, - t_decay, - t_first, - kw, - vw, - rw, - ow, - kmx, - krx, - kmy, - kry, - vmx, - vrx, - vmy, - vry, - rmx, - rrx, - rmy, - rry, - omx, - orx, - omy, - ory, - ): - xx = F.layer_norm(x, (x.shape[-1],), weight=ln_w, bias=ln_b) - sx = torch.cat((sx.unsqueeze(0), xx[:-1, :])) - kx = xx * k_mix + sx * (1 - k_mix) - vx = xx * v_mix + sx * (1 - v_mix) - rx = xx * r_mix + sx * (1 - r_mix) - - r = torch.sigmoid(self.mm8_seq(rx, rw, rmx, rrx, rmy, rry)) - k = self.mm8_seq(kx, kw, kmx, krx, kmy, kry).float() - v = self.mm8_seq(vx, vw, vmx, vrx, vmy, vry).float() - - T = x.shape[0] - for t in range(T): - kk = k[t] - vv = v[t] - ww = t_first + kk - p = torch.maximum(pp, ww) - e1 = torch.exp(pp - p) - e2 = torch.exp(ww - p) - sx[t] = ((e1 * aa + e2 * vv) / (e1 * bb + e2)).to(dtype=x.dtype) - ww = t_decay + pp - p = torch.maximum(ww, kk) - e1 = torch.exp(ww - p) - e2 = torch.exp(kk - p) - aa = e1 * aa + e2 * vv - bb = e1 * bb + e2 - pp = p - out = self.mm8_seq(r * sx, ow, omx, orx, omy, ory) - return x + out, xx[-1, :], aa, bb, pp - - ######################################################################################################## - - @MyFunction - def att_one_v5( - self, - x, - sx, - s, - ln_w, - ln_b, - lx_w, - lx_b, - k_mix, - v_mix, - r_mix, - t_decay, - t_first, - kw, - vw, - rw, - ow, - kmx, - krx, - kmy, - kry, - vmx, - vrx, - vmy, - vry, - rmx, - rrx, - rmy, - rry, - omx, - orx, - omy, - ory, - ): - xx = F.layer_norm(x, (x.shape[-1],), weight=ln_w, bias=ln_b) - kx = xx * k_mix + sx * (1 - k_mix) - vx = xx * v_mix + sx * (1 - v_mix) - rx = xx * r_mix + sx * (1 - r_mix) - - H = t_decay.shape[0] - S = x.shape[-1] // H - - r = gemm(rx, rw, output_dtype=torch.float32).view(H, 1, S) - k = gemm(kx, kw, output_dtype=torch.float32).view(H, S, 1) - v = gemm(vx, vw, output_dtype=torch.float32).view(H, 1, S) - - a = gemm(k, v) - out = r @ (t_first * a + s) - s = a + t_decay * s - - out = out.flatten() - out = F.group_norm( - out.unsqueeze(0), num_groups=H, weight=lx_w, bias=lx_b - ).squeeze(0) - out = out.to(dtype=x.dtype) - out = gemm(out, ow) - - return x + out, xx, s - - @MyFunction - def att_seq_v5( - self, - x, - sx, - s, - ln_w, - ln_b, - lx_w, - lx_b, - k_mix, - v_mix, - r_mix, - t_decay, - t_first, - kw, - vw, - rw, - ow, - kmx, - krx, - kmy, - kry, - vmx, - vrx, - vmy, - vry, - rmx, - rrx, - rmy, - rry, - omx, - orx, - omy, - ory, - ): - xx = F.layer_norm(x, (x.shape[-1],), weight=ln_w, bias=ln_b) - sx = torch.cat((sx.unsqueeze(0), xx[:-1, :])) - kx = xx * k_mix + sx * (1 - k_mix) - vx = xx * v_mix + sx * (1 - v_mix) - rx = xx * r_mix + sx * (1 - r_mix) - - H = t_decay.shape[0] - S = x.shape[-1] // H - T = x.shape[0] - - w = t_decay.reshape(-1, 1) - u = t_first.reshape(-1, 1) - ws = w.pow(T).reshape(H, 1, 1) - ind = torch.arange(T - 1, -1, -1, device=w.device).unsqueeze(0).repeat(H, 1) - w = w.repeat(1, T).pow(ind) - wk = w.reshape(H, 1, T) - wb = wk.transpose(-2, -1).flip(1) - w = torch.cat([w[:, 1:], u], dim=1) - w = F.pad(w, (0, T)) - w = torch.tile(w, [T]) - w = w[:, :-T].reshape(-1, T, 2 * T - 1) - w = w[:, :, T - 1 :].reshape(H, T, T) - - r = gemm(rx, rw, output_dtype=torch.float32).view(T, H, S).transpose(0, 1) - k = ( - gemm(kx, kw, output_dtype=torch.float32) - .view(T, H, S) - .transpose(0, 1) - .transpose(-2, -1) - ) - v = gemm(vx, vw, output_dtype=torch.float32).view(T, H, S).transpose(0, 1) - - out = ((r @ k) * w) @ v + (r @ s) * wb - s = ws * s + (k * wk) @ v - - out = out.transpose(0, 1).contiguous().reshape(T, H * S) - out = F.group_norm(out, num_groups=H, weight=lx_w, bias=lx_b) - out = out.to(dtype=x.dtype) - out = gemm(out, ow) - - return x + out, xx[-1, :], s - - ######################################################################################################## - - if os.environ["RWKV_CUDA_ON"] == "1": - - @MyFunction - def cuda_att_seq_fp16( - self, - x, - sx, - aa, - bb, - pp, - ln_w, - ln_b, - k_mix, - v_mix, - r_mix, - t_decay, - t_first, - kw, - vw, - rw, - ow, - kmx, - krx, - kmy, - kry, - vmx, - vrx, - vmy, - vry, - rmx, - rrx, - rmy, - rry, - omx, - orx, - omy, - ory, - ): - seq_len = x.shape[0] - kvrx_and_y_bytes = x.numel() * 2 - k_bytes = seq_len * kw.shape[1] * 4 - v_bytes = seq_len * vw.shape[1] * 4 - r_bytes = seq_len * rw.shape[1] * 2 - buf = torch.empty( - (kvrx_and_y_bytes * 4 + k_bytes + v_bytes + r_bytes,), - device=x.device, - dtype=torch.int8, - ) - x_plus_out_t = torch.empty_like(x) - xx = torch.ops.rwkv.att_seq( - x, - sx, - ln_w, - ln_b, - k_mix, - v_mix, - r_mix, - kw, - vw, - rw, - ow, - t_first, - pp, - aa, - bb, - t_decay, - buf, - x_plus_out_t, - ) - - return x_plus_out_t, xx[-1, :], aa, bb, pp - - @MyFunction - def cuda_att_seq_naive( - self, - x, - sx, - aa, - bb, - pp, - ln_w, - ln_b, - k_mix, - v_mix, - r_mix, - t_decay, - t_first, - kw, - vw, - rw, - ow, - kmx, - krx, - kmy, - kry, - vmx, - vrx, - vmy, - vry, - rmx, - rrx, - rmy, - rry, - omx, - orx, - omy, - ory, - ): - T, C = x.size() - xx = F.layer_norm(x, (C,), weight=ln_w, bias=ln_b) - sx = torch.cat((sx.unsqueeze(0), xx[:-1, :])) - kx = xx * k_mix + sx * (1 - k_mix) - vx = xx * v_mix + sx * (1 - v_mix) - rx = xx * r_mix + sx * (1 - r_mix) - - r = torch.sigmoid(gemm(rx, rw)) - k = gemm(kx, kw, output_dtype=torch.float32) - v = gemm(vx, vw, output_dtype=torch.float32) - y, aa, bb, pp = cuda_wkv(T, C, t_decay, t_first, k, v, aa, bb, pp) - - out = gemm(r * y.to(x.dtype), ow) - return x + out, xx[-1, :], aa, bb, pp - - @MyFunction - def cuda_att_seq_i8( - self, - x, - sx, - aa, - bb, - pp, - ln_w, - ln_b, - k_mix, - v_mix, - r_mix, - t_decay, - t_first, - kw, - vw, - rw, - ow, - kmx, - krx, - kmy, - kry, - vmx, - vrx, - vmy, - vry, - rmx, - rrx, - rmy, - rry, - omx, - orx, - omy, - ory, - ): - T, C = x.size() - xx = F.layer_norm(x, (C,), weight=ln_w, bias=ln_b) - sx = torch.cat((sx.unsqueeze(0), xx[:-1, :])) - kx = xx * k_mix + sx * (1 - k_mix) - vx = xx * v_mix + sx * (1 - v_mix) - rx = xx * r_mix + sx * (1 - r_mix) - - r = torch.sigmoid(self.mm8_seq(rx, rw, rmx, rrx, rmy, rry)) - k = self.mm8_seq(kx, kw, kmx, krx, kmy, kry) - v = self.mm8_seq(vx, vw, vmx, vrx, vmy, vry) - y, aa, bb, pp = cuda_wkv(T, C, t_decay, t_first, k, v, aa, bb, pp) - - out = self.mm8_seq(r * y, ow, omx, orx, omy, ory) - return x + out, xx[-1, :], aa, bb, pp - - @MyFunction - def cuda_ffn_seq_fp16( - self, - x, - sx, - ln_w, - ln_b, - k_mix, - r_mix, - kw, - vw, - rw, - kmx, - krx, - kmy, - kry, - vmx, - vrx, - vmy, - vry, - rmx, - rrx, - rmy, - rry, - ): - krx_bytes = x.numel() * x.element_size() - vx_bytes = x.shape[0] * kw.shape[1] * x.element_size() - r_bytes = x.shape[0] * rw.shape[1] * x.element_size() - buf = torch.empty( - (krx_bytes * 2 + vx_bytes + r_bytes,), device=x.device, dtype=torch.int8 - ) - x_plus_out = torch.empty_like(x) - xx = torch.ops.rwkv.ffn_seq( - x, sx, ln_w, ln_b, k_mix, r_mix, kw, vw, rw, buf, x_plus_out - ) - return x_plus_out, xx[-1, :] - - @MyFunction - def cuda_att_one_fp16( - self, - x, - sx, - aa, - bb, - pp, - ln_w, - ln_b, - k_mix, - v_mix, - r_mix, - t_decay, - t_first, - kw, - vw, - rw, - ow, - kmx, - krx, - kmy, - kry, - vmx, - vrx, - vmy, - vry, - rmx, - rrx, - rmy, - rry, - omx, - orx, - omy, - ory, - ): - kx = torch.empty_like(x) - vx = torch.empty_like(x) - rx = torch.empty_like(x) - - k_t = torch.empty((kw.shape[0],), dtype=torch.float32, device=x.device) - v_t = torch.empty((vw.shape[0],), dtype=torch.float32, device=x.device) - r_t = torch.empty((rw.shape[0],), dtype=torch.float16, device=x.device) - x_plus_out_t = torch.empty_like(x) - t1_t = torch.empty_like(x, dtype=torch.float32) - t2_t = torch.empty_like(x, dtype=torch.float32) - p_t = torch.empty_like(x, dtype=torch.float32) - xx = torch.ops.rwkv.att_one( - x, - ln_w, - ln_b, - sx, - k_mix, - v_mix, - r_mix, - kw, - kx, - vw, - vx, - rw, - rx, - ow, - t_first, - k_t, - pp, - ow, - aa, - bb, - t_decay, - v_t, - r_t, - x_plus_out_t, - t1_t, - t2_t, - p_t, - ) - return x_plus_out_t, xx, t1_t, t2_t, p_t - - @MyFunction - def cuda_att_one_v5_fp16( - self, - x, - sx, - s, - ln_w, - ln_b, - lx_w, - lx_b, - k_mix, - v_mix, - r_mix, - t_decay, - t_first, - kw, - vw, - rw, - ow, - kmx, - krx, - kmy, - kry, - vmx, - vrx, - vmy, - vry, - rmx, - rrx, - rmy, - rry, - omx, - orx, - omy, - ory, - ): - kx = torch.empty_like(x) - vx = torch.empty_like(x) - rx = torch.empty_like(x) - - H = t_decay.shape[0] - S = x.shape[-1] // H - - r = torch.empty((H * S,), dtype=torch.float32, device=x.device) - k = torch.empty((H * S,), dtype=torch.float32, device=x.device) - v = torch.empty((H * S,), dtype=torch.float32, device=x.device) - s1 = torch.empty((H, S, S), dtype=torch.float32, device=x.device) - s2 = torch.empty((H, S, S), dtype=torch.float32, device=x.device) - x_plus_out = torch.empty_like(x) - - xx = torch.ops.rwkv.att_one_v5( - x, - sx, - s, - ln_w, - ln_b, - lx_w, - lx_b, - k_mix, - v_mix, - r_mix, - kw, - kx, - vw, - vx, - rw, - rx, - ow, - t_first, - k, - t_decay, - v, - r, - s1, - x_plus_out, - s2, - ) - - return x_plus_out, xx, s2 - - @MyFunction - def cuda_ffn_one_fp16( - self, - x, - sx, - ln_w, - ln_b, - k_mix, - r_mix, - kw, - vw, - rw, - kmx, - krx, - kmy, - kry, - vmx, - vrx, - vmy, - vry, - rmx, - rrx, - rmy, - rry, - ): - krx_bytes = x.numel() * x.element_size() - vx_bytes = x.shape[0] * kw.shape[1] * x.element_size() - r_bytes = x.shape[0] * rw.shape[1] * x.element_size() - buf = torch.empty( - (krx_bytes * 2 + vx_bytes + r_bytes,), device=x.device, dtype=torch.int8 - ) - x_plus_out = torch.empty_like(x) - xx = torch.ops.rwkv.ffn_one( - x, sx, ln_w, ln_b, k_mix, r_mix, kw, vw, rw, buf, x_plus_out - ) - return x_plus_out, xx - - ######################################################################################################## - - def forward(self, tokens, state, full_output=False): - with torch.no_grad(): - w = self.w - args = self.args - - if state == None: - if self.version == 4: - state = [None] * args.n_layer * 5 - for i in range( - args.n_layer - ): # state: 0=att_xx 1=att_aa 2=att_bb 3=att_pp 4=ffn_xx - dd = self.strategy[i] - dev = dd.device - atype = dd.atype - state[i * 5 + 0] = torch.zeros( - args.n_embd, dtype=atype, requires_grad=False, device=dev - ).contiguous() - state[i * 5 + 1] = torch.zeros( - args.n_embd, - dtype=torch.float, - requires_grad=False, - device=dev, - ).contiguous() - state[i * 5 + 2] = torch.zeros( - args.n_embd, - dtype=torch.float, - requires_grad=False, - device=dev, - ).contiguous() - state[i * 5 + 3] = ( - torch.zeros( - args.n_embd, - dtype=torch.float, - requires_grad=False, - device=dev, - ).contiguous() - - 1e30 - ) - state[i * 5 + 4] = torch.zeros( - args.n_embd, dtype=atype, requires_grad=False, device=dev - ).contiguous() - elif self.version == 5: - state = [None] * args.n_layer * 3 - for i in range(args.n_layer): # state: 0=att_xx 1=att_kv 2=ffn_xx - dd = self.strategy[i] - dev = dd.device - atype = dd.atype - state[i * 3 + 0] = torch.zeros( - args.n_embd, dtype=atype, requires_grad=False, device=dev - ).contiguous() - state[i * 3 + 1] = torch.zeros( - ( - args.n_head, - args.n_embd // args.n_head, - args.n_embd // args.n_head, - ), - dtype=torch.float, - requires_grad=False, - device=dev, - ).contiguous() - state[i * 3 + 2] = torch.zeros( - args.n_embd, dtype=atype, requires_grad=False, device=dev - ).contiguous() - - seq_mode = len(tokens) > 1 - - x = w["emb.weight"][tokens if seq_mode else tokens[0]] - - for i in range(args.n_layer): - bbb = f"blocks.{i}." - att = f"blocks.{i}.att." - ffn = f"blocks.{i}.ffn." - dd = self.strategy[i] - dev = dd.device - atype = dd.atype - wtype = dd.wtype - if seq_mode: - ATT = self.att_seq if wtype != torch.uint8 else self.att_seq_i8 - FFN = self.ffn_seq if wtype != torch.uint8 else self.ffn_seq_i8 - if "cuda" in str(dev) and os.environ["RWKV_CUDA_ON"] == "1": - if wtype == torch.float16: - ATT = self.cuda_att_seq_fp16 - FFN = self.cuda_ffn_seq_fp16 - elif wtype == torch.uint8: - ATT = self.cuda_att_seq_i8 - else: - ATT = self.cuda_att_seq_naive - if self.version == 5: - ATT = self.att_seq_v5 - else: - ATT = self.att_one if wtype != torch.uint8 else self.att_one_i8 - FFN = self.ffn_one if wtype != torch.uint8 else self.ffn_one_i8 - if self.version == 5: - ATT = self.att_one_v5 - if ( - "cuda" in str(dev) - and os.environ["RWKV_CUDA_ON"] == "1" - and wtype == torch.float16 - ): - ATT = self.cuda_att_one_fp16 - FFN = self.cuda_ffn_one_fp16 - if self.version == 5: - ATT = self.cuda_att_one_v5_fp16 - - x = x.to(dtype=atype, device=dev) - - kw = w[f"{att}key.weight"] - vw = w[f"{att}value.weight"] - rw = w[f"{att}receptance.weight"] - ow = w[f"{att}output.weight"] - if dd.stream: - kw = kw.to(device=dev, non_blocking=True) - vw = vw.to(device=dev, non_blocking=True) - rw = rw.to(device=dev, non_blocking=True) - ow = ow.to(device=dev, non_blocking=True) - kmx = w[f"{att}key.weight_mx"] if wtype == torch.uint8 else x - krx = w[f"{att}key.weight_rx"] if wtype == torch.uint8 else x - kmy = w[f"{att}key.weight_my"] if wtype == torch.uint8 else x - kry = w[f"{att}key.weight_ry"] if wtype == torch.uint8 else x - vmx = w[f"{att}value.weight_mx"] if wtype == torch.uint8 else x - vrx = w[f"{att}value.weight_rx"] if wtype == torch.uint8 else x - vmy = w[f"{att}value.weight_my"] if wtype == torch.uint8 else x - vry = w[f"{att}value.weight_ry"] if wtype == torch.uint8 else x - rmx = w[f"{att}receptance.weight_mx"] if wtype == torch.uint8 else x - rrx = w[f"{att}receptance.weight_rx"] if wtype == torch.uint8 else x - rmy = w[f"{att}receptance.weight_my"] if wtype == torch.uint8 else x - rry = w[f"{att}receptance.weight_ry"] if wtype == torch.uint8 else x - omx = w[f"{att}output.weight_mx"] if wtype == torch.uint8 else x - orx = w[f"{att}output.weight_rx"] if wtype == torch.uint8 else x - omy = w[f"{att}output.weight_my"] if wtype == torch.uint8 else x - ory = w[f"{att}output.weight_ry"] if wtype == torch.uint8 else x - if self.version == 4: - ( - x, - state[i * 5 + 0], - state[i * 5 + 1], - state[i * 5 + 2], - state[i * 5 + 3], - ) = ATT( - x, - state[i * 5 + 0], - state[i * 5 + 1], - state[i * 5 + 2], - state[i * 5 + 3], - w[f"{bbb}ln1.weight"], - w[f"{bbb}ln1.bias"], - w[f"{att}time_mix_k"], - w[f"{att}time_mix_v"], - w[f"{att}time_mix_r"], - w[f"{att}time_decay"], - w[f"{att}time_first"], - kw, - vw, - rw, - ow, - kmx, - krx, - kmy, - kry, - vmx, - vrx, - vmy, - vry, - rmx, - rrx, - rmy, - rry, - omx, - orx, - omy, - ory, - ) - elif self.version == 5: - x, state[i * 3 + 0], state[i * 3 + 1] = ATT( - x, - state[i * 3 + 0], - state[i * 3 + 1], - w[f"{bbb}ln1.weight"], - w[f"{bbb}ln1.bias"], - w[f"{att}ln_x.weight"], - w[f"{att}ln_x.bias"], - w[f"{att}time_mix_k"], - w[f"{att}time_mix_v"], - w[f"{att}time_mix_r"], - w[f"{att}time_decay"], - w[f"{att}time_first"], - kw, - vw, - rw, - ow, - kmx, - krx, - kmy, - kry, - vmx, - vrx, - vmy, - vry, - rmx, - rrx, - rmy, - rry, - omx, - orx, - omy, - ory, - ) - if dd.stream: - del kw, vw, rw, ow - - kw = w[f"{ffn}key.weight"] - vw = w[f"{ffn}value.weight"] - rw = w[f"{ffn}receptance.weight"] - if dd.stream: - kw = kw.to(device=dev, non_blocking=True) - vw = vw.to(device=dev, non_blocking=True) - rw = rw.to(device=dev, non_blocking=True) - kmx = w[f"{ffn}key.weight_mx"] if wtype == torch.uint8 else x - krx = w[f"{ffn}key.weight_rx"] if wtype == torch.uint8 else x - kmy = w[f"{ffn}key.weight_my"] if wtype == torch.uint8 else x - kry = w[f"{ffn}key.weight_ry"] if wtype == torch.uint8 else x - vmx = w[f"{ffn}value.weight_mx"] if wtype == torch.uint8 else x - vrx = w[f"{ffn}value.weight_rx"] if wtype == torch.uint8 else x - vmy = w[f"{ffn}value.weight_my"] if wtype == torch.uint8 else x - vry = w[f"{ffn}value.weight_ry"] if wtype == torch.uint8 else x - rmx = w[f"{ffn}receptance.weight_mx"] if wtype == torch.uint8 else x - rrx = w[f"{ffn}receptance.weight_rx"] if wtype == torch.uint8 else x - rmy = w[f"{ffn}receptance.weight_my"] if wtype == torch.uint8 else x - rry = w[f"{ffn}receptance.weight_ry"] if wtype == torch.uint8 else x - if self.version == 4: - offset = i * 5 + 4 - elif self.version == 5: - offset = i * 3 + 2 - x, state[offset] = FFN( - x, - state[offset], - w[f"{bbb}ln2.weight"], - w[f"{bbb}ln2.bias"], - w[f"{ffn}time_mix_k"], - w[f"{ffn}time_mix_r"], - kw, - vw, - rw, - kmx, - krx, - kmy, - kry, - vmx, - vrx, - vmy, - vry, - rmx, - rrx, - rmy, - rry, - ) - if dd.stream: - del kw, vw, rw - - if self.RESCALE_LAYER > 0: - if (i + 1) % self.RESCALE_LAYER == 0: - x = x / 2 - - dd = self.strategy[args.n_layer] - x = x[-1, :] if (seq_mode and (not full_output)) else x - x = x.to(dtype=dd.atype, device=dd.device) - - x = F.layer_norm( - x, (args.n_embd,), weight=w["ln_out.weight"], bias=w["ln_out.bias"] - ) - if w["head.weight"].dtype != torch.uint8: - x = x @ w["head.weight"] - else: - if seq_mode and full_output: - x = self.mm8_seq( - x, - w["head.weight"], - w["head.weight_mx"], - w["head.weight_rx"], - w["head.weight_my"], - w["head.weight_ry"], - ) - else: - x = self.mm8_one( - x, - w["head.weight"], - w["head.weight_mx"], - w["head.weight_rx"], - w["head.weight_my"], - w["head.weight_ry"], - ) - - return x.float(), state diff --git a/backend-python/rwkv_pip/beta/wkv_cuda.pyd b/backend-python/rwkv_pip/beta/wkv_cuda.pyd deleted file mode 100644 index 7734f12573204cd6497cf1c18656286f9d4abcec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 640512 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 str: def RWKV(model: str, strategy: str, tokenizer: Union[str, None]) -> AbstractRWKV: model_path = get_model_path(model) - rwkv_beta = global_var.get(global_var.Args).rwkv_beta rwkv_cpp = getattr(global_var.get(global_var.Args), "rwkv.cpp") webgpu = global_var.get(global_var.Args).webgpu @@ -625,12 +624,7 @@ def RWKV(model: str, strategy: str, tokenizer: Union[str, None]) -> AbstractRWKV os.environ["RWKV_RESCALE_LAYER"] = "999" # dynamic import to make RWKV_CUDA_ON work - if rwkv_beta: - print("Using rwkv-beta") - from rwkv_pip.beta.model import ( - RWKV as Model, - ) - elif rwkv_cpp: + if rwkv_cpp: print("Using rwkv.cpp, strategy is ignored") from rwkv_pip.cpp.model import ( RWKV as Model,