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