6行代码,1行指令!轻松完成多模态(视觉)模型离线推理 & 在线服务

早在去年年底,LMDeploy 现已悄悄地支撑了多模态(视觉)模型(下文简称 VLM)推理,只不过它静静地躺在库房的 examples/vl 角落里,未曾与咱们正式照面。

LMDeploy 开源链接:

github.com/InternLM/lm…

经过一段时间的迭代,LMDeploy 在 VLM 推理和服务方面,发生了天翻地覆的变化,于 v0.2.6 版本中正式发布。和去年相比,已有云泥之别,能够接受咱们的检阅啦。

LMDeploy 的 VLM 推理,主打简略、好用。6行代码完成推理,一行指令建立服务。

目前,已支撑了以下模型:

  • Qwen/Qwen-VL-Chat
  • LLaVA 系列 v1.5,v1.6
  • 01-ai/Yi-VL-6B

准备工作

在运用之前,请先装置 LMDeploy 最新版。假如系统的 cuda 版本是 11+,能够直接装置 pypi 包:

pip install lmdeploy

假如 cuda 版本是 12+,请参阅如下指令装置:

export LMDEPLOY_VERSION=0.2.6
export PYTHON_VERSION=38
pip install https://github.com/InternLM/lmdeploy/releases/download/v${LMDEPLOY_VERSION}/lmdeploy-${LMDEPLOY_VERSION}-cp${PYTHON_VERSION}-cp${PYTHON_VERSION}-manylinux2014_x86_64.whl

LMDeploy 支撑 Linux、Windows 操作系统。对 cuda 的最低要求是 11.4。显卡架构最低为 sm70,也便是 Volta 架构及以上。显卡内存最好在 20G 以上。

离线推理

运用 LMDeploy pipeline 接口推理 VL 模型仅需 6 行代码,这得益于 LMDeploy 把 VL 模型中的视觉部分,和 LLM 模型都封装到推理 pipeline。以 Qwen-VL-Chat 模型为例:

from lmdeploy import pipeline
from lmdeploy.vl import load_image
pipe = pipeline('Qwen/Qwen-VL-Chat')
image = load_image('')
response = pipe(('这是哪里', image))
print(response)

在这段代码中,

  • 1, 2 两行加载必要的包
  • 第 3 行,输入模型路径,创立推理 pipeline。模型路径能够是huggingface hub 上的模型库房名,也能够是模型的本地路径,亦能够是 modelscope hub 上的模型库房名。当挑选 modelscope hub 上的模型时,需求先设置环境变量 export LMDEPLOY_USE_MODELSCOPE=True
  • 第 4 行,读取图片。接口 load_image 除了支撑 web url 外,还支撑本地路径
  • 5,6 两行进行推理,并显现结果。LMDeploy pipeline 支撑多种输入形式:
第一种:单提示图,单图画。(prompt, image)
第二种:单提示图,多图画。(prompt,[image_1, image_2, ..., image_n])
第三种:批量数据。[(prompt_1, image_1), (prompt_2, image_2)]
第四种:openai message 格式
prompts = [    {        'role': 'user',        'content': [            {'type': 'text', 'text': '这是哪里'},            {'type': 'image_url', 'image_url': {'url': ''}}        ]
    }

pipeline 还供给了多轮对话接口,用法也很简略:

from lmdeploy import pipeline
from lmdeploy.vl import load_image
pipe = pipeline('Qwen/Qwen-VL-Chat')
image = load_image('')
sess = pipe.chat(('make a story about this picture', image))
print(sess.response.text)
sess = pipe.chat('make the story focusing on the dog', sess)
print(sess.response.text)

在线服务

LMDeploy 供给了一键式把 VL 模型封装为服务的东西。这儿的服务能够是类似 OpenAI 的服务,也能够是 gradio 服务。相信总有一款合适你!

lmdeploy serve api_server Qwen/Qwen-VL-Chat --server-port 8000
lmdeploy serve gradio Qwen/Qwen-VL-Chat --server-port 8000

如建立 OpenAI 服务,能够无缝对接 OpenAI 运用接口:

from openai import OpenAI
client = OpenAI(api_key='YOUR_API_KEY', base_url='http://0.0.0.0:8000/v1')
model_name = client.models.list().data[0].id
response = client.chat.completions.create(
    model=model_name,
    messages=[{
        'role':
        'user',
        'content': [{
            'type': 'text',
            'text': 'Describe the image please',
        }, {
            'type': 'image_url',
            'image_url': {
                'url':
                '',
            },
        }],
    }],
    temperature=0.8,
    top_p=0.8)
print(response)

如建立 gradio 服务,在浏览器中翻开 http://0.0.0.0:8000,就能够经过 WebUI 与模型在线沟通啦

6行代码,1行指令!轻松完成多模态(视觉)模型离线推理 & 在线服务

引擎装备

在用户的既往反应中,咱们常常收到关于怎么做多卡并行、为什么内存占用高、怎么支撑更大序列长度等问题。咱们运用 VLM 模型时,可能也遇到类似的问题。咱们在这个章节一并阐明下。

其实,很简略,设置推理引擎参数即可。

运用 pipeline 接口的时分,传入TurbomindEngineConfig 装备相关的参数。而在启动 api_server 前,经过 lmdeploy serve api_server --help查阅相关的参数阐明,按需传入就好。

这儿,咱们将要点介绍经过 pipeline 设置一些比较重要的参数的办法。完整的参数列表,咱们能够参阅 github.com/InternLM/lm…

设置显卡内存运用量

LMDeploy 的内存分配战略是,在加载完模型权重后,从闲暇内存中,按一定份额为 k/v cache 拓荒空间。份额值默认为 0.8。这个份额值适用于 A100-80G 这样的大内存,而关于 24G 内的显卡来说,0.4 更加合适。

具体设置办法如下:

from lmdeploy import pipeline, TurbomindEngineConfig
pipe = pipeline('Qwen/Qwen-VL-Chat',
                backend_config=TurbomindEngineConfig(cache_max_entry_count=0.4))

设置张量并行

当单卡无法支撑 LLM 或许 VLM 时,多卡推理成为很自然的挑选。此刻,只要为引擎装备 tp 就好:

from lmdeploy import pipeline, TurbomindEngineConfig
pipe = pipeline('Qwen/Qwen-VL-Chat',
                backend_config=TurbomindEngineConfig(tp=2))

设置上下文窗口大小

多图、多轮对话场景,一般需求比较长的推理上下文窗口。这能够经过引擎的 session_len 设置:

from lmdeploy import pipeline, TurbomindEngineConfig
pipe = pipeline('Qwen/Qwen-VL-Chat',
                backend_config=TurbomindEngineConfig(session_len=9000))

结束语

LMDeploy VLM 模型推理和服务就简略介绍到这儿啦。咱们在运用中,遇到任何问题或许需求,都能够来咱们的社群或许代码库房反应。后续,咱们将推出 在 LMDeploy 中添加 VLM 模型的办法,诚邀咱们参与,奉献自己的力气!

最终的最终,欢迎咱们关注咱们的项目 github.com/InternLM/lm…