modelscope / ms-swift

Use PEFT or Full-parameter to finetune 400+ LLMs or 100+ MLLMs. (LLM: Qwen2.5, Llama3.2, GLM4, Internlm2.5, Yi1.5, Mistral, Baichuan2, DeepSeek, Gemma2, ...; MLLM: Qwen2-VL, Qwen2-Audio, Llama3.2-Vision, Llava, InternVL2, MiniCPM-V-2.6, GLM4v, Xcomposer2.5, Yi-VL, DeepSeek-VL, Phi3.5-Vision, ...)
https://swift.readthedocs.io/zh-cn/latest/Instruction/index.html
Apache License 2.0
4.2k stars 369 forks source link

使用infer_backend=lmdeploy推理Internlm-Xcomposer2-4KHD模型效果不佳(缺少eos_token) #1688

Closed bonre closed 3 months ago

bonre commented 3 months ago

非常感谢贵组的工作,能够在swift中集成lmdeploy! 然而,事实上我在使用的过程中遇到了一些问题。 我使用如下脚本进行推理:

CUDA_VISIBLE_DEVICES=4,5,6,7 swift infer \
    --model_type internlm-xcomposer2-4khd-7b-chat \
    --model_id_or_path /data/IXC2/swift/adapter/0809/internlm-xcomposer2-4khd-7b-chat/checkpoint-1497-merged \
    --infer_backend lmdeploy \
    --load_dataset_config true \
    --max_new_tokens 4096 \
    --do_sample true \
    --temperature 0 \
    --repetition_penalty 1.01 \
    --use_flash_attn true \
    --repetition_penalty 1.01 \
    --tp 4

运行后能够推理模型,然而推理的结果并不理想,从log上看应该是无法正确识别\<s>这个特殊token。 我这边之前是将merge后的模型放到写好的lmdeploy的推理脚本当中进行推理,在这边推理的结果是正常的。 在这边的设置中,model_name如下:

self.pipe = pipeline(
            model_path=model_dir_map[type],
            chat_template_config=ChatTemplateConfig(model_name='internlm-xcomposer2'),
            backend_config=Config.engine_config(model_format=model_format)
        )

我这边感觉,是否是因为我使用的是4khd的版本,在swift中指定了model_type,而在lmdeploy中没有找到对应的模型所导致推理效果不佳呢? lmdeploy我使用的是 0.5.3 版本,在之前的更新中,lmdeploy已经把4khd归并到Internlm-xcomposer2中, site-packages/lmdeploy/model.py中对应内容如下:

@MODELS.register_module(name=['internlm-xcomposer2', 'internlm-xcomposer2d5'])
class InternLMXComposer2Chat7B(InternLMChat7B):
    """Chat template and generation parameters of InternLM-XComposer2-7b."""

不知道这算不算BUG,还是我的设置有问题呢? 烦请能为我解答,非常感谢!@Jintao-Huang

Jintao-Huang commented 3 months ago

方便看一下 推理问题的 样本的回答嘛

是没有读到图片嘛

bonre commented 3 months ago

@Jintao-Huang CF0E6505-67EB-4c1a-8124-1B1D86A5C5D5 抱歉具体的内容不太方便展示,这里展示问题所在。 上下涂红的地方是被抹去的数据,从内容上看是读到了图片的。 问题在于,如图所示,在im_end前的内容就是预期要的推理结果, 而此时推理不会停止,在输出了\</s>以后,模型又去输出图中的内容。一直到设置的max_new_tokens才会结束。

Jintao-Huang commented 3 months ago
截屏2024-08-13 16 47 13

我这里是推理正常的. 您可以尝试一下下面的案例,是否正常么

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'

from swift.llm import sft_main, SftArguments, infer_main, InferArguments

infer_main(InferArguments(model_type='internlm-xcomposer2-4khd-7b-chat', dataset='coco-en-mini#2000', infer_backend='lmdeploy'))
bonre commented 3 months ago
截屏2024-08-13 16 47 13

我这里是推理正常的. 您可以尝试一下下面的案例,是否正常么

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'

from swift.llm import sft_main, SftArguments, infer_main, InferArguments

infer_main(InferArguments(model_type='internlm-xcomposer2-4khd-7b-chat', dataset='coco-en-mini#2000', infer_backend='lmdeploy'))

@Jintao-Huang 这段案例是正常的。 现在的问题在于,相同的merge后的模型,相同的gen_config的情况下, 使用swift集成的lmdeploy 和 使用lmdeploy 推理所得到的结果却不同。 从结果上看集成的可以推理出预期的结果,但是无法正确识别im_end; 而单独使用lmdeploy的推理结果也很符合预期,证明并不是merge后的模型被训坏了。 不太知道是哪里出了问题 :( 我这边能找出的区别就是 pipline 中的 ChatTemplateConfig 中的 model_name 可能不同?

Jintao-Huang commented 3 months ago

swift是不使用lmdeploy的template的

bonre commented 3 months ago

推理的数据集没有变化,当使用的infer_backend=pt时,结果是正常的,可以识别到im_end

Jintao-Huang commented 3 months ago

好的 我知道是什么原因了...

Jintao-Huang commented 3 months ago

fix了,再试试呢

bonre commented 3 months ago

@Jintao-Huang CF0E6505-67EB-4c1a-8124-1B1D86A5C5D5 抱歉具体的内容不太方便展示,这里展示问题所在。 上下涂红的地方是被抹去的数据,从内容上看是读到了图片的。 问题在于,如图所示,在im_end前的内容就是预期要的推理结果, 而此时推理不会停止,在输出了以后,模型又去输出图中的内容。一直到设置的max_new_tokens才会结束。

@Jintao-Huang 非常感谢!这个问题已经解决了。 目前测试下来的结果,使用 swift集成 和 直接使用lmdeploy 推理的内容基本一致。 虽然配置一样结果有些许区别,但我估计是input的图片位置不同导致? 因为直接使用lmdeploy用的prompt是对齐internlm-xcomposer2的finetune指定的自定义template。 再次感谢您的工作! 方便的话可以为我解释一些BUG的原因吗?因为我看commit修改的貌似是InternVL的结构,为什么会影响IXC2呢?

Jintao-Huang commented 3 months ago

加了eos_token