这是视频 卷卷卷!新的开源多模态大模型王者来啦,从量化到部署用 lmdeploy 把它运行起来吧 的笔记,请结合视频观看。
大纲
- 安装 modelscope 下载 internvl2 8b 的模型
- 安装最新的 lmdeploy
- 部署原始模型
- 模型量化
- 部署量化后的模型
- 测试 lmdeploy 的效果
- 使用 openai api 的方式部署并进行推理
安装 modelscope 下载 internvl2 8b 的模型
pip install modelscope
from modelscope.hub.snapshot_download import snapshot_download
model_dir = snapshot_download('OpenGVLab/InternVL2-8B', cache_dir='autodl-tmp', revision='master')
安装最新的 lmdeploy
pip install lmdeploy[all] timm
pip install transformers==4.37.2
如果想要支持 flash attention 则需要安装 flash-attn
pip install packaging
pip uninstall -y ninja && pip install ninja
pip install flash-attn --no-build-isolation
注意这里不要直接使用 pip install flash-attn
来安装,否则会非常非常的慢。
使用 lmdeploy 部署原始模型
目前 lmdeploy 还没来得及更新对 internvl2 的支持,不过在未来的 0.5.1 应该就会支持。看了目前主分支上的代码,我草率的觉得只要修改下文件夹名称就能解决目前的问题。
ln -s /root/autodl-tmp/OpenGVLab/InternVL2-8B /root/autodl-tmp/OpenGVLab/InternVL-Chat-V1-5
这里可以理解为把新的模型假装是 internvl 1.5 的模型,然后进行部署。
下一步可以进行模型的部署了:
lmdeploy serve gradio \
/root/autodl-tmp/OpenGVLab/InternVL-Chat-V1-5 \
--server-port 8080 \
--server-name 0.0.0.0
目前 autodl
已经不支持暴露外部端口了,但是还是可以使用我自己的 gradio-tunneling
或者直接使用 gradio
自己的内网穿透访问。
pip install gradio-tunneling
gradio-tunneling
是我写的一个小工具,就是使用 huggingface 的 gradio share 的功能进行内网穿透(即使你没有在使用 gradio 也可以!)。
gradio-tunneling 8080
模型量化
使用 awq 量化,首先需要准备校准数据集。
pip install datasets
这里需要从 hf 下载几个文件。
source /etc/network_turbo # autodl 特有的,开启学术加速
export HF_HOME=/root/huggingface # 设定 huggingface 的目录
python -c "
from datasets import load_dataset
load_dataset('ptb_text_only', 'penn_treebank', split='train', trust_remote_code=True)
load_dataset('ptb_text_only', 'penn_treebank', split='validation', trust_remote_code=True)
"
使用下面的命令进行模型量化:
export HF_HOME=/root/huggingface
export HF_DATASETS_OFFLINE=1
lmdeploy lite auto_awq /root/autodl-tmp/OpenGVLab/InternVL-Chat-V1-5 --work-dir /root/autodl-tmp/OpenGVLab/InternVL-Chat-V1-5-AWQ
注意这里的目录名称不能随便给,加载模型的时候会依据文件夹名称加载模型。添加参数 HF_DATASETS_OFFLINE
是为了让 datasets 直接读取本地缓存,不必每次都去 huggingface 检查是否有更新。
部署量化后的模型
lmdeploy lite auto_awq \
/root/autodl-tmp/OpenGVLab/InternVL-Chat-V1-5 \
--work-dir /root/autodl-tmp/OpenGVLab/InternVL-Chat-V1-5-AWQ
awq
模型量化需要进行一些模型推理,这个过程是需要 gpu 的支持的。
测试
再次部署量化后的模型:
lmdeploy serve gradio \
/root/autodl-tmp/OpenGVLab/InternVL-Chat-V1-5-AWQ \
--model-format awq \
--server-port 8080 \
--server-name 0.0.0.0
使用 openai api 的方式部署并进行推理
lmdeploy 也能支持 openai 兼容的 api 方式部署,这里我们先安装 openai 的包。
pip install openai
然后修改 gradio
为 api_server
,并设定这个模型的名称为 internvl-2
方便后续的模型调用。
lmdeploy serve api_server \
/root/autodl-tmp/OpenGVLab/InternVL-Chat-V1-5-AWQ \
--model-format awq \
--server-port 8080 \
--server-name 0.0.0.0 \
--model-name internvl-2
下面是一段 python 代码,按照 openai 官方的例子修改而来:
import base64
from openai import OpenAI
client = OpenAI(base_url='http://localhost:8080/v1', api_key='xxx')
# Function to encode the image
def encode_image(image_path):
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode('utf-8')
image_path = "/root/WechatIMG390.jpg"
base64_image = encode_image(image_path)
response = client.chat.completions.create(
model="internvl-2",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "描述这张图片"},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{base64_image}"
}
},
],
}
],
max_tokens=300,
)
print(response.choices[0].message.content)
openai 兼容服务的好处不必多说,我们可以只修改点点代码就能适配 internvl 了呢!