您的位置:首頁(yè) > 軟件教程 > 教程 > llama.cpp:一個(gè)適用于中小型研發(fā)企業(yè)的高性能CPU/GPU大語(yǔ)言模型推理框架

llama.cpp:一個(gè)適用于中小型研發(fā)企業(yè)的高性能CPU/GPU大語(yǔ)言模型推理框架

來(lái)源:好特整理 | 時(shí)間:2024-10-06 09:55:16 | 閱讀:65 |  標(biāo)簽: a 一個(gè) C 高性能   | 分享到:

llama.cpp是一個(gè)高性能的CPU/GPU大語(yǔ)言模型推理框架,適用于消費(fèi)級(jí)設(shè)備或邊緣設(shè)備。開(kāi)發(fā)者可以通過(guò)工具將各類開(kāi)源大語(yǔ)言模型轉(zhuǎn)換并量化成gguf格式的文件,然后通過(guò)llama.cpp實(shí)現(xiàn)本地推理。經(jīng)過(guò)我的調(diào)研,相比較其它大模型落地方案,中小型研發(fā)企業(yè)使用llama.cpp可能是唯一的產(chǎn)品落地

llama.cpp是一個(gè)高性能的CPU/GPU大語(yǔ)言模型推理框架,適用于消費(fèi)級(jí)設(shè)備或邊緣設(shè)備。開(kāi)發(fā)者可以通過(guò)工具將各類開(kāi)源大語(yǔ)言模型轉(zhuǎn)換并量化成gguf格式的文件,然后通過(guò)llama.cpp實(shí)現(xiàn)本地推理。經(jīng)過(guò)我的調(diào)研,相比較其它大模型落地方案,中小型研發(fā)企業(yè)使用llama.cpp可能是唯一的產(chǎn)品落地方案。關(guān)鍵詞:“中小型研發(fā)企業(yè)”,“產(chǎn)品落地方案”。

中小型研發(fā)企業(yè):相較動(dòng)輒千萬(wàn)+的硬件投入,中小型研發(fā)企業(yè)只能支撐少量硬件投入,并且也缺少專業(yè)的研發(fā)人員。

產(chǎn)品落地方案:項(xiàng)目需要具備在垂直領(lǐng)域落地的能力,大多數(shù)情況下還需要私有化部署。

網(wǎng)上有不少介紹的文章,B站上甚至有一些收費(fèi)課程。但是版本落后較多,基本已經(jīng)沒(méi)有參考價(jià)值。本文采用b3669版本,發(fā)布日期是2024年9月,參考代碼:examples/main.cpp。由于作者(Georgi Gerganov)沒(méi)有提供詳細(xì)的接口文檔,examples的代碼質(zhì)量也確實(shí)不高,因此學(xué)習(xí)曲線比較陡峭。本文旨在介紹如何使用llama.cpp進(jìn)行推理和介紹重點(diǎn)函數(shù),幫助開(kāi)發(fā)人員入門,深入功能還有待研究。

llama.cpp:一個(gè)適用于中小型研發(fā)企業(yè)的高性能CPU/GPU大語(yǔ)言模型推理框架

一、推理流程

1. 過(guò)程描述

以常見(jiàn)的交互推理為例,程序大概可以分成5個(gè)子功能模塊。

2. 概念介紹

角色(roles):大語(yǔ)言模型通常會(huì)內(nèi)置三種角色:系統(tǒng)(system),用戶(user),助手(assistant)。這三種角色并非所有模型統(tǒng)一指定,但是基本目前所有開(kāi)源的大模型都兼容這三種角色的交互,它有助于大模型更好的理解人類語(yǔ)境并完成任務(wù)。system表示系統(tǒng)提示詞,就是我們常說(shuō)的prompt。網(wǎng)上有不少課程將寫(xiě)系統(tǒng)提示詞描述為提示詞工程,還煞有介事的進(jìn)行分類,其實(shí)大可不必。從我的使用經(jīng)驗(yàn)看,一個(gè)好的系統(tǒng)提示詞(prompt)應(yīng)具備三個(gè)要點(diǎn)即可:語(yǔ)義明確,格式清晰,任務(wù)簡(jiǎn)單。語(yǔ)義明確即在系統(tǒng)提示詞中盡量不要使用模棱兩可的詞語(yǔ),用人話說(shuō)就是“把問(wèn)題說(shuō)清楚”。格式清晰即可以使用markdown或者json指定一些重要概念。如果你需要讓大模型按照某個(gè)固定流程進(jìn)行分析,可以使用markdown的編號(hào)語(yǔ)法,如果你需要將大模型對(duì)推理結(jié)果進(jìn)行結(jié)構(gòu)化處理,可以使用json語(yǔ)法。任務(wù)簡(jiǎn)單即不要讓大模型處理邏輯太復(fù)雜或者流程太多的任務(wù)。大模型的推理能力完全基于語(yǔ)義理解,它并不具備嚴(yán)格意義上的程序執(zhí)行邏輯和數(shù)學(xué)運(yùn)算邏輯。這就是為什么,當(dāng)你問(wèn)大模型:1.11和1.8誰(shuí)大的時(shí)候,它會(huì)一本正經(jīng)的告訴你,當(dāng)整數(shù)部分一樣大的時(shí)候,僅需要比較小數(shù)部分,因?yàn)?1大于8,因此1.11大于1.8。那么如果我們現(xiàn)實(shí)中確實(shí)有一些計(jì)算任務(wù)或復(fù)雜的流程需要處理怎么辦?我的解決方案是,與程序交互和動(dòng)態(tài)切換上下文。除了系統(tǒng)角色以外,用戶一般代表輸入和助手一般代表輸出。

3. 程序結(jié)構(gòu)

llama.cpp的程序結(jié)構(gòu)比較清晰,核心模塊是llama和ggmll。ggml通過(guò)llama進(jìn)行調(diào)用,開(kāi)發(fā)通常不會(huì)直接使用。在llama中定義了常用的結(jié)構(gòu)體和函數(shù)。common是對(duì)llama中函數(shù)功能的再次封裝,有時(shí)候起到方便調(diào)用的目的。但是版本迭代上,common中的函數(shù)變化較快,最好的方法是看懂流程后直接調(diào)用llama.h中的函數(shù)。

4. 源碼分析

下面我以examples/main/main.cpp作為基礎(chǔ)做重點(diǎn)分析。

(1) 初始化

全局參數(shù),這個(gè)結(jié)構(gòu)體主要用來(lái)接收用戶輸入和后續(xù)用來(lái)初始化模型與推理上下文。

系統(tǒng)初始化函數(shù):

系統(tǒng)資源釋放函數(shù):

創(chuàng)建模型和推理上下文:

它聲明在common.h中。如果你需要將模型和上下文分開(kāi)創(chuàng)建可以使用llama.h中的另外兩對(duì)函數(shù):

創(chuàng)建ggml的線程池,這個(gè)過(guò)程可能和模型加速有關(guān),代碼中沒(méi)有對(duì)它的詳細(xì)解釋:

除了完成一般的推理任務(wù),llama.cpp還實(shí)現(xiàn)了上下文存儲(chǔ)與讀取。上下文切換的前提是不能換模型,且僅首次推理接收用戶輸入的prompt。利用這個(gè)特性,可以實(shí)現(xiàn)上下文的動(dòng)態(tài)切換。

至此,有關(guān)系統(tǒng)初始化模塊的過(guò)程已經(jīng)完成。

(2) 用戶輸入

為了接收用戶輸入和推理輸出,源碼集中定義了幾個(gè)變量:

檢查編碼器,現(xiàn)代模型大多都沒(méi)有明確定義的encodec

(3) 分析預(yù)測(cè)

分析預(yù)測(cè)部分的核心代碼如下,我將處理關(guān)注力和session的邏輯刪除,僅保留推理部分的邏輯。

邏輯的重點(diǎn)是:首先,如果推理的上下文長(zhǎng)度超限,會(huì)丟棄超出部分。實(shí)際開(kāi)發(fā)中可以考慮重構(gòu)這個(gè)部分的邏輯。其次,每次推理都有一個(gè)處理數(shù)量限制(n_batch),這主要是為了當(dāng)一次性輸入的內(nèi)容太多,系統(tǒng)不至于長(zhǎng)時(shí)間無(wú)響應(yīng)。最后,每次推理完成,embd都會(huì)被清理,推理完成后的信息會(huì)保存在ctx中。

(4) 推理采樣

采樣推理部分的源碼分兩個(gè)部分:

首先要關(guān)注第2部分,這一段的邏輯是將用戶的輸入載入上下文中,由于用戶的輸入不需要推理,因此只需要調(diào)用llama_sampling_accept函數(shù)。第1部分只有當(dāng)用戶輸入都完成以后才會(huì)進(jìn)入,每次采樣一個(gè)token,寫(xiě)進(jìn)embd。這個(gè)過(guò)程和分析預(yù)測(cè)交替進(jìn)行,直到遇到eos。

chat_add_and_format函數(shù)只負(fù)責(zé)將所有交互過(guò)程記錄在char_msgs中,對(duì)整個(gè)推理過(guò)程沒(méi)有影響。如果要實(shí)現(xiàn)用戶輸出,可以在這里處理。

二、關(guān)鍵函數(shù)

通過(guò)gpt_params初始化llama_model_params

創(chuàng)建大模型指針

創(chuàng)建ggml線程池和設(shè)置線程池

通過(guò)gpt_params初始化llama_context_params

對(duì)輸入進(jìn)行分詞并轉(zhuǎn)換成token

獲取特殊token

批量處理token并進(jìn)行預(yù)測(cè)

執(zhí)行采樣和接收采樣

將token轉(zhuǎn)成自然語(yǔ)言

判斷推理是否結(jié)束,注意,這個(gè)token可能和llama_token_eos獲取的不一致。因此一定要通過(guò)這個(gè)函數(shù)判斷

三、總結(jié)

本文旨在介紹llama.cpp的基礎(chǔ)用法,由于Georgi Gerganov更新較快,且缺少文檔。因此可能有些解釋不夠準(zhǔn)確。如果大家對(duì)框架和本文敢興趣可以給我留言深入討論。

小編推薦閱讀

好特網(wǎng)發(fā)布此文僅為傳遞信息,不代表好特網(wǎng)認(rèn)同期限觀點(diǎn)或證實(shí)其描述。

a 1.0
a 1.0
類型:休閑益智  運(yùn)營(yíng)狀態(tài):正式運(yùn)營(yíng)  語(yǔ)言:中文   

游戲攻略

游戲禮包

游戲視頻

游戲下載

游戲活動(dòng)

《alittletotheleft》官網(wǎng)正版是一款備受歡迎的休閑益智整理游戲。玩家的任務(wù)是對(duì)日常生活中的各種雜亂物

相關(guān)視頻攻略

更多

掃二維碼進(jìn)入好特網(wǎng)手機(jī)版本!

掃二維碼進(jìn)入好特網(wǎng)微信公眾號(hào)!

本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請(qǐng)發(fā)郵件[email protected]

湘ICP備2022002427號(hào)-10 湘公網(wǎng)安備:43070202000427號(hào)© 2013~2024 haote.com 好特網(wǎng)