Advertisement

人工智能大模型即服务时代:大模型即服务的实战应用

阅读量:

1.背景介绍

大数据、云计算、容器技术的演进及其对各行各业的数据分析、挖掘、处理等领域带来了深远的影响,促使传统单机计算机难以支撑海量数据的快速处理需求,而人工智能模型的训练效率更是直接制约着系统整体性能的关键瓶颈。如何将人工智能模型的高效能力部署到大型分布式集群中,以实现对海量数据的实时处理和分析,这是本文的一个研究重点。此外,随着云计算、容器化技术的持续发展,越来越多的企业和组织已逐渐转向微服务架构模式,基于容器的架构已逐渐成为主流。如何结合云计算、容器技术和人工智能模型的大规模分布式部署架构,以实现机器学习服务的架构设计、开发和运维,这是一个亟待解决的新课题。

当前,现代大型企业和组织已逐步建立起统一的服务标准与规范体系。通常情况下,遵循这一规范与架构模式的软件服务系统,将由专业的团队负责其维护、运营及扩展工作,从而进一步提升企业内部协作效率,实现资源共享。然而,各类企业由于各自特有的特点,使得统一的标准和架构模式难以实现。因此,各个企业需要根据自身特点、业务发展需求以及资源与成本的限制,制定符合自身实际情况的服务架构设计、开发与运维标准、流程、工具链、开发框架以及相关工具。

鉴于上述背景,云计算、容器技术和大规模分布式架构的快速发展,促使众多企业和组织开始探索如何将云计算、容器技术和人工智能模型进行整合,以实现一种面向服务的、高度可扩展的、低成本的人工智能模型自动化部署方案,确保最优的人机交互体验。

2.核心概念与联系

(1)大模型的定义

什么是大模型?对于这一问题,目前的研究者们尚未给出明确的定义,通常将其归纳为以下几种形式:具体表现为以下几种定义:

  1. 数据规模过大:指模型中的参数规模过于庞大,导致无法实现压缩存储,占用内存空间;
  2. 模型复杂度高:指模型的结构复杂度和超参数规模过大,使得模型结构和超参数优化过程耗时较长且难以解析;
  3. 测试集规模过大:指测试集的数量规模过大,导致计算资源难以满足需求。

以上三种大模型的主要区别体现在模型参数规模的大小、模型结构的复杂程度以及测试集容量的大小。在不同条件下,这些大模型的表现特征会有所差异。

(2)Big Model Serving简介

Big Model Serving(BMS)作为一种新兴的服务模式,其核心在于基于分布式计算平台和微服务架构,通过机器学习模型预测的能力,展现出高可用性、低延迟和高吞吐量等显著优势,从而有效解决大规模数据环境下机器学习模型的部署、运维、应用和监控等问题。

Big Model Serving 的特点如下:

  1. 可用性与冗余:服务的可用性可以保障在任何情况下服务都是可用的,并且提供了自动故障转移机制来保证服务的高可用性;
  2. 弹性伸缩:服务的弹性伸缩可以根据负载自动调整计算节点的数量,提升服务的容量和性能;
  3. 易于集成:服务的易于集成可以让客户很容易地接入到自己的服务中,不需要修改已有的代码;
  4. 安全性:服务的安全性可以防止黑客对服务的攻击,保护用户的隐私信息和数据;
  5. 便捷监控:服务的监控功能可以帮助管理员及时发现服务运行出现的问题,并及时修正问题,避免服务中断。

Big Model Serving 可以分为四个层次:

模型管理模块:该模块主要负责模型的存储、版本管理、训练部署等核心功能,并提供信息查询、管理、推理等接口服务;
服务管控模块:涵盖服务注册中心、配置中心、流量调度、容错策略等功能模块;
任务调度模块:集中管理模型推理任务的调度、运行、分配及监控管理;
客户端SDK包:提供标准化的客户端SDK接口和代码生成工具,方便开发者快速调用服务功能。

Big Model Serving 中模型推理任务主要由三个角色组成:

  1. 模型训练方:由负责承担机器学习模型训练任务的组织单位,完成模型训练后,将训练完成的模型发送至存储方。
  2. 模型存储方:负责管理存储训练完成后模型的组织单位,提供包括查询、下载、推理等在内的服务接口,以满足用户需求。
  3. 模型推理方:由负责接收用户请求的组织单位,调用存储方的推理服务接口获取模型预测结果,并将预测结果返回给调用方。

BMS作为一种全方位的分布式架构,基于云计算原生设计,实现了对机器学习模型的自动化管理。主要针对大数据时代下服务质量保障、运行效率提升以及系统扩展性优化等关键挑战,BMS提供了一整套解决方案。

(3)云计算、容器化和分布式集群的关系

云计算、容器化和分布式集群之间的关系与它们的发展历史紧密相连。在早期阶段,当没有云计算时代时,各公司普遍将服务器分散放置于办公室内,采用的是手工安装的分散部署方式。随着服务器数量和配置的不断增加,部署的压力也随之加剧,人们开始寻求一种能够有效解决这一挑战的解决方案。云计算的出现使得多台物理服务器能够通过软件手段组成一个虚拟集群,通过软件调度和管理机制,实现了计算资源的集中配置,并且支持多种类型的虚拟服务器配置方案。

在容器技术不断发展之际,它逐步取代了虚拟机技术,将应用程序及其运行环境封装成一个标准镜像,便于部署在各种平台上,实现跨平台和分布式部署。容器化的出现,不仅带来了软件部署的标准化,还提升了独立性、自动化水平,最终实现了标准化的统一。

近年来,随着云计算和容器技术的快速发展,以及分布式集群的快速发展,人们逐渐认识到,云计算、容器化和分布式集群的结合,能够实现高性能、高效能的机器学习模型的部署、管理和使用,以解决日益增长的大数据时代,机器学习模型的部署、管理、使用以及监控等问题。

3.核心算法原理和具体操作步骤以及数学模型公式详细讲解

(1)模型选择和训练

为了充分利用机器学习模型的高性能潜力,自动部署模型的训练环节同样不可或缺。一般情况下,主要存在两种主要策略:

在线学习:采用动态更新的方式,在模型训练过程中,利用收集到的新数据和标签对模型进行更新。离线学习:通过集中存储的方式,将所有数据和标签存储在一个地方,然后将这些数据划分为训练集、验证集和测试集等,并对模型进行训练和评估。

在线学习主要指采用最新数据进行训练,特别适用于模型在线学习场景,例如广告点击率预测模型。离线学习主要指采用较久远的历史数据进行训练,特别适用于模型的长期稳定预测场景,例如图像识别和文本分类等。

机器学习模型的训练往往耗时耗力,尤其是在面对海量数据时,训练所需的时间可能会显著延长。因此,在决定训练模型之前,需要综合考虑以下几个关键因素:首先,数据量的规模将直接影响训练所需的计算资源;其次,模型的复杂度与预期效果之间需要找到平衡点;最后,计算能力的强弱也会对整体训练效率产生重要影响。

  1. 数据量:决定模型的规模和准确度,可以从数据的大小、质量、分布、相关性等方面进行评估;
  2. 硬件设备:决定模型的训练是否能使用GPU加速,如果有的话,还需要确定所需的GPU类型;
  3. 算法和超参数:确定模型的算法类型、参数设置等,并通过网格搜索或随机搜索的方法进行优化;
  4. 梯度下降算法:决定梯度下降法中的步长、迭代次数和其它参数,使得训练结果达到最优。

(2)服务注册中心

服务注册中心(Service Registry)是Big Model Serving的核心功能模块,负责存储和管理所有模型元信息,并负责分配服务地址和路由规则。每个模型一般会有一个以上的版本,每个版本都分配一个独特的标识符,通过模型ID可以访问对应的模型版本。

服务注册中心可以采用多种存储方案进行部署,涵盖数据库、非关系型数据库以及文件存储系统等。无论选择何种存储方案,服务注册中心都应具备高可用性和高性能特征,能够处理高并发的读写请求,同时确保数据一致性。

为了确保服务的高可用性,服务注册中心需要不仅存储模型的元信息,还需记录各版本模型的运行状态。这些状态信息应包含模型的地址信息、启动时间记录以及推理请求计数等数据。当某个模型版本出现不可用状况时,服务注册中心应通过通知机制,促使其他模型版本尝试切换至其他可用的模型版本。

为了提升服务响应速度,服务注册中心可采用缓存机制。当新服务注册时,服务注册中心可将该服务信息存储于本地,从而提高服务响应速度。缓存的信息可根据访问频率、最近访问时间和过期时间进行定期清理。

(3)模型推理层

模型推理层是 Big Model Serving 的关键组件,同时也是模型推理服务的核心。它负责处理来自前端的推理请求,并根据请求的类型将请求分配到相应的模型版本,调用推理函数,生成结果后返回给前端。

模型推理层与模型训练层共同组成了一个完整的BMS服务。模型训练层负责训练模型并将其存储至服务注册中心,而模型推理层则接收来自前端的模型推理请求,并通过分析请求内容来识别并获取相应的模型版本。随后,该层会调用并执行模型的推理函数,最终输出推理结果。为了确保服务的稳定性和扩展性,模型推理层还需要具备快速响应能力,并能够处理海量数据以及高并发请求。

模型推理层主要通过异步消息队列或RPC框架来实现。基于模型推理层的独立部署特性,可以根据服务的使用状况自动调整资源规模。当新请求到来时,模型推理层能够迅速启动多个线程或进程来处理请求。如果某个模型版本出现性能瓶颈,模型推理层可以将其放入消息队列中,等待其他模型版本的空闲时段来处理。

模型推理层还需要具备容错机制,当某个模型版本出现故障时,模型推理层应将请求重新路由至其他可用的模型版本,以避免服务中断。此外,模型推理层还需配备错误检测机制,通过日志和监控系统记录各模型版本的请求失败率,并据此采取相应的调整措施,从而提升服务的可用性。

(4)模型版本管理

模型版本管理模块主要负责对模型版本进行管理,主要包含模型版本创建、删除、激活等功能。在创建模型版本时,需指定模型的元信息、代码、配置文件、依赖库等,并上传至模型存储服务器。创建完成后,即可投入训练。

为了实现多版本模型部署需求,模型存储服务器支持存储多样化的模型版本。同时支持配置多样化的标签设置,通过标签指定推理请求应访问的模型版本。

当遇到模型版本出现故障时,可以将其标记为非最新版本,随后将其下线以停止对其的推理请求。模型被标记为非最新版本后,服务注册中心将不再提供该版本的服务,直到该版本重新启动。

在配置模型版本时,需要在配置参数中指定模型的运行环境、依赖库以及配置参数等信息,并通知服务注册中心将其设置为当前激活的模型版本。

模型版本管理模块还需要支持多租户的隔离机制,确保不同租户的数据独立,避免数据干扰。

(5)模型预测管理

模型预测管理模块主要负责处理模型预测请求。当用户通过客户端 SDK 或浏览器访问服务时,触发了模型预测请求。客户端 SDK 将请求转发至服务端处理,服务端通过模型推理层完成推理后,将结果返回给客户端使用。

模型预测管理模块的主要功能如下:

  1. 请求路由:基于请求的模型名称、版本号、特征值等信息,对应到相应的模型版本进行推理逻辑处理;
  2. 请求限速:对特定模型版本的请求流量进行限速设置,以控制并发请求对服务器资源的压力;
  3. 请求缓存:通过统计热门请求的频率,设计并实施本地缓存机制,减少网络请求的频率;
  4. 请求重试:在检测到异常请求状态时,自动重新发送请求指令,以提高整体请求处理的成功率;
  5. 错误日志统计:建立完整的错误日志收集体系,深入分析各模型版本的错误原因,为服务质量优化提供数据支持。

模型预测管理模块还需要具备多租户隔离的能力。每个租户仅拥有各自的数据集,无法与其他租户的数据进行共享。

(6)端侧SDK

端侧 SDK 是 Big Model Serving 的核心组件,主要用于整合模型推理代码,并支持调用外部接口。目前,业界广泛采用的端侧 SDK 包括 TensorFlow、MXNet、Scikit-learn 和 PyTorch。

端侧SDK的主要功能是帮助开发者通过易于使用的API接口接入模型服务,从而实现预测功能。通过端侧SDK,开发者只需输入待预测的数据即可快速获得模型输出结果。

端侧 SDK 还可以包括如下几个方面:

接口设计:设计直观的接口,使开发者能够高效调用服务;
错误处理:明确地定义错误码和错误信息,便于定位问题;
文档编写:详实的文档能够帮助开发者更好地了解服务;
性能监控:具备性能监控功能,便于查看服务的性能。

(7)模型部署和管理工具

模型部署与管理工具是Big Model Serving的关键组成部分。该工具的主要功能是协助模型开发者完成模型部署、版本管理、性能监控以及模型维护等任务。开发人员可以通过图形界面或命令行工具进行模型生命周期的管理,包括发布、部署、回滚、版本更新以及性能监控等。

该部署与管理平台能够支持模型在服务器、集群以及PaaS平台上的部署方案,并具备自动化部署、灵活配置以及可控管理等特点。

模型部署和管理工具需要具备以下几个功能:

  1. 模型导入功能:支持用户上传模型的代码、配置文件以及依赖库等文件,导入至服务注册中心;
  2. 模型发布功能:允许用户将模型发布至服务注册中心,并与其指定版本关联;
  3. 模型回滚功能:提供回滚机制,用户可回滚至任意已发布版本;
  4. 模型版本管理功能:用户可通过该功能查看、创建、编辑及删除模型版本;
  5. 模型配置管理功能:支持用户查看、创建、编辑及删除模型配置;
  6. 性能监控功能:实时提供模型的CPU、内存、GPU使用率、响应时间及错误率等指标;
  7. 用户权限管理功能:用户可通过该功能管理模型权限,控制访问模型详情、配置编辑及版本推送等操作;
  8. 命令行工具支持:提供命令行工具,用户可进行批量操作,如模型发布及版本推送等。

4.具体代码实例和详细解释说明

(1)TensorFlow Serving Docker 镜像构建

TensorFlow Serving 是一个开源项目,主要功能是部署机器学习模型。该框架的 Docker 镜像支持一键获取官方镜像,并允许用户进行定制化构建。

复制代码
    FROM tensorflow/serving:latest-gpu
    RUN apt update && apt install -y --no-install-recommends \
        build-essential \
        curl \
        git \
        libcurl3-dev \
        libssl-dev \
        python-dev \
    && rm -rf /var/lib/apt/lists/*
    
    WORKDIR /app
    
    ENV MODEL_NAME=model1
    ENV MODEL_BASE_PATH=/models/${MODEL_NAME}
    
    COPY. ${MODEL_BASE_PATH}/
    
    RUN cd ${MODEL_BASE_PATH} \
    && mkdir -p model \
    && wget https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip \
    && unzip inception5h.zip -d model \
    && chmod +x start.sh
    
    EXPOSE 8501
    CMD ["./start.sh"]
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

Dockerfile中第一条FROM语句继承了官方的TensorFlow Serving GPU镜像。第二条RUN语句安装了必要的依赖库,包括编译工具、cURL工具、Git工具、OpenSSL工具、Python开发工具等。第三条WORKDIR语句将工作目录设置为/app。第四条ENV语句配置了环境变量MODEL_NAME,并将其设置为model1。第五条COPY语句将当前目录的所有内容复制到/app目录下,实现了将项目完整迁移至Docker镜像中。第六条RUN语句下载了Inception v5模型并解压至镜像内/app/model文件夹。第七条EXPOSE语句指定端口8501,作为TensorFlow Serving默认使用的端口。最后,CMD语句执行了启动脚本start.sh,作为启动命令运行。

构建完成后,可以运行 Docker 容器,并映射端口 8501 到宿主机:

复制代码
    docker run -t -i -p 8501:8501 <image_name>
    
    
    代码解读

这样,模型可以通过 http://localhost:8501/v1/models/<model_name>/versions/<version_number>:predict 被调用。

(2)Kubernetes 配置文件示例

Kubernetes 是一个开源项目,专注于提供容器化作业调度系统,支持开发者在生产环境中高效部署和管理容器化应用。Big Model Serving 是 Kubernetes 的一个组件,负责在 Kubernetes 集群上部署和管理大规模模型。

复制代码
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: big-model-serving
      labels:
    app: big-model-serving
    spec:
      replicas: 3
      selector:
    matchLabels:
      app: big-model-serving
      template:
    metadata:
      labels:
        app: big-model-serving
    spec:
      containers:
      - name: big-model-serving
        image: bms/big-model-serving:<tag> # replace with your own tag
        ports:
        - containerPort: 8500
          name: grpc-api
        livenessProbe:
          httpGet:
            path: /v1/models/model1
            port: grpc-api
          initialDelaySeconds: 5
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /v1/models/model1
            port: grpc-api
          initialDelaySeconds: 5
          periodSeconds: 10
      volumes:
      - name: models-config-map
        configMap:
          name: models-config-map
    ---
    apiVersion: v1
    data:
      9000: "big-model-serving:9000"
    kind: ConfigMap
    metadata:
      name: models-config-map
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: big-model-serving
      labels:
    app: big-model-serving
    spec:
      type: ClusterIP
      ports:
      - name: grpc-api
    port: 9000
    targetPort: grpc-api
      selector:
    app: big-model-serving
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

以下是改写后的文本

通过Kubernetes官方提供的部署工具,可以将配置文件提交至集群中,最终生成一个服务实例。

全部评论 (0)

还没有任何评论哟~