faster inference

This commit is contained in:
Daniel Han-Chen 2024-02-01 20:03:54 +11:00
commit 1793a16c8f
2 changed files with 29 additions and 26 deletions

View file

@ -119,7 +119,7 @@ def fast_gemv(X, W, quant_state, out = None):
# For fast X @ W where seq_len == 1
# From https://github.com/TimDettmers/bitsandbytes/blob/main/bitsandbytes/functional.py#L1469
bsz, q_len, hd = X.shape
assert(q_len == 1)
# assert(q_len == 1)
if type(quant_state) is not list:
# https://github.com/TimDettmers/bitsandbytes/pull/763/files
@ -138,7 +138,7 @@ def fast_gemv(X, W, quant_state, out = None):
offset, state2 = compressed_stats
absmax2, code2, blocksize2, _, _, _, _ = state2
pass
assert(dtype == X.dtype)
# assert(dtype == X.dtype)
bout = shape[0]
if out is None:
@ -152,7 +152,7 @@ def fast_gemv(X, W, quant_state, out = None):
k = shape[1]
lda = shape[0]
ldc = shape[0]
ldb = (X.shape[-1]+1)//2
ldb = (hd+1)//2
m = ctypes.c_int32(m)
n = ctypes.c_int32(n)
k = ctypes.c_int32(k)

View file

@ -223,37 +223,40 @@ def LlamaAttention_fast_forward_inference(
remember K and V, which are called the KV cache.
"""
Xn = hidden_states
bsz, _, _ = hidden_states.size()
bsz, _, hd = hidden_states.size()
K1, V1 = past_key_value
dtype = X.dtype
n_heads = self.num_heads
n_groups = self.num_key_value_groups
n_kv_heads = self.num_key_value_heads
head_dim = self.head_dim
# ssert(n_kv_heads * n_groups == n_heads)
# assert(n_kv_heads * n_groups == n_heads)
temp_QA = torch.empty((2, bsz, 1, hd), dtype = dtype, device = "cuda")
temp_KV = torch.empty((2, bsz, 1, n_kv_heads*head_dim), dtype = dtype, device = "cuda")
Qn = fast_linear_forward(self.q_proj, Xn)
Kn = fast_linear_forward(self.k_proj, Xn)
Vn = fast_linear_forward(self.v_proj, Xn)
Qn = fast_linear_forward(self.q_proj, Xn, out = temp_QA[0])
Kn = fast_linear_forward(self.k_proj, Xn, out = temp_KV[0])
Vn = fast_linear_forward(self.v_proj, Xn, out = temp_KV[1])
Qn = Qn.view(bsz, 1, n_heads, head_dim).transpose(1, 2)
Kn = Kn.view(bsz, 1, n_kv_heads, head_dim).transpose(1, 2)
Vn = Vn.view(bsz, 1, n_kv_heads, head_dim).transpose(1, 2)
seq_len = K1.shape[-2]
kv_seq_len = seq_len + 1
cos, sin = self.rotary_emb(Vn, seq_len = kv_seq_len)
Qn, Kn = inplace_rope_embedding(Qn, Kn, cos, sin, position_ids)
# cos = self.rotary_emb.cos_cached[seq_len]
# sin = self.rotary_emb.sin_cached[seq_len]
# h = head_dim // 2
# cos, sin = self.rotary_emb(Vn, seq_len = kv_seq_len)
# Qn, Kn = inplace_rope_embedding(Qn, Kn, cos, sin, position_ids)
cos = self.rotary_emb.cos_cached[seq_len]
sin = self.rotary_emb.sin_cached[seq_len]
h = head_dim // 2
# RH_Q = torch.empty((bsz, n_heads, 1, head_dim), dtype = Xn.dtype, device = "cuda")
# RH_Q[:,:,:,:h] = Qn[:,:,:,h:]; RH_Q[:,:,:,h:] = Qn[:,:,:,:h]; torch.neg(RH_Q[:,:,:,:h], out = RH_Q[:,:,:,:h]);
# Qn *= cos; Qn.addcmul_(RH_Q, sin);
RH_Q = torch.empty((bsz, n_heads, 1, head_dim), dtype = Xn.dtype, device = "cuda")
RH_Q[:,:,:,:h] = Qn[:,:,:,h:]; RH_Q[:,:,:,h:] = Qn[:,:,:,:h]; torch.neg(RH_Q[:,:,:,:h], out = RH_Q[:,:,:,:h]);
Qn *= cos; Qn.addcmul_(RH_Q, sin);
# RH_K = RH_Q[:,:n_kv_heads,:,:] # torch.empty((n_kv_heads, 1, head_dim), dtype = dtype, device = "cuda")
# RH_K[:,:,:,:h] = Kn[:,:,:,h:]; RH_K[:,:,:,h:] = Kn[:,:,:,:h]; torch.neg(RH_K[:,:,:,:h], out = RH_K[:,:,:,:h]);
# Kn *= cos; Kn.addcmul_(RH_K, sin);
RH_K = RH_Q[:,:n_kv_heads,:,:] # torch.empty((n_kv_heads, 1, head_dim), dtype = dtype, device = "cuda")
RH_K[:,:,:,:h] = Kn[:,:,:,h:]; RH_K[:,:,:,h:] = Kn[:,:,:,:h]; torch.neg(RH_K[:,:,:,:h], out = RH_K[:,:,:,:h]);
Kn *= cos; Kn.addcmul_(RH_K, sin);
# New KV cache
Kn = torch.cat([K1, Kn], dim = 2)
@ -276,7 +279,7 @@ def LlamaAttention_fast_forward_inference(
A = torch.matmul(A, Vnn, out = Qn)
A = A.transpose(1, 2)
A = A.reshape(bsz, 1, self.hidden_size)
A = fast_linear_forward(self.o_proj, A)
A = fast_linear_forward(self.o_proj, A, out = temp_QA[1])
return A, (Kn, Vn)
pass
@ -286,15 +289,15 @@ def fast_mlp_inference(self, X):
# up = self.up_proj(X)
bsz, _, hd = X.shape
mlp_size = self.config.intermediate_size
# temp = torch.empty((2, bsz, 1, mlp_size), dtype = X.dtype, device = "cuda")
temp = torch.empty((2, bsz, 1, mlp_size), dtype = X.dtype, device = "cuda")
gate = fast_linear_forward(self.gate_proj, X)
up = fast_linear_forward(self. up_proj, X)
gate = fast_linear_forward(self.gate_proj, X, out = temp[0])
up = fast_linear_forward(self. up_proj, X, out = temp[1])
gate = torch.nn.functional.silu(gate, inplace = True)
gate *= up
# X = self.down_proj(gate)
down = fast_linear_forward(self.down_proj, gate)
down = fast_linear_forward(self.down_proj, gate, out = up[:,:,:hd])
return down
pass