CogVLM是一个强大的多模态模型,能够处理文本和图像数据。通过CogVLM,用户可以提出与图像相关的问题,模型将结合图像内容给出答案。在定性测试中,CogVLM展现出了比LLaVA和BakLLaVA更强的性能,并且与Qwen-VL和GPT-4 with Vision的性能相当。
CogVLM的能力范围广泛,包括但不限于视觉问答(VQA)、文档VQA、零样本目标检测、文档OCR和普通OCR。这些功能使得CogVLM在制造业、物流等多个行业中都有潜在的应用价值,例如检查叉车是否靠近传送带或读取运输集装箱上的序列号。
要在本地硬件上部署CogVLM,推荐使用Roboflow Inference,这是一个开源的计算机视觉推理服务器,支持运行基础模型如CogVLM以及自己训练的模型(例如YOLOv8模型)。本指南将带了解如何在本地硬件上部署和使用CogVLM,包括安装Roboflow Inference和创建一个Python脚本,该脚本可以向本地部署的CogVLM模型发送请求。
可以根据本指南在任何云平台上部署CogVLM,如AWS、GCP和Azure。在本指南中,在配备NVIDIA T4 GPU的GCP Compute Engine实例上部署了CogVLM。
CogVLM可以通过不同程度量化来运行。量化是一种使大型机器学习模型变小的方法,以便在较低的RAM需求下运行。模型量化程度越高,运行速度越快,但准确度越低。
通过Roboflow Inference运行CogVLM时,可以选择三种量化程度:
- 无量化:运行完整模型,需要80GB的GPU RAM。可以在80GB的NVIDIA A100上运行此模型。
- 8位量化:运行模型的准确度低于无量化,需要32GB的GPU RAM。可以在具有足够虚拟RAM的A100上运行此模型。
- 4位量化:运行模型的准确度低于8位量化,需要16GB的GPU RAM。可以在NVIDIA T4上运行此模型。
应根据可用硬件和应用所需的准确度水平来选择模型大小。为了获得最准确的结果,请使用未量化的CogVLM。在本指南中,将使用4位量化,以便在T4上运行模型。
要部署CogVLM,将使用Roboflow Inference。Inference使用Docker创建隔离环境,在其中可以运行视觉模型。使用Inference部署的模型具有HTTP接口,可以通过该接口发送请求。
首先,在机器上安装Docker。如果尚未安装Docker,请按照官方Docker安装说明为操作系统设置Docker。
接下来,需要安装Inference Python包和CLI。可以使用这些包设置Inference Docker容器。运行以下命令安装所需的包:
pip install inference inference-cli
要启动Inference服务器,请运行:
inference server start
注意:此命令会检测机器上是否存在GPU,并相应地拉取正确的Docker镜像。如果没有GPU,此命令将拉取特定于CPU的Docker镜像,该镜像中不包含CogVLM。
首次运行此命令时,将从Docker Hub下载Docker容器。一旦机器上有了容器,容器将开始运行。Inference服务器将在以下地址可用:
http://localhost:9001
使用Inference部署的所有模型都有专用的HTTP路由。在本指南中,将使用CogVLM路由向CogVLM模型发送请求。一旦下载了模型权重,就可以离线运行CogVLM。
创建一个新的Python文件,并添加以下代码:
import base64
import os
from PIL import Image
import requests
PORT = 9001
API_KEY = ""
IMAGE_PATH = "forklift.png"
def encode_base64(image_path):
with open(image_path, "rb") as image:
x = image.read()
image_string = base64.b64encode(x)
return image_string.decode("ascii")
prompt = "Read the text in this image."
infer_payload = {
"image": {
"type": "base64",
"value": encode_base64(IMAGE_PATH),
},
"api_key": API_KEY,
"prompt": prompt,
}
results = requests.post(
f"http://localhost:{PORT}/llm/cogvlm",
json=infer_payload,
)
print(results.json())
这段代码将向/llm/cogvlm路由发送HTTP请求。此路由接受文本和图像,这些将被发送到CogVLM进行处理。此路由返回一个包含模型文本响应的JSON对象。
在上面的代码中,将ROBOFLOW_API_KEY替换为Roboflow API密钥。image.png替换为想要用来发送请求的图像。prompt替换为想要问的问题。
让在下面的叉车图像上运行代码,并问问题“叉车是否靠近传送带?”:
{'response': 'yes, there is a forklift close to a conveyor belt, and it appears to be transporting a stack of items onto it.', 'time': 12.89864671198302}
模型返回了正确的答案。在使用的NVIDIA T4 GPU上,推理大约需要12.9秒。让问问题“工人是否戴着手套?”。模型返回:
{'response': 'No, the forklift worker is not wearing gloves.', 'time': 10.490668170008576}
模型返回了正确的响应。模型计算响应大约需要10.5秒。
当询问上图中的工人是否戴着安全帽时,模型回答说“是的,工人戴着安全帽。”这是不正确的。
与所有多模态语言模型一样,模型性能将取决于提供的图像、提示以及应用到模型的量化程度。量化了这个模型,以便在T4上运行模型,但如果没有这种量化,模型的性能会更好。
CogVLM是一个大型多模态模型(LMM)。可以向CogVLM询问有关图像的问题并获取响应。CogVLM能够执行不同的计算机视觉任务,从识别图像中物体的存在到读取图像中的字符再到零样本目标检测。