? HF Repo • ⚒️ SwissArmyTransformer (sat) • ? Twitter
• ? [CogView@NeurIPS 21] [GitHub] • ? [GLM@ACL 22] [GitHub]
加入我們的Slack 和微信
[2023.10] 歡迎關注智譜AI新一代多模態對話模型CogVLM( https://github.com/THUDM/CogVLM ),採用視覺專家新架構,在10項權威經典多模態任務上取得第一名。目前開源CogVLM-17B英文模型,即將基於GLM開源中文模型。
VisualGLM-6B is an open-source, multi-modal dialog language model that supports images, Chinese, and English . The language model is based on ChatGLM-6B with 6.2 billion delmeters; the ualimage top ChatGLM-6B with 6.2 billion delmeers; the ualwegen and the ualwe delbuilwe delhween; language model through the training of BLIP2-Qformer, with the total model comprising 7.8 billion parameters. Click here for English version.
VisualGLM-6B 是一個開源的,支援圖像、中文和英文的多模態對話語言模型,語言模型基於ChatGLM-6B,具有62 億參數;圖像部分透過訓練BLIP2-Qformer 建構起視覺模型與語言模型的橋樑,整體模型共78億參數。
VisualGLM-6B 依賴CogView 資料集的30M高品質中文圖文對,與300M經過篩選的英文圖文對進行預訓練,中英文權重相同。此訓練方式較好地將視覺訊息對齊到ChatGLM的語意空間;之後的微調階段,模型在長視覺問答資料上訓練,以產生符合人類偏好的答案。
VisualGLM-6B 由SwissArmyTransformer(簡稱sat
) 庫訓練,這是一個支援Transformer靈活修改、訓練的工具庫,支援Lora、P-tuning等參數高效微調方法。本專案提供了符合使用者習慣的huggingface介面,也提供了基於sat的介面。
結合模型量化技術,使用者可以在消費級的顯示卡上進行本地部署(INT4量化等級下最低只需6.3G顯存)。
VisualGLM-6B 開源模型旨在與開源社群一起推動大模型技術發展,懇請開發者和大家遵守開源協議,勿將該開源模型和程式碼及基於該開源專案產生的衍生物用於任何可能給國家和社會帶來危害的用途以及用於任何未經安全評估和備案的服務。目前,本專案官方未基於VisualGLM-6B 開發任何應用,包括網站、安卓App、蘋果iOS應用程式及Windows App 等。
由於VisualGLM-6B 仍處於v1版本,目前已知具有相當多的局限性,例如影像描述事實性/模型幻覺問題,影像細節資訊捕捉不足,以及一些來自語言模型的局限性。儘管模型在訓練的各個階段都盡力確保資料的合規性和準確性,但由於VisualGLM-6B 模型規模較小,且模型受機率隨機性因素影響,無法保證輸出內容的準確性,且模型易被誤導(詳見局限性部分)。在VisualGLM之後的版本中,將會著力對此類問題進行最佳化。本專案不承擔開源模型和程式碼導致的資料安全、輿情風險或發生任何模型被誤導、濫用、傳播、不當利用而產生的風險和責任。
VisualGLM-6B 可以進行影像的描述的相關知識的問答。
使用pip安裝依賴
pip install -i https://pypi.org/simple -r requirements.txt
# 国内请使用aliyun镜像,TUNA等镜像同步最近出现问题,命令如下
pip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt
此時預設會安裝deepspeed
庫(支援sat
庫訓練),此程式庫對於模型推理並非必要,同時部分Windows環境安裝此程式庫時會遇到問題。 如果想繞過deepspeed
安裝,我們可以將指令改為
pip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements_wo_ds.txt
pip install -i https://mirrors.aliyun.com/pypi/simple/ --no-deps "SwissArmyTransformer>=0.4.4"
如果使用Huggingface transformers庫呼叫模型(也需要安裝上述依賴套件! ),可以透過以下程式碼(其中圖像路徑為本機路徑):
from transformers import AutoTokenizer , AutoModel
tokenizer = AutoTokenizer . from_pretrained ( "THUDM/visualglm-6b" , trust_remote_code = True )
model = AutoModel . from_pretrained ( "THUDM/visualglm-6b" , trust_remote_code = True ). half (). cuda ()
image_path = "your image path"
response , history = model . chat ( tokenizer , image_path , "描述这张图片。" , history = [])
print ( response )
response , history = model . chat ( tokenizer , image_path , "这张图片可能是在什么场所拍摄的?" , history = history )
print ( response )
以上程式碼會由transformers
自動下載模型實作和參數。完整的模型實作可以在Hugging Face Hub。如果你從Hugging Face Hub 上下載模型參數的速度較慢,可以從這裡手動下載模型參數文件,並從本地加載模型。具體做法請參考從本地載入模型。關於基於transformers 函式庫模型的量化、CPU推理、Mac MPS 後端加速等內容,請參考ChatGLM-6B 的低成本部署。
如果使用SwissArmyTransformer函式庫呼叫模型,方法類似,可以使用環境變數SAT_HOME
決定模型下載位置。在本倉庫目錄下:
import argparse
from transformers import AutoTokenizer
tokenizer = AutoTokenizer . from_pretrained ( "THUDM/chatglm-6b" , trust_remote_code = True )
from model import chat , VisualGLMModel
model , model_args = VisualGLMModel . from_pretrained ( 'visualglm-6b' , args = argparse . Namespace ( fp16 = True , skip_init = True ))
from sat . model . mixins import CachedAutoregressiveMixin
model . add_mixin ( 'auto-regressive' , CachedAutoregressiveMixin ())
image_path = "your image path or URL"
response , history , cache_image = chat ( image_path , model , tokenizer , "描述这张图片。" , history = [])
print ( response )
response , history , cache_image = chat ( None , model , tokenizer , "这张图片可能是在什么场所拍摄的?" , history = history , image = cache_image )
print ( response )
使用sat
庫也可以輕鬆進行參數高效率微調。
多模態任務分佈廣、種類多,預訓練往往無法面面俱到。 這裡我們提供了一個小樣本微調的例子,使用20張標註圖增強模型回答「背景」問題的能力。
解壓縮fewshot-data.zip
以後執行以下指令:
bash finetune/finetune_visualglm.sh
目前支援三種方式的微調:
--layer_range
和--lora_rank
參數。bash finetune/finetune_visualglm_qlora.sh
,QLoRA將ChatGLM的線性層進行了4-bit量化,只需要9.8GB顯存即可微調。--use_lora
替換為--use_ptuning
,但不建議使用,除非模型應用場景非常固定。訓練好以後可以使用以下指令推理:
python cli_demo.py --from_pretrained your_checkpoint_path --prompt_zh 这张图片的背景里有什么内容?
微調前:
欢迎使用 VisualGLM-6B 模型,输入图像URL或本地路径读图,继续输入内容对话,clear 重新开始,stop 终止程序
请输入图像路径或URL(回车进入纯文本对话): fewshot-data/2p.png
用户:这张图片的背景里有什么内容?
VisualGLM-6B:人们总是被生活琐事所困扰,无法摆脱束缚.
用户:clear
请输入图像路径或URL(回车进入纯文本对话): fewshot-data/meme.png
用户:这张图片的背景里有什么内容?
VisualGLM-6B:这张图片的背景是一张狗的图片,它躺在木地板上。
用户:clear
请输入图像路径或URL(回车进入纯文本对话): fewshot-data/passport.png
用户:这张图片的背景里有什么内容?
VisualGLM-6B:这张图片的背景是一台电脑键盘和两张护照。
用户:clear
请输入图像路径或URL(回车进入纯文本对话):
微調後:
欢迎使用 VisualGLM-6B 模型,输入图像URL或本地路径读图,继续输入内容对话,clear 重新开始,stop 终止程序
请输入图像路径或URL(回车进入纯文本对话): fewshot-data/2p.png
用户:这张图片的背景里有什么内容?
VisualGLM-6B:这张图片的背景是雨天,
用户:描述一下这张图片。
VisualGLM-6B:这张图片描绘了雨天的情景,雨水淅淅沥沥地落在地面上。人们穿着雨衣或雨伞,走在雨中,似乎在寻找着什么.
用户:clear
请输入图像路径或URL(回车进入纯文本对话): fewshot-data/meme.png
用户:这张图片的背景里有什么内容?
VisualGLM-6B:这张图片的背景是木质地板。
用户:什么颜色的地板
VisualGLM-6B:这张图片的背景是蓝色的。
用户:描述一下这张图片。
VisualGLM-6B:这张图片描绘了一只棕色的小狗躺在蓝色的木质地板上。
用户:clear
请输入图像路径或URL(回车进入纯文本对话): fewshot-data/passport.png
用户:这张图片的背景里有什么内容?
VisualGLM-6B:这张图片的背景是电脑键盘。
用户:描述一下这张图片。
VisualGLM-6B:这张图片的特点是电脑键盘和护照。
用户:有几张护照
VisualGLM-6B:两张护照。
用户:clear
请输入图像路径或URL(回车进入纯文本对话):
如果希望把LoRA部分的參數合併到原始的權重,可以呼叫merge_lora()
,例如:
from finetune_visualglm import FineTuneVisualGLMModel
import argparse
model , args = FineTuneVisualGLMModel . from_pretrained ( 'checkpoints/finetune-visualglm-6b-05-19-07-36' ,
args = argparse . Namespace (
fp16 = True ,
skip_init = True ,
use_gpu_initialization = True ,
device = 'cuda' ,
))
model . get_mixin ( 'lora' ). merge_lora ()
args . layer_range = []
args . save = 'merge_lora'
args . mode = 'inference'
from sat . training . model_io import save_checkpoint
save_checkpoint ( 1 , model , None , None , args )
微調需要安裝deepspeed
庫,目前本流程僅支援linux系統,更多的範例說明和Windows系統的流程說明將在近期完成。
python cli_demo.py
程式會自動下載sat模型,並在命令列中進行互動式的對話,輸入指示並回車即可產生回复,輸入clear 可以清空對話歷史,輸入stop 終止程式。
程式提供如下超參數控制生成過程與量化精度:
usage: cli_demo.py [-h] [--max_length MAX_LENGTH] [--top_p TOP_P] [--top_k TOP_K] [--temperature TEMPERATURE] [--english] [--quant {8,4}]
optional arguments:
-h, --help show this help message and exit
--max_length MAX_LENGTH
max length of the total sequence
--top_p TOP_P top p for nucleus sampling
--top_k TOP_K top k for top k sampling
--temperature TEMPERATURE
temperature for sampling
--english only output English
--quant {8,4} quantization bits
要注意的是,在訓練時英文問答對的提示詞為Q: A:
,而中文為问:答:
,在網頁demo中採取了中文的提示,因此英文回復會差一些且夾雜中文;如果需要英文回复,請使用cli_demo.py
中的--english
選項。
我們也提供了繼承自ChatGLM-6B
的打字機效果命令列工具,此工具使用Huggingface模型:
python cli_demo_hf.py
我們也支援模型並行多卡部署:(需要更新最新版本的sat,如果之前下載了checkpoint,也需要手動刪除後重新下載)
torchrun --nnode 1 --nproc-per-node 2 cli_demo_mp.py
我們提供了一個基於Gradio 的網頁版Demo,首先安裝Gradio: pip install gradio
。 然後下載並進入本倉庫運行web_demo.py
:
git clone https://github.com/THUDM/VisualGLM-6B
cd VisualGLM-6B
python web_demo.py
程式會自動下載sat 模型,並執行一個Web Server,並輸出位址。在瀏覽器中開啟輸出的位址即可使用。
我們也提供了繼承自ChatGLM-6B
的打字機效果網頁版工具,此工具使用Huggingface 模型,啟動後將運行在:8080
連接埠上:
python web_demo_hf.py
兩種網頁版demo 均接受命令行參數--share
以產生gradio 公開鏈接,接受--quant 4
和--quant 8
以分別使用4比特量化/8比特量化減少顯存佔用。
首先需要安裝額外的依賴pip install fastapi uvicorn
,然後運行倉庫中的api.py:
python api.py
程式會自動下載sat 模型,預設部署在本地的8080 端口,透過POST 方法進行呼叫。以下是用curl
請求的例子,一般而言可以也可以使用程式碼方法來進行POST。
echo " { " image " : " $( base64 path/to/example.jpg ) " , " text " : "描述这张图片" , " history " :[]} " > temp.json
curl -X POST -H " Content-Type: application/json " -d @temp.json http://127.0.0.1:8080
得到的回傳值為
{
"response":"这张图片展现了一只可爱的卡通羊驼,它站在一个透明的背景上。这只羊驼长着一张毛茸茸的耳朵和一双大大的眼睛,它的身体是白色的,带有棕色斑点。",
"history":[('描述这张图片', '这张图片展现了一只可爱的卡通羊驼,它站在一个透明的背景上。这只羊驼长着一张毛茸茸的耳朵和一双大大的眼睛,它的身体是白色的,带有棕色斑点。')],
"status":200,
"time":"2023-05-16 20:20:10"
}
我們也提供了使用Huggingface模型的api_hf.py,用法和sat模型的api一致:
python api_hf.py
在Huggingface實作中,模型預設以FP16 精度加載,運行上述程式碼需要大約15GB 顯存。如果你的GPU 顯存有限,可以嘗試以量化方式載入模型。 使用方法如下:
# 按需修改,目前只支持 4/8 bit 量化。下面将只量化ChatGLM,ViT 量化时误差较大
model = AutoModel . from_pretrained ( "THUDM/visualglm-6b" , trust_remote_code = True ). quantize ( 8 ). half (). cuda ()
在sat實作中,需先傳參將載入位置改為cpu
,再進行量化。方法如下,詳見cli_demo.py
:
from sat . quantization . kernels import quantize
quantize ( model , args . quant ). cuda ()
# 只需要 7GB 显存即可推理
本專案正處於V1版本視覺和語言模型的參數、計算量都較小,我們總結瞭如下主要存在的改進方向:
本倉庫的程式碼依照Apache-2.0 協定開源,VisualGLM-6B 模型的權重的使用則需要遵循Model License。
如果你覺得我們的工作有幫助的話,請考慮引用下列論文
@inproceedings{du2022glm,
title={GLM: General Language Model Pretraining with Autoregressive Blank Infilling},
author={Du, Zhengxiao and Qian, Yujie and Liu, Xiao and Ding, Ming and Qiu, Jiezhong and Yang, Zhilin and Tang, Jie},
booktitle={Proceedings of the 60th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers)},
pages={320--335},
year={2022}
}
@article{ding2021cogview,
title={Cogview: Mastering text-to-image generation via transformers},
author={Ding, Ming and Yang, Zhuoyi and Hong, Wenyi and Zheng, Wendi and Zhou, Chang and Yin, Da and Lin, Junyang and Zou, Xu and Shao, Zhou and Yang, Hongxia and others},
journal={Advances in Neural Information Processing Systems},
volume={34},
pages={19822--19835},
year={2021}
}
在VisualGLM-6B的指令微調階段的數據集中,包含了來自MiniGPT-4和LLAVA專案的一部分英文圖文數據,以及許多經典的跨模態工作數據集,衷心感謝他們的貢獻。