首页 > 其他分享 >LitServe 服务多worker启动简单说明

LitServe 服务多worker启动简单说明

时间:2024-11-09 08:48:49浏览次数:1  
标签:启动 self worker uvicorn LitServe server port

LitServe 是一个基于fastapi 包装的快速推理api 服务,以下只简单说明下关于server 启动部分的处理

参考使用

我们可以通过配置devices 以及每个device 对应的worker 数执行以那种模式进行server 的启动(多线程还是多进程)

  • 参考使用
if __name__ == "__main__":
    # Enable the OpenAISpec in LitServer
    api = SimpleLitAPI()
    server = ls.LitServer(api,workers_per_device=2, spec=ls.OpenAISpec())
    server.run(port=8000)

代码处理

  • server 启动 处理上实际上使用了类似uvicorn 多worker 的处理,因为默认使用了模块类,而不是字符串,多worker 是不能生效的,所以LitServe 自己使用类似uvicorn的机制包装了下 运行处理
  def run(
    self,
    port: Union[str, int] = 8000,
    num_api_servers: Optional[int] = None,
    log_level: str = "info",
    generate_client_file: bool = True,
    api_server_worker_type: Optional[str] = None,
    **kwargs,
):
    if generate_client_file:
        self.generate_client_file()

    port_msg = f"port must be a value from 1024 to 65535 but got {port}"
    try:
        port = int(port)
    except ValueError:
        raise ValueError(port_msg)

    if not (1024 <= port <= 65535):
        raise ValueError(port_msg)
    # 此处创建socket bind 信息,后续实际server会复用socket
    config = uvicorn.Config(app=self.app, host="0.0.0.0", port=port, log_level=log_level, **kwargs)
    sockets = [config.bind_socket()]

    if num_api_servers is None:
        num_api_servers = len(self.workers)

    if num_api_servers < 1:
        raise ValueError("num_api_servers must be greater than 0")

    if sys.platform == "win32":
        print("Windows does not support forking. Using threads api_server_worker_type will be set to 'thread'")
        api_server_worker_type = "thread"
    elif api_server_worker_type is None:
        api_server_worker_type = "process"
    # 基于配置的devices 以及workers_per_device 信息创建多进程
    manager, litserve_workers = self.launch_inference_worker(num_api_servers)

    try:
        # 基于uvicorn 启动多server进程
        servers = self._start_server(port, num_api_servers, log_level, sockets, api_server_worker_type, **kwargs)
        print(f"Swagger UI is available at http://0.0.0.0:{port}/docs")
        for s in servers:
            s.join()
    finally:
        print("Shutting down LitServe")
        for w in litserve_workers:
            w.terminate()
            w.join()
        manager.shutdown()

_start_server 处理

def _start_server(self, port, num_uvicorn_servers, log_level, sockets, uvicorn_worker_type, **kwargs):
    servers = []
    for response_queue_id in range(num_uvicorn_servers):
        self.app.response_queue_id = response_queue_id
        if self.lit_spec:
            self.lit_spec.response_queue_id = response_queue_id
        app = copy.copy(self.app)

        config = uvicorn.Config(app=app, host="0.0.0.0", port=port, log_level=log_level, **kwargs)
        server = uvicorn.Server(config=config)
        # 此处会基于使用线程还是进程进行server 的创建以及启动,复用了socket
        if uvicorn_worker_type == "process":
            ctx = mp.get_context("fork")
            w = ctx.Process(target=server.run, args=(sockets,))
        elif uvicorn_worker_type == "thread":
            w = threading.Thread(target=server.run, args=(sockets,))
        else:
            raise ValueError("Invalid value for api_server_worker_type. Must be 'process' or 'thread'")
        w.start()
        servers.append(w)
    return servers  

说明

以上只是LitServe关于fastapi 服务基于uvicorn server 启动部分的说明,其他部分的处理后续会介绍,实际上难度并不难,核心是了解内部机制

参考资料

https://github.com/Lightning-AI/LitServe

https://github.com/encode/uvicorn/blob/master/uvicorn/supervisors/multiprocess.py

标签:启动,self,worker,uvicorn,LitServe,server,port
From: https://www.cnblogs.com/rongfengliang/p/18418969

相关文章

  • 一文彻底弄懂Spring Boot的启动过程
    一,SpringBoot启动过程1.启动入口SpringBoot应用的启动入口通常是一个包含@SpringBootApplication注解的主类,并调用SpringApplication.run()方法。@SpringBootApplication是一个复合注解,包含了@Configuration、@EnableAutoConfiguration和@ComponentScan,从而开启了自......
  • 树莓派开机自启动热点(使用有线eth0上网,使用wlan0进行热点)
    一、背景内容其实就是接了一单,有人需要我帮忙配置一下树莓派开机启动热点。这边做个记录,该方式树莓派4B、3B都可以使用。二、实际操作1、使用网线连接路由器和树莓派树莓派的网络接口一共有三个,分别是:eth0:有线网络接口(以太网接口)wlan0:无线网络接口(WiFi接口)lo:本地回环接口(......
  • 树莓派创建开机自启动任务
    一、编写需要开机启动的后台任务毕竟为了醋才能包饺子嘛~简单写一个输出x.hello的demo用于测试后续的配置是否成功。importtime#文件路径file_path="/home/pi/Desktop/output.txt"#根据具体情况修改defwrite_hello():count=1try:whileTru......
  • LitServe 快速部署类openai 接口服务
    以前简单说明过LitServe支持openai接口格式的服务api,以下是一个简单试用参考代码app.pyimportlitserveaslsclassSimpleLitAPI(ls.LitAPI):defsetup(self,device):self.model=Nonedefpredict(self,prompt):#`prompt`isalisto......
  • 轻松掌握如何使用 Ventoy 创建多启动 USB 驱动器,并有效管理操作系统镜像文件。深入理
    Ventoy初级使用教程的大纲。Ventoy是一个非常实用的开源工具,能够让用户轻松地在USB驱动器上创建多启动(multi-boot)系统,支持多种操作系统镜像(ISO文件)的直接启动,而无需重新格式化或安装启动加载器。Ventoy初级使用教程大纲1.Ventoy简介什么是Ventoy?开源的多启动工......
  • 26服务管理(启动、停止、重启服务)
    每天五分钟学Linux|第二十六课:服务管理(启动、停止、重启服务)大家好!欢迎再次来到我们的“每天五分钟学Linux”系列教程。在前面的课程中,我们学习了如何通过源码编译来安装软件。今天,我们将探讨如何管理和控制Linux系统中的服务。服务是指在后台运行的应用程序,例如Web服务......
  • 【Linux内核设计思想】三、Linux内核的启动过程
    欢迎关注博主Mindtechnist或加入【智能科技社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关注公粽号《机器和智能》回复关键词“python项目实战......
  • oracle11g启动过程中加载配置文件
    oracle指定配置文件启动,要是不指定配置文件启动的话默认找的参数文件顺序如下:在oracle11g中oracle启动过程中默认会加载相应的配置文件来启动oracle服务。检查参数文件有两个,一个是spfile<ORACLE_SID>.ora文件,另一个是inti<ORACLE_SID>.ora文件。oracle软件服务安装完成后......
  • 安装和启动ElasticSearch
    安装和启动ElasticSearch我们直接使用docker部署好的ElasticSearch访问路径:http://192.168.144.160:9200ES默认端口是9200ES基本使用<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spri......
  • 系统变量group_replication_group_seeds为空导致MySQL节点无法启动组复制
    MySQLInnoDBCluster集群中一个节点,在服务器重启过后,启动MySQL实例后,发现status为MISSING,另外memberState为OFFLINE状态。如下所示: MySQL  mysqldbu02:7306 ssl  JS > cluster.status(){    "clusterName": "yssps",     "defaultReplicaSet": {      ......