大語言模型

dzhang發表於2024-08-08

大語言模型

一、大型語言模型(LLM)概念

1、LLM定義、特點、核心:

處理海量文字,多者可以具備數百億引數,理解語言深度,展現湧現能力

它的核心是注意力機制 :透過注意力機制,transformer能夠聚焦於輸入序列中的重要部分,類似於人類閱讀時關注關鍵詞

2、模型大小與效能關係 :

與小模型 架構相似,但引數量級提升帶來解決複雜任務的顯著優勢

3、LLM國內外代表:

國外有GPT系列、LLaMA等,國內有文心一言等,均表現強大

4、LLM應用示例:

ChatGPT是LLM的對話應用典範,展示出與人類流暢自然地互動能力

二、LLM的發展歷程

1、早期語言模型

採用統計學習預測詞彙,受限於理解複雜語言規則。

2、深度學習的引入

Bengio在2003年將深度學習應用於語言模型,增強理解語言的能力。

3、Transformer架構優勢

2018年左右,Transformer模型出現,透過大量文字訓練理解語言規
則。

4、大型語言模型時代

隨著模型規模擴大,LLM展現出驚人能力,開啟新紀元。

三、程式碼分析

1、匯入庫

from transformers import AutoModelForCausalLM, AutoTokenizer

2、將模型載入到cuda裝置上,這通常意味著使用GPU來加速模型的計算。

device = "cuda" # the device to load the model onto

3、使用AutoModelForCausalLM.from_pretrained方法載入預訓練的模型。這裡指定了模型的路徑、資料型別自動選擇、裝置對映自動選擇。

model = AutoModelForCausalLM.from_pretrained(
"/gemini/pretrain/Qwen2-0.5B-Instruct",
torch_dtype="auto",
device_map="auto"
)

4、使用AutoTokenizer.from_pretrained方法載入與模型匹配的分詞器。

tokenizer = AutoTokenizer.from_pretrained("/gemini/pretrain/Qwen2-0.5B-Instruct")

5、建立一個包含系統角色和使用者角色的訊息列表,使用者角色的內容是“你是誰?”。然後使用分詞器的apply_chat_template方法將這些訊息轉換為模型可以理解的格式。

prompt = "你是誰?"
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt}
]

6、使用分詞器將文字轉換為模型可以理解的輸入格式,並將輸入移動到之前設定的裝置上。

text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(device)

7、使用模型的generate方法生成文字,這裡設定最多生成512個新的標記(tokens)。

generated_ids = model.generate(
model_inputs.input_ids,
max_new_tokens=512
)

8、從生成的文字中移除輸入部分的標記,只保留新生成的文字。

generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

9、使用分詞器的batch_decode方法將生成的標記解碼為可讀的文字。

response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]

10、最後,列印出模型生成的文字。

print(response)

四、流式輸出

`

import torch`
`from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer`
`from threading import Thread`

`device = "cuda"`

`model_name = "/gemini/pretrain/Qwen2-0.5B-Instruct"`
`model = AutoModelForCausalLM.from_pretrained(model_name).to(device)`
`tokenizer = AutoTokenizer.from_pretrained(model_name)`
`streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)`
`messages = [`
    `{"role": "system", "content": "You are a helpful assistant."},`
`]

`

`

def stream_generate(prompt, model, tokenizer, device):`
    `messages.append({"role": "user", "content": prompt})`
    `text = tokenizer.apply_chat_template(`
        `messages,`
        `tokenize=False,`
        `add_generation_prompt=True`
    `)`
    `model_inputs = tokenizer([text], return_tensors="pt").to(device)`
    `generate_params = dict(`
        `inputs=model_inputs.input_ids,`
        `max_new_tokens=512,`
        `do_sample=True,`
        `top_k=50,`
        `temperature=0.7,`
        `pad_token_id=tokenizer.eos_token_id,`
        ``streamer=streamer`

`)`

`thread = Thread(target=model.generate, kwargs=generate_params)thread.start()`

`generated_text = ""`
`for new_text in streamer:`
    `generated_text += new_text`
    `print(new_text, end='', flush=True)`
`print()`

`#generated_text`

`messages.append({"role": "user", "content": generated_text})

`

`#多輪對話`

`while True:`
    `user_input = input("User: ")`
    `if user_input.lower() == 'exit':`
        `print("Exiting...")`
        `break`
``    

`#生成回覆並流式輸出`

`print("Assistant: ", end="")`
`stream_generate(user_input, model, tokenizer, device)v`


五、stable diffusion影像生成方法

1、主要組成部分:

文字編碼器、影像解碼器、噪聲預測器

2、特性:

模型穩定性、訓練速度快、易與最佳化與多樣性控制

3、缺點:

樣本多樣性犧牲、生成樣本速度問題

4、未來發展趨勢與潛力:

影像生成技術、人工智慧應用、創意產業

相關文章