GLM-130B 部署 - 8*3090-24G
镜像要求A100-40G-8卡
硬件配置:
软件配置:
1.准备
由于恒源云暂时缺少硬件资源,此次部署使用8*3090-24G配置(需要量化int8):
注意镜像选择,pytorch版本选择1.13,不要选择2.0,2.0会产生不兼容的情况。
同时需要注意扩容,否则模型存放不够空间
创建实例后,打开终端,下载模型到临时目录:
oss login
oss cp oss://xxx/ -r /hy-tmp/ .
一共60个文件,约240G
cat glm-130b-sat.tar.part_* > glm-130b-sat.tar //合并文件
tar xvf glm-130b-sat.tar //解压
得到文件夹 glm-130b-sat
然后,在代码文件中的 config
文件夹下找到 model_glm_130b_int8.sh
,修改 checkpoint_path
路径为上一步解压得到的文件夹路径。
在 scripts/generate.sh
中修改source路径:
2.环境配置
由于要求python3.9以上,而恒源云的系统镜像只有3.8可选,因此先创建一个虚拟环境,指定python版本
conda create --name test python=3.10
conda activate test //激活虚拟环境
进入主代码目录下,安装依所需的依赖:
cd /GLM-130B/GLM-130B/
pip install -r requirements.txt
此时即可尝试运行脚本:
bash scripts/generate.sh --input-source interactive
不出意外,报错:
ImportError: cannot import name 'builder' from 'google.protobuf.internal' (/usr/local/miniconda3/envs/GLM-130B/lib/python3.9/site-packages/google/protobuf/internal/init.py)
这可能是因为protobuf版本问题导致的不兼容问题。
3.解决报错
1.protobuf版本兼容问题
首先尝试升级protobuf版本:
pip install --upgrade protobuf
又开始报错:
icetk依赖要求protobuf版本低于3.19,那么按照要求安装回3.18的版本:
pip install protobuf==3.18.*
报错:
tensorboard 依赖要求protobuf版本高于3.19,和icetk产生冲突:
解决:先安装低版本的tensorboard,然后安装低版本的protobuf,使得依赖兼容:
pip install tensorboard==2.0
pip install protobuf==3.18.*
再次运行,在pip安装时不再出现版本不兼容报错,但是又出现了新的报错:
ImportError: cannot import name 'builder' from 'google.protobuf.internal'
在对应的site-packages/google/protobuf/internal中查看发现,3.18版本的protobuf中不存在builder.py的文件!
很矛盾,必须用到builder.py,然而低版本的protobuf不存在这个文件,高版本的protobuf又不兼容。
解决方案(奇技淫巧):
- 先把protobuf升级到最新版本
pip install --upgrade protobuf
-
在目录中[
usr/local/miniconda3/envs/test/lib/python3.10/site-packages/google/protobuf/internal/builder.py]
找到builder.py
文件,将它复制到其他目录下保存。 -
安装旧版本的protobuf
pip install protobuf==3.18.3
- 将刚刚复制到其他目录的builder.py文件重新保存到原来的目录下[
usr/local/miniconda3/envs/test/lib/python3.10/site-packages/google/protobuf/internal/
]。
运行,没有再报这个错。
2.apex兼容问题
protobuf版本兼容问题解决后,还是存在报错:
File "/usr/local/miniconda3/envs/GLM-130B/lib/python3.9/site-packages/apex/init.py", line 13, in
from pyramid.session import UnencryptedCookieSessionFactoryConfig
ImportError: cannot import name 'UnencryptedCookieSessionFactoryConfig' from 'pyramid.session' (unknown location)
无法导入包,先尝试安装pyramid.session:pip install pyramid.session
,安装后依然报错。
经过查阅资料,找到原因:不能直接pip安装apex,必须将项目代码克隆到本地后安装:
python setup.py install --cpp_ext --cuda_ext
git clone https://github.com/NVIDIA/apex.git
cd apex
pip install -v --no-cache-dir --global-option=“–cpp_ext” --global-option=“–cuda_ext” ./
报错:
ModuleNotFoundError: No module named 'packaging'
尝试强制重装packaging包:pip install packaging -U --force-reinstall
还是同样的报错。。
快绝望了,在网上看到一个“偏方”,抱着试一试的态度输入:
git checkout f3a960f80244cf9e80558ab30f7f7e8cbf03c0a0
python setup.py install --cpp_ext --cuda_ex
居然可以安装了!也不知道这个git checkpoint到底check了个啥,反正就是可以安装了orz
3.numpy兼容问题
安装好新的apex,运行了1分钟又报错:
原因:
在numpy的1.24版本已经弃用了np.bool这个名称,取而代之的是np.bool_
可以看到当前版本为1.25.2:
可以选择安装旧版本,或者在文件中更改 bool
为 bool_
这里选择安装回旧版本的numpy1.23:
pip install numpy==1.23
再次测试,可以正常运行!
4.运行效果
GLM-130B 使用两种不同的掩码标记:[MASK]
用于简短的填空任务,[gMASK]
用于从左到右的长文本生成。当输入不包含任何 MASK 标记时,[gMASK]
将被自动附加到文本的末尾。
运行脚本进行推理:
bash scripts/generate.sh --input-source interactive
以下是短文本填空与长文本生成的效果: