鏡像要求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
以下是短文本填空與長文本生成的效果: