main
py 96 lines 2.9 KB
Raw
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3 """Demonstrates how to generate prompt embeddings using
4 Hugging Face Transformers and use them as input to vLLM
5 for both single and batch inference.
6
7 Model: meta-llama/Llama-3.2-1B-Instruct
8 Note: This model is gated on Hugging Face Hub.
9 You must request access to use it:
10 https://huggingface.co/meta-llama/Llama-3.2-1B-Instruct
11
12 Requirements:
13 - vLLM
14 - transformers
15
16 Run:
17 python examples/features/prompt_embed/prompt_embed_offline.py
18 """
19
20 import torch
21 from transformers import AutoModelForCausalLM, AutoTokenizer, PythonBackend
22
23 from vllm import LLM
24
25
26 def init_tokenizer_and_llm(model_name: str):
27 tokenizer = AutoTokenizer.from_pretrained(model_name)
28 transformers_model = AutoModelForCausalLM.from_pretrained(model_name)
29 embedding_layer = transformers_model.get_input_embeddings()
30 llm = LLM(model=model_name, enable_prompt_embeds=True)
31 return tokenizer, embedding_layer, llm
32
33
34 def get_prompt_embeds(
35 chat: list[dict[str, str]],
36 tokenizer: PythonBackend,
37 embedding_layer: torch.nn.Module,
38 ):
39 token_ids = tokenizer.apply_chat_template(
40 chat, add_generation_prompt=True, return_tensors="pt", return_dict=True
41 ).input_ids
42 prompt_embeds = embedding_layer(token_ids).squeeze(0)
43 return prompt_embeds
44
45
46 def single_prompt_inference(
47 llm: LLM, tokenizer: PythonBackend, embedding_layer: torch.nn.Module
48 ):
49 chat = [{"role": "user", "content": "Please tell me about the capital of France."}]
50 prompt_embeds = get_prompt_embeds(chat, tokenizer, embedding_layer)
51
52 outputs = llm.generate(
53 {
54 "prompt_embeds": prompt_embeds,
55 }
56 )
57
58 print("\n[Single Inference Output]")
59 print("-" * 30)
60 for o in outputs:
61 print(o.outputs[0].text)
62 print("-" * 30)
63
64
65 def batch_prompt_inference(
66 llm: LLM, tokenizer: PythonBackend, embedding_layer: torch.nn.Module
67 ):
68 chats = [
69 [{"role": "user", "content": "Please tell me about the capital of France."}],
70 [{"role": "user", "content": "When is the day longest during the year?"}],
71 [{"role": "user", "content": "Where is bigger, the moon or the sun?"}],
72 ]
73
74 prompt_embeds_list = [
75 get_prompt_embeds(chat, tokenizer, embedding_layer) for chat in chats
76 ]
77
78 outputs = llm.generate([{"prompt_embeds": embeds} for embeds in prompt_embeds_list])
79
80 print("\n[Batch Inference Outputs]")
81 print("-" * 30)
82 for i, o in enumerate(outputs):
83 print(f"Q{i + 1}: {chats[i][0]['content']}")
84 print(f"A{i + 1}: {o.outputs[0].text}\n")
85 print("-" * 30)
86
87
88 def main():
89 model_name = "meta-llama/Llama-3.2-1B-Instruct"
90 tokenizer, embedding_layer, llm = init_tokenizer_and_llm(model_name)
91 single_prompt_inference(llm, tokenizer, embedding_layer)
92 batch_prompt_inference(llm, tokenizer, embedding_layer)
93
94
95 if __name__ == "__main__":
96 main()