阿里云域名注冊好了怎么做網(wǎng)站無錫網(wǎng)站建設(shè)
文章目錄
- 1. HuggingFace模型下載
- 2. 模型推理:文本問答
1. HuggingFace模型下載
模型在 HuggingFace 下載,如果下載速度太慢,可以在 HuggingFace鏡像網(wǎng)站 或 ModelScope 進行下載。
使用HuggingFace的下載命令(需要先注冊HuggingFace賬號):
第一步:安裝 git-lfs
curl https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash
apt-get install git-lfs
第二步:下載 Qwen2-0.5B 模型
git lfs clone https://huggingface.co/Qwen/Qwen2-0.5B
下載完后的模型包括以下文件:
config.json # 模型配置文件,包含了模型的各種參數(shù)設(shè)置,例如層數(shù)、隱藏層大小、注意力頭數(shù)
generation_config.json #文本生成相關(guān)的模型配置
merges.txt #訓(xùn)練tokenizer階段所得到的合并詞表結(jié)果
model.Safetensors #模型文件
tokenizer.json #分詞器,將詞轉(zhuǎn)換為數(shù)字
tokenizer_config.json #分詞模型的配置信息,如分詞器的類型、詞匯表大小、最大序列長度、特殊標記等
vocab.json #詞表
2. 模型推理:文本問答
本文使用單卡 A100-80G 進行推理實驗
注意:使用 Qwen2 模型需要將 transformers 庫更新到最新版本
code:
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM# 從本地加載預(yù)訓(xùn)練模型
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model_path = "models/Qwen2-0.5B"
model = AutoModelForCausalLM.from_pretrained(model_path,device_map=device)
# 設(shè)置 device_map="auto" 會自動使用所有多卡
print(f"model: {model}")# 加載 tokenizer(分詞器)
# 分詞器負責(zé)將句子分割成更小的文本片段 (詞元) 并為每個詞元分配一個稱為輸入 id 的值(數(shù)字),因為模型只能理解數(shù)字。
# 每個模型都有自己的分詞器詞表,因此使用與模型訓(xùn)練時相同的分詞器很重要,否則它會誤解文本。
tokenizer = AutoTokenizer.from_pretrained(model_path, add_eos_token=True, padding_side='left')
# add_eos_token=True: 可選參數(shù),表示在序列的末尾添加一個結(jié)束標記(end-of-sequence token),這有助于模型識別序列的結(jié)束。
# padding_side='left': 可選參數(shù),表示 padding 應(yīng)該在序列的哪一邊進行,確保所有序列的長度一致。# 模型輸入
input_text = "介紹一下悉尼這座城市。"# 對輸入文本分詞
input_ids = tokenizer(input_text, return_tensors="pt").to(device)
# return_tensors="pt": 指定返回的數(shù)值序列的數(shù)據(jù)類型。"pt"代表 PyTorch Tensor,表示分詞器將返回一個PyTorch而不是TensorFlow對象# 生成文本回答
# max_new_tokens:模型生成的新的 token 的最大數(shù)量為 200
outputs = model.generate(input_ids["input_ids"], max_new_tokens=200)
print(f"type(outputs) = {type(outputs)}") # <class 'torch.Tensor'>
print(f"outputs.shape = {outputs.shape}") # torch.Size([1, 95]),outputs.shape是隨機的,是不超過200的數(shù)# 將輸出token解碼為文本
decoded_outputs = tokenizer.decode(outputs[0])
print(f"decoded_outputs: {decoded_outputs}")
模型輸出的文本回答如下:
decoded_outputs: 介紹一下悉尼這座城市。 悉尼這座城市位于澳大利亞東南部,是澳大利亞最大的城市之一。它是一個現(xiàn)代化的城市,擁有許多現(xiàn)代化的建筑和設(shè)施,如購物中心、博館、劇院和音樂廳等。悉尼的氣候宜人,四季分明,夏季炎熱,冬季寒冷,適合旅游和度假。此外,悉尼還有許多著名的景點,如悉尼歌劇院、悉尼塔、悉尼海港大橋等,這些景點吸引來自世界各地的游客。<|endoftext|>
Qwen2-0.5B 模型結(jié)構(gòu):
Qwen2ForCausalLM((model): Qwen2Model((embed_tokens): Embedding(151936, 896)(layers): ModuleList((0-23): 24 x Qwen2DecoderLayer((self_attn): Qwen2SdpaAttention((q_proj): Linear(in_features=896, out_features=896, bias=True)(k_proj): Linear(in_features=896, out_features=128, bias=True)(v_proj): Linear(in_features=896, out_features=128, bias=True)(o_proj): Linear(in_features=896, out_features=896, bias=False)(rotary_emb): Qwen2RotaryEmbedding())(mlp): Qwen2MLP((gate_proj): Linear(in_features=896, out_features=4864, bias=False)(up_proj): Linear(in_features=896, out_features=4864, bias=False)(down_proj): Linear(in_features=4864, out_features=896, bias=False)(act_fn): SiLU())(input_layernorm): Qwen2RMSNorm()(post_attention_layernorm): Qwen2RMSNorm()))(norm): Qwen2RMSNorm())(lm_head): Linear(in_features=896, out_features=151936, bias=False)
)
參考資料:Hugging Face Transformers 萌新完全指南