大模型體驗(yàn)之Qwen2模型 原創(chuàng)
前言
在上一章【??大模型的三大架構(gòu)及T5體驗(yàn)??】中,我們體驗(yàn)了Encoder-Decoder架構(gòu)的T5模型。本章內(nèi)容,我們將以Decoder-Only架構(gòu)的Qwen模型入手,了解Qwen模型結(jié)構(gòu)、聊天模板的概念以及通過大模型進(jìn)行翻譯、信息抽取等任務(wù)的嘗試。
模型選擇
訪問ModelScope官網(wǎng),在模型庫搜索??Qwen2?
?。
補(bǔ)充說明:
- Qwen2-7B是一個(gè)通用的Base模型。
Qwen2-7B-Instruct是經(jīng)過監(jiān)督微調(diào)SFT的模型,在處理指令時(shí)的表現(xiàn)通常會(huì)更好。
Qwen模型簡(jiǎn)介
Qwen2是Qwen大型語言模型的新系列,基于LLaMA架構(gòu),由Qwen團(tuán)隊(duì)進(jìn)行訓(xùn)練。
- 參數(shù)規(guī)模:Qwen2系列模型的參數(shù)范圍從0.5億到72億,Qwen2-7B對(duì)應(yīng)是70億參數(shù)規(guī)模。
- 上下文長度:Qwen2-7B-Instruct支持最長達(dá)131,072個(gè)標(biāo)記的上下文長度,能夠處理大量輸入。
- 應(yīng)用場(chǎng)景:Qwen2模型可應(yīng)用于多種自然語言處理任務(wù),包括語言理解、語言生成、多語言能力、編碼、數(shù)學(xué)推理等。
- 開源情況:Qwen2模型是開源的,Github地址:https://github.com/QwenLM/Qwen2
- 技術(shù)博客:https://qwenlm.github.io/blog/qwen2/
- 技術(shù)文檔:https://qwen.readthedocs.io/en/latest/
模型下載
第一步:?jiǎn)?dòng)ModelScope平臺(tái)的PAI-DSW的GPU環(huán)境
第二步:在終端中,輸入以下命令進(jìn)行模型下載:
git clone https://www.modelscope.cn/qwen/qwen2-7b-instruct.git
Qwen2模型目錄簡(jiǎn)介
qwen2-7b-instruct/
│
├──.gitattributes # Git屬性文件,用于配置Git的行為。
│
├── config.json # 模型配置文件,包含模型的基本參數(shù)和設(shè)置。
│
├── configuration.json # 系統(tǒng)初始化配置文件,定義系統(tǒng)啟動(dòng)時(shí)的配置。
│
├── generation_config.json # 生成配置文件,包含文本生成時(shí)的參數(shù)設(shè)置。
│
├── LICENSE # 許可證文件,說明模型的使用條款和條件。
│
├── merges.txt # 詞匯合并文件,通常用于處理子詞分割。
│
├── model-00001-of-00004.safetensors# 模型權(quán)重文件(第1部分),使用Safetensors格式存儲(chǔ)。
├── model-00002-of-00004.safetensors# 模型權(quán)重文件(第2部分),使用Safetensors格式存儲(chǔ)。
├── model-00003-of-00004.safetensors# 模型權(quán)重文件(第3部分),使用Safetensors格式存儲(chǔ)。
├── model-00004-of-00004.safetensors# 模型權(quán)重文件(第4部分),使用Safetensors格式存儲(chǔ)。
│
├── model.safetensors.index.json # 模型索引文件,包含模型權(quán)重的索引信息。
│
├── README.md # 項(xiàng)目說明文件,提供模型的使用說明和相關(guān)信息。
│
├── tokenizer.json # 分詞器配置文件,定義分詞器的參數(shù)和設(shè)置。
│
├── tokenizer_config.json # 分詞器初始化配置文件,包含分詞器的啟動(dòng)配置。
│
└── vocab.json # 詞匯表文件,列出模型可識(shí)別的所有詞匯。
模型使用
第一步:創(chuàng)建Jupyter Notebook文件
在與qwen2-7b-instruct同一目錄下,新建Jupyter Notebook文件,命名為qwen2測(cè)試.ipynb
workspace/
├── qwen2-7b-instruct/
├── qwen2測(cè)試.ipynb
第二步:運(yùn)行測(cè)試代碼 在qwen2測(cè)試.ipynb中,輸入以下代碼:
# 導(dǎo)入依賴組件
from modelscope importAutoModelForCausalLM
from modelscope importAutoTokenizer
# 判斷設(shè)備
device ="cuda"# the device to load the model onto
# 模型ID,對(duì)應(yīng)git clone的模型文件夾名稱
model_id ="qwen2-7b-instruct"
# 加載模型
model =AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype="auto",
device_map="auto"
)
# 加載分詞器
tokenizer =AutoTokenizer.from_pretrained(model_id)
# 準(zhǔn)備提示詞
messages =[
{"role":"system","content":"""
You are a helpful assistant.
"""},
{"role":"user","content":"""
中華人民共和國的首都是哪里?
"""}
]
# 應(yīng)用聊天模板
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
# 輸入內(nèi)容轉(zhuǎn)ID
model_inputs = tokenizer([text], return_tensors="pt").to(device)
# 模型預(yù)測(cè)
generated_ids = model.generate(
model_inputs.input_ids,
max_new_tokens=512
)
# 刪除問句信息
generated_ids =[
output_ids[len(input_ids):]for input_ids, output_ids inzip(model_inputs.input_ids, generated_ids)
]
# 翻譯答案
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
# 輸出結(jié)果
print(response)
運(yùn)行結(jié)果:
代碼理解
導(dǎo)入依賴及初始化部分
# 導(dǎo)入依賴組件
from modelscope import AutoModelForCausalLM
from modelscope import AutoTokenizer
# 判斷設(shè)備
device = "cuda" # the device to load the model onto
# 模型ID,對(duì)應(yīng)git clone的模型文件夾名稱
model_id = "qwen2-7b-instruct"
上述的model_id對(duì)應(yīng)本地下載的模型文件夾名稱,特別注意文件名及大小寫保持一致。
模型結(jié)構(gòu)
在Jupyter Notebook中打印??model?
?的模型結(jié)構(gòu),得到如下內(nèi)容:
Qwen2ForCausalLM(
(model):Qwen2Model(
(embed_tokens):Embedding(152064,3584)
(layers):ModuleList(
(0-27):28 x Qwen2DecoderLayer(
(self_attn):Qwen2SdpaAttention(
(q_proj):Linear(in_features=3584, out_features=3584, bias=True)
(k_proj):Linear(in_features=3584, out_features=512, bias=True)
(v_proj):Linear(in_features=3584, out_features=512, bias=True)
(o_proj):Linear(in_features=3584, out_features=3584, bias=False)
(rotary_emb):Qwen2RotaryEmbedding()
)
(mlp):Qwen2MLP(
(gate_proj):Linear(in_features=3584, out_features=18944, bias=False)
(up_proj):Linear(in_features=3584, out_features=18944, bias=False)
(down_proj):Linear(in_features=18944, out_features=3584, bias=False)
(act_fn):SiLU()
)
(input_layernorm):Qwen2RMSNorm()
(post_attention_layernorm):Qwen2RMSNorm()
)
)
(norm):Qwen2RMSNorm()
)
(lm_head):Linear(in_features=3584, out_features=152064, bias=False)
)
- Qwen2ForCausalLM 是一個(gè)Decoder-Only結(jié)構(gòu)模型。
- ?
?embed_tokens?
? 對(duì)應(yīng)輸出層的上文處理外掛部分。 - ?
?layers?
? 對(duì)應(yīng)Decoder部分,由28個(gè)Qwen2DecoderLayer構(gòu)成。
??self_attn?
? 對(duì)應(yīng)mask自注意力機(jī)制部分。由于Decoder-Only結(jié)構(gòu),所以該模型沒有融合注意力機(jī)制部分。
??mlp?
?:多層感知機(jī)結(jié)構(gòu)
- ?
?lm_head?
?:對(duì)應(yīng)全鏈接輸出層,負(fù)責(zé)將模型的輸出映射到詞匯表的維度。
分詞器tokenizer
在Jupyter Notebook中打印??model?
?的模型結(jié)構(gòu),得到如下內(nèi)容:
Qwen2TokenizerFast(name_or_path='qwen2-7b-instruct', vocab_size=151643,
model_max_length=131072, is_fast=True, padding_side='right',
truncation_side='right',
special_tokens={
'eos_token':'<|im_end|>',
'pad_token':'<|endoftext|>',
'additional_special_tokens':['<|im_start|>','<|im_end|>']},
clean_up_tokenization_spaces=False),
added_tokens_decoder={
151643:AddedToken("<|endoftext|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
151644:AddedToken("<|im_start|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
151645:AddedToken("<|im_end|>", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
}
- ?
?vocab_size?
?:詞匯表包含151,643個(gè)詞匯。 - ?
?model_max_length?
?:支持的最大輸入長度為131,072個(gè)token。 - 特殊標(biāo)記有:
??<|im_start|>?
?: 表示開始一個(gè)對(duì)話。
??<|im_end|>?
?: 表示結(jié)束一個(gè)對(duì)話。
??|endoftext|?
?: 表示文本結(jié)束。
查看參數(shù)量
total_params = sum(p.numel() for p in model.parameters())
print(f"模型參數(shù)總量: {total_params}")
# 運(yùn)行結(jié)果:
# 模型參數(shù)總量: 7615616512
使用上述測(cè)試可以查看模型的參數(shù)量,對(duì)應(yīng)為76億。
message
messages = [
{"role": "system", "content": """
You are a helpful assistant.
"""},
{"role": "user", "content": """
中華人民共和國的首都是哪里?
"""}
]
- ?
?messages?
? 是一個(gè)包含對(duì)話信息的列表。 - 每個(gè)消息都有一個(gè)?
?role?
? 字段,表示消息的發(fā)送者角色。常見的角色有:
??"system"?
?:系統(tǒng)角色,用于設(shè)置助手的行為或提供上下文信息。
??"user"?
?:用戶角色,表示提問或請(qǐng)求的內(nèi)容。
- 每個(gè)消息都有一個(gè)?
?content?
? 字段,包含具體的文本內(nèi)容。這個(gè)字段存儲(chǔ)了角色所傳達(dá)的信息。
聊天模板
在Jupyter Notebook中打印??text?
?,得到如下內(nèi)容:
'<|im_start|>system\n\n
You are a helpful assistant.\n
<|im_end|>\n<|im_start|>user\n\n
中華人民共和國的首都是哪里?\n
<|im_end|>\n<|im_start|>assistant\n'
- ? 以上內(nèi)容即傳入給模型的上文內(nèi)容,然后由大模型進(jìn)行自回歸式補(bǔ)全,其原理與【課程總結(jié)】day21(上):Transformer源碼深入理解之預(yù)測(cè)過程類似
模型輸出
在Jupyter Notebook中,使用以下測(cè)試代碼,可以看到模型輸出的原始內(nèi)容。
# 模型預(yù)測(cè)
generated_ids = model.generate(
model_inputs.input_ids,
max_new_tokens=512
)
# 刪除問句信息
# generated_ids = [
# output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
# ]
# 翻譯答案
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=False)[0]
# 輸出結(jié)果
print(response)
輸出結(jié)果:
<|im_start|>system
You are a helpful assistant.
<|im_end|>
<|im_start|>user
中華人民共和國的首都是哪里?
<|im_end|>
<|im_start|>assistant
中華人民共和國的首都是北京。<|im_end|>
- 將?
?skip_special_tokens?
? 設(shè)置為False,可以輸出完整的對(duì)話內(nèi)容。如果改為True,則輸出內(nèi)容會(huì)去掉im_start等特殊字符。
streamlit調(diào)用模型
為了便于修改message的內(nèi)容,接下來我們通過streamlit搭建一個(gè)簡(jiǎn)易的調(diào)用Qwen2的頁面,來測(cè)試模型的不同任務(wù)勝任能力。
安裝streamlit
pip install streamlit
下載模型
實(shí)測(cè)Qwen2-7B模型在魔搭社區(qū)GPU環(huán)境上運(yùn)行會(huì)因?yàn)轱@存不足,導(dǎo)致無法有效運(yùn)行,所以這里我們選擇使用Qwen2-0.5B-Instruction模型。
git clone https://www.modelscope.cn/qwen/Qwen2-0.5B-Instruct.git
創(chuàng)建代碼
創(chuàng)建app.py文件,代碼內(nèi)容如下:
import streamlit as st
from modelscope importAutoModelForCausalLM,AutoTokenizer
import torch
# 判斷設(shè)備
device ="cuda"if torch.cuda.is_available()else"cpu"
# 模型ID
model_id ="Qwen2-0.5B-Instruct"
# 加載模型
model =AutoModelForCausalLM.from_pretrained(model_id).to(device)
tokenizer =AutoTokenizer.from_pretrained(model_id)
# Streamlit 頁面標(biāo)題
st.title("聊天助手")
# 輸入系統(tǒng)內(nèi)容
system_content = st.text_area("輸入系統(tǒng)內(nèi)容","You are a helpful assistant.")
# 輸入用戶內(nèi)容
user_content = st.text_area("輸入用戶內(nèi)容","中華人民共和國的首都是哪里?")
# 提交按鈕
if st.button("獲取回答"):
# 準(zhǔn)備提示詞
messages =[
{"role":"system","content": system_content},
{"role":"user","content": user_content}
]
# 應(yīng)用聊天模板
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
# 輸入內(nèi)容轉(zhuǎn)ID
model_inputs = tokenizer([text], return_tensors="pt").to(device)
# 模型預(yù)測(cè)
generated_ids = model.generate(
model_inputs.input_ids,
max_new_tokens=512
)
# 刪除問句信息
generated_ids =[
output_ids[len(input_ids):]for input_ids, output_ids inzip(model_inputs.input_ids, generated_ids)
]
# 翻譯答案
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
# 輸出結(jié)果
st.subheader("模型回答")
st.write(response)
運(yùn)行代碼
在終端中運(yùn)行以下命令
streamlit run app.py
啟動(dòng)后點(diǎn)擊??Local URL: http://localhost:8501?
? 得到如下效果:
特別說明:在使用streamlit啟動(dòng)頁面前,請(qǐng)?jiān)诮K端命令行中使用 ?
?nvidia-smi?
? 查看顯存的釋放情況;如果顯存未釋放,建議在Jupyter Notebook中Shutdown Kernel以便釋放顯存。
大模型能力
大模型有著非常強(qiáng)的能力,通過修改system和user中的內(nèi)容,可以勝任不同的任務(wù)。
翻譯任務(wù)
在streamlit頁面中編輯框中輸入對(duì)應(yīng)內(nèi)容:
- 系統(tǒng)內(nèi)容:?
?你是一個(gè)翻譯助手,請(qǐng)將輸入的文本翻譯成英文。?
? - 用戶內(nèi)容:?
?中國隊(duì)在巴黎奧運(yùn)會(huì)中取得了11金7銀6銅的成績(jī),?位列獎(jiǎng)牌榜首位。??
?
運(yùn)行結(jié)果:
情感識(shí)別任務(wù)
- 系統(tǒng)內(nèi)容:?
?你是一個(gè)情感識(shí)別機(jī)器人,請(qǐng)將用戶的輸入做情感分類。
?
如果是正面的情感,請(qǐng)輸出:正面
如果是負(fù)面的情感,請(qǐng)輸出:負(fù)面
如果是中性的情感,請(qǐng)輸出:中性? - 用戶內(nèi)容:?
?送餐快,態(tài)度也特別好,辛苦啦謝謝?
?
運(yùn)行結(jié)果:
說明:
- 大模型的能力確實(shí)很強(qiáng),分類效果遠(yuǎn)遠(yuǎn)好于之前的機(jī)器學(xué)習(xí)模型。
信息提取任務(wù)
- 系統(tǒng)內(nèi)容:?
?你是一個(gè)信息抽取機(jī)器人,請(qǐng)從用戶的投訴中抽取核心信息,輸出格式請(qǐng)參考:
?
{
'name':'投訴人的姓名',
‘phone’:'投訴人的電話號(hào)碼',
'reason':'投訴原因',
'appeal':'投訴人期望的解決辦法',
},
請(qǐng)意:務(wù)必嚴(yán)格按照用戶輸入來抽取信息,切記隨意捏造答案!如果沒有相關(guān)的信息,請(qǐng)直接把該字段賦值為"不知道"。? - 用戶內(nèi)容:?
?我是樓下的小李子,家里快遞丟了3天了,給你們打電話也打不通!趕緊處理!否則,我要給撥打市長熱線了。?
?運(yùn)行結(jié)果:
閱讀理解任務(wù)
- 系統(tǒng)內(nèi)容:?
?你是一個(gè)閱讀理解機(jī)器人,請(qǐng)認(rèn)真閱讀用戶的輸入內(nèi)容,嚴(yán)格根據(jù)文章的內(nèi)容來回答用戶的問題。
?
注意:如果文章中沒有出現(xiàn)相關(guān)問題的答案,請(qǐng)直接回答"不知道"。? - 用戶內(nèi)容:?
?諸葛亮(181年—234年10月8日),字孔明,號(hào)臥龍,瑯琊陽都(今山東省沂南縣)人 [126],三國時(shí)期蜀漢丞相,中國古代杰出的政治家、軍事家、戰(zhàn)略家 [256]、發(fā)明家、文學(xué)家。 [164]
?
諸葛亮早年隨叔父諸葛玄到荊州,諸葛玄死后,諸葛亮躬耕于南陽。 [1-4]劉備依附荊州劉表時(shí)三顧茅廬,諸葛亮向劉備提出占據(jù)荊州、益州,聯(lián)合孫權(quán)共同對(duì)抗曹操的《隆中對(duì)》,劉備根據(jù)諸葛亮的策略,成功占領(lǐng)荊州、益州之地,與孫權(quán)、曹操形成三足鼎立之勢(shì)。章武元年(221年),劉備稱帝,任命諸葛亮為丞相。劉備伐吳于夷陵之戰(zhàn)失敗后,劉備于永安托孤于諸葛亮。劉禪繼位后,封諸葛亮為武鄉(xiāng)侯,領(lǐng)益州牧。諸葛亮勤勉謹(jǐn)慎,大小政事必親自處理,賞罰嚴(yán)明;與東吳聯(lián)盟,改善和西南各族的關(guān)系;實(shí)行屯田政策,加強(qiáng)戰(zhàn)備。諸葛亮前后五次北伐中原,但未能實(shí)現(xiàn)興復(fù)漢室的目標(biāo)。終因積勞成疾,于建興十二年(234年)病逝于五丈原(今陜西省寶雞市岐山境內(nèi)),享年五十四歲 [5]。后主劉禪追謚為忠武侯,后世常以“武侯”尊稱。東晉桓溫追封為“武興王”。 [6]
諸葛亮散文代表作有《出師表》《誡子書》等。曾發(fā)明木牛流馬、孔明燈等,并改造連弩,叫作諸葛連弩,可一弩十矢俱發(fā)。 [162]諸葛亮一生“鞠躬盡瘁,死而后已”,是中國傳統(tǒng)文化中“忠臣”與“智者”的代表人物。
諸葛亮的注明著作是什么??
運(yùn)行結(jié)果:
文本摘要任務(wù)
- 系統(tǒng)內(nèi)容:?
?你是一個(gè)文本摘要機(jī)器人,請(qǐng)將用戶輸入的文章輸出摘要,要求100字以內(nèi)。?
? - 用戶內(nèi)容:?
?魯迅(1881年9月25日—1936年10月19日),原名周樟壽,后改名周樹人,字豫山,后改字豫才,浙江紹興人。中國著名文學(xué)家、思想家、革命家、教育家、美術(shù)家、書法家、民主戰(zhàn)士,新文化運(yùn)動(dòng)的重要參與者,中國現(xiàn)代文學(xué)的奠基人之一。 [181-185]
?運(yùn)行結(jié)果:
他早年與厲綏之和錢均夫同赴日本公費(fèi)留學(xué),于日本仙臺(tái)醫(yī)科專門學(xué)校肄業(yè)。 [172] [180]“魯迅”,是他在1918年發(fā)表《狂人日記》時(shí)所用的筆名,也是最為廣泛的筆名。 [1-6]
魯迅一生在文學(xué)創(chuàng)作、文學(xué)批評(píng)、思想研究、文學(xué)史研究、翻譯、美術(shù)理論引進(jìn)、基礎(chǔ)科學(xué)介紹和古籍??迸c研究等多個(gè)領(lǐng)域具有重大貢獻(xiàn)。他對(duì)于五四運(yùn)動(dòng)以后的中國社會(huì)思想文化發(fā)展具有重大影響,蜚聲世界文壇,尤其在韓國、日本思想文化領(lǐng)域有極其重要的地位和影響,被譽(yù)為“二十世紀(jì)東亞文化地圖上占最大領(lǐng)土的作家”。?
回想2019年在搜狗時(shí),參加了一年一度的《黑客馬拉松大賽》,其中我們小組的主題就是進(jìn)行文本摘要提取。當(dāng)時(shí)只是使用word2vec詞向量提取后進(jìn)行機(jī)器學(xué)習(xí),雖然創(chuàng)意較好,但是效果并不理想。如今對(duì)比大模型的效果,真是感慨技術(shù)進(jìn)步之快。
少樣本學(xué)習(xí)推理任務(wù)
- 系統(tǒng)內(nèi)容:?
?請(qǐng)學(xué)習(xí)下面用戶給定的樣本,據(jù)此做出相關(guān)的推理:
?
{'input':'北京', 'output':'北京烤鴨'}
{'input':'山西', 'output':'肉夾饃'}? - 用戶內(nèi)容:?
? 蘭州?
?運(yùn)行結(jié)果:
內(nèi)容小結(jié)
- Qwen系列模型是Decoder-Only模型,其中Qwen2-7B-Instruct是經(jīng)過監(jiān)督微調(diào)SFT的模型,參數(shù)支持70億。
- Qwen模型可以支持多種任務(wù),如:翻譯任務(wù)、信息提取、情感識(shí)別、文本摘要、少樣本學(xué)習(xí)推理任務(wù)等。
?
本文轉(zhuǎn)載自公眾號(hào)一起AI技術(shù) 作者:熱情的Dongming
