目录
引言
在人工智能的多模态范畴,将视觉信息与语言处理加以融合的技术正在急速演进。CogVLM2 作为此趋势的典型代表,乃是一款开源的视觉语言模型,其通过对视觉和语言信息的有效整合,极大地增强了模型在多模态任务里的表现水平。本文将会详尽阐述 CogVLM2 的技术特性、功能应用,并且为您提供切实可行的实践指南。
一、CogVLM2概览
CogVLM2 由智谱 A1 推出,系新一代的多模态大模型,于视觉和语言理解层面实现了显著的性能提升。它支持高达 8K 的文本长度以及 1344*1344 分辨率的图像输入,拥有强大的文档图像理解能力。该模型运用 50 亿参数的视觉编码器和 70 亿参数的视觉专家模块,借助深度融合策略,优化了视觉与语言模态的交互,在强化视觉理解的同时,保障了语言处理能力。CogVLM2 的开源版本支持中英文双语,模型参数规模为 19 亿,但实际推理时激活的参数量约为 120 亿,呈现出在多模态任务中的高效性能。
CogVLM2 开源了多款语言模型,均基于 Meta-Llama-3-8B-Instruct 模型进行微调,具备如下特点:
- 显著提升关键指标,例如 TextVQA 和 DocVQA 等。
- 支持长达 8K 的文本长度。
- 支持高达 1344x1344 分辨率的图像。
- 提供支持中英文双语的开源模型版本。
CogVLM2 的技术突出之处在于其强大的跨模态理解能力,能够处理长文本和高分辨率图像,并且支持中英文双语,这使其在多语言环境中具备广泛的应用潜能。
二、模型架构
CogVLM2 的模型架构在承继上一代模型的基础上展开了优化与创新,具体特点如下:
- 视觉编码器:CogVLM2 运用了一个具备 50 亿参数的视觉编码器,负责对输入图像实施特征提取与编码操作。
- 视觉专家模块:于大语言模型中整合了一个拥有 70 亿参数的视觉专家模块,该模块凭借独特的参数设定,精细地构建了视觉与语言序列的交互模型。
- 深度融合策略:CogVLM2 采用了深度融合策略,促使视觉模态与语言模态能够更为紧密地相结合,进而在增强模型视觉理解能力的同时,维持了其在语言处理方面的优势。
- MLP Adapter:模型中应用了 MLP(多层感知器)Adapter,用于调节和适配不同模态之间的特征。
- 降采样模块:为了更优地处理和理解高分辨率的文档或网页图片,CogVLM2 在视觉编码器之后引入了一个专门的降采样模块,能够有效地提取关键信息,降低输入到语言模型中的序列长度。
- Word Embedding:模型涵盖了 Word Embedding 层,用于将文本转化为模型能够理解的数值型向量。
- 多专家模块结构:CogVLM2 规划了多专家模块结构,使得在进行推理时,实际激活的参数量仅约 120 亿,这种设计既保障了模型的性能,又提升了推理效率。
- 语言基座模型:CogVLM2 选用了 Meta-Llama-3-8B-Instruct 作为语言基座模型,为模型赋予了强大的语言理解和生成能力。
三、模型性能
CogVLM2 的团队在一系列多模态基准上实施了定量评估,这些基准涵盖了 TextVQA、DocVQA、ChartQA、OCRbench、MMMU、MMVet、MMBench 等等。从下面的表格能够明晰,CogVLM2 的两个模型,虽然具有相对较小的模型规模,然而在多个基准中获取了 SOTA 性能;而在其他性能方面,也能够达成与闭源模型(诸如 GPT-4V、Gemini Pro 等)相近的水平。
四. 模型在线体验
在线地址:http://cogvlm2-online.cogviewai.cn:7861/
五. 模型部署实践
1、资源准备
最低配置要求
Python: 3.10.12 以上版本。
操作系统: 建议使用 Linux 操作系统运行以避免xformers库安装问题。建议使用 NVIDIA GPU 以防止兼容性问题。
GPU要求如下表格所示
2、源码下载
从Github仓库下载模型源码(推理实践的客户端源代码)
git clone https://github.com/THUDM/CogVLM2.git
3、安装依赖
在开始使用CogVLM2之前,请确保安装了所有必要的Python库。可以通过以下命令安装transformers库和其他依赖:
pip install transformers
pip install -r requirements.txt # requirements.txt 包含在CogVLM2项目中
4、模型下载
本次测试由于资源有限,下载量化版本的模型进行测试。
CogVLM2模型可以从从国内的魔塔(modelscope)下载,也可以从huggingface下载(这里主要下载模型权重相关文件) 。
modelscope下载地址:https://modelscope.cn/models/ZhipuAI/cogvlm2-llama3-chinese-chat-19B-int4
Huggingface下载地址:https://huggingface.co/THUDM/cogvlm2-llama3-chinese-chat-19B-int4
import torch
from modelscope import snapshot_download
# snapshot_download函数用于下载模型
model_dir = snapshot_download(
'ZhipuAI/cogvlm2-llama3-chinese-chat-19B-int4', # 模型名称
cache_dir='/root/autodl-tmp', # 缓存目录
revision='master' # 版本号
)
5、快速开始
完整测试代码样例如下:
import torch
from PIL import Image
from transformers import AutoModelForCausalLM, AutoTokenizer
MODEL_PATH = "THUDM/cogvlm2-llama3-chinese-chat-19B-int4"
DEVICE = 'cuda' if torch.cuda.is_available() else 'cpu'
TORCH_TYPE = torch.bfloat16 if torch.cuda.is_available() and torch.cuda.get_device_capability()[
0] >= 8 else torch.float16
tokenizer = AutoTokenizer.from_pretrained(
MODEL_PATH,
trust_remote_code=True
)
model = AutoModelForCausalLM.from_pretrained(
MODEL_PATH,
torch_dtype=TORCH_TYPE,
trust_remote_code=True,
low_cpu_mem_usage=True,
).eval()
text_only_template = "A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions. USER: {} ASSISTANT:"
while True:
image_path = input("image path >>>>> ")
if image_path == '':
print('You did not enter image path, the following will be a plain text conversation.')
image = None
text_only_first_query = True
else:
image = Image.open(image_path).convert('RGB')
history = []
while True:
query = input("Human:")
if query == "clear":
break
if image is None:
if text_only_first_query:
query = text_only_template.format(query)
text_only_first_query = False
else:
old_prompt = ''
for _, (old_query, response) in enumerate(history):
old_prompt += old_query + " " + response + "\n"
query = old_prompt + "USER: {} ASSISTANT:".format(query)
if image is None:
input_by_model = model.build_conversation_input_ids(
tokenizer,
query=query,
history=history,
template_version='chat'
)
else:
input_by_model = model.build_conversation_input_ids(
tokenizer,
query=query,
history=history,
images=[image],
template_version='chat'
)
inputs = {
'input_ids': input_by_model['input_ids'].unsqueeze(0).to(DEVICE),
'token_type_ids': input_by_model['token_type_ids'].unsqueeze(0).to(DEVICE),
'attention_mask': input_by_model['attention_mask'].unsqueeze(0).to(DEVICE),
'images': [[input_by_model['images'][0].to(DEVICE).to(TORCH_TYPE)]] if image is not None else None,
}
gen_kwargs = {
"max_new_tokens": 2048,
"pad_token_id": 128002,
}
with torch.no_grad():
outputs = model.generate(**inputs, **gen_kwargs)
outputs = outputs[:, inputs['input_ids'].shape[1]:]
response = tokenizer.decode(outputs[0])
response = response.split("<|end_of_text|>")[0]
print("\nCogVLM2:", response)
history.append((query, response))
6、CLI 调用模型
运行本代码以开始在命令行中对话。请注意,模型必须在一张GPU上载入
CUDA_VISIBLE_DEVICES=0 python cli_demo.py
如果有多张GPU,可以通过以下代码执行多卡拉起模型,并将模型的不同层分布在不同的GPU上。
python cli_demo_multi_gpu.py
7、Web端调用模型
chainlit run web_demo.py
拉起对话后,你将能和模型进行对话,效果如下:
8、OpenAI API 测试
openai_api_demo.py提供了一个简单的示例,通过以下代码拉起模型,之后,就可以使用 OpenAI API格式的方式请求和模型的对话。
python openai_api_demo.py
开发人员可以通过以下代码来调用模型:
python openai_api_request.py
结语
CogVLM2 作为新一代的视觉语言模型,不但在技术层面达成了重大突破,并且在实际应用中彰显出广泛的适用性。伴随人工智能技术的持续进步,CogVLM2 有希望在多模态领域创造出更多的创新成果和可能性。本文的目的在于为读者提供一个全面且深入的 CogVLM2 模型介绍,期望能够唤起更多开发者和研究人员的兴趣,携手共同推动 AI 技术的发展。
🎯🔖更多专栏系列文章:AI大模型提示工程完全指南、AI大模型探索之路(零基础入门)、AI大模型预训练微调进阶、AI大模型开源精选实践、AI大模型RAG应用探索实践🔥🔥🔥 其他专栏可以查看博客主页📑
😎 作者介绍:我是寻道AI小兵,资深程序老猿,从业10年+、互联网系统架构师,目前专注于AIGC的探索。
📖 技术交流:欢迎关注【小兵的AI视界】公众号或扫描下方👇二维码,加入技术交流群,开启编程探索之旅。
💘精心准备📚500本编程经典书籍、💎AI专业教程,以及高效AI工具。等你加入,与我们一同成长,共铸辉煌未来。
如果文章内容对您有所触动,别忘了点赞、⭐关注,收藏!加入我,让我们携手同行AI的探索之旅,一起开启智能时代的大门!