• 使用纯c#在本地部署多模态模型,让本地模型也可以理解图像


    之前曾经分享过纯c#运行开源本地大模型Mixtral-8x7B 当时使用的是llamasharp这个库和Mixtral的模型在本地部署和推理,前段时间我看到llamasharp更新到了0.11.1版本,可以支持今年2月份开源的

    llava-v1.6多模态大模型了,本着尝试一下的想法,就做了集成,不过中途也是踩了一些坑,好在模型还是跑起来了。

    先展示一下模型的图形理解结果吧:

     可以看到模型对图像还是有一些基本的理解能力,但是受限于模型的尺寸(7B),智能确实有限。而且基于目前的CPU推理确实速度感人。有感兴趣的小伙伴可以使用CUDA版本进行测试

    修改办法是双击csproj,修改为LLamaSharp.Backend.Cuda12 or LLamaSharp.Backend.Cuda11 (根据你的N卡环境的CUDA确定安装哪一个版本即可)

    接下来大概看看多模态部分的源代码实现,其实也比较简单:

    多模态模型的实现原理是使用clip模型对图像到文本的映射生成对应的embedding,这一步和词嵌入类似,只不过这里是clip模型将图像转化成了另外一种形式的嵌入,然后输入多模态模型来进行图像推理

    所以多模态模型我们需要下载两个模型,一个用于图像CLIP嵌入,一个同于多模态推理:

    //多模态模型:llava-v1.6-mistral-7b.Q4_K_M.gguf 下载地址:https://huggingface.co/mradermacher/llava-v1.6-mistral-7b-GGUF/resolve/main/llava-v1.6-mistral-7b.Q4_K_M.gguf
    //CLIP模型:mmproj-mistral7b-f16-q6_k.gguf 下载地址:https://huggingface.co/cmp-nct/llava-1.6-gguf/resolve/main/mmproj-mistral7b-f16-q6_k.gguf?download=true

    接着我们通过创建llamasharp上下文,就可以愉快的进行推理任务了,核心代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var param = new ModelParams(modelPath)
    {
        ContextSize = 4096
    };
    var ex = new InteractiveExecutor(LLamaWeights.LoadFromFile(param).CreateContext(param), LLavaWeights.LoadFromFile(mmpmodelPath));
    ex.ImagePaths.Add("yourimgpath.png");//注意只能是jpeg图片的本地路径
    await foreach (var item in ex.InferAsync("\nUser:请理解图像中的内容\nAssistant:"))
    {
        Console.WriteLine(item);
    }

      这里modelPath是你的多模态模型的本地加载地址,mmpmodelPath是CLIP模型的地址,都是相对路径。主要的坑过就是一开始我以为不需要加载CLIP模型,所以下载了llava就测试,结果模型要吗说没有找到图片要吗就乱说一通,

    后来去llamasharp翻了一下案例才发现少了一个模型,第二个坑就是InferAsync这里输入内容时,如果要进行图像推理,必须要前置一个的标签,否则模型会直接忽略你的图像,进行单纯的文本推理回答。

    今天分享的内容都比较简单,项目也都更新到了git上,欢迎有兴趣的小伙伴下载+star:https://github.com/sd797994/LocalChatForLlama

    补充一下:使用英文测试发现效果要稍微好一点,如图:

     

  • 相关阅读:
    【Cpp】 第一章 C++入门
    哪款蓝牙耳机适合学生党?开学季值得买的蓝牙耳机推荐
    OpenCV DNN模块常用操作
    PMP对项目管理工作有什么用?
    @controller和@RestController的区别
    Rasa:使用大语言模型进行意图分类
    Spring Data JPA使用@DynamicInsert和@DynamicUpdate注解进行动态插入和更新
    集成系列:低代码对接泛微e-cology
    系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第三部分:缓存
    LeetCode--279. 完全平方数(C++描述)
  • 原文地址:https://www.cnblogs.com/gmmy/p/18146496