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




































