Py学习  »  机器学习算法

高效可扩展,使用Ray Serve部署机器学习模型

AI科技论谈 • 1 年前 • 364 次点击  

使用Ray Serve框架简化机器学习模型的部署流程,并通过Docker容器化技术实现模型的轻松扩展和管理。

长按关注《AI科技论谈》

在数据为王的今天,使用机器学习模型来构建智能解决方案,绝对是科技圈的热门趋势。然而,对于涉足这一领域的开发者来说,构建过程中的架构设计往往充满了挑战,系统的复杂性会迅速增长。

本文带读者了解将机器学习模型部署为服务时可能遇到的问题,并分享一些策略,帮助在不增加架构复杂度的前提下,轻松应对这些挑战。

1 引言:机器学习模型部署的挑战

传统上,在生产环境中部署机器学习模型,需要配置消息队列和任务调度系统。这不仅复杂,还要求工程师投入大量精力以确保系统的稳定性和响应速度。

Ray Serve框架的出现,简化了这一流程。

Ray Serve整合了消息队列和工作进程,提供简洁的解决方案,让模型部署、管理和扩展变得更加便捷。开发者只需关注模型的核心开发,Ray Serve则自动处理负载均衡和故障恢复等任务,从而加快部署速度并提升模型的可靠性与响应性。

2 实践:容器化模型部署

在模型服务化实践中,会发现将每个机器学习模型单独部署到Docker容器中极为有效。这种策略让模型独立于应用其他部分,增强系统的模块化和可维护性,同时简化模型扩展和新模型的集成。每个容器自成一体,不受外部变化影响,便于系统平滑扩展。

这种方法与敏捷开发理念相符,与Ray Serve等框架的动态管理特性相得益彰,显著简化了部署流程,提高开发速度。

为此,开发了以下文件结构:

  • Dockerfile
  • model_deployment.py
  • requirements.txt

这个简单的文件结构让我们能够通过运行 model_deployment.py 来启动模型。

import json
from typing import Dict

import torch
from starlette.requests import Request

import ray
from ray import serve
from ray.serve.drivers import DAGDriver

from  sentence_transformers import SentenceTransformer


# 异步函数,用于解析传入的 JSON 请求
async def json_resolver(request: Request) -> dict:
    """
    Resolve incoming JSON requests asynchronously.

    Args:
        request: The incoming HTTP request containing JSON data.

    Returns:
        A dictionary representing the parsed JSON data.
    """

    return await request.json()


# 第一步:将预训练的情感分析模型封装在 Serve 部署中。
@serve.deployment
class ModelDeployment:
    def __init__(self):
        """
        Initialize the ModelDeployment class.

        This constructor initializes the class and loads the pretrained sentiment analysis model.
        """

        self._model = SentenceTransformer('sentence-transformers/all-mpnet-base-v2')

    def __call__(self, data: dict) -> Dict:
        """
        Embed texts using sentence transformers.

        Args:
            data: The input data containing a list of texts to embed.

        Returns:
            A dictionary containing embeddings of input texts, each represented as a list of floats.
        """

        input_texts = json.loads(data)['input']
        embeddings = [torch.from_numpy(self._model.encode(text, convert_to_numpy=True)).tolist() for text in input_texts]
        response = {'data': embeddings}
        return response

# 第二步:部署模型。
ray.init(address='ray://localhost:10001')
serve.run(DAGDriver.bind(ModelDeployment.bind(), http_adapter=json_resolver), host="0.0.0.0", port=8888)

通过调整 @serve.deployment 装饰器参数,可以轻松管理模型部署,如增减副本数、设置健康检查等,具体详情可查官方文档。

ModelDeployment 类通过该装饰器集成了预训练的情感分析模型。构造函数加载模型,__call__ 方法处理输入文本并生成嵌入向量,结果以字典形式返回。

部署时,使用 ray.init 初始化 Ray 集群,并指定运行地址。serve.run 函数结合 json_resolverModelDeployment 绑定到 DAGDriver,处理请求,并将服务部署在端口 8888 上。

# Dockerfile

# 设置基础镜像为 Python 3.10
FROM python:3.10

# 设置容器内的工作环境
WORKDIR /app

# 升级 pip
RUN pip3 install --upgrade pip

# 复制 requirements 文件并安装依赖
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt

# 将 model_deployment.py 脚本复制到容器中
COPY model_deployment.py ./

# 将 8888 端口对外开放
EXPOSE 8888

# 定义容器启动时运行的命令
CMD [ "bash""-c""ray start --head --block --object-manager-port=8076 --include-dashboard=true --dashboard-host=0.0.0.0 --dashboard-port=8266"]

这个Dockerfile为你的机器学习模型部署提供了一种简洁有效的容器化方法。它详细说明了设置环境、安装依赖和启动Ray集群的必要步骤。

总的来说,这个Dockerfile配置了Python 3.10环境,从requirements.txt文件中安装了所需的依赖,并把model_deployment.py脚本复制到容器的工作目录中。EXPOSE指令对外开放了8888端口,使得外部可以与部署的模型进行通信。最后,CMD指令以特定配置启动Ray集群,包括启动可在8266端口访问的Ray仪表盘。

# requirements.txt

ray[serve]~=2.0.1
starlette==0.20.4
sentence-transformers==2.2.2
torch==2.0.0
pandas==2.0.1

你的 requirements.txt 文件详细列出了部署机器学习模型时所需的各种依赖及其精确版本,确保系统的兼容性。注意,随着时间的推移,可能需要更新这些依赖。

通过执行 docker-compose up 命令,可以启动容器化的环境。如果需要深入了解容器的运行情况,可以使用 sudo docker exec -it [container-id] /bin/bash 命令进入容器的终端,这样就能直接对部署进行监控和实时调整了。在容器中运行 model_deployment.py 脚本,你就能利用 Ray Serve 的强大功能,轻松部署并扩展你的机器学习模型。

更便捷的是,我们还能直接在 Dockerfile 中配置,使得在容器启动时自动执行 model_deployment.py 脚本,实现模型的即时部署。

推荐书单

《Ray分布式机器学习:利用Ray进行大模型的数据处理、训练、推理和部署》

Ray是开源分布式计算框架,简化了扩展计算密集型Python工作负载的过程。本书展示了如何使用Ray构建机器学习应用程序,介绍了Ray如何融入当前的机器学习工具,以及Ray如何与这些工具紧密集成。本书前3章介绍了Ray作为分布式Python框架的基础知识,并提供了应用示例;第4-10章介绍了Ray高级库(Ray RLlib、Ray Tune、Ray Dataset、Ray Train、Ray Serve、Ray Cluster、Ray AIR),并展示如何使用高级库创建应用程序;第11章对Ray的生态进行了总结,并指导读者继续学习。

购买链接:https://item.jd.com/14622022.html

精彩回顾

搜索引擎+GraphRAG+智能体,打造AI智能搜索

一文彻底搞懂GraphRAG

高效打造知识图谱,使用LlamaIndex Relik实现实体关联和关系抽取

动手实现GraphRAG,检索效果大幅提升

利用LlamaIndex和本地PDF文档,轻松打造知识图谱GraphRAG

基于Llama 3、Ollama、Milvus、LangChain,快速搭建本地RAG

长按关注《AI科技论谈》

长按访问【IT今日热榜】,发现每日技术热点

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/174031