看了看,推理文件其实和训练,评估好像是一回事,只是要减少一些过程,禁用一些调用
比如:
1。推理阶段不涉及对模型参数的更新,只进行前向传播。这意味着推理过程中不会进行反向传播和梯度计算,从而节省计算资源。
2。禁用Dropou,既 :随机丢弃:在每次训练迭代(forward pass)中,Dropout按照预定的概率(通常表示为0到1之间的值)随机选择一部分神经元,并将它们的输出设置为0。这意味着这些神经元在这次迭代中不会对网络的输出产生任何影响。(在使用PyTorch时,可以通过调用model.eval()
来关闭dropout层)
3。禁用自动梯度计算:在生成文本时,不需要计算梯度,因为这是一个前向传播过程,不涉及权重更新。这有助于提高性能并减少内存使用。
python test.py --train_data_local_path "C:\techxixi_project\AI\MobileLLM-main\basepath\good_sample.jsonl" --input_model_filename "C:\techxixi_project\AI\MobileLLM-main\125M"
咱是先列一下我的初次体验代码,
import os
import torch
import sys
#from transformers import AutoTokenizer
from transformers import AutoModelForCausalLM, LlamaTokenizerFast
from transformers import AutoConfig, AutoTokenizer
from utils.modeling_llama import LlamaForCausalLM
# 模型和分词器的本地路径
model_folder_path = r"C:\techxixi_project\AI\MobileLLM-main\125M"
model_file_name = "pytorch_model.bin" # 模型文件名
# 构建完整的文件路径
model_path = os.path.join(model_folder_path, model_file_name)
sys.setrecursionlimit(5000) # 将递归深度限制增加到 5000
# 加载模型
try:
model = AutoModelForCausalLM.from_pretrained(model_folder_path)
model.eval()
print("Model loaded successfully")
print(f"model_folder_path: {model_folder_path}")
except Exception as e:
print(f"Failed to load model: {e}")
print(f"model_folder_path: {model_folder_path}")
#################临时测试################
# 加载分词器
print("开始加载分词器...")
tokenizer=AutoTokenizer.from_pretrained(
pretrained_model_name_or_path=model_folder_path,
padding_side="right",
use_fast=False,
return_tensors="pt",
max_length=512,
truncation=True,
)
# 输入文本(可以是任何您想要生成文本的起始文本)
input_text = "你好,我要怎么称呼你"
print(f"关键词:{input_text}")
##################################
# 检查是否已经有填充标记,如果没有,设置填充标记
if not tokenizer.pad_token:
# 如果词器已经有结束标记,将其用作填充标记
tokenizer.pad_token = tokenizer.eos_token
##################################
# 对输入文本进行编码
inputs = tokenizer(input_text, return_tensors="pt", max_length=512, truncation=True, padding="max_length")
# 打印输入信息
print(f"Input text: {input_text}")
print(f"Encoded inputs: {inputs}")
# 生成文本(这里我们生成50个标记作为示例)
with torch.no_grad():
try:
outputs = model.generate(**inputs, max_new_tokens=10, num_return_sequences=1) # 注意:生成长度包括初始输入文本
#print(f"Generated outputs: {outputs}")
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(f"Generated text: {generated_text}")
except Exception as e:
# 打印错误信息
print(f"An error occurred: {e}")
# 解码生成的标记为文本
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
# 打印生成的文本
#print(generated_text)
出来的结果乱七八糟的,好傻~~
我换个大点的模型再试试吧,125M这个真不行,太失望