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

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

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

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

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

修改办法是双击csproj,修改<PackageReference Include="LLamaSharp.Backend.Cpu" Version="0.11.2" />为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上下文,就可以愉快的进行推理任务了,核心代码如下:

复制代码
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("<image>\nUser:请理解图像中的内容\nAssistant:"))
{
    Console.WriteLine(item);
}

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

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

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