使用純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

補充一下:使用英文測試發現效果要稍微好一點,如圖:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章