使用纯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
使用纯c#在本地部署多模态模型,让本地模型也可以理解图像的更多相关文章
- RocketMq灰皮书(二)------本地部署启动MQ
RocketMq灰皮书(二)------本地部署启动MQ Windows10本地部署RocketMQ 在上一篇文章中,我们对rocket的几个基本概念进行了介绍,也了解了业内几大消息中间件的区别.在本 ...
- windows下百度离线人脸识别本地部署与使用(nodejs做客户端,c++做服务端,socket做通信)
1.离线人脸识别本地部署 详情请阅读百度人脸识别官网 2.nodejs做socket通信的客户端 为什么不直接通过调用c++编译的exe获得人脸识别结果? 原因:exe运行时会加载很多模型而消耗很多时 ...
- Kubernetes 学习笔记(二):本地部署一个 kubernetes 集群
前言 前面用到过的 minikube 只是一个单节点的 k8s 集群,这对于学习而言是不够的.我们需要有一个多节点集群,才能用到各种调度/监控功能.而且单节点只能是一个加引号的"集群&quo ...
- day131:2RenMJ:2RenMJ游戏简介&部署MJ项目到本地
目录 1.游戏简介 1.如何做出一款麻将游戏? 2.麻将运行界面 3.麻将项目所用技术快速概览 4.web开发 / 游戏开发 / APP开发 比较 5.firefly游戏框架介绍 2.部署麻将项目到本 ...
- 【Azure 应用服务】App Service 在使用GIt本地部署,上传代码的路径为/home/site/repository,而不是站点的根目录/home/site/wwwroot。 这个是因为什么?
问题描述 App Service 在使用GIt本地部署,上传代码的路径为/home/site/repository,而不是站点的根目录/home/site/wwwroot. 这个是因为什么? 并且通过 ...
- 本地部署arcgis by eclipse
首次来博客园发帖,从本地部署arcgis api开始吧: 首先还是下载arcgis的api包开始,在中国区官网下载arcgis包: 1.http://support.esrichina.com.cn/ ...
- ArcGIS server开发之API for js 本地部署
ArcGIS Server for javascript 本地部署 第一次使用arcgis server for js开发,在经验方面还有很多的不足,所以将自己在开发过程中遇到的问题写出来与大家共享. ...
- Exceptionless 本地部署
免费开源分布式系统日志收集框架 Exceptionless 前两天看到了这篇文章,亲身体会了下,确实不错,按照官方的文档试了试本地部署,折腾一番后终于成功,记下心得在此,不敢独享. 本地部署官方wik ...
- ArcGIS JavaScript API本地部署离线开发环境[转]
原文地址:http://www.cnblogs.com/brawei/archive/2012/12/28/2837660.html 1 获取ArcGIS JavaScript API API的下载地 ...
- Exceptionless 本地部署踩坑记录
仅已此文记录 Exceptionless 本地部署所遇到的问题 1.安装ElasticSearch文本 执行elasticsearch目录中的elasticsearch.bat 没有执行成功. 使用命 ...
随机推荐
- JavaScript获取href的值
1.当href的值为正常网址时: <!DOCTYPE html> <html> <head> <title></title> <met ...
- mikumikudance 和 pmxEditor 都可以打开 pmx
mikumikudance 和 pmxEditor 都可以打开 pmx 模型下载 https://www.bilibili.com/blackboard/activity-5hkwDIRkBv.htm ...
- vue 打包 可以加 --watch 持续打包 - 开发本地应用程序 - 套壳模式开发
vue 打包 可以加 --watch 持续打包 - 开发本地应用程序 - 套壳模式开发 "watch": "vue-cli-service build --watch - ...
- 安装libevent
1.在libevent官网(http://libevent.org/)上下载压缩包(我下载的是libevent-2.1.8-stable.tar.gz) 2.解压压缩包:tar -zxvf libev ...
- Android视音频基础知识
学术概念 采样和采样频率: ⼀秒钟内采样的次数称为采样频率.采样频率越⾼,越接近原始信号,但是也加⼤了运算处理的复杂度.根据Nyquist采样定理,要想重建原始信号,采样频率必须⼤于信号中最⾼频率的两 ...
- 游戏引擎中的实时渲染和在V-Ray中渲染有什么区别 2022-11-25
游戏引擎中的实时渲染和在V-Ray中渲染有什么区别,下面我们一起来分析一下,从2个方面来具体分析实时渲染和在V-Ray中渲染种的不一样的区别. 原理区别 VRay等渲染器原理上叫做离线渲染(Offli ...
- drools中使用function
一.背景 当我们在drools中编写规则时,有些时候存在重复的代码,那么我们是否可以将这些重复代码抽取出来,封装成一个function来调用呢?那么在drools中如何自定义function? 二.需 ...
- KingbaseES V8R3 备份恢复案例 -- sys_rman物理备份异机恢复
案例说明: 在生产环境通过sys_rman执行了物理备份后,需要在异机构建测试环境,本案例描述了通过物理备份异机恢复的详细过程及操作. 适用版本: KingbaseES V8R3 节点信息: [kin ...
- KingbaseES 分区表与 Oracle 分区表对于空值的处理差异
一.对于null 值处理 1.Oracle 分区字段允许为空,只要存在maxvalue 分区,值就可以插入. SQL> create table t1(id number,data varcha ...
- kafka集群启动命令脚本文件kf.sh
注意代码缩进 添加执行权限 chmod +x kf.sh 1 #! /bin/bash 2 case $1 in 3 "start"){ 4 for i in hadoop102 ...