使用純c#在本地部署多模態模型,讓本地模型也可以理解影像

a1010發表於2024-04-19

之前曾經分享過純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

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

相關文章