为通过单个API网关托管多个VLLM模型添加工作注册服务

s8vozzvw  于 4个月前  发布在  其他
关注(0)|答案(2)|浏览(81)

我已经使用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上打开了一个问题,因为我不确定哪个仓库更适合存储这个功能。

ffscu2ro

ffscu2ro1#

一个潜在的解决方案(适用于多GPU机器)是让一个 api_server 拥有多个 engine。然后,当收到新请求时,api_server 将最短等待请求队列中的传入提示发送给 engine
这个解决方案具有以下优点:

  • 自平衡
  • 需要相对较少的代码
  • 保持 vLLM 作为单个服务器

WoosukKwon,这听起来像是一个合理的解决方案吗?

pkwftd7m

pkwftd7m2#

从错误信息来看,问题出在无法对_thread.lock对象进行pickle。这是因为在使用cupy_utils.init_process_group时,它试图将一些不可pickle的对象传递给子进程。为了解决这个问题,你可以尝试将这些不可pickle的对象移除,或者使用其他方法来传递它们。

首先,你需要找到哪些对象是不可pickle的。在这个例子中,问题出在_thread.lock对象上。你可以通过以下方式检查:

import threading
print(isinstance(threading.Lock(), pickle.PicklingError))

如果输出为True,则表示该对象是不可pickle的。接下来,你需要找到为什么这些对象会出现在这里。可能的原因是在创建LLMEngineLLMEngineFromEngineArgs时,传入了一些不应该被pickle的对象。你需要检查这些对象的创建过程,并确保它们是可以被pickle的。

另外,你可以尝试使用其他方法来传递这些不可pickle的对象。例如,你可以将它们存储在一个单独的文件中,然后在需要的时候读取它们。这样,你可以避免在进程间传递这些对象。但是,这种方法可能会增加系统的复杂性,因此请谨慎使用。

总之,你需要找到为什么这些不可pickle的对象会出现在这里,并采取相应的措施来解决这个问题。这可能涉及到修改你的代码,以便正确地创建和传递这些对象。
(我知道有人建议在单个服务器上使用单一模型,但这种方法并不适合我们的架构。目前我正在测试最简单的LLM离线调用用法,如果它能正常工作,以后会切换到异步引擎。非常感谢您对这个问题的回答!)

相关问题