在本地跑一個大語言模型

有何m不可發表於2024-04-02

2024-02-27 · 路邊的阿不 | 轉載自 https://babyno.top/posts/2024/02/running-a-large-language-model-locally/

隨著ChatGPT的興起,LLM (Large Language Model,大語言模型) 已經成為人工智慧和自然語言處理領域的熱門話題。本篇文章我將和大家一起在自己的個人電腦上執行一個大語言模型。

優缺點

在本地執行大語言模型有諸多優點:

  • 可以保護隱私
  • 不會產生昂貴的費用
  • 可以無視網路問題
  • 可以嚐鮮各種開源模型

我認為前兩個優點已經足夠大家去折騰了吧。每個人總有一些隱私資料不願意傳送給第三方吧,如果能在本地甚至不聯網的情況下使用AI來處理隱私資料,是不是相當完美呢?另外在本地,無論跑多少資料,都不需要支付介面和令牌費用,心動了嗎?

有優點,當然也有缺點:

  • 小白勸退
  • 開源模型與商用模型相比,“智商”堪憂
  • 個人電腦配置較弱,不可能把模型的全部實力跑出來

但好在開源世界裡工具超多,“智商”這種東西,可以透過工具慢慢“調教”。我相信只要你願意折騰,一定能調教出一個令你自己滿意的模型。

工具選擇

我主要介紹3個本地執行LLM的工具:

  • LMStudio
  • llamafile
  • Ollama

這三個工具我都使用過,使用方法大同小異,安裝也都很簡單,有興趣的可以都試一試。但是從穩定性和便利性來講,我會推薦Ollama

執行Ollama

安裝

Ollama的安裝可以在官網下載安裝包,根據自己的作業系統下載對應的安裝包就行了。雖然提供了安裝包,但是並沒有提供GUI介面,所有操作都是需要命令列操作。

拉取模型

安裝完後第一步是要拉取一個模型,該命令和docker的命令非常類似:

1
2
3
4
5
# 安裝模型
ollama pull llama2

# 刪除模型
ollama rm llama2

說到模型,就很有意思了,首先,你可以去官網尋找並下載自己心儀的模型。目前各大公司都或多或少開源了自己的大語言模型,你在各種新聞上應該也聽過不少。但如果你是一個初學者的話,我在這裡推薦幾個模型:

  • llama2(臉書母公司Meta釋出的大語言模型)
  • mistral (法國AI公司釋出的大語言模型)
  • qwen (阿里巴巴釋出的大語言模型,通義千問都聽說過吧)
  • llava (可以進行圖片識別的大語言模型)

為什麼說很有意思呢?因為這些大廠開源的這些模型,都不是它們最強的模型,換句話說,都留了一手,因為最強模型都留著自己商用呢。這就意味著這些模型剛拿到手裡都或多或少有點“智障”,一開始並不能很好的理解你的意圖給你很好的回答。這也就造成了後面說的需要“調教”的原因。

模型引數

使用ollama pull llama2命令拉取的模型是預設引數,如果你對引數有需求,可以點選模型的Tags標籤,自行選擇合適的引數。

這裡科普下主要的一些引數說明:

  • 2b, 7b, 13b
    • 模型訓練時的引數數量,b代表億。越大結果越精確,相應的也越佔資源,同時生成結果所需的時間也越長。7B至少需要8G記憶體,13B至少需要16G記憶體。
  • instruct, chat, text
    • instruct, chat更適合聊天,text更適合內容生成(參看Ollama API)。
  • q2, q4, q8
    • 模型量化值,同樣越大越精確,但越佔記憶體,同時生成結果所需的時間也越長。

這些引數根據你的電腦配置自行選擇,我的M1晶片MacBook一般都選擇7b_q8

執行

拉取完模型後,可以使用ollama list命令檢視一下所有已安裝的模型。接下來就可以執行Ollama了。

Ollama的執行方式有兩種,一種是命令列方式,輸入ollama serve即可啟動服務。另一種是點選App的快捷方式執行,這種方式會在狀態列出現一個ollama的圖示。無論哪種方式,啟動服務後都會佔用11434埠。

此時你可以使用任何支援修改API地址的ChatGPT客戶端連線Ollama(因為最新版的Ollama已經適配了OpenAI的API)。另外,某些APP如果適配Llama API介面的話,也可以直接配置:

Ollama API

API文件在這裡,這裡我只介紹兩個。

1
2
POST /api/generate
POST /api/chat

第一個是內容生成,第二個是與模型聊天。兩個API所需的引數不同,具體可以檢視文件這裡不做贅述。這裡主要聊一聊的是這兩個介面的區別。

generate介面強調的是生成,因此你需要一次性把提示都給到它,這樣才能生成更理想的結果。

chat介面強調的是聊天,也是目前大部分ChatGPT客戶端使用的場景,與模型有來有回的聊天,每次聊天都會帶上之前的所有上下文。因此可以與模型聊天幾個來回後逐步把提示給到它。

模型測試

接下來我們寫一個指令碼來測試一下各個模型在內容生成方面表現如何。

首先,安裝相應的包:pip install ollama

然後編寫一個python指令碼,這個指令碼定義了幾個簡單的角色:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import ollama


roles = {
    'english_translator': 'Translate `%s` to English.',
    'chinese_translator': 'Translate `%s` to Chinese.',
    'supervisor': "Explain `%s` like I'm a 5 year old.",
    'professional': "Explain `%s` as a professional.",
    'generator': "%s",
    'content_creator': 'Expand your writing according to the prompts given: `%s`',
}

models = {
    'mistral': 'mistral:7b-instruct-v0.2-q8_0',
    'qwen': 'qwen:7b-q8_0',
    'gemma': 'gemma:7b-instruct-q8_0',
    'llama2': 'llama2-uncensored:7b-chat-q8_0',
    'llava': 'llava:7b-v1.6-mistral-q8_0',
    'codellama': 'codellama:7b-instruct-q8_0',
}

class Assistant:
    def __init__(self, model_key, role_key) -> None:
        self.role_prompt = roles[role_key]
        self.model = models[model_key]


    def work(self, user_prompt):
        print(user_prompt)
        response = ollama.generate(
            model=self.model,
            # format='json',
            options={'temperature': 0.7},
            prompt=self.role_prompt % user_prompt,
            stream=True
        )

        for chunk in response:
            print(chunk['response'], end='', flush=True)


if __name__ == "__main__":
    assistant = Assistant('llama2', 'chinese_translator')
    assistant.work("Note: It is important to wear protective gear while handling these ingredients as they are highly corrosive and can cause serious burns if not handled properly.")

這個指令碼很簡單,大家可以在自己的電腦上執行一下。透過我的觀察,結論為:大部分語言模型對中文的支援都不好,中翻英還可以,英翻中、日翻中很多都沒法看。“通義千問”是中文方面表現最出色的。但是“通義千問”的回答總是會出現一些莫名其妙的發散令人大跌眼鏡。

以下是3個模型對“中國四大名著”的答案。

看來是時候需要對模型進行進一步的調教了。

相關文章