使用 vllm 库调用大模型,这里调用的是通义千问,那需要先下载:
通义千问-14B-Chat
vllm 这个库目前只能在 linux 上用, win 是用不了的,pip 安装不了,这里弄了一个调用示例代码
from vllm import LLM, SamplingParams
from transformers import AutoModelForCausalLM, AutoTokenizer
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0' # 设置使用第一块 gpu
model_path = ''
# tokenizer_mode='slow'表示使用慢速但更精确的tokenizer模式。
# tensor_parallel_size=2,表明在多GPU环境下进行张量并行计算的大小
# trust_remote_code=True,信任远程代码执行(根据具体库实现可能与安全性相关)
model = LLM(modle=model_path, tokenizer=model_path, tokenizer_mode='slow', tensor_parallel_size=2,trust_remote_code=True)''''
pad_token='<|extra_0|>':指定了填充token,当需要对输入序列进行填充以保持固定长度时,会用到这个token。在处理批次数据时,通常需要所有序列具有相同的长度,较短的序列会在指定侧(这里是左侧)使用填充token进行填充。
eos_token='':终止符(End of Sequence),表示序列的结束。在自回归语言模型中,它有时用来标记文本块的结尾。当模型生成文本时,遇到此标记可能会停止生成新的tokens。
padding_side='left':指定在哪个侧面对序列进行填充。在这里是“left”,意味着在每个样本的左侧添加填充token,直到所有样本达到batch中最长样本的长度。
trust_remote_code=True:这个参数允许从远程位置(如Hugging Face Model Hub)加载tokenizer时信任远程代码。这主要是为了安全和执行远程代码而设置的一个选项,确保在加载预训练模型tokenizer时能够顺利运行来自可信源的代码。
'''
tokenizer = AutoTokenizer.from_pretrained(model_path,pad_token='<|extra_0|>', # 设置填充tokeneos_token='<|endoftext|>',padding_side='left', # 在序列左侧进行填充trust_remote_code=True #
)# temperature 调节生成样本的随机性,默认情况下温度越高,生成结果越多样;温度越低,生成结果越接近训练数据的概率分布。一般 0-1 ,超过1模型说的话不太可用
# stop=['', '<|im_start|>', '']:当生成的序列包含这些终止符时,停止生成
# max_tokens=1000:限制生成的最大token数量
sampling_params = SamplingParams(temperature=0.9,stop=['<|im_end|>','<|im_start|>', '<|endoftext|>'], max_tokens=1000)'''
<'|im_start|'>' 和 '<'|endoftext|'>' 是预定义的特殊标记,分别表示一个新对话的开始和文本块的结束。当模型在生成过程中遇到这些标记时,
它会知道当前输入已经完成
因为调用模型是一批一批的,存入列表中去调用的,肯呢个 vllm 内部会吧列表的东西合起来,这样就需要加入结束符来区别每次的输入
'''
prompt_before = '<|im_start|>system\n你是自然语言处理专家<|im_end|>\n<|im_start|>user\n'
prompt_after = '<|im_end|>\n<|im_start|>assistant\n'message = f'''你好,你是谁?'''
batch_prompts = []
cur_prompts = prompt_before + message + prompt_after
batch_prompts.append(message)
outputs = model.generate(batch_prompts, sampling_params)
for output in outputs:generated_text = output.outputs[0].textprint(generated_text)