我已经使用FastChat中的vllm集成来托管多个vllm模型。然而,它并没有提供vllm的全部功能。例如,它不支持beam search。
我建议添加一个类似于FastChat的系统,以便为vllm工作者提供服务,从而暴露出其所有功能,如贪婪搜索、beam search、返回log_probs等。
我已经修改了聊天完成端点。然而,它是专门为vllm工作者编写的,而不是transformers模型工作者。
初步代码可以在以下链接找到:
https://github.com/tjtanaa/fastchat-serve/tree/vllm-api-expose-tj
自定义OpenAI API服务器,使用best_of和use_beam_search
https://github.com/tjtanaa/fastchat-serve/blob/vllm-api-expose-tj/src/fastchat_serve/openai_api_server_vllm.py
修改后的vllm工作者,支持贪婪搜索和beam search。
https://github.com/tjtanaa/fastchat-serve/blob/vllm-api-expose-tj/src/fastchat_serve/vllm_worker.py
将此功能添加到vllm仓库中是否会有帮助?
我已经在lm-sys/FastChat#2709上打开了一个问题,因为我不确定哪个仓库更适合存储这个功能。
2条答案
按热度按时间ffscu2ro1#
一个潜在的解决方案(适用于多GPU机器)是让一个
api_server
拥有多个engine
。然后,当收到新请求时,api_server
将最短等待请求队列中的传入提示发送给engine
。这个解决方案具有以下优点:
WoosukKwon,这听起来像是一个合理的解决方案吗?
pkwftd7m2#
从错误信息来看,问题出在无法对
_thread.lock
对象进行pickle。这是因为在使用cupy_utils.init_process_group
时,它试图将一些不可pickle的对象传递给子进程。为了解决这个问题,你可以尝试将这些不可pickle的对象移除,或者使用其他方法来传递它们。首先,你需要找到哪些对象是不可pickle的。在这个例子中,问题出在
_thread.lock
对象上。你可以通过以下方式检查:如果输出为
True
,则表示该对象是不可pickle的。接下来,你需要找到为什么这些对象会出现在这里。可能的原因是在创建LLMEngine
或LLMEngineFromEngineArgs
时,传入了一些不应该被pickle的对象。你需要检查这些对象的创建过程,并确保它们是可以被pickle的。另外,你可以尝试使用其他方法来传递这些不可pickle的对象。例如,你可以将它们存储在一个单独的文件中,然后在需要的时候读取它们。这样,你可以避免在进程间传递这些对象。但是,这种方法可能会增加系统的复杂性,因此请谨慎使用。
总之,你需要找到为什么这些不可pickle的对象会出现在这里,并采取相应的措施来解决这个问题。这可能涉及到修改你的代码,以便正确地创建和传递这些对象。
(我知道有人建议在单个服务器上使用单一模型,但这种方法并不适合我们的架构。目前我正在测试最简单的LLM离线调用用法,如果它能正常工作,以后会切换到异步引擎。非常感谢您对这个问题的回答!)