llama.cpp是一個(gè)高性能的CPU/GPU大語(yǔ)言模型推理框架,適用于消費(fèi)級(jí)設(shè)備或邊緣設(shè)備。開發(fā)者可以通過(guò)工具將各類開源大語(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è)備。開發(fā)者可以通過(guò)工具將各類開源大語(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)沒有參考價(jià)值。本文采用b3669版本,發(fā)布日期是2024年9月,參考代碼:examples/main.cpp。由于作者(Georgi Gerganov)沒有提供詳細(xì)的接口文檔,examples的代碼質(zhì)量也確實(shí)不高,因此學(xué)習(xí)曲線比較陡峭。本文旨在介紹如何使用llama.cpp進(jìn)行推理和介紹重點(diǎn)函數(shù),幫助開發(fā)人員入門,深入功能還有待研究。
系統(tǒng)初始化函數(shù):
系統(tǒng)資源釋放函數(shù):
創(chuàng)建模型和推理上下文:
它聲明在common.h中。如果你需要將模型和上下文分開創(chuàng)建可以使用llama.h中的另外兩對(duì)函數(shù):
創(chuàng)建ggml的線程池,這個(gè)過(guò)程可能和模型加速有關(guān),代碼中沒有對(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)完成。
檢查編碼器,現(xiàn)代模型大多都沒有明確定義的encodec
邏輯的重點(diǎn)是:首先,如果推理的上下文長(zhǎng)度超限,會(huì)丟棄超出部分。實(shí)際開發(fā)中可以考慮重構(gòu)這個(gè)部分的邏輯。其次,每次推理都有一個(gè)處理數(shù)量限制(n_batch),這主要是為了當(dāng)一次性輸入的內(nèi)容太多,系統(tǒng)不至于長(zhǎng)時(shí)間無(wú)響應(yīng)。最后,每次推理完成,embd都會(huì)被清理,推理完成后的信息會(huì)保存在ctx中。
首先要關(guān)注第2部分,這一段的邏輯是將用戶的輸入載入上下文中,由于用戶的輸入不需要推理,因此只需要調(diào)用llama_sampling_accept函數(shù)。第1部分只有當(dāng)用戶輸入都完成以后才會(huì)進(jìn)入,每次采樣一個(gè)token,寫進(jìn)embd。這個(gè)過(guò)程和分析預(yù)測(cè)交替進(jìn)行,直到遇到eos。
chat_add_and_format函數(shù)只負(fù)責(zé)將所有交互過(guò)程記錄在char_msgs中,對(duì)整個(gè)推理過(guò)程沒有影響。如果要實(shí)現(xiàn)用戶輸出,可以在這里處理。
通過(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ù)判斷
本文旨在介紹llama.cpp的基礎(chǔ)用法,由于Georgi Gerganov更新較快,且缺少文檔。因此可能有些解釋不夠準(zhǔn)確。如果大家對(duì)框架和本文敢興趣可以給我留言深入討論。
小編推薦閱讀機(jī)器學(xué)習(xí):神經(jīng)網(wǎng)絡(luò)構(gòu)建(下)
閱讀華為Mate品牌盛典:HarmonyOS NEXT加持下游戲性能得到充分釋放
閱讀實(shí)現(xiàn)對(duì)象集合與DataTable的相互轉(zhuǎn)換
閱讀鴻蒙NEXT元服務(wù):論如何免費(fèi)快速上架作品
閱讀算法與數(shù)據(jù)結(jié)構(gòu) 1 - 模擬
閱讀5. Spring Cloud OpenFeign 聲明式 WebService 客戶端的超詳細(xì)使用
閱讀Java代理模式:靜態(tài)代理和動(dòng)態(tài)代理的對(duì)比分析
閱讀Win11筆記本“自動(dòng)管理應(yīng)用的顏色”顯示規(guī)則
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請(qǐng)發(fā)郵件[email protected]
湘ICP備2022002427號(hào)-10 湘公網(wǎng)安備:43070202000427號(hào)© 2013~2025 haote.com 好特網(wǎng)