大語言模型
一、大型語言模型(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、未來發展趨勢與潛力:
影像生成技術、人工智慧應用、創意產業