这几天在阅读VLLM的代码,今天尝试运行了offline inference,发现收获颇丰。
参照readme指令,基于pip就可以实现vllm的安装;然后需要下载hugging face版本的llama模型;
接下来,执行examples中的offline_inference.py.
offline_inference.py的文件内容很简单,调用entrypoints的LLM对象。然后进行生成
outputs = llm.generate(prompts, sampling_params)
在generate中,最重要的是_run_engine函数
outputs = self._run_engine(use_tqdm=use_tqdm)
通过run_engine函数,我们给LLM对象中的llm_engine添加请求,LLMEngine是VLLM代码中的一个重要类。
self.llm_engine.add_request(request_id,
inputs,
params,
lora_request=lora_request)
值得注意的是,这里通过next来实现request_id的更新。
request_id = str(next(self.request_counter))
在进入LLM_Engine的add_request函数中后,我们可以添加请求。
这里又触发了一个重要类Sequence, 请求被转换为了processed_inputs对象,包含的内容也不多,就是tokens的信息
(Pdb) p processed_inputs
{'prompt_token_ids': [2, 133, 394, 9, 5, 315, 532, 16], 'prompt': 'The president of the United States is', 'multi_modal_data': None}
接下来调用_add_processed_request函数,这里使用了一个重要信息,block_size:16,基于它和input信息,我们构建sequence对象。 block_size, 表示序列所占用的block size,在block manager和cache_engine中都有出现。
seq = Sequence(seq_id, processed_inputs, block_size, eos_token_id, lora_request)
好,我要去上班了,今天,我们从VLLM的example调用,见证了llm如何启动offline inference,然后基于输入的string一步步封装,目前为止,我们看到它被封装成了sequence这个对象,并且已经考虑到了block size这些和显存占用直接相关的参数,接下来会发生什么?我们下期揭晓。