Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
OpenDAS
vllm_cscc
Commits
ca7f98e5
Commit
ca7f98e5
authored
Jan 03, 2025
by
zhuwenwen
Browse files
remove gemm and fa pad
parent
57adffa2
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
92 additions
and
577 deletions
+92
-577
README.md
README.md
+1
-1
vllm/model_executor/models/baichuan.py
vllm/model_executor/models/baichuan.py
+9
-9
vllm/model_executor/models/bloom.py
vllm/model_executor/models/bloom.py
+13
-11
vllm/model_executor/models/chatglm.py
vllm/model_executor/models/chatglm.py
+13
-13
vllm/model_executor/models/falcon.py
vllm/model_executor/models/falcon.py
+9
-9
vllm/model_executor/models/llama.py
vllm/model_executor/models/llama.py
+21
-20
vllm/model_executor/models/qwen.py
vllm/model_executor/models/qwen.py
+13
-13
vllm/model_executor/models/qwen2.py
vllm/model_executor/models/qwen2.py
+9
-9
vllm/model_executor/models/qwen2_moe.py
vllm/model_executor/models/qwen2_moe.py
+4
-4
vllm/model_executor/models/telechat_12B.py
vllm/model_executor/models/telechat_12B.py
+0
-488
No files found.
README.md
View file @
ca7f98e5
...
...
@@ -20,7 +20,7 @@ vLLM是一个快速且易于使用的LLM推理和服务库,使用PageAttention
| InternLMForCausalLM | InternLM | Yes | No | - |
| InternLM2ForCausalLM | InternLM2 | Yes | No | - |
| FalconForCausalLM | falcon | Yes | No | Yes |
| TeleChat
12B
ForCausalLM
(#TelechatForCausalLM) | TeleChat-12B
| Yes | No | - |
| TeleChat
2
ForCausalLM
| TeleChat2
| Yes | No | - |
| MiniCPMForCausalLM | MiniCPM | Yes | No | - |
| MiniCPM3ForCausalLM | MiniCPM3 | Yes | No | - |
| MixtralForCausalLM | Mixtral-8x7B,Mixtral-8x7B-Instruct | Yes | No | - |
...
...
vllm/model_executor/models/baichuan.py
View file @
ca7f98e5
...
...
@@ -195,8 +195,8 @@ class BaiChuanAttention(nn.Module):
attn_metadata
:
AttentionMetadata
,
)
->
torch
.
Tensor
:
qkv
,
_
=
self
.
W_pack
(
hidden_states
)
if
os
.
environ
.
get
(
'FA_PAD'
)
==
'1'
and
self
.
quant_method
is
None
:
qkv
=
qkv
[...,:
-
32
]
#
if os.environ.get('FA_PAD') == '1' and self.quant_method is None:
#
qkv = qkv[...,:-32]
q
,
k
,
v
=
qkv
.
chunk
(
chunks
=
3
,
dim
=-
1
)
if
self
.
postion_embedding
!=
"ALIBI"
:
q
,
k
=
self
.
rotary_emb
(
positions
,
q
,
k
)
...
...
@@ -501,18 +501,18 @@ class BaiChuanBaseForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
]
combined_words
=
"|"
.
join
(
lay_key_words
)
lay_qkv_words
=
[
"self_attn.W_pack.weight"
]
qkv_words
=
"|"
.
join
(
lay_qkv_words
)
#
lay_qkv_words = ["self_attn.W_pack.weight"]
#
qkv_words = "|".join(lay_qkv_words)
for
layername
,
weight
in
params_dict
.
items
():
matches
=
re
.
findall
(
combined_words
,
layername
)
if
matches
:
if
self
.
use_gemm_pad
and
gemm_bank_conf
(
weight
.
data
.
shape
[
0
]):
weight
.
data
=
pad_weight
(
weight
.
data
,
32
)
#
if self.use_gemm_pad and gemm_bank_conf(weight.data.shape[0]):
#
weight.data = pad_weight(weight.data, 32)
if
self
.
use_fa_pad
and
(
re
.
findall
(
qkv_words
,
layername
)):
if
not
gemm_bank_conf
(
weight
.
data
.
shape
[
0
]):
weight
.
data
=
pad_weight
(
weight
.
data
,
32
)
#
if self.use_fa_pad and (re.findall(qkv_words, layername)):
#
if not gemm_bank_conf(weight.data.shape[0]):
#
weight.data = pad_weight(weight.data, 32)
_weight
=
torch
.
zeros_like
(
weight
.
data
)
ori_shape
=
_weight
.
shape
...
...
vllm/model_executor/models/bloom.py
View file @
ca7f98e5
...
...
@@ -138,6 +138,8 @@ class BloomAttention(nn.Module):
)
->
torch
.
Tensor
:
del
position_ids
# Unused.
qkv
,
_
=
self
.
query_key_value
(
hidden_states
)
# if os.environ.get('FA_PAD') == '1' and self.quant_method is None:
# qkv = qkv[...,:-32]
q
,
k
,
v
=
qkv
.
chunk
(
chunks
=
3
,
dim
=-
1
)
attn_output
=
self
.
attn
(
q
,
k
,
v
,
kv_cache
,
attn_metadata
)
output
,
_
=
self
.
dense
(
attn_output
)
...
...
@@ -409,24 +411,24 @@ class BloomForCausalLM(nn.Module, SupportsPP):
]
combined_words
=
"|"
.
join
(
lay_key_words
)
lay_qkv_words
=
[
"self_attention.query_key_value.weight"
]
qkv_words
=
"|"
.
join
(
lay_qkv_words
)
#
lay_qkv_words = ["self_attention.query_key_value.weight"]
#
qkv_words = "|".join(lay_qkv_words)
lay_qkv_bias_words
=
[
"self_attention.query_key_value.bias"
]
qkv_bias_words
=
"|"
.
join
(
lay_qkv_bias_words
)
#
lay_qkv_bias_words = ["self_attention.query_key_value.bias"]
#
qkv_bias_words = "|".join(lay_qkv_bias_words)
for
layername
,
weight
in
params_dict
.
items
():
if
self
.
use_fa_pad
and
(
re
.
findall
(
qkv_bias_words
,
layername
)):
weight
.
data
=
pad_weight
(
weight
.
data
,
32
)
#
if self.use_fa_pad and (re.findall(qkv_bias_words, layername)):
#
weight.data = pad_weight(weight.data, 32)
matches
=
re
.
findall
(
combined_words
,
layername
)
if
matches
:
if
self
.
use_gemm_pad
and
gemm_bank_conf
(
weight
.
data
.
shape
[
0
]):
weight
.
data
=
pad_weight
(
weight
.
data
,
32
)
#
if self.use_gemm_pad and gemm_bank_conf(weight.data.shape[0]):
#
weight.data = pad_weight(weight.data, 32)
if
self
.
use_fa_pad
and
(
re
.
findall
(
qkv_words
,
layername
)):
if
not
gemm_bank_conf
(
weight
.
data
.
shape
[
0
]):
weight
.
data
=
pad_weight
(
weight
.
data
,
32
)
#
if self.use_fa_pad and (re.findall(qkv_words, layername)):
#
if not gemm_bank_conf(weight.data.shape[0]):
#
weight.data = pad_weight(weight.data, 32)
_weight
=
torch
.
zeros_like
(
weight
.
data
)
ori_shape
=
_weight
.
shape
...
...
vllm/model_executor/models/chatglm.py
View file @
ca7f98e5
...
...
@@ -313,8 +313,8 @@ class GLMAttention(nn.Module):
attn_metadata
:
AttentionMetadata
,
)
->
torch
.
Tensor
:
qkv
,
_
=
self
.
query_key_value
(
hidden_states
)
if
os
.
environ
.
get
(
'FA_PAD'
)
==
'1'
and
self
.
quant_method
is
None
:
qkv
=
qkv
[...,:
-
32
]
#
if os.environ.get('FA_PAD') == '1' and self.quant_method is None:
#
qkv = qkv[...,:-32]
q
,
k
,
v
=
qkv
.
split
([
self
.
q_size
,
self
.
kv_size
,
self
.
kv_size
],
dim
=-
1
)
q
,
k
=
self
.
rotary_emb
(
position_ids
,
q
,
k
)
context_layer
=
self
.
attn
(
...
...
@@ -738,11 +738,11 @@ class ChatGLMBaseModel(nn.Module, SupportsLoRA, SupportsPP):
]
combined_words
=
"|"
.
join
(
lay_key_words
)
lay_qkv_words
=
[
"self_attention.query_key_value.weight"
]
qkv_words
=
"|"
.
join
(
lay_qkv_words
)
#
lay_qkv_words = ["self_attention.query_key_value.weight"]
#
qkv_words = "|".join(lay_qkv_words)
lay_qkv_bias_words
=
[
"self_attention.query_key_value.bias"
]
qkv_bias_words
=
"|"
.
join
(
lay_qkv_bias_words
)
#
lay_qkv_bias_words = ["self_attention.query_key_value.bias"]
#
qkv_bias_words = "|".join(lay_qkv_bias_words)
for
layername
,
weight
in
params_dict
.
items
():
if
"lm_head.weight"
in
layername
and
weight
.
shape
[
1
]
==
4096
:
...
...
@@ -751,17 +751,17 @@ class ChatGLMBaseModel(nn.Module, SupportsLoRA, SupportsPP):
os
.
environ
[
'LM_NN'
]
=
'1'
else
:
os
.
environ
[
'LM_NN'
]
=
'0'
if
self
.
use_fa_pad
and
(
re
.
findall
(
qkv_bias_words
,
layername
)):
weight
.
data
=
pad_weight
(
weight
.
data
,
32
)
#
if self.use_fa_pad and (re.findall(qkv_bias_words, layername)):
#
weight.data = pad_weight(weight.data, 32)
matches
=
re
.
findall
(
combined_words
,
layername
)
if
matches
:
if
self
.
use_gemm_pad
and
gemm_bank_conf
(
weight
.
data
.
shape
[
0
]):
weight
.
data
=
pad_weight
(
weight
.
data
,
32
)
#
if self.use_gemm_pad and gemm_bank_conf(weight.data.shape[0]):
#
weight.data = pad_weight(weight.data, 32)
if
self
.
use_fa_pad
and
(
re
.
findall
(
qkv_words
,
layername
)):
if
not
gemm_bank_conf
(
weight
.
data
.
shape
[
0
]):
weight
.
data
=
pad_weight
(
weight
.
data
,
32
)
#
if self.use_fa_pad and (re.findall(qkv_words, layername)):
#
if not gemm_bank_conf(weight.data.shape[0]):
#
weight.data = pad_weight(weight.data, 32)
_weight
=
torch
.
zeros_like
(
weight
.
data
)
ori_shape
=
_weight
.
shape
...
...
vllm/model_executor/models/falcon.py
View file @
ca7f98e5
...
...
@@ -202,8 +202,8 @@ class FalconAttention(nn.Module):
attn_metadata
:
AttentionMetadata
,
)
->
torch
.
Tensor
:
qkv
,
bias
=
self
.
query_key_value
(
hidden_states
)
if
os
.
environ
.
get
(
'FA_PAD'
)
==
'1'
and
self
.
quant_method
is
None
:
qkv
=
qkv
[...,:
-
32
]
#
if os.environ.get('FA_PAD') == '1' and self.quant_method is None:
#
qkv = qkv[...,:-32]
if
bias
is
not
None
:
qkv
+=
bias
q
,
k
,
v
=
qkv
.
split
([
self
.
q_size
,
self
.
kv_size
,
self
.
kv_size
],
dim
=-
1
)
...
...
@@ -557,18 +557,18 @@ class FalconForCausalLM(nn.Module, SupportsPP):
]
combined_words
=
"|"
.
join
(
lay_key_words
)
lay_qkv_words
=
[
"self_attention.query_key_value.weight"
]
qkv_words
=
"|"
.
join
(
lay_qkv_words
)
#
lay_qkv_words = ["self_attention.query_key_value.weight"]
#
qkv_words = "|".join(lay_qkv_words)
for
layername
,
weight
in
params_dict
.
items
():
matches
=
re
.
findall
(
combined_words
,
layername
)
if
matches
:
if
self
.
use_gemm_pad
and
gemm_bank_conf
(
weight
.
data
.
shape
[
0
]):
weight
.
data
=
pad_weight
(
weight
.
data
,
32
)
#
if self.use_gemm_pad and gemm_bank_conf(weight.data.shape[0]):
#
weight.data = pad_weight(weight.data, 32)
if
self
.
use_fa_pad
and
(
re
.
findall
(
qkv_words
,
layername
)):
if
not
gemm_bank_conf
(
weight
.
data
.
shape
[
0
]):
weight
.
data
=
pad_weight
(
weight
.
data
,
32
)
#
if self.use_fa_pad and (re.findall(qkv_words, layername)):
#
if not gemm_bank_conf(weight.data.shape[0]):
#
weight.data = pad_weight(weight.data, 32)
_weight
=
torch
.
zeros_like
(
weight
.
data
)
ori_shape
=
_weight
.
shape
...
...
vllm/model_executor/models/llama.py
View file @
ca7f98e5
...
...
@@ -211,8 +211,8 @@ class LlamaAttention(nn.Module):
attn_metadata
:
AttentionMetadata
,
)
->
torch
.
Tensor
:
qkv
,
_
=
self
.
qkv_proj
(
hidden_states
)
if
os
.
environ
.
get
(
'FA_PAD'
)
==
'1'
and
self
.
quant_method
is
None
:
qkv
=
qkv
[...,:
-
32
]
#
if os.environ.get('FA_PAD') == '1' and self.quant_method is None:
#
qkv = qkv[...,:-32]
q
,
k
,
v
=
qkv
.
split
([
self
.
q_size
,
self
.
kv_size
,
self
.
kv_size
],
dim
=-
1
)
q
,
k
=
self
.
rotary_emb
(
positions
,
q
,
k
)
attn_output
=
self
.
attn
(
q
,
k
,
v
,
kv_cache
,
attn_metadata
)
...
...
@@ -344,6 +344,18 @@ class LlamaModel(nn.Module):
self
.
make_empty_intermediate_tensors
=
(
make_empty_intermediate_tensors_factory
(
[
"hidden_states"
,
"residual"
],
config
.
hidden_size
))
self
.
quant_method
=
None
if
quant_config
is
not
None
:
self
.
quant_method
=
quant_config
.
get_name
()
self
.
quant_config
=
quant_config
self
.
use_llama_nn
=
os
.
environ
.
get
(
'LLAMA_NN'
)
==
'1'
# self.use_lm_nn = os.environ.get('LM_NN') == '1'
self
.
use_gemm_pad
=
os
.
environ
.
get
(
'GEMM_PAD'
)
==
'1'
self
.
use_fa_pad
=
os
.
environ
.
get
(
'FA_PAD'
)
==
'1'
self
.
use_awq_pad
=
os
.
environ
.
get
(
'AWQ_PAD'
)
==
'1'
self
.
w8a8_strategy
=
int
(
os
.
getenv
(
'W8A8_SUPPORT_METHODS'
,
'0'
))
def
get_input_embeddings
(
self
,
input_ids
:
torch
.
Tensor
)
->
torch
.
Tensor
:
return
self
.
embed_tokens
(
input_ids
)
...
...
@@ -454,8 +466,8 @@ class LlamaModel(nn.Module):
]
combined_words
=
"|"
.
join
(
lay_key_words
)
lay_qkv_words
=
[
"self_attn.qkv_proj.weight"
]
qkv_words
=
"|"
.
join
(
lay_qkv_words
)
#
lay_qkv_words = ["self_attn.qkv_proj.weight"]
#
qkv_words = "|".join(lay_qkv_words)
for
layername
,
weight
in
params_dict
.
items
():
if
"lm_head.weight"
in
layername
and
weight
.
shape
[
1
]
>=
4096
:
...
...
@@ -468,12 +480,12 @@ class LlamaModel(nn.Module):
matches
=
re
.
findall
(
combined_words
,
layername
)
if
matches
:
if
self
.
use_gemm_pad
and
gemm_bank_conf
(
weight
.
data
.
shape
[
0
]):
weight
.
data
=
pad_weight
(
weight
.
data
,
32
)
#
if self.use_gemm_pad and gemm_bank_conf(weight.data.shape[0]):
#
weight.data = pad_weight(weight.data, 32)
if
self
.
use_fa_pad
and
(
re
.
findall
(
qkv_words
,
layername
)):
if
not
gemm_bank_conf
(
weight
.
data
.
shape
[
0
]):
weight
.
data
=
pad_weight
(
weight
.
data
,
32
)
#
if self.use_fa_pad and (re.findall(qkv_words, layername)):
#
if not gemm_bank_conf(weight.data.shape[0]):
#
weight.data = pad_weight(weight.data, 32)
_weight
=
torch
.
zeros_like
(
weight
.
data
)
ori_shape
=
_weight
.
shape
...
...
@@ -687,17 +699,6 @@ class LlamaForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
self
.
make_empty_intermediate_tensors
=
(
self
.
model
.
make_empty_intermediate_tensors
)
self
.
quant_method
=
None
if
quant_config
is
not
None
:
self
.
quant_method
=
quant_config
.
get_name
()
self
.
quant_config
=
quant_config
self
.
use_llama_nn
=
os
.
environ
.
get
(
'LLAMA_NN'
)
==
'1'
# self.use_lm_nn = os.environ.get('LM_NN') == '1'
self
.
use_gemm_pad
=
os
.
environ
.
get
(
'GEMM_PAD'
)
==
'1'
self
.
use_fa_pad
=
os
.
environ
.
get
(
'FA_PAD'
)
==
'1'
self
.
use_awq_pad
=
os
.
environ
.
get
(
'AWQ_PAD'
)
==
'1'
self
.
w8a8_strategy
=
int
(
os
.
getenv
(
'W8A8_SUPPORT_METHODS'
,
'0'
))
def
_init_model
(
self
,
vllm_config
:
VllmConfig
,
prefix
:
str
=
""
):
return
LlamaModel
(
vllm_config
=
vllm_config
,
prefix
=
prefix
)
...
...
vllm/model_executor/models/qwen.py
View file @
ca7f98e5
...
...
@@ -499,8 +499,8 @@ class QWenAttention(nn.Module):
attn_metadata
:
AttentionMetadata
,
)
->
torch
.
Tensor
:
qkv
,
_
=
self
.
c_attn
(
hidden_states
)
if
os
.
environ
.
get
(
'FA_PAD'
)
==
'1'
and
self
.
quant_method
is
None
:
qkv
=
qkv
[...,:
-
32
]
#
if os.environ.get('FA_PAD') == '1' and self.quant_method is None:
#
qkv = qkv[...,:-32]
q
,
k
,
v
=
qkv
.
chunk
(
chunks
=
3
,
dim
=-
1
)
q
,
k
=
self
.
rotary_emb
(
positions
,
q
,
k
)
attn_output
=
self
.
attn
(
q
,
k
,
v
,
kv_cache
,
attn_metadata
)
...
...
@@ -1040,24 +1040,24 @@ class QWenBaseModel(nn.Module, SupportsPP, SupportsLoRA):
]
combined_words
=
"|"
.
join
(
lay_key_words
)
lay_qkv_words
=
[
"attn.c_attn.weight"
]
qkv_words
=
"|"
.
join
(
lay_qkv_words
)
#
lay_qkv_words = ["attn.c_attn.weight"]
#
qkv_words = "|".join(lay_qkv_words)
lay_qkv_bias_words
=
[
"attn.c_attn.bias"
]
qkv_bias_words
=
"|"
.
join
(
lay_qkv_bias_words
)
#
lay_qkv_bias_words = ["attn.c_attn.bias"]
#
qkv_bias_words = "|".join(lay_qkv_bias_words)
for
layername
,
weight
in
params_dict
.
items
():
if
self
.
use_fa_pad
and
(
re
.
findall
(
qkv_bias_words
,
layername
)):
weight
.
data
=
pad_weight
(
weight
.
data
,
32
)
#
if self.use_fa_pad and (re.findall(qkv_bias_words, layername)):
#
weight.data = pad_weight(weight.data, 32)
matches
=
re
.
findall
(
combined_words
,
layername
)
if
matches
:
if
self
.
use_gemm_pad
and
gemm_bank_conf
(
weight
.
data
.
shape
[
0
]):
weight
.
data
=
pad_weight
(
weight
.
data
,
32
)
#
if self.use_gemm_pad and gemm_bank_conf(weight.data.shape[0]):
#
weight.data = pad_weight(weight.data, 32)
if
self
.
use_fa_pad
and
(
re
.
findall
(
qkv_words
,
layername
)):
if
not
gemm_bank_conf
(
weight
.
data
.
shape
[
0
]):
weight
.
data
=
pad_weight
(
weight
.
data
,
32
)
#
if self.use_fa_pad and (re.findall(qkv_words, layername)):
#
if not gemm_bank_conf(weight.data.shape[0]):
#
weight.data = pad_weight(weight.data, 32)
_weight
=
torch
.
zeros_like
(
weight
.
data
)
ori_shape
=
_weight
.
shape
...
...
vllm/model_executor/models/qwen2.py
View file @
ca7f98e5
...
...
@@ -181,8 +181,8 @@ class Qwen2Attention(nn.Module):
attn_type
:
str
=
AttentionType
.
DECODER
,
)
->
torch
.
Tensor
:
qkv
,
_
=
self
.
qkv_proj
(
hidden_states
)
if
os
.
environ
.
get
(
'FA_PAD'
)
==
'1'
and
self
.
quant_method
is
None
:
qkv
=
qkv
[...,:
-
32
]
#
if os.environ.get('FA_PAD') == '1' and self.quant_method is None:
#
qkv = qkv[...,:-32]
q
,
k
,
v
=
qkv
.
split
([
self
.
q_size
,
self
.
kv_size
,
self
.
kv_size
],
dim
=-
1
)
q
,
k
=
self
.
rotary_emb
(
positions
,
q
,
k
)
attn_output
=
self
.
attn
(
q
,
...
...
@@ -441,17 +441,17 @@ class Qwen2Model(nn.Module):
os
.
environ
[
'LM_NN'
]
=
'1'
else
:
os
.
environ
[
'LM_NN'
]
=
'0'
if
self
.
use_fa_pad
and
(
re
.
findall
(
qkv_bias_words
,
layername
)):
weight
.
data
=
pad_weight
(
weight
.
data
,
32
)
#
if self.use_fa_pad and (re.findall(qkv_bias_words, layername)):
#
weight.data = pad_weight(weight.data, 32)
matches
=
re
.
findall
(
combined_words
,
layername
)
if
matches
:
if
self
.
use_gemm_pad
and
gemm_bank_conf
(
weight
.
data
.
shape
[
0
]):
weight
.
data
=
pad_weight
(
weight
.
data
,
32
)
#
if self.use_gemm_pad and gemm_bank_conf(weight.data.shape[0]):
#
weight.data = pad_weight(weight.data, 32)
if
self
.
use_fa_pad
and
(
re
.
findall
(
qkv_words
,
layername
)):
if
not
gemm_bank_conf
(
weight
.
data
.
shape
[
0
]):
weight
.
data
=
pad_weight
(
weight
.
data
,
32
)
#
if self.use_fa_pad and (re.findall(qkv_words, layername)):
#
if not gemm_bank_conf(weight.data.shape[0]):
#
weight.data = pad_weight(weight.data, 32)
_weight
=
torch
.
zeros_like
(
weight
.
data
)
ori_shape
=
_weight
.
shape
...
...
vllm/model_executor/models/qwen2_moe.py
View file @
ca7f98e5
...
...
@@ -566,11 +566,11 @@ class Qwen2MoeForCausalLM(nn.Module, SupportsPP):
]
combined_words
=
"|"
.
join
(
lay_key_words
)
lay_qkv_words
=
[
"self_attn.qkv_proj.weight"
]
qkv_words
=
"|"
.
join
(
lay_qkv_words
)
#
lay_qkv_words = ["self_attn.qkv_proj.weight"]
#
qkv_words = "|".join(lay_qkv_words)
lay_qkv_bias_words
=
[
"self_attn.qkv_proj.bias"
]
qkv_bias_words
=
"|"
.
join
(
lay_qkv_bias_words
)
#
lay_qkv_bias_words = ["self_attn.qkv_proj.bias"]
#
qkv_bias_words = "|".join(lay_qkv_bias_words)
for
layername
,
weight
in
params_dict
.
items
():
# if self.use_fa_pad and (re.findall(qkv_bias_words, layername)):
...
...
vllm/model_executor/models/telechat_12B.py
deleted
100644 → 0
View file @
57adffa2
# coding=utf-8
# Copyright 2023 The vLLM team.
# Copyright 2022 EleutherAI and the HuggingFace Inc. team. All rights reserved.
#
# This code is based on EleutherAI's GPT-NeoX library and the GPT-NeoX
# and OPT implementations in this library. It has been modified from its
# original forms to accommodate minor architectural differences compared
# to GPT-NeoX and OPT used by the Meta AI team that trained the model.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from
typing
import
Any
,
Dict
,
Iterable
,
List
,
Optional
,
Tuple
,
Union
import
torch
from
torch
import
nn
from
transformers
import
PretrainedConfig
from
vllm.attention
import
Attention
,
AttentionMetadata
from
vllm.config
import
CacheConfig
,
LoRAConfig
from
vllm.distributed
import
(
get_pp_group
,
get_pp_indices
,
get_tensor_model_parallel_rank
,
get_tensor_model_parallel_world_size
)
from
vllm.model_executor.layers.activation
import
SiluAndMul
from
vllm.model_executor.layers.layernorm
import
RMSNorm
from
vllm.model_executor.layers.linear
import
(
MergedColumnParallelLinear
,
ColumnParallelLinear
,
QKVParallelLinear
,
RowParallelLinear
)
from
vllm.distributed
import
(
divide
,
get_tensor_model_parallel_rank
,
get_tensor_model_parallel_world_size
,
split_tensor_along_last_dim
,
tensor_model_parallel_all_gather
,
tensor_model_parallel_all_reduce
)
from
vllm.model_executor.layers.logits_processor
import
LogitsProcessor
from
vllm.model_executor.layers.quantization.base_config
import
(
QuantizationConfig
)
from
vllm.model_executor.layers.rotary_embedding
import
get_rope
from
vllm.model_executor.layers.sampler
import
Sampler
,
SamplerOutput
from
vllm.model_executor.layers.vocab_parallel_embedding
import
(
DEFAULT_VOCAB_PADDING_SIZE
,
ParallelLMHead
,
VocabParallelEmbedding
)
from
vllm.model_executor.model_loader.weight_utils
import
(
default_weight_loader
,
kv_cache_scales_loader
)
from
vllm.model_executor.sampling_metadata
import
SamplingMetadata
from
vllm.sequence
import
IntermediateTensors
from
vllm.utils
import
is_hip
,
print_warning_once
from
.interfaces
import
SupportsLoRA
class
TeleChatMLP
(
nn
.
Module
):
def
__init__
(
self
,
hidden_size
:
int
,
intermediate_size
:
int
,
hidden_act
:
str
,
quant_config
:
Optional
[
QuantizationConfig
]
=
None
,
bias
:
bool
=
False
,
)
->
None
:
super
().
__init__
()
self
.
gate_proj
=
ColumnParallelLinear
(
input_size
=
hidden_size
,
output_size
=
intermediate_size
,
bias
=
False
,
quant_config
=
quant_config
)
self
.
up_proj
=
ColumnParallelLinear
(
input_size
=
hidden_size
,
output_size
=
intermediate_size
,
bias
=
False
,
quant_config
=
quant_config
)
self
.
down_proj
=
RowParallelLinear
(
input_size
=
intermediate_size
,
output_size
=
hidden_size
,
# bias=bias,
bias
=
True
,
quant_config
=
quant_config
,
input_is_parallel
=
True
)
self
.
act_fn
=
SiluAndMul
()
def
forward
(
self
,
x
):
gate_output
,
_
=
self
.
gate_proj
(
x
)
up_output
,
_
=
self
.
up_proj
(
x
)
gate_output
=
self
.
act_fn
(
torch
.
cat
([
gate_output
,
up_output
],
dim
=-
1
))
output
,
_
=
self
.
down_proj
(
gate_output
)
return
output
class
TeleChatAttention
(
nn
.
Module
):
def
__init__
(
self
,
config
,
hidden_size
:
int
,
num_heads
:
int
,
num_kv_heads
:
int
,
rope_theta
:
float
=
10000
,
rope_scaling
:
Optional
[
Dict
[
str
,
Any
]]
=
None
,
max_position_embeddings
:
int
=
8192
,
quant_config
:
Optional
[
QuantizationConfig
]
=
None
,
bias
:
bool
=
False
,
cache_config
:
Optional
[
CacheConfig
]
=
None
,
)
->
None
:
super
().
__init__
()
self
.
config
=
config
self
.
hidden_size
=
hidden_size
tp_size
=
get_tensor_model_parallel_world_size
()
self
.
tp_size
=
tp_size
self
.
total_num_heads
=
num_heads
assert
self
.
total_num_heads
%
tp_size
==
0
self
.
num_heads
=
self
.
total_num_heads
//
tp_size
self
.
total_num_kv_heads
=
num_kv_heads
if
self
.
total_num_kv_heads
>=
tp_size
:
# Number of KV heads is greater than TP size, so we partition
# the KV heads across multiple tensor parallel GPUs.
assert
self
.
total_num_kv_heads
%
tp_size
==
0
else
:
# Number of KV heads is less than TP size, so we replicate
# the KV heads across multiple tensor parallel GPUs.
assert
tp_size
%
self
.
total_num_kv_heads
==
0
self
.
num_kv_heads
=
max
(
1
,
self
.
total_num_kv_heads
//
tp_size
)
self
.
head_dim
=
hidden_size
//
self
.
total_num_heads
self
.
q_size
=
self
.
num_heads
*
self
.
head_dim
self
.
kv_size
=
self
.
num_kv_heads
*
self
.
head_dim
self
.
scaling
=
self
.
head_dim
**-
0.5
self
.
rope_theta
=
rope_theta
self
.
max_position_embeddings
=
max_position_embeddings
self
.
query
=
ColumnParallelLinear
(
input_size
=
hidden_size
,
output_size
=
hidden_size
,
bias
=
False
,
quant_config
=
quant_config
,
gather_output
=
False
)
kv_projection_size
=
self
.
head_dim
*
self
.
total_num_heads
self
.
key_value
=
MergedColumnParallelLinear
(
input_size
=
hidden_size
,
output_sizes
=
[
kv_projection_size
]
*
2
,
bias
=
False
,
quant_config
=
quant_config
,
gather_output
=
False
,)
self
.
dense
=
RowParallelLinear
(
input_size
=
hidden_size
,
output_size
=
hidden_size
,
bias
=
True
,
quant_config
=
quant_config
,
input_is_parallel
=
True
,
)
self
.
rotary_emb
=
get_rope
(
self
.
head_dim
,
rotary_dim
=
self
.
head_dim
,
max_position
=
max_position_embeddings
,
base
=
rope_theta
,
rope_scaling
=
rope_scaling
,
)
self
.
attn
=
Attention
(
self
.
num_heads
,
self
.
head_dim
,
self
.
scaling
,
num_kv_heads
=
self
.
num_kv_heads
,
cache_config
=
cache_config
,
quant_config
=
quant_config
)
def
split_tensor_along_last_dim
(
self
,
tensor
:
torch
.
Tensor
,
num_partitions
:
int
,
contiguous_split_chunks
:
bool
=
False
,
):
# Get the size and dimension.
last_dim
=
tensor
.
dim
()
-
1
last_dim_size
=
tensor
.
size
()[
last_dim
]
//
num_partitions
# Split.
tensor_list
=
torch
.
split
(
tensor
,
last_dim_size
,
dim
=
last_dim
)
return
tensor_list
def
forward
(
self
,
positions
:
torch
.
Tensor
,
hidden_states
:
torch
.
Tensor
,
kv_cache
:
torch
.
Tensor
,
attn_metadata
:
AttentionMetadata
,
)
->
torch
.
Tensor
:
query_layer
,
_
=
self
.
query
(
hidden_states
)
mixed_kv_layer
,
_
=
self
.
key_value
(
hidden_states
)
(
key_layer
,
value_layer
)
=
self
.
split_tensor_along_last_dim
(
mixed_kv_layer
,
2
)
query_layer
,
key_layer
=
self
.
rotary_emb
(
positions
,
query_layer
,
key_layer
)
attn_output
=
self
.
attn
(
query_layer
,
key_layer
,
value_layer
,
kv_cache
,
attn_metadata
)
output
,
_
=
self
.
dense
(
attn_output
)
return
output
class
TeleChatDecoderLayer
(
nn
.
Module
):
def
__init__
(
self
,
config
:
PretrainedConfig
,
cache_config
:
Optional
[
CacheConfig
]
=
None
,
quant_config
:
Optional
[
QuantizationConfig
]
=
None
,
)
->
None
:
super
().
__init__
()
self
.
hidden_size
=
config
.
hidden_size
rope_theta
=
getattr
(
config
,
"rope_theta"
,
10000
)
rope_scaling
=
getattr
(
config
,
"rope_scaling"
,
None
)
if
rope_scaling
is
not
None
and
getattr
(
config
,
"original_max_position_embeddings"
,
None
):
rope_scaling
[
"original_max_position_embeddings"
]
=
(
config
.
original_max_position_embeddings
)
max_position_embeddings
=
getattr
(
config
,
"max_position_embeddings"
,
8192
)
# Support abacusai/Smaug-72B-v0.1 with attention_bias
# Support internlm/internlm-7b with bias
attention_bias
=
getattr
(
config
,
"attention_bias"
,
False
)
or
getattr
(
config
,
"bias"
,
False
)
self
.
self_attention
=
TeleChatAttention
(
config
,
hidden_size
=
self
.
hidden_size
,
num_heads
=
config
.
num_attention_heads
,
num_kv_heads
=
getattr
(
config
,
"num_key_value_heads"
,
config
.
num_attention_heads
),
rope_theta
=
rope_theta
,
rope_scaling
=
rope_scaling
,
max_position_embeddings
=
max_position_embeddings
,
quant_config
=
quant_config
,
bias
=
attention_bias
,
cache_config
=
cache_config
,
)
self
.
mlp
=
TeleChatMLP
(
hidden_size
=
self
.
hidden_size
,
intermediate_size
=
config
.
intermediate_size
,
hidden_act
=
config
.
hidden_act
,
quant_config
=
quant_config
,
bias
=
getattr
(
config
,
"mlp_bias"
,
False
),
)
self
.
input_layernorm
=
RMSNorm
(
config
.
hidden_size
,
eps
=
config
.
rms_norm_eps
)
self
.
post_attention_layernorm
=
RMSNorm
(
config
.
hidden_size
,
eps
=
config
.
rms_norm_eps
)
self
.
apply_residual_connection_post_layernorm
=
config
.
apply_residual_connection_post_layernorm
def
forward
(
self
,
positions
:
torch
.
Tensor
,
hidden_states
:
torch
.
Tensor
,
kv_cache
:
torch
.
Tensor
,
attn_metadata
:
AttentionMetadata
,
)
->
Tuple
[
torch
.
Tensor
,
torch
.
Tensor
]:
residual
=
hidden_states
layernorm_output
=
self
.
input_layernorm
(
hidden_states
)
attn_outputs
=
self
.
self_attention
(
positions
=
positions
,
hidden_states
=
layernorm_output
,
kv_cache
=
kv_cache
,
attn_metadata
=
attn_metadata
,
)
attn_outputs
=
residual
+
attn_outputs
residual
=
attn_outputs
layernorm_output
=
self
.
post_attention_layernorm
(
attn_outputs
)
output
=
residual
+
self
.
mlp
(
layernorm_output
)
return
output
class
TeleChatModel
(
nn
.
Module
):
def
__init__
(
self
,
config
:
PretrainedConfig
,
cache_config
:
Optional
[
CacheConfig
]
=
None
,
quant_config
:
Optional
[
QuantizationConfig
]
=
None
,
lora_config
:
Optional
[
LoRAConfig
]
=
None
,
)
->
None
:
super
().
__init__
()
self
.
config
=
config
self
.
padding_idx
=
config
.
pad_token_id
self
.
vocab_size
=
config
.
vocab_size
self
.
word_embeddings
=
VocabParallelEmbedding
(
self
.
vocab_size
,
config
.
hidden_size
,
org_num_embeddings
=
config
.
vocab_size
,
)
self
.
h
=
nn
.
ModuleList
(
[
TeleChatDecoderLayer
(
config
=
config
,
cache_config
=
cache_config
,
quant_config
=
quant_config
)
for
_
in
range
(
self
.
config
.
num_hidden_layers
)
]
)
self
.
ln_f
=
RMSNorm
(
config
.
hidden_size
,
eps
=
config
.
rms_norm_eps
)
def
get_input_embeddings
(
self
,
input_ids
:
torch
.
Tensor
)
->
torch
.
Tensor
:
return
self
.
word_embeddings
(
input_ids
)
def
forward
(
self
,
input_ids
:
Optional
[
torch
.
Tensor
],
positions
:
torch
.
Tensor
,
kv_caches
:
List
[
torch
.
Tensor
],
attn_metadata
:
AttentionMetadata
,
)
->
Union
[
torch
.
Tensor
,
IntermediateTensors
]:
hidden_states
=
self
.
get_input_embeddings
(
input_ids
)
for
i
in
range
(
self
.
config
.
num_hidden_layers
):
layer
=
self
.
h
[
i
]
hidden_states
=
layer
(
positions
,
hidden_states
,
kv_caches
[
i
],
attn_metadata
,
)
hidden_states
=
self
.
ln_f
(
hidden_states
)
return
hidden_states
class
TeleChat12BForCausalLM
(
nn
.
Module
,
SupportsLoRA
):
packed_modules_mapping
=
{
"qkv_proj"
:
[
"q_proj"
,
"k_proj"
,
"v_proj"
,
],
"gate_up_proj"
:
[
"gate_proj"
,
"up_proj"
,
],
}
# LoRA specific attributes
supported_lora_modules
=
[
"qkv_proj"
,
"o_proj"
,
"gate_up_proj"
,
"down_proj"
,
"embed_tokens"
,
"lm_head"
]
embedding_modules
=
{
"embed_tokens"
:
"input_embeddings"
,
"lm_head"
:
"output_embeddings"
,
}
embedding_padding_modules
=
[
"lm_head"
]
bitsandbytes_stacked_params_mapping
=
{
# shard_name, weight_name, index
"q_proj"
:
(
"qkv_proj"
,
0
),
"k_proj"
:
(
"qkv_proj"
,
1
),
"v_proj"
:
(
"qkv_proj"
,
2
),
"gate_proj"
:
(
"gate_up_proj"
,
0
),
"up_proj"
:
(
"gate_up_proj"
,
1
),
}
def
__init__
(
self
,
config
:
PretrainedConfig
,
cache_config
:
Optional
[
CacheConfig
]
=
None
,
quant_config
:
Optional
[
QuantizationConfig
]
=
None
,
lora_config
:
Optional
[
LoRAConfig
]
=
None
,
)
->
None
:
super
().
__init__
()
config
.
intermediate_size
=
config
.
ffn_hidden_size
config
.
hidden_act
=
"silu"
config
.
rms_norm_eps
=
config
.
layer_norm_epsilon
config
.
tie_word_embeddings
=
False
self
.
config
=
config
self
.
lora_config
=
lora_config
self
.
transformer
=
TeleChatModel
(
config
,
cache_config
,
quant_config
,
lora_config
=
lora_config
)
self
.
lm_head
=
ParallelLMHead
(
config
.
vocab_size
,
config
.
hidden_size
,
bias
=
False
,
quant_config
=
quant_config
,
)
self
.
logits_processor
=
LogitsProcessor
(
config
.
vocab_size
)
self
.
sampler
=
Sampler
()
def
forward
(
self
,
input_ids
:
torch
.
Tensor
,
positions
:
torch
.
Tensor
,
kv_caches
:
List
[
torch
.
Tensor
],
attn_metadata
:
AttentionMetadata
,
intermediate_tensors
:
Optional
[
IntermediateTensors
]
=
None
,
)
->
Union
[
torch
.
Tensor
,
IntermediateTensors
]:
model_output
=
self
.
transformer
(
input_ids
,
positions
,
kv_caches
,
attn_metadata
)
return
model_output
def
compute_logits
(
self
,
hidden_states
:
torch
.
Tensor
,
sampling_metadata
:
SamplingMetadata
)
->
torch
.
Tensor
:
logits
=
self
.
logits_processor
(
self
.
lm_head
,
hidden_states
,
sampling_metadata
)
return
logits
def
sample
(
self
,
logits
:
torch
.
Tensor
,
sampling_metadata
:
SamplingMetadata
,
)
->
Optional
[
SamplerOutput
]:
next_tokens
=
self
.
sampler
(
logits
,
sampling_metadata
)
return
next_tokens
def
make_empty_intermediate_tensors
(
self
,
batch_size
:
int
,
dtype
:
torch
.
dtype
,
device
:
torch
.
device
)
->
IntermediateTensors
:
return
IntermediateTensors
({
"hidden_states"
:
torch
.
zeros
((
batch_size
,
self
.
config
.
hidden_size
),
dtype
=
dtype
,
device
=
device
),
"residual"
:
torch
.
zeros
((
batch_size
,
self
.
config
.
hidden_size
),
dtype
=
dtype
,
device
=
device
),
})
def
load_weights
(
self
,
weights
:
Iterable
[
Tuple
[
str
,
torch
.
Tensor
]]):
params_dict
=
dict
(
self
.
named_parameters
())
num_key_value_heads
=
self
.
config
.
num_attention_heads
head_dim
=
self
.
config
.
hidden_size
//
num_key_value_heads
for
name
,
loaded_weight
in
weights
:
if
"self_attention.key_value"
in
name
:
k_weight
=
[]
v_weight
=
[]
for
i
in
range
(
num_key_value_heads
):
start
=
i
*
head_dim
*
2
k_weight
.
append
(
loaded_weight
[
start
:
start
+
head_dim
,:])
v_weight
.
append
(
loaded_weight
[
start
+
head_dim
:
start
+
2
*
head_dim
:])
k_weight
=
torch
.
cat
(
k_weight
,
dim
=
0
)
v_weight
=
torch
.
cat
(
v_weight
,
dim
=
0
)
loaded_weight
=
torch
.
cat
([
k_weight
,
v_weight
],
dim
=
0
)
try
:
param
=
params_dict
[
name
]
weight_loader
=
getattr
(
param
,
"weight_loader"
,
default_weight_loader
)
weight_loader
(
param
,
loaded_weight
)
except
KeyError
:
print
(
"key error"
)
pass
def
load_kv_cache_scales
(
self
,
quantization_param_path
:
str
)
->
None
:
tp_size
=
get_tensor_model_parallel_world_size
()
tp_rank
=
get_tensor_model_parallel_rank
()
for
layer_idx
,
scaling_factor
in
kv_cache_scales_loader
(
quantization_param_path
,
tp_rank
,
tp_size
,
self
.
config
.
num_hidden_layers
,
self
.
config
.
__class__
.
model_type
):
if
not
isinstance
(
self
.
model
.
layers
[
layer_idx
],
nn
.
Identity
):
layer_self_attn
=
self
.
model
.
layers
[
layer_idx
].
self_attn
if
is_hip
():
# The scaling factor convention we are assuming is
# quantized_value * scaling_factor ~= true_value
# which is consistent with the practice of setting
# scaling_factor = tensor_amax / FPtype_max
scaling_factor
*=
2
if
hasattr
(
layer_self_attn
,
"kv_scale"
):
layer_self_attn
.
attn
.
_kv_scale
=
scaling_factor
else
:
raise
RuntimeError
(
"Self attention has no KV cache scaling "
"factor attribute!"
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment