multiprocessing多进程使用案例

multiprocessing --- 基于进程的并行:https://docs.python.org/zh-cn/3.11/library/multiprocessing.html

python 复制代码
import sys
from fastchat.serve.controller import Controller
from fastchat.serve.model_worker import ModelWorker
from fastchat.serve.openai_api_server import app, CORSMiddleware, app_settings

import sys
import uuid
import uvicorn
from fastapi import FastAPI


# 创建不同的 FastAPI 应用实例
controller_app = FastAPI(title="FastChat Controller Service")
worker_app = FastAPI(title="FastChat Model Worker Service")
api_app = FastAPI(title="FastChat OpenAI API Service")


def start_controller():
    """启动 FastChat Controller 服务

    分布式系统设计中常见的一种优化策略,决定如何分配任务给不同的model_worker(或服务器)
     - LOTTERY:这种方法系统会随机选择一个worker。不考虑worker的当前负载或任何其他因素。
     - SHORTEST_QUEUE:这种方法会选择当前队列长度最短的worker,也就是当前负载最小的工人。
    """

    controller = Controller(dispatch_method="shortest_queue")
    # sys.modules 是一个字典,它存储了已经加载的模块。每个键是一个模块名,每个值是一个模块对象。
    # 这种机制使得Python在导入模块时可以检查模块是否已经在sys.modules中,如果是,就直接使用已经加载的模块,避免重复加载。
    sys.modules["fastchat.serve.controller"].controller = controller
    controller_app.title = "FastChat Controller"
    controller_app._controller = controller
    uvicorn.run(controller_app, host="192.168.110.131", port=21001)


def start_model_worker():
    """启动 Model Worker 服务"""
    worker_id = str(uuid.uuid4())[:8]
    worker = ModelWorker(
        controller_addr="http://192.168.110.131:21001",
        worker_addr="http://192.168.110.131:21002",
        worker_id=worker_id,
        limit_worker_concurrency=5,
        no_register=False,
        # no_register=True,
        model_path="/home/00_rag/model/ZhipuAI/chatglm3-6b",
        num_gpus=4,
        model_names=["chatglm3-6b"],
        device="cuda",
        max_gpu_memory="22GiB",
    )
    worker_app.title = f"FastChat LLM Server ChaGLM3-6b"
    worker_app._worker = worker
    uvicorn.run(worker_app, host="192.168.110.131", port=21002)


def start_openai_api_server():
    """启动 OpenAI API 服务"""
    api_app.add_middleware(
        CORSMiddleware,
        allow_credentials=True,  # 允许前端请求携带认证信息(如 cookies
        allow_origins=["*"],  # 允许所有域名的请求,星号表示不限制任何域。
        allow_methods=["*"],  # 允许所有的 HTTP 方法。
        allow_headers=["*"],  # 允许所有的 HTTP 头
    )
    app_settings.controller_address = "http://192.168.110.131:21001"
    app_settings.api_keys = []
    api_app.title = "FastChat OpenAI API Server"
    uvicorn.run(api_app, host="192.168.110.131", port=8000)

from multiprocessing import Process
import time

def start_services_in_processes():
    # 创建进程
    # controller_process = Process(target=start_controller)
    worker_process = Process(target=start_model_worker)
    api_server_process = Process(target=start_openai_api_server)

    # 启动进程
    # controller_process.start()

    worker_process.start()
    api_server_process.start()

    # 等待所有进程完成
    # controller_process.join()
    worker_process.join()
    api_server_process.join()


if __name__ == '__main__':
    start_services_in_processes()
    
相关推荐
敲代码的嘎仔3 分钟前
实习日志day6--实习日志day6--title命名规范化&businessType纠正&补充缺失的@Log注解&报警与通信模块补充&产出阶段总结文档
java·开发语言·人工智能·git·python·实习·大二
江华森21 分钟前
Python 实现高德地图找房(一):环境搭建与数据爬虫
开发语言·爬虫·python
杜子不疼.22 分钟前
【Qt初识】信号槽(三):机制意义、断开连接与 Lambda 表达式
开发语言·数据库·qt
VIP_CQCRE1 小时前
用 Ace Data Cloud 快速接入 OpenAI Chat Completions:对话、流式、多轮和多模态一篇打通
python·ai·openai·api·教程
老迟到的茉莉2 小时前
Hermes 是谁?跟 Claude Code 差在哪
开发语言·python
学逆向的2 小时前
汇编——内存
开发语言·汇编·算法·网络安全
Day(AKA Elin)2 小时前
【Day】MTP(Multi Token Prediction)技术学习
python·深度学习·学习·llama
lbb 小魔仙2 小时前
MuMu 模拟器 6.0 硬核测评:这次升级确实不一样
java·开发语言·模拟器·mumu·硬核测评
r_oo_ki_e_2 小时前
Java 线程池
java·开发语言
杜子不疼.3 小时前
【Qt初识】信号槽(二):自定义信号函数与槽函数
开发语言·qt