使用纯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 没有执行成功. 使用命 ...
随机推荐
- Android 获取设备的亮度百分比
一般的屏幕亮度都是0-255,而小米手机的高版本不一样 为了使亮度调节更加细腻, MIUI对原生亮度级别进行了扩展, 由原有的255级调整根据不同屏幕分别支持255/1023/2047/4095级.开 ...
- 关于初始化page入参的设计思路
最近在重构老的代码,在写的过程中发现之前的逻辑如果遇到没有入参pageNo会Npe,于是乎我想找找公司项目有啥方式处理page入参的有两种如下 使用三元表达式直接判断是否null,然后赋值 使用map ...
- InfluxDB、Grafana、node_exporter、Prometheus搭建压测平台
InfluxDB.Grafana.node_exporter.Prometheus搭建压测平台 我们的压测平台的架构图如下: 配置docker环境 1)yum 包更新到最新 sudo yum upda ...
- 对象池Pools优化
目录介绍 01.什么是对象池 02.glide哪里用到对象池 03.多条件key缓存bitmap 3.1 多条件key创建 3.2 key值的复用 04.glide对象池总结 05.学以致用对象池 5 ...
- 【已失效】Xcode GUI 添加 SPM 依赖的时候访问不了 github,无视 git config proxy 配置解决方案
此 openradar 中提出者指出了原因:Xcode 调用 libgit2 时传入了 GIT_PROXY_NONE,无视了 git config 中的 proxy 配置.作者说用了自己打的 libg ...
- axios中设置了response:blol后,如何处理json对象
axios中文件下载 上传文件后台校验,若失败则下载文件 let loading = this.$common.loading("正在上传"); let form = new Fo ...
- 并发CPU伪共享及优化
伪共享 缓存系统中是以缓存行(cache line)为单位存储的.缓存行是2的整数幂个连续字节,一般为32-256个字节.最常见的缓存行大小是64个字节.当多线程修改互相独立的变量时,如果这些变量共享 ...
- Spring Cloud 服务的注册与发现之eureka搭建
1.创建eureka微服务模块.导入maven依赖. <dependency> <groupId>org.springframework.cloud</groupId&g ...
- 插入排序【Java]
1 package class01; 2 3 import java.util.Arrays; 4 5 public class Code03_InsertionSort { 6 7 public s ...
- 安卓AlertDialog对话面板的使用---Android开发
1 AlertDialog.Builder builder=new AlertDialog.Builder(this); 2 builder.setTitle("历史记录").se ...