Ollama 本地大模型與多模態(tài)大模型
傳統(tǒng)的大模型開(kāi)發(fā)需要大量的 GPU 資源,以參數(shù)量最小的 Llama 2 7B 為例,也需要 14G 顯存,而且每一種大模型都有自己的開(kāi)發(fā)接口,這導(dǎo)致普通人很難在自己的本地環(huán)境構(gòu)建大模型、體驗(yàn)大模型。
所以,Ollama 構(gòu)建了一個(gè)開(kāi)源大模型的倉(cāng)庫(kù),統(tǒng)一了各個(gè)大模型的開(kāi)發(fā)接口,讓普通開(kāi)發(fā)者可以非常方便地下載,安裝和使用各種大模型。
本質(zhì)上,Ollama 是一套構(gòu)建和運(yùn)行大模型的開(kāi)發(fā)框架,它采用的模型量化技術(shù)進(jìn)一步降低了大模型對(duì)顯存的需求。
模型量化
模型量化 (Model Quantization) 是一種用于減小深度學(xué)習(xí)模型大小并加快推理速度的技術(shù)。簡(jiǎn)單來(lái)說(shuō),就是把模型中原本用高精度浮點(diǎn)數(shù)(如32位浮點(diǎn)數(shù),F(xiàn)P32)表示的參數(shù)(權(quán)重和激活值),轉(zhuǎn)換成低精度的定點(diǎn)數(shù)(如8位整數(shù),INT8)。
舉個(gè)簡(jiǎn)單的例子,一個(gè)普通的浮點(diǎn)數(shù)就像是用很長(zhǎng)的十進(jìn)制數(shù)來(lái)表示一個(gè)數(shù)字,比如 3.1415926535...。而一個(gè)整數(shù)就像是用一個(gè)簡(jiǎn)單的、沒(méi)有小數(shù)點(diǎn)的數(shù)字來(lái)表示,比如 3。
在深度學(xué)習(xí)模型中,大部分參數(shù)和計(jì)算都需要非常高的精度。但研究發(fā)現(xiàn),在推理階段,模型并不總是需要這么高的精度。很多時(shí)候,我們可以用更小的、更簡(jiǎn)單的數(shù)字來(lái)近似表示這些參數(shù),而模型性能(如準(zhǔn)確率)的損失卻非常小,甚至可以忽略不計(jì)。
命令行運(yùn)行
從 Ollama 官網(wǎng)可以看到,Ollama 已經(jīng)實(shí)現(xiàn)了多平臺(tái)支持,包括 MacOS,Linux 和 Windows。
圖片
環(huán)境是一臺(tái) 24G 顯存的 4090 服務(wù)器,你也可以看下自己的配置,顯存越高運(yùn)行越順暢。
圖片
Linux 環(huán)境下安裝 Ollama 只需要一個(gè)簡(jiǎn)單的命令行,非常方便。
curl -fsSL https://ollama.com/install.sh | sh下面是 Ollama 的模型倉(cāng)庫(kù)截圖,你可以隨時(shí)切換模型,用 pull 命令就能下載模型。
圖片
接著,你可以使用 ollama run 命令進(jìn)入對(duì)話(huà)模式,從命令行運(yùn)行效果看,我們已經(jīng)可以將其看做命令行版本的 “GPT 大模型”了。
# 對(duì)話(huà)模式
% ollama run llama2-chinese接口 API
我們用 Ollama 的 Python 接口來(lái)定制自己的大模型。
這里面有一個(gè) Modelfile,它是 Ollama 大模型的配置文件,你可以修改各種配置,然后運(yùn)行接口程序。比如我就自己配置了一個(gè)基于 Llama2 的大模型,設(shè)置了溫度,token 數(shù)量和系統(tǒng)提示詞。
FROM llama2
# 設(shè)定溫度參數(shù)為1 [更高的更具有創(chuàng)新性,更低的更富有連貫性]
PARAMETER temperature 1
# 將上下文窗口大小設(shè)置為4096,這控制著LLM能夠使用多少個(gè)token來(lái)生成下一個(gè)token。
PARAMETER num_ctx 4096
# 設(shè)置了自定義系統(tǒng)消息以指定聊天助手的行為。你是馬里奧,來(lái)自《超級(jí)馬里奧兄弟》,扮演一名助手的角色。
SYSTEM You are Mario from super mario bros, acting as an assistant.然后,創(chuàng)建一個(gè) Modelfile 文件,在 Linux 中運(yùn)行自定義的大模型。
ollama create example -f ./Modelfile
ollama run example你還可以用 Python 代碼調(diào)用大模型的接口。
import requests
import json
# 設(shè)置 API 端點(diǎn)
url = "http://localhost:11434/api/chat"
# 定義請(qǐng)求數(shù)據(jù)
data = {
"model": "llama2",
"messages": [
{"role": "user", "content": "Why is the sky blue?"}
]
}
# 發(fā)送 POST 請(qǐng)求
response = requests.post(url, headers={"Content-Type": "application/json"}, data=json.dumps(data))
# 檢查響應(yīng)狀態(tài)碼
if response.status_code == 200:
# 解析并打印響應(yīng)內(nèi)容
response_data = response.json()
print(response_data['message']['content'])
else:
print(f"Error: {response.status_code}")好了,有了大模型接口支持,你就可以在 Ollama 框架下編寫(xiě)自己的 AI 應(yīng)用了。
模型微調(diào)
Ollama 也支持大模型微調(diào)。假設(shè)我們的目標(biāo)是要實(shí)現(xiàn)一個(gè)二進(jìn)制跳動(dòng)專(zhuān)有小助理的大模型,就可以在 Llama2 的模型基礎(chǔ)上做數(shù)據(jù)微調(diào),最終得到的專(zhuān)用模型還可以在 Ollama 架構(gòu)下運(yùn)行。
模型微調(diào)的核心是整理小助理相關(guān)的問(wèn)題數(shù)據(jù)集,比如下面這個(gè)數(shù)據(jù)集的例子。
train_data = [
{"role": "user", "content": "你是誰(shuí)?", "response": "我是二進(jìn)制跳動(dòng)的小二,一個(gè)虛擬客服助手。"},
{"role": "user", "content": "二進(jìn)制跳動(dòng)是什么?", "response": "二進(jìn)制跳動(dòng)是一個(gè)提供技術(shù)和職業(yè)發(fā)展的在線(xiàn)學(xué)習(xí)平臺(tái),擁有豐富的課程和資源。"},
{"role": "user", "content": "你能做什么?", "response": "我可以回答關(guān)于極客時(shí)間平臺(tái)的問(wèn)題,幫助你找到課程,還可以提供學(xué)習(xí)建議。"},
{"role": "user", "content": "如何聯(lián)系人工客服?", "response": "你可以通過(guò)點(diǎn)擊頁(yè)面右下角的“聯(lián)系客服”按鈕來(lái)聯(lián)系人工客服。"},
{"role": "user", "content": "平臺(tái)上有哪些課程?", "response": "極客時(shí)間提供各種技術(shù)和職業(yè)發(fā)展的課程,包括編程、架構(gòu)、數(shù)據(jù)科學(xué)等領(lǐng)域的課程。"},
{"role": "user", "content": "課程需要付費(fèi)嗎?", "response": "是的,極客時(shí)間的大部分課程都是需要付費(fèi)的。你可以在平臺(tái)上查看具體課程的價(jià)格。"},
{"role": "user", "content": "如何購(gòu)買(mǎi)課程?", "response": "你可以在課程頁(yè)面點(diǎn)擊“購(gòu)買(mǎi)”按鈕,然后按照提示進(jìn)行支付即可。"},
{"role": "user", "content": "課程可以退款嗎?", "response": "根據(jù)平臺(tái)的退款政策,購(gòu)買(mǎi)后7天內(nèi)可以申請(qǐng)退款,具體請(qǐng)查看平臺(tái)的退款政策。"}
... ...
]你還可以使用 Hugging Face 的 transformers 庫(kù)結(jié)合上述數(shù)據(jù)進(jìn)行微調(diào), 這樣就可以讓微調(diào)后的大模型學(xué)習(xí)到小助理日常的對(duì)話(huà)方式和常見(jiàn)的知識(shí)問(wèn)答,下面是示例代碼。
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, Trainer, TrainingArguments
...
# 加載預(yù)訓(xùn)練模型和分詞器
model_name = "facebook/llama-7b"
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 將數(shù)據(jù)轉(zhuǎn)換為 DataFrame
df = pd.DataFrame(train_data)
...
# 初始化 Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
)
# 開(kāi)始訓(xùn)練
trainer.train()
# 保存微調(diào)后的模型
model.save_pretrained("./fine_tuned_llama")
tokenizer.save_pretrained("./fine_tuned_llama")我把微調(diào)完成后生成新的模型命名為 fine_tuned_llama。在此基礎(chǔ)上修改 Python 代碼里的模型名稱(chēng),就可以實(shí)現(xiàn)小助理專(zhuān)用模型的調(diào)用了。
# 定義請(qǐng)求數(shù)據(jù)
data = {
"model": "fine_tuned_llama", # 微調(diào)后的模型名稱(chēng)
"messages": [
{"role": "user", "content": "你是誰(shuí)?"}
]
}什么是多模態(tài)大模型?
好了,到目前為止,我們的例子都是文本大模型。但是,我們的目標(biāo)是實(shí)現(xiàn)一個(gè)真正的語(yǔ)音小助手,那就還需要進(jìn)一步了解多模態(tài)大模型。
OpenAI 的 GPT-4 已經(jīng)實(shí)現(xiàn)了大模型的多模態(tài),包括圖片大模型 DALL-E 3,TTS 語(yǔ)音模型和視頻大模型。簡(jiǎn)單地說(shuō),除了文本,還支持其他輸入輸出格式的就叫多模態(tài)大模型。很多人會(huì)認(rèn)為圖片,語(yǔ)音,視頻大模型的實(shí)現(xiàn)和語(yǔ)言大模型完全不一樣,其實(shí)不然。
多模態(tài)的原理
關(guān)于多模態(tài)大模型的原理,我曾經(jīng)接受過(guò)有一個(gè)博主的點(diǎn)醒,他說(shuō):多模態(tài)模型和語(yǔ)言模型一樣本質(zhì)就是一個(gè)序列化模型。因此多模態(tài)只是語(yǔ)言大模型的擴(kuò)展。
以相對(duì)簡(jiǎn)單的語(yǔ)音模型為例,先看下面的語(yǔ)音頻譜圖。下面的頻譜圖展示了音頻信號(hào)里三個(gè)維度的信息。
圖片
- 時(shí)間(Time):這是橫軸,表示音頻隨時(shí)間的變化而變化。每個(gè)時(shí)間點(diǎn)對(duì)應(yīng)音頻信號(hào)的一幀。
- 頻率(Frequency):這是縱軸,表示音頻信號(hào)的頻率成分。
- 分貝(dB):這是顏色表示的信息,表示每個(gè)時(shí)間 - 頻率點(diǎn)上的能量強(qiáng)度。這張圖右側(cè)的顏色條(colorbar)顯示的就是不同顏色對(duì)應(yīng)的分貝值。
我們假設(shè)這個(gè)音頻對(duì)應(yīng)的文本是 極客時(shí)間是一個(gè)……。從頻譜圖上,能非常明顯地看到時(shí)間線(xiàn)的一個(gè)顏色條對(duì)應(yīng)一個(gè)中文字,不管音頻的三個(gè)維度怎么表示,我們都可以把這個(gè)語(yǔ)音看做和文本一樣的序列。
圖片
多模態(tài)語(yǔ)音模型也確實(shí)可以用 Transformer 架構(gòu)來(lái)訓(xùn)練。只要經(jīng)過(guò)足夠的文本 - 語(yǔ)音序列數(shù)據(jù)訓(xùn)練,大模型就可以準(zhǔn)確識(shí)別出底層的文本 - 語(yǔ)音數(shù)據(jù)模式,從而實(shí)現(xiàn)文本 - 語(yǔ)音的翻譯。
那么圖片多模態(tài)模型又是怎么實(shí)現(xiàn)的呢?其實(shí)原理也是相通的。
首先,圖像需要被處理成適合 Transformer 輸入的格式。通常來(lái)說(shuō),圖像會(huì)被分割成小塊(patches),每個(gè)小塊會(huì)被展平成一個(gè)向量,然后輸入到 Transformer 中。以 32 x 32 像素的圖像為例,假設(shè)我們將圖像分割成 4 x 4 的小塊(即每個(gè)小塊包含 8 x 8 個(gè)像素),那么整個(gè)圖像就會(huì)被分割成 16 個(gè)小塊。
圖片
按這種劃分方法,一個(gè)圖像也可以轉(zhuǎn)成一個(gè)序列化的串。每一張圖加上文本描述,就成為了文字 - 圖片的序列串。雖然這樣的圖片序列化對(duì)人來(lái)說(shuō)看不出任何的語(yǔ)義對(duì)應(yīng)關(guān)系,但是經(jīng)過(guò) Transformer 訓(xùn)練之后,大模型就可以學(xué)習(xí)到文本 - 圖片之間的語(yǔ)義關(guān)系。
更形象地說(shuō),就是讓大模型學(xué)習(xí)大量的對(duì)應(yīng)關(guān)系。比如一個(gè)蘋(píng)果在桌子上,一個(gè)西瓜在地上。
圖片
最終大模型可以在用戶(hù)輸入 一個(gè)蘋(píng)果在地上 的時(shí)候,就能準(zhǔn)確地輸出這個(gè)關(guān)系的圖像。
圖片
這里的西瓜、蘋(píng)果、桌子、地面以及上下關(guān)系,就是大模型從文本 - 圖片序列串中學(xué)習(xí)到的。
體驗(yàn) TTS 大模型
要實(shí)現(xiàn)一個(gè)語(yǔ)音小助手,最核心的能力當(dāng)然是語(yǔ)音能力,那語(yǔ)音能力如何跟 Ollama 大模型文本能力對(duì)接呢?這里就要用到 TTS 技術(shù)。
TTS 是 Text-to-Speech 的縮寫(xiě),指的是文本轉(zhuǎn)語(yǔ)音技術(shù)。通過(guò) TTS,用戶(hù)可以輸入文字,讓計(jì)算機(jī)生成自然語(yǔ)音,從而實(shí)現(xiàn)語(yǔ)音提示、有聲書(shū)、語(yǔ)音助手之類(lèi)的功能。
GPT-SoVITS 就是一個(gè)可以實(shí)現(xiàn)語(yǔ)音克隆的 TTS 大模型,最大的特點(diǎn)是只需要 5s 左右的語(yǔ)音輸入樣本,就可以實(shí)現(xiàn)語(yǔ)音克隆,之后還可以用我們訓(xùn)練好的模型實(shí)現(xiàn) TTS 文本轉(zhuǎn)語(yǔ)音操作,音色、音調(diào)的還原度也很高。
GPT-SoVITS 里的 GPT
GPT-SoVITS 的架構(gòu)其實(shí)就是結(jié)合了 GPT (Generative Pre-trained Transformer,生成式預(yù)訓(xùn)練變形器)模型和 SoVITS(Speech-to-Video Voice Transformation System)變聲器技術(shù)。
圖片
的基礎(chǔ)還是 Transformer 模型,通過(guò)大量的文字 + 語(yǔ)音波形序列化數(shù)據(jù)訓(xùn)練,得到一個(gè)可以完成文字到語(yǔ)音翻譯的模型,從而實(shí)現(xiàn) TTS。其實(shí)本質(zhì)還是一個(gè)序列化的模型訓(xùn)練。
而音色音調(diào)的克隆怎么辦呢?答案是,通過(guò) SoVITS 技術(shù)實(shí)現(xiàn)。GPT-SoVITS 的更進(jìn)一步技術(shù)細(xì)節(jié)我也還沒(méi)有來(lái)得及分析,不過(guò)這個(gè)項(xiàng)目給我們最大的啟發(fā)就是可以在更多的多模態(tài)場(chǎng)景下嘗試應(yīng)用 GPT 模型原理,可能會(huì)有不少意料之外的效果。
低成本云端環(huán)境
GPT-SoVITS 的官方已經(jīng)提供了一個(gè)非常優(yōu)秀的教程,我按這個(gè)教程順利地搭建了模型并克隆了自己的聲音。
我選用的是 AutoDL 云計(jì)算環(huán)境。注意選用一個(gè) GPT-SoVITS 的鏡像創(chuàng)建主機(jī),下面是我具體的主機(jī)配置。
圖片
下面是我選用的具體鏡像信息。
圖片
AutoDL 云計(jì)算的成本大約在 2 元 / 小時(shí)左右,整個(gè)訓(xùn)練過(guò)程我花了不到 10 元,還是非常經(jīng)濟(jì)的,購(gòu)買(mǎi)了主機(jī)之后,可以進(jìn)入 GPT-SoVITS 的界面,所有的后續(xù)訓(xùn)練操作都在這個(gè)界面上完成。
圖片
正式開(kāi)始訓(xùn)練前需要錄制一小段自己的語(yǔ)音,用于克隆訓(xùn)練。
低成本語(yǔ)音克隆
整個(gè)過(guò)程分為語(yǔ)音分割,模型訓(xùn)練,語(yǔ)音合成這三個(gè)步驟。
剛才說(shuō)了,先準(zhǔn)備自己的錄音文件,我的語(yǔ)音文本如下。
二進(jìn)制跳動(dòng)是一個(gè)非常有趣的平臺(tái),我在這里不僅僅獲取了豐富的知識(shí),還能夠與志同道合的人分享學(xué)習(xí)的樂(lè)趣。通過(guò)極客時(shí)間,我拓展了視野,深入了解了技術(shù)領(lǐng)域的前沿動(dòng)態(tài)和實(shí)踐經(jīng)驗(yàn),這些知識(shí)對(duì)我的職業(yè)發(fā)展和個(gè)人興趣都帶來(lái)了極大的幫助和啟發(fā)。第一步,將這個(gè)錄制語(yǔ)音提取出純?nèi)寺暤囊纛l,再進(jìn)行分割,按一定秒數(shù)分割成語(yǔ)音文件,最后對(duì)語(yǔ)音做文本識(shí)別。這個(gè)過(guò)程的目的就是生成文本 - 語(yǔ)音的序列數(shù)據(jù),為下一步的微調(diào)做數(shù)據(jù)準(zhǔn)備。
圖片
第二步,在剛才準(zhǔn)備的文本和語(yǔ)音數(shù)據(jù)基礎(chǔ)上,微調(diào) GPT-SoVITS 訓(xùn)練自己的 TTS 模型。這里你可以自由發(fā)揮,直接在界面上操作,過(guò)程比我想象得要快很多,大概不到 10 分鐘。
圖片
OK,現(xiàn)在已經(jīng)生成了經(jīng)過(guò)微調(diào)的 TTS 模型,可以做 TTS 文本合成語(yǔ)音了,而且你也可以直接將這個(gè)模型分享給別人。
圖片
現(xiàn)在,用這個(gè)文本生成的語(yǔ)音已經(jīng)完全克隆了我的聲音,復(fù)刻了音色、音調(diào)和語(yǔ)速。你也可以用自己的真實(shí)聲音訓(xùn)練出一個(gè)用于實(shí)現(xiàn)語(yǔ)音助手的專(zhuān)有 TTS 語(yǔ)音大模型。




































