跳转到主要内容

简化任何环境下的机器学习部署。

项目描述

OpenModelZ

discord invitation link trackgit-views docs all-contributors CI PyPI version Coverage Status

什么是OpenModelZ?

OpenModelZ ( mdz ) 是一个将您的模型部署到任何集群(GCP、AWS、Lambda labs、您的家庭实验室,甚至单个机器)的工具。

将模型投入生产对数据科学家和SRE来说很困难。您需要配置监控、日志记录和扩展基础设施,以及正确的安全性和权限。然后设置域名、SSL和负载均衡器。即使是单个模型的部署,这也可能需要数周或数月的工作。

现在您可以使用mdz deploy轻松部署您的模型。OpenModelZ为您处理所有基础设施设置。每个部署都获得一个公共子域名,例如 http://jupyter-9pnxd.2.242.22.143.modelz.live,使其易于访问。

OpenModelZ

优势

OpenModelZ提供以下功能

  • 📈 从0自动扩展:推理服务器数量可以根据工作量进行扩展。您可以从0开始,轻松扩展到10+个副本。
  • 📦 支持任何机器学习框架:您可以使用单个命令部署任何机器学习框架(例如 vLLM/triton-inference-server/mosec 等),此外,您还可以部署您自己的自定义推理服务器。
  • 🔬 支持Gradio/Streamlit/Jupyter:我们提供了一个强大的原型设计环境,支持 GradioStreamlitjupyter 等。您可以在笔记本中轻松可视化模型性能并调试它,或使用单个命令部署模型的Web应用程序。
  • 🏃 从单个机器到机器集群:您可以从单个机器开始,无需任何麻烦,通过单个命令 mdz server start 将其扩展到机器集群。
  • 🚀 为每个部署提供公开可访问的子域名(可选):我们为每个部署分配单独的子域名,无需额外费用和努力,使每个部署都易于外部访问。

OpenModelZ是可在modelz.aimodelz.ai)上获取的ModelZ平台的基础组件。

工作原理

获取一个服务器(可以是云VM、家庭实验室或单个机器),并运行mdz server start命令。OpenModelZ将为您启动服务器。

$ mdz server start
🚧 Creating the server...
🚧 Initializing the load balancer...
🚧 Initializing the GPU resource...
🚧 Initializing the server...
🚧 Waiting for the server to be ready...
🐋 Checking if the server is running...
🐳 The server is running at http://146.235.213.84.modelz.live
🎉 You could set the environment variable to get started!

export MDZ_URL=http://146.235.213.84.modelz.live
$ export MDZ_URL=http://146.235.213.84.modelz.live

然后,您可以使用单个命令mdz deploy部署模型并获取端点。

$ mdz deploy --image modelzai/gradio-stable-diffusion:23.03 --name sdw --port 7860 --gpu 1
Inference sd is created
$ mdz list
 NAME  ENDPOINT                                                 STATUS  INVOCATIONS  REPLICAS 
 sdw   http://sdw-qh2n0y28ybqc36oc.146.235.213.84.modelz.live   Ready           174  1/1      
       http://146.235.213.84.modelz.live/inference/sdw.default                                

快速入门 🚀

安装mdz

您可以使用以下命令安装OpenModelZ:

pip install openmodelz

您可以通过运行以下命令来验证安装:

mdz

一旦您安装了mdz,您就可以开始部署模型并进行实验。

启动mdz

启动mdz服务器非常简单。您只需要找到一个服务器(可以是云VM、家庭实验室或单个机器),然后运行mdz server start命令。

注意:我们可能在端口80上启动mdz服务器时需要root权限。

$ mdz server start
🚧 Creating the server...
🚧 Initializing the load balancer...
🚧 Initializing the GPU resource...
🚧 Initializing the server...
🚧 Waiting for the server to be ready...
🐋 Checking if the server is running...
Agent:
 Version:       v0.0.13
 Build Date:    2023-07-19T09:12:55Z
 Git Commit:    84d0171640453e9272f78a63e621392e93ef6bbb
 Git State:     clean
 Go Version:    go1.19.10
 Compiler:      gc
 Platform:      linux/amd64
🐳 The server is running at http://192.168.71.93.modelz.live
🎉 You could set the environment variable to get started!

export MDZ_URL=http://192.168.71.93.modelz.live

内部IP地址将被用作部署的默认端点。您可以将服务器的公共IP地址提供给mdz server start命令,使其可以从外部访问。

# Provide the public IP as an argument
$ mdz server start 1.2.3.4

您还可以指定镜像仓库镜像以加快镜像拉取过程。以下是一个示例:

$ mdz server start --mirror-endpoints https://docker.mirrors.sjtug.sjtu.edu.cn

创建第一个基于UI的部署

一旦启动了mdz服务器,您就可以开始部署您的第一个应用程序。在本教程中,我们将使用jupyter notebook作为示例。您可以使用任何Docker镜像作为您的部署。

$ mdz deploy --image jupyter/minimal-notebook:lab-4.0.3 --name jupyter --port 8888 --command "jupyter notebook --ip='*' --NotebookApp.token='' --NotebookApp.password=''"
Inference jupyter is created
$ mdz list
 NAME     ENDPOINT                                                   STATUS  INVOCATIONS  REPLICAS
 jupyter  http://jupyter-9pnxdkeb6jsfqkmq.192.168.71.93.modelz.live  Ready           488  1/1
          http://192.168.71.93/inference/jupyter.default                                                                         

您可以通过访问端点URL来访问部署。端点将自动为每个部署生成,格式如下:<name>-<随机字符串>.<ip>.modelz.live

在这个例子中是http://jupyter-9pnxdkeb6jsfqkmq.192.168.71.93.modelz.live。如果您已将服务器的公共IP地址提供给mdz server start命令,则端点也可以从外部访问。

jupyter notebook

创建第一个兼容OpenAI的API服务器

您还可以创建基于API的部署。在本教程中,我们将使用与Bloomz 560M兼容的OpenAI API服务器作为示例。

$ mdz deploy --image modelzai/llm-bloomz-560m:23.07.4 --name simple-server
Inference simple-server is created
$ mdz list
 NAME           ENDPOINT                                                         STATUS  INVOCATIONS  REPLICAS 
 jupyter        http://jupyter-9pnxdkeb6jsfqkmq.192.168.71.93.modelz.live        Ready           488  1/1      
                http://192.168.71.93/inference/jupyter.default                                                 
 simple-server  http://simple-server-lagn8m9m8648q6kx.192.168.71.93.modelz.live  Ready             0  1/1      
                http://192.168.71.93/inference/simple-server.default                                           

您可以使用OpenAI Python包和端点http://simple-server-lagn8m9m8648q6kx.192.168.71.93.modelz.live与此部署交互。

import openai
openai.api_base="http://simple-server-lagn8m9m8648q6kx.192.168.71.93.modelz.live"
openai.api_key="any"

# create a chat completion
chat_completion = openai.ChatCompletion.create(model="bloomz", messages=[
    {"role": "user", "content": "Who are you?"},
    {"role": "assistant", "content": "I am a student"},
    {"role": "user", "content": "What do you learn?"},
], max_tokens=100)

扩展您的部署

您可以使用mdz scale命令扩展您的部署。

$ mdz scale simple-server --replicas 3

请求将在部署的副本之间进行负载均衡。

您还可以告诉mdz根据流请求自动扩展您的部署。有关更多详细信息,请参阅自动扩展文档。

调试您的部署

有时您可能想要调试您的部署。您可以使用mdz logs命令获取部署的日志。

$ mdz logs simple-server
simple-server-6756dd67ff-4bf4g: 10.42.0.1 - - [27/Jul/2023 02:32:16] "GET / HTTP/1.1" 200 -
simple-server-6756dd67ff-4bf4g: 10.42.0.1 - - [27/Jul/2023 02:32:16] "GET / HTTP/1.1" 200 -
simple-server-6756dd67ff-4bf4g: 10.42.0.1 - - [27/Jul/2023 02:32:17] "GET / HTTP/1.1" 200 -

您还可以使用mdz exec命令在部署的容器中执行命令。您不需要ssh进入服务器即可做到这一点。

$ mdz exec simple-server ps
PID   USER     TIME   COMMAND
    1 root       0:00 /usr/bin/dumb-init /bin/sh -c python3 -m http.server 80
    7 root       0:00 /bin/sh -c python3 -m http.server 80
    8 root       0:00 python3 -m http.server 80
    9 root       0:00 ps
$ mdz exec simple-server -ti bash
bash-4.4# 

或者,您可以将部署端口转发到您的本地机器,并在本地进行调试。

$ mdz port-forward simple-server 7860
Forwarding inference simple-server to local port 7860

添加更多服务器

您可以使用mdz server join命令将更多服务器添加到您的集群中。将在服务器上启动mdz服务器并自动将其加入集群。

$ mdz server join <internal ip address of the previous server>
$ mdz server list
 NAME   PHASE  ALLOCATABLE      CAPACITY        
 node1  Ready  cpu: 16          cpu: 16         
               mem: 32784748Ki  mem: 32784748Ki 
               gpu: 1           gpu: 1      
 node2  Ready  cpu: 16          cpu: 16         
               mem: 32784748Ki  mem: 32784748Ki 
               gpu: 1           gpu: 1      

标记您的服务器

您可以通过标记服务器来将模型部署到特定的服务器。例如,您可以使用gpu=true标记服务器并将模型部署到具有GPU的服务器。

$ mdz server label node3 gpu=true type=nvidia-a100
$ mdz deploy ... --node-labels gpu=true,type=nvidia-a100

架构

OpenModelZ 受 k3sOpenFaaS 的启发,但专为机器学习部署设计。我们保持系统的核心 简单,易于扩展

如果您只想部署模型,则无需阅读本节。但如果您想了解 OpenModelZ 的工作原理,本节是为您准备的。

OpenModelZ

OpenModelZ 由两个组件组成

  • 数据平面:数据平面负责服务器。您可以使用 mdz server 来管理服务器。数据平面被设计成 无状态可扩展。您可以通过向集群添加更多服务器轻松扩展数据平面。它底层使用 k3s,支持虚拟机、裸机设备和物联网设备(未来)。您还可以在现有的 kubernetes 集群上部署 OpenModelZ。
  • 控制平面:控制平面负责部署。它管理部署及其底层资源。

请求将通过负载均衡器路由到推理服务器。自动扩展器将根据工作负载调整推理服务器的数量。我们默认提供 *.modelz.live 域名,通过一个 通配符 DNS 服务器 支持每个部署的公开可访问子域名。您也可以使用自己的域名。

有关更多详细信息,请参阅 架构文档

路线图 🗂️

请查阅 路线图

贡献 😊

我们欢迎开源社区、个人和合作伙伴的各种贡献。

贡献者 ✨

Ce Gao
蔡高

💻 👀
Jinjing Zhou
周金晶

💬 🐛 🤔
Keming
柯明

💻 🎨 🚇
Nadeshiko Manju
南希科·马努

🐛 🎨 🤔
Teddy Xinyuan Chen
陈新源·泰迪

📖
Wei Zhang
张伟

💻
Xuanwo
玄沃

🖋 🎨 🤔
cutecutecat
cutecutecat

🤔
xieydd
谢燕德

🤔

致谢 🙏

  • K3s 为单控制平面二进制和进程。
  • OpenFaaS 为其无服务器函数服务的工作。这为 OpenModelZ 打下了基础。
  • sslip.io 为通配符 DNS 服务。它使得从外部世界访问服务器无需任何设置成为可能。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解有关 安装软件包 的更多信息。

源分布

openmodelz-0.0.27.tar.gz (315.8 kB 查看哈希值)

上传时间 源码

构建版本

openmodelz-0.0.27-py2.py3-none-musllinux_1_1_x86_64.whl (9.1 MB 查看哈希值)

上传时间 Python 2 Python 3 musllinux: musl 1.1+ x86-64

openmodelz-0.0.27-py2.py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (9.1 MB 查看哈希值)

上传时间 Python 2 Python 3 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

由以下支持