diff --git a/unsloth/kernels/utils.py b/unsloth/kernels/utils.py index 4f4ce41006..de97fea729 100644 --- a/unsloth/kernels/utils.py +++ b/unsloth/kernels/utils.py @@ -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) diff --git a/unsloth/models/llama.py b/unsloth/models/llama.py index 965cc2c71f..c92dc78bdc 100644 --- a/unsloth/models/llama.py +++ b/unsloth/models/llama.py @@ -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