LLM探索:環境搭建與模型本地部署
前言
最近一直在煉丹(搞AIGC這塊),突然發現業務代碼都索然無味了…
上次發了篇AI畫圖的文章,ChatGPT雖然沒法自己部署,但現在開源的LLM還是不少的,只要有一塊差不多的顯卡,要搞個LLM本地部署還是沒問題的。
本文將介紹這以下兩個國產開源LLM的本地部署
- ChatGLM-6B
- MOSS
本文先簡單的把模型跑起來,后續將繼續我近期在LLM方向的一些探索記錄~
概念
開始之前,先來看看一些基礎概念。
AIGC
引用以下 mbalib 的內容
AIGC(AI Generated Content)即人工智能生成內容,又稱“生成式AI”(Generative AI),被認為是繼專業生產內容(PGC)、用戶生產內容(UGC)之后的新型內容創作方式。
互聯網內容生產方式經歷了PGC——UGC——AIGC的過程。PGC(Professionally Generated Content)是專業生產內容,如Web1.0和廣電行業中專業人員生產的文字和視頻,其特點是專業、內容質量有保證。UGC(User Generated Content)是用戶生產內容,伴隨Web2.0概念而產生,特點是用戶可以自由上傳內容,內容豐富。AIGC(AI Generated Content)是由AI生成的內容,其特點是自動化生產、高效。隨著自然語言生成技術NLG和AI模型的成熟,AIGC逐漸受到大家的關注,目前已經可以自動生成文字、圖片、音頻、視頻,甚至3D模型和代碼。
最近很多的ChatGPT、AI畫圖,就都屬于這個領域。
LLM
引用以下 wikipedia 的內容
A large language model (LLM) is a language model consisting of a neural network with many parameters (typically billions of weights or more), trained on large quantities of unlabeled text using self-supervised learning or semi-supervised learning. LLMs emerged around 2018 and perform well at a wide variety of tasks. This has shifted the focus of natural language processing research away from the previous paradigm of training specialized supervised models for specific tasks.
中文也就是「大語言模型」,現在很火的ChatGPT就是這個LLM的代表,大模型有一個關鍵的屬性:參數量,參數量的大小決定了大模型的能力(不能說是絕對的,但肯定是正相關)。
以下是常見LLM的參數量:
LLM名稱 | 參數量 |
---|---|
ChatGPT 3.5 | 175B |
ChatGLM | 6B |
MOSS | 16B |
LLaMA | 7B/13B/33B/65B |
篇幅關系只列舉這幾個,更多的可以看文后的參考資料。
搭建環境
硬件
首先要有一臺搭載了NVIDIA顯卡的Linux系統服務器/電腦。
顯存需要達到8G及以上,不然跑不動~
系統推薦使用最新的Ubuntu(22.04)或者其衍生版,以下是我在測試過程中使用的兩臺服務器配置。
服務器1
- CPU: Intel(R) Core(TM) i9-10940X CPU @ 3.30GHz
- 內存:64G
- 顯卡:NVIDIA GeForce RTX 2080 Ti
服務器2
- CPU:Intel(R) Xeon(R) Gold 5318Y CPU @ 2.10GHz x2
- 內存:128G
- 顯卡: Tesla T4 x4
軟件
說完了硬件,再看看軟件。
驅動
首先,需要顯卡驅動,Ubuntu系的發行版安裝顯卡驅動比喝水還容易,這就是為啥推薦煉丹用Ubuntu的理由。
PS:完全可以一鍵完成,不需要再去網上查什么復制了幾百遍的博客然后下載一堆東西又是編譯又是卸載nouveau啥的了~
Ubuntu桌面版可以直接用「軟件更新」App一鍵安裝顯卡驅動。
Ubuntu服務器版本,使用 nvidia-detector
命令檢測需要安裝的驅動版本,示例:
$ nvidia-detector
nvidia-driver-530
使用 ubuntu-drivers list
獲取可安裝的驅動列表,示例:
$ ubuntu-drivers list
nvidia-driver-418-server, (kernel modules provided by nvidia-dkms-418-server)
nvidia-driver-530, (kernel modules provided by linux-modules-nvidia-530-generic-hwe-22.04)
nvidia-driver-450-server, (kernel modules provided by linux-modules-nvidia-450-server-generic-hwe-22.04)
nvidia-driver-515, (kernel modules provided by linux-modules-nvidia-515-generic-hwe-22.04)
nvidia-driver-470-server, (kernel modules provided by linux-modules-nvidia-470-server-generic-hwe-22.04)
nvidia-driver-525-server, (kernel modules provided by linux-modules-nvidia-525-server-generic-hwe-22.04)
nvidia-driver-515-server, (kernel modules provided by linux-modules-nvidia-515-server-generic-hwe-22.04)
nvidia-driver-510, (kernel modules provided by linux-modules-nvidia-510-generic-hwe-22.04)
nvidia-driver-525, (kernel modules provided by linux-modules-nvidia-525-generic-hwe-22.04)
nvidia-driver-470, (kernel modules provided by linux-modules-nvidia-470-generic-hwe-22.04)
然后使用 ubuntu-drivers install nvidia-driver-530
來安裝驅動,示例:
$ ubuntu-drivers install nvidia-driver-530
All the available drivers are already installed.
就這么簡單
PS:當然非要自己去NVIDIA官網下載也可以,具體可以看看參考資料。
Python
搞AI,Python是必備的,但我們不直接使用系統的Python環境,而是使用conda來管理。
推薦使用 miniconda3 比 anaconda 輕量。
按照官網說明按照 miniconda3 之后,只需要使用以下命令即可創建指定版本的python環境
conda create -n 環境名稱 python=3.10
如果遇到網絡環境問題,可以參考我之前這篇文章,配置一下國內鏡像:配置pip國內鏡像加快python第三方庫安裝速度~
ChatGLM-6B
介紹
這是清華和智譜公司搞的開源LLM,截止本文撰寫時,其在國產開源LLM里面算是天花板的存在了~
ChatGLM-6B 是一個開源的、支持中英雙語的對話語言模型,基于 General Language Model (GLM) 架構,具有 62 億參數。結合模型量化技術,用戶可以在消費級的顯卡上進行本地部署(INT4 量化級別下最低只需 6GB 顯存)。 ChatGLM-6B 使用了和 ChatGPT 相似的技術,針對中文問答和對話進行了優化。經過約 1T 標識符的中英雙語訓練,輔以監督微調、反饋自助、人類反饋強化學習等技術的加持,62 億參數的 ChatGLM-6B 已經能生成相當符合人類偏好的回答。
硬件需求
量化等級 | 最低 GPU 顯存(推理) | 最低 GPU 顯存(高效參數微調) |
---|---|---|
FP16(無量化) | 13 GB | 14 GB |
INT8 | 8 GB | 9 GB |
INT4 | 6 GB | 7 GB |
本地部署
下載項目代碼
git clone https://github.com/THUDM/ChatGLM-6B.git
PS:也可以使用我 fork 魔改的版本,主要做了以下修改:
- 部署和模型微調默認開啟多卡加速
- 重寫API接口,更直觀
換成以下命令即可
git clone https://github.com/Deali-Axy/ChatGLM-6B.git
創建虛擬環境
建議使用 conda 管理
conda create -n chatglm python==3.8
安裝依賴
cd ChatGLM-6B
conda activate chatglm
pip install -r requirements.txt
conda install cudatoolkit=11.7 -c nvidia
PS:沒有安裝
cudatoolkit
的話,會報RuntimeError: Library cudart is not initialized
錯誤但 issues 里也有人說可以通過使用CPU輸出量化模型后直接調用的方式解決,暫未嘗試。
下載模型和啟動
項目代碼里有命令行和web界面兩種demo,任意選一個運行,程序會自動從 huggingface 下載預訓練模型。
PS: huggingface 的模型理論上是可以直接下載的,如果遇到網絡問題,請自行使用代理或者從官方提供的某云盤下載模型。
# 命令行 demo
python cli_demo.py
# 使用 Gradio 實現的簡單Web界面
python web_demo.py
Gradio 的默認端口是7860,可以通過在 launch()
方法里傳入 server_port
參數自定義端口。
使用量化模型
如果顯存沒有13G以上,則無法運行FP16精度模型,只能運行量化后的模型,需要修改一下代碼。
打開上述的 cli_demo.py
或 web_demo.py
代碼
找到以下加載模型的代碼,修改一下參數
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
將上面的代碼修改為下面這樣以使用量化模型
# 按需修改,目前只支持 4/8 bit 量化
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).quantize(4).half().cuda()
運行效果
多卡加速
如果顯卡多,可以使用多卡運行以加速推理。
依然是打開上述的 cli_demo.py
或 web_demo.py
代碼。
找到以下加載模型的代碼
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
修改為
from utils import load_model_on_gpus
model = load_model_on_gpus("THUDM/chatglm-6b", num_gpus=4)
num_gpus
參數為要使用的顯卡數量
我看了 load_model_on_gpus
這個方法的代碼,它是通過 auto_configure_device_map
方法把 transformer分成30層,然后再分配到指定數量的顯卡上,沒法像 CUDA_VISIBLE_DEVICES
環境變量一樣通過顯卡編號來指定,只能按順序來分配。
如果機器上同時要運行其他模型,可以考慮先運行這個ChatGLM,再運行其他的,或者重寫 auto_configure_device_map
方法,讓其可以靈活指定顯卡。
授權
模型不可以直接商用,據說商用需要購買一年180w的許可證。
MOSS
介紹
這個是復旦開源的大模型,使用下來和ChatGLM最大的區別是推理速度特別慢
MOSS是一個支持中英雙語和多種插件的開源對話語言模型,
moss-moon
系列模型具有160億參數,在FP16精度下可在單張A100/A800或兩張3090顯卡運行,在INT4/8精度下可在單張3090顯卡運行。MOSS基座語言模型在約七千億中英文以及代碼單詞上預訓練得到,后續經過對話指令微調、插件增強學習和人類偏好訓練具備多輪對話能力及使用多種插件的能力。
硬件需求
量化等級 | 加載模型 | 完成一輪對話(估計值) | 達到最大對話長度2048 |
---|---|---|---|
FP16 | 31GB | 42GB | 81GB |
Int8 | 16GB | 24GB | 46GB |
Int4 | 7.8GB | 12GB | 26GB |
本地部署
下載代碼
git clone https://github.com/OpenLMLab/MOSS.git
創建虛擬環境
建議使用 conda 管理
conda create -n moss python==3.8
安裝依賴
cd MOSS
conda activate moss
pip install -r requirements.txt
conda install cudatoolkit=11.7 -c nvidia
下載模型和啟動
項目代碼里有命令行和web界面兩種demo,任意選一個運行,程序會自動從 huggingface 下載預訓練模型。
# 命令行 demo
python moss_cli_demo.py
# 使用 Gradio 實現的簡單Web界面
python moss_web_demo_gradio.py
修改默認模型和多卡加速
因為MOSS對顯存的要求比較高,因此默認用的是4位量化的模型,這里我使用一臺4塊T4的服務器來部署,所以直接使用FP16模型。
修改 moss_web_demo_gradio.py
,找到以下代碼
parser.add_argument("--model_name", default="fnlp/moss-moon-003-sft-int4",
...)
把 default
參數改為 fnlp/moss-moon-003-sft
然后再設置一下多卡加速,把GPU參數設置為四個顯卡的編號
parser.add_argument("--gpu", default="0,1,2,3", type=str)
然后啟動,就可以看到四張顯卡都吃滿了
使用下來最大的感受就是慢,往往要一兩分鐘才能生成一個回答。
我看了下GitHub issues,有很多人也提出了同樣的問題。兩張A100還需要10s起步,100s左右的生成時間,看來短時間內是無解了,只能等官方優化了~
詳見:
授權
模型采用 GNU AFFERO GENERAL PUBLIC LICENSE
許可證,可以免費商用。