Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
J
jinchat-server
概览
概览
详情
活动
周期分析
版本库
存储库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
aigc-pioneer
jinchat-server
Commits
88175c2e
提交
88175c2e
authored
5月 11, 2023
作者:
imClumsyPanda
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' into dev
上级
f02df58f
b0714eed
显示空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
17 行增加
和
10 行删除
+17
-10
README.md
README.md
+1
-1
qr_code_16.jpg
img/qr_code_16.jpg
+0
-0
chatglm_llm.py
models/chatglm_llm.py
+16
-9
没有找到文件。
README.md
浏览文件 @
88175c2e
...
@@ -193,6 +193,6 @@ Web UI 可以实现如下功能:
...
@@ -193,6 +193,6 @@ Web UI 可以实现如下功能:
-
[
]
实现调用 API 的 Web UI Demo
-
[
]
实现调用 API 的 Web UI Demo
## 项目交流群
## 项目交流群
![
二维码
](
img/qr_code_1
5
.jpg
)
![
二维码
](
img/qr_code_1
6
.jpg
)
🎉 langchain-ChatGLM 项目交流群,如果你也对本项目感兴趣,欢迎加入群聊参与讨论交流。
🎉 langchain-ChatGLM 项目交流群,如果你也对本项目感兴趣,欢迎加入群聊参与讨论交流。
img/qr_code_16.jpg
0 → 100644
浏览文件 @
88175c2e
269.3 KB
models/chatglm_llm.py
浏览文件 @
88175c2e
...
@@ -11,7 +11,7 @@ DEVICE_ID = "0" if torch.cuda.is_available() else None
...
@@ -11,7 +11,7 @@ DEVICE_ID = "0" if torch.cuda.is_available() else None
DEVICE
=
f
"{DEVICE_}:{DEVICE_ID}"
if
DEVICE_ID
else
DEVICE_
DEVICE
=
f
"{DEVICE_}:{DEVICE_ID}"
if
DEVICE_ID
else
DEVICE_
def
auto_configure_device_map
(
num_gpus
:
int
)
->
Dict
[
str
,
int
]:
def
auto_configure_device_map
(
num_gpus
:
int
,
use_lora
:
bool
)
->
Dict
[
str
,
int
]:
# transformer.word_embeddings 占用1层
# transformer.word_embeddings 占用1层
# transformer.final_layernorm 和 lm_head 占用1层
# transformer.final_layernorm 和 lm_head 占用1层
# transformer.layers 占用 28 层
# transformer.layers 占用 28 层
...
@@ -19,14 +19,21 @@ def auto_configure_device_map(num_gpus: int) -> Dict[str, int]:
...
@@ -19,14 +19,21 @@ def auto_configure_device_map(num_gpus: int) -> Dict[str, int]:
num_trans_layers
=
28
num_trans_layers
=
28
per_gpu_layers
=
30
/
num_gpus
per_gpu_layers
=
30
/
num_gpus
# bugfix: PEFT加载lora模型出现的层命名不同
if
LLM_LORA_PATH
and
use_lora
:
layer_prefix
=
'base_model.model.transformer'
else
:
layer_prefix
=
'transformer'
# bugfix: 在linux中调用torch.embedding传入的weight,input不在同一device上,导致RuntimeError
# bugfix: 在linux中调用torch.embedding传入的weight,input不在同一device上,导致RuntimeError
# windows下 model.device 会被设置成 transformer.word_embeddings.device
# windows下 model.device 会被设置成 transformer.word_embeddings.device
# linux下 model.device 会被设置成 lm_head.device
# linux下 model.device 会被设置成 lm_head.device
# 在调用chat或者stream_chat时,input_ids会被放到model.device上
# 在调用chat或者stream_chat时,input_ids会被放到model.device上
# 如果transformer.word_embeddings.device和model.device不同,则会导致RuntimeError
# 如果transformer.word_embeddings.device和model.device不同,则会导致RuntimeError
# 因此这里将transformer.word_embeddings,transformer.final_layernorm,lm_head都放到第一张卡上
# 因此这里将transformer.word_embeddings,transformer.final_layernorm,lm_head都放到第一张卡上
device_map
=
{
'transformer.word_embeddings'
:
0
,
device_map
=
{
f
'{layer_prefix}.word_embeddings'
:
0
,
'transformer.final_layernorm'
:
0
,
'lm_head'
:
0
}
f
'{layer_prefix}.final_layernorm'
:
0
,
'lm_head'
:
0
,
f
'base_model.model.lm_head'
:
0
,
}
used
=
2
used
=
2
gpu_target
=
0
gpu_target
=
0
...
@@ -35,7 +42,7 @@ def auto_configure_device_map(num_gpus: int) -> Dict[str, int]:
...
@@ -35,7 +42,7 @@ def auto_configure_device_map(num_gpus: int) -> Dict[str, int]:
gpu_target
+=
1
gpu_target
+=
1
used
=
0
used
=
0
assert
gpu_target
<
num_gpus
assert
gpu_target
<
num_gpus
device_map
[
f
'
transformer
.layers.{i}'
]
=
gpu_target
device_map
[
f
'
{layer_prefix}
.layers.{i}'
]
=
gpu_target
used
+=
1
used
+=
1
return
device_map
return
device_map
...
@@ -141,16 +148,16 @@ class ChatGLM(LLM):
...
@@ -141,16 +148,16 @@ class ChatGLM(LLM):
else
:
else
:
from
accelerate
import
dispatch_model
from
accelerate
import
dispatch_model
model
=
AutoModel
.
from_pretrained
(
model_name_or_path
,
trust_remote_code
=
True
,
#
model = AutoModel.from_pretrained(model_name_or_path, trust_remote_code=True,
config
=
model_config
,
**
kwargs
)
#
config=model_config, **kwargs)
if
LLM_LORA_PATH
and
use_lora
:
if
LLM_LORA_PATH
and
use_lora
:
from
peft
import
PeftModel
from
peft
import
PeftModel
model
=
PeftModel
.
from_pretrained
(
model
,
LLM_LORA_PATH
)
model
=
PeftModel
.
from_pretrained
(
self
.
model
,
LLM_LORA_PATH
)
# 可传入device_map自定义每张卡的部署情况
# 可传入device_map自定义每张卡的部署情况
if
device_map
is
None
:
if
device_map
is
None
:
device_map
=
auto_configure_device_map
(
num_gpus
)
device_map
=
auto_configure_device_map
(
num_gpus
,
use_lora
)
self
.
model
=
dispatch_model
(
model
.
half
(),
device_map
=
device_map
)
self
.
model
=
dispatch_model
(
self
.
model
.
half
(),
device_map
=
device_map
)
else
:
else
:
self
.
model
=
self
.
model
.
float
()
.
to
(
llm_device
)
self
.
model
=
self
.
model
.
float
()
.
to
(
llm_device
)
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论