LMDeploy部署InternVL-Chat-V1-5(V100)

本篇写于2024年7月,请注意甄别

环境准备

[LMDeploy官方文档]

LMDeploy 提供了快速安装、模型量化、离线批处理、在线推理服务等功能。每个功能只需简单的几行代码或者命令就可以完成。

环境安装:

### 启动环境
source /mnt/lustre/share/platform/env/lmdeploy

### 新建 conda 环境
conda create -n lmdeploy python=3.8 # 大于3.8即可

# CUDA12
pip install lmdeploy 
pip install timm
# 手动下载 flash_attn.whl 并安装 : https://github.com/Dao-AILab/flash-attention/releases/

# CUDA 11+
# 浏览器下载 https://github.com/InternLM/lmdeploy/releases/download/v0.5.0/lmdeploy-0.5.0+cu118-cp38-cp38-manylinux2014_x86_64.whl
pip install lmdeploy-0.5.0+cu118-cp38-cp38-manylinux2014_x86_64.whl
# 除上述包之外,可能需要手动下载 torch2.2.2-cu118-cp38、torchvision-0.17.2-cu118-cp38
# 下载地址:https://download.pytorch.org/whl/cu118

## 联网情况下
# export LMDEPLOY_VERSION=0.5.0
# export PYTHON_VERSION=38
# pip install https://github.com/InternLM/lmdeploy/releases/download/v${LMDEPLOY_VERSION}/lmdeploy-${LMDEPLOY_VERSION}+cu118-cp${PYTHON_VERSION}-cp${PYTHON_VERSION}-manylinux2014_x86_64.whl --extra-index-url https://download.pytorch.org/whl/cu118

推理引擎:可选Turbomind和Pytorch【支持的模型链接

【注意】:

1. pipeline 默认申请一定比例显存,用来存储推理过程中产生的 k/v。v0.2.0 默认比例为 0.5,表示 GPU****总显存的 50% 被分配给 k/v cache,lmdeploy > v0.2.1分配策略改为从空闲显存中按比例为 k/v cache 开辟空间。默认比例值调整为 0.8

2. 比例由参数TurbomindEngineConfig.cache_max_entry_count 控制,OOM或缓解显存占用问题可以修改这个参数,V100的机器无法使用 FlashAttention (only supports Ampere GPUs or newer), 通过修改模型根目录下的 config.json 文件来规避这个问题

    use_flash_attn: false

    attn_implementation:eager

离线推理

from lmdeploy import pipeline
from lmdeploy.messages import TurbomindEngineConfig
from lmdeploy.vl import load_image

model = '/path/to/InternVL-Chat-V1-5'
image = load_image('/path/to/infering_image.jpeg')
backend_config = TurbomindEngineConfig(tp=4) # 量化模型加 model_format='awq'
pipe = pipeline(model, backend_config=backend_config, log_level='INFO')
response = pipe((prompt, image))
print(response)

API-Server

服务端口

srun -p pat_dev --gres=gpu:4 -w target_ip lmdeploy serve api_server /path/to/InternVL-Chat-V1-5/ --server-port 23333 --tp 4
# 量化模型要加 --model-format awq
# 如果现存占用过大 --cache-max-entry-count 0.5 # 默认是 0.8

Infer脚本

from lmdeploy.serve.openai.api_client import APIClient

api_client = APIClient(f'http://{target_ip}:23333')
model_name = api_client.available_models[0]
messages = [
    {'role':'user',
        'content': [
            {
                'type': 'text',
                'text': 'Describe the image please',
            },{
                'type': 'image_url',
                'image_url': {
                     'url':'/path/to/infering_image.jpeg',
                 },
            }]
    }]

res = api_client.chat_completions_v1(model=model_name,messages=messages):

for item in res:
    for k,v in item.items():
        print(k, v)
        print("---")

推理速度

环境:V100 * 4,CUDA 12,lmdeploy 0.5.0

数据:

        图像:coco2014测试集(5k)

        图像平均分辨率486*575,最大640*640,最小144*176

        文本 prompt 统一为“describe this image”

显存占用,cache_max_entry_count=0.5 的情况下,左侧为仅加载模型,右侧为推理状态

batch推理脚本

from lmdeploy import pipeline
from lmdeploy.messages import TurbomindEngineConfig
from lmdeploy.vl import load_image

import os, time, json

def batchInfer(batch_size):
    idx = 0
    res_lists = {}
    while idx < 100-batch_size:
        prompt = 'describe this image'
        images = []
        image_names = []
        for i in range(batch_size):
            image = load_image(os.path.join(image_path, imnames[idx]))
            images.append(image)
            image_names.append(imnames[idx])
            idx += 1

        batch = [(prompt, images[i]) for i in range(batch_size)]

        start_time = time.time()
        response = pipe.batch_infer(batch)
        end_time = time.time()
        stage_time = end_time - start_time

        for idx, res in enumerate(response):
            res_lists[image_names[idx]] = {'modelout': res.text, 'time': stage_time/batch_size}
    return res_lists

if __name__ == '__main__':
    model = '/mnt/cache/wenduren/data/InternVL-Chat-V1-5'
    image_path = "/mnt/cache/wenduren/data/images_coco_2014_5k_test"
    
    backend_config = TurbomindEngineConfig(tp=4, cache_max_entry_count=0.5)
    pipe = pipeline(model, backend_config=backend_config)#, log_level='INFO')

    imnames = os.listdir(image_path)

    test_batch_size = [1, 4, 8, 16, 32]
    for batch_size in test_batch_size:
        res_lists = batchInfer(batch_size)
        with open(f"result/bs{batch_size}/result.txt", "w") as f:
            json.dump(res_lists,f,indent=4)
        print(f'Infererence on Batch Size = {batch_size} Done.')

可能遇到的问题

  1. 输入文本prompt没有问题,输入图片就报错

解决方法;

echo $LD_LiBRARY_PATH # 检查是否为空,否则
unset LD_LiBRARY_PATH # 加到 ~/.bashrc

<think>好的,我现在需要回答用户关于在RTX 4060上部署Mini-InternVL-Chat-4B-V1-5的问题。首先,我得了解Mini-InternVL-Chat-4B-V1-5这个模型的基本信息,比如模型的大小、显存需求以及RTX 4060的硬件参数。 首先,RTX 4060的显存是8GB,而模型的名字里有4B,可能指的是40亿参数。通常,像GPT这样的模型,参数数量和显存占用的关系大约是每10亿参数需要大约2GB显存左右,但具体还要看数据类型和优化情况。比如,如果使用FP16,每个参数占2字节,那么40亿参数就是40亿*2字节=80亿字节,即大约8GB。这刚好和RTX 4060的显存匹配,但实际中可能还需要考虑中间变量、批次大小等因素,可能显存会不够。 不过,模型名称里的4B可能是否真的是40亿参数?我需要确认一下。例如,InternVL可能是一个视觉语言模型,结构可能和纯文本模型不同。可能需要查阅官方文档或相关资料。假设确实是40亿参数,那么显存需求可能在8GB左右,但实际运行时可能超过,导致无法加载。 另外,RTX 4060是否支持INT8或4位量化?如果模型支持量化,可以降低显存占用。例如,4位量化的话,40亿参数占40亿*0.5字节=20亿字节,约2GB,这样显存就足够。但需要模型本身支持量化,并且工具链如bitsandbytes是否兼容。 还要考虑推理框架,比如使用Hugging Face的Transformers库,可能支持模型并行或内存优化技术,如梯度检查点、激活值优化等。如果用户只做推理,可能不需要存储梯度,可以节省部分显存。 另外,模型的输入输出长度也会影响显存。如果处理很长的序列,比如大图片或长文本,显存需求会增加。用户可能需要限制输入大小或使用分块处理。 综合来看,RTX 4060的8GB显存在不进行量化或优化的情况下,可能不足以部署40亿参数的模型。但如果使用量化技术,并且模型支持的话,可能可行。需要用户确认模型是否支持量化,或者是否有官方的优化版本。 可能的步骤:1. 确认模型参数和显存需求;2. 检查量化支持;3. 使用内存优化技术;4. 测试实际显存占用。 如果用户没有量化支持,可能需要更高级的显卡,如RTX 3090(24GB)或4090。但若用户能应用优化方法,RTX 4060或许勉强可用,但可能会有性能瓶颈或需要降低批次大小。</think>关于在NVIDIA RTX 4060(8GB显存)上部署**Mini-InternVL-Chat-4B-V1-5**模型的可行性,以下是逐步分析: --- ### **1. 模型显存需求计算** - **参数规模**:模型名称中的"4B"通常指40亿参数(假设为FP32精度)。 - **理论显存占用**:$$ 4 \times 10^9 \text{参数} \times 4 \text{字节/参数} = 16 \text{GB} $$ 这已超出RTX 4060的8GB显存容量。 - **实际优化后需求**: - **FP16/BF16精度**:显存需求减半,即约8GB。 - **INT8量化**:进一步降至约4GB,但需要模型支持量化技术。 --- ### **2. RTX 4060硬件能力** - **显存容量**:8GB GDDR6 - **算力支持**:支持FP16/Tensor Core加速,但需注意以下限制: - 模型加载时需启用显存优化(如`device_map="auto"`或`load_in_4bit`)。 - 长序列输入(如图像+文本多模态数据)会显著增加显存占用。 --- ### **3. 关键部署条件** #### **条件一:量化支持** 若模型支持**4-bit量化**(如通过`bitsandbytes`库): $$ 4 \times 10^9 \times 0.5 \text{字节} = 2 \text{GB} $$ 剩余显存可用于推理计算,此时RTX 4060可满足需求。 #### **条件二:模型优化** - 使用Hugging Face的`accelerate`库或`vLLM`推理框架,启用显存优化策略(如分片加载、梯度卸载)。 - 限制输入长度(例如图片分辨率、文本截断)。 --- ### **4. 实际测试建议** 1. **检查模型文档**:确认Mini-InternVL是否提供4-bit/8-bit量化版本。 2. **代码示例**(需适配实际模型): ```python from transformers import AutoModelForCausalLM, BitsAndBytesConfig quantization_config = BitsAndBytesConfig(load_in_4bit=True) model = AutoModelForCausalLM.from_pretrained( "model_name", quantization_config=quantization_config, device_map="auto" ) ``` 3. **监控显存占用**:使用`nvidia-smi`或`memory_profiler`观察推理时的显存峰值。 --- ### **结论** - **可行场景**:若模型支持4-bit量化,且输入数据规模较小(如224x224图像+短文本),RTX 4060可勉强部署- **不可行场景**:若需FP16精度或长序列输入,建议升级至至少RTX 3090(24GB显存)。 建议优先联系模型开发者,确认量化兼容性及最低硬件要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值