datawhalechina / self-llm

《开源大模型食用指南》基于Linux环境快速部署开源大模型,更适合中国宝宝的部署教程
Apache License 2.0
6.08k stars 748 forks source link

如何获取一个大模型的stop_token_ids #170

Open jdm4pku opened 2 weeks ago

jdm4pku commented 2 weeks ago

看到您写的04-Qwen2-7B-Instruct vLLM 部署调用的代码:

def get_completion(prompts, model, tokenizer=None, max_tokens=512, temperature=0.8, top_p=0.95, max_model_len=2048):
    stop_token_ids = [151329, 151336, 151338]
    # 创建采样参数。temperature 控制生成文本的多样性,top_p 控制核心采样的概率
    sampling_params = SamplingParams(temperature=temperature, top_p=top_p, max_tokens=max_tokens, stop_token_ids=stop_token_ids)
    # 初始化 vLLM 推理引擎
    llm = LLM(model=model, tokenizer=tokenizer, max_model_len=max_model_len,trust_remote_code=True)
    outputs = llm.generate(prompts, sampling_params)
    return outputs

想请教一下,这个stop_token_ids是怎么获取的?

我尝试加载了Qwen/Qwen2-7B-Instruct这个预训练模型:

tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-7B-Instruct")

看了一下all_special_tokens_id,但是不是上面代码中的,所以我很疑惑如何获取的stop_token_ids。我想学习一下获取方式,以用于后面用VLLM推理其他的大模型。谢谢。

Tsumugii24 commented 2 weeks ago

你好,感谢提问。经过检查,这里的stop_token_ids确实没有对应。但是对于测试结果而言没有影响,因为除了stop_token_ids这个参数,还有很多别的因素会让其停止生成,可以简单理解成所有条件之间是“或”的关系。具体影响条件参考vllm的官方文档:https://docs.vllm.ai/en/stable/dev/sampling_params.html stop_token_ids这个参数更多的作用是让模型的输出在一些设定的token处停下,所以可以根据自己的需要选择,是比较自由的,没有固定的获取方式。 比如,如果想要获取关于vocab中的special_token作为stop_token_ids,可以直接打印出tokenizer。

tokenizer = AutoTokenizer.from_pretrained(model, use_fast=False) 
print(tokenizer)
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
Qwen2Tokenizer(name_or_path='/root/autodl-tmp/qwen/Qwen2-7B-Instruct', vocab_size=151643, model_max_length=131072, is_fast=False, 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),
}

然后设置

stop_token_ids = [151643, 151644, 151645]  # <|endoftext|>, <|im_start|>, <|im_end|>

如果想要设定其他字符作为stop_token_id,可以直接在对应的vocab.json文件中获取,那么模型在推理时下一个token如果是对应的token就会结束生成。 希望这个回答对你有帮助🥰

jdm4pku commented 2 weeks ago

十分感谢您详细的回复,对我很有帮助!谢谢