GLM-130B 部署 - 8*3090-24G

官方文檔

鏡像要求A100-40G-8卡

硬件配置:

image

軟件配置:

image

1.準備

由於恆源雲暫時缺少硬件資源,此次部署使用8*3090-24G配置(需要量化int8):
image

注意鏡像選擇,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路徑爲上一步解壓得到的文件夾路徑。

image

scripts/generate.sh 中修改source路徑:

image

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

又開始報錯:

image

icetk依賴要求protobuf版本低於3.19,那麼按照要求安裝回3.18的版本:

pip install  protobuf==3.18.*

報錯:
image

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又不兼容。

解決方案(奇技淫巧):

  1. 先把protobuf升級到最新版本
pip install --upgrade protobuf
  1. 在目錄中[usr/local/miniconda3/envs/test/lib/python3.10/site-packages/google/protobuf/internal/builder.py]找到 builder.py文件,將它複製到其他目錄下保存。

  2. 安裝舊版本的protobuf

pip install protobuf==3.18.3
  1. 將剛剛複製到其他目錄的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分鐘又報錯:
image

原因:
在numpy的1.24版本已經棄用了np.bool這個名稱,取而代之的是np.bool_

可以看到當前版本爲1.25.2:

image

可以選擇安裝舊版本,或者在文件中更改 boolbool_
這裏選擇安裝回舊版本的numpy1.23:

pip install numpy==1.23

再次測試,可以正常運行!

4.運行效果

GLM-130B 使用兩種不同的掩碼標記:[MASK] 用於簡短的填空任務,[gMASK] 用於從左到右的長文本生成。當輸入不包含任何 MASK 標記時,[gMASK] 將被自動附加到文本的末尾。

運行腳本進行推理:

bash scripts/generate.sh --input-source interactive

以下是短文本填空與長文本生成的效果:

image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章