MindSpore Serving基于昇腾910B实现大模型部署

本文介绍了MindSporeServing,一个用于将大模型部署到生产环境的轻量级服务组件。它解决了模型提交、部署和用户访问的问题,支持简单易用、定制化服务、批处理以及高性能扩展。文章详细描述了组件构成、功能特点和示例代码片段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Why MindSpore Serving

大模型时代,作为一个开发人员更多的是关注一个大模型如何训练好、如何调整模型参数、如何才能得到一个更高的模型精度。而作为一个整体项目,只有项目落地才能有其真正的价值。那么如何才能够使得大模型实现落地?如何才能使大模型项目中的文件以app的形式呈现给用户?

解决这个问题的一个组件就是Serving(服务),它主要解决的问题有:

  • 模型如何提交给服务;
  • 服务如何部署;
  • 服务如何呈现给用户;
  • 如何应用各种复杂场景等待

MindSpore Serving就是为了实现将大模型部署到生产环境而产生的。

MindSpore Serving是一个轻量级、高性能的服务模块,旨在帮助MindSpore开发者在生产环境中高效部署在线推理服务。当用户使用MindSpore完成模型训练后,导出MindIR,即可使用MindSpore Serving创建该大模型的推理服务。

MindSpore Serving实现的是一个模型服务化的部署,也就是说模型以线上的形式部署在服务器和云上,客户通过浏览器或者客户端去访问这个服务,将需要进行推理的输入内容发送给服务器,然后服务器将推理的结果返回给用户。

二、Component

MindSpore Serving由三部分组成,分别是客户端(Client)、Master和Worker。

  • 客户端是用户节点,提供了gRPC和RESTful的访问。

  • Master是一个管理节点,管理所有Worker的信息,包括Worker有哪些模型的信息;Master也是一个分化节点,接收到了客户端的请求之后,会根据请求的内容,结合当前管理的Worker节点的信息进行分发,将请求分发给不同的Worker执行。

  • Worker是一个执行节点,会执行加载、模型的更新,在接收到Master转发的请求之后,会将请求进行组装和拆分,然后做前处理、推理和后处理,执行完之后将结果返回给Master,Master再将结果返回给客户端。

三、Features

1.简单易用:
对客户端提供了gRPC和RESTful的服务,同时又提供了服务的拉起、服务的部署和客户端的访问,提供了简单的python接口,通过python接口,用户可以很方便的定制和访问部署服务,只需要一行命令就能够完成一件事。

2.提供定制化的服务:
对于模型来说输入和输出一般是固定的,而对于用户来说输入和输出可能是多变的,这就需要一个预处理模块,将模型的输入转为一个模型可以识别的输入。同时还需要一个后处理模块,给用户提供定制化的服务,针对模型可以定制方法classifly_top,用户根据需要去写前处理和后处理的操作。对于客户端来说只要指定模型名和方法名就能实现推理的结果。

3.支持批处理:
主要是针对具有batchsize维度的文本来说。batchsize实现了文本的并行,在硬件资源足够的情况下,batchsize可以很大地提高性能。对于MindSpore Serving来说,用户一次性发送的请求是不确定的,因此Serving分割和组合一个或者多个请求以匹配用户模型的batchsize。例如batchsize=2,但是有三个请求发过来,这时候就会将两个请求合并处理,到后面再拆分,这样就实现了三个请求的并行,提高了效率。

  1. 高性能扩展:
    MindSpore Serving所使用的算子引擎框架是MindSpore框架,具有自动融合和自动并行的高性能,再加上MindSpore Serving本身具有一个高性能的底层通信能力,客户端可以进行多实例组装,模型支持批处理,多模型之间支持并发,预处理和后处理支持多线程的处理。客户端和Worker可以实现扩展的,因此它也实现了一个高扩展性。

四、Demo

基于昇腾910B3

start_agent.py
from agent.agent_multi_post_method import *
from multiprocessing import Queue

from config.serving_config import AgentConfig, ModelName


if __name__ == "__main__":
    startup_queue = Queue(1024)
    startup_agents(AgentConfig.ctx_setting,
                   AgentConfig.inc_setting,
                   AgentConfig.post_model_setting,
                   len(AgentConfig.AgentPorts),
                   AgentConfig.prefill_model,
                   AgentConfig.decode_model,
                   AgentConfig.argmax_model,
                   AgentConfig.topk_model,
                   startup_queue)

    started_agents = 0
    while True:
        value = startup_queue.get()
        print("agent : %f started" % value)
        started_agents = started_agents + 1
        if started_agents >= len(AgentConfig.AgentPorts):
            print("all agents started")
            break

    # server_app_post.init_server_app()
    # server_app_post.warmup_model(ModelName)
    # server_app_post.run_server_app()

client/server_app_post.py
import asyncio
import json
import logging
import signal
import sys
import uuid
from multiprocessing import Process

import uvicorn
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
from sse_starlette.sse import EventSourceResponse, ServerSentEvent

from client.client_utils import ClientRequest, Parameters
from config.serving_config import SERVER_APP_HOST, SERVER_APP_PORT
from server.llm_server_post import LLMServer

logging.basicConfig(level=logging.DEBUG,
                    filename='./output/server_app.log',
                    filemode='w',
                    format=
                    '%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')

app = FastAPI()
llm_server = None


async def get_full_res(request, results):
    all_texts = ''
    async for result in results:
        prompt_ = result.prompt
        answer_texts = [output.text for output in result.outputs]
        text = answer_texts[0]
        if text is None:
            text = ""
        all_texts += text

    ret = {
   
        "generated_text": all_texts,
    }
    yield (json.dumps(ret, ensure_ascii=False) + '\n').encode("utf-8")


### 部署 DeepSeek 于升腾 910B 对于希望在华为升腾 910B 平台上部署 DeepSeek 的用户而言,需遵循特定的配置流程来确保模型能够高效运行并充分利用硬件资源。由于 DeepSeek 是一种大型语言模型 (LLM),其部署过程涉及多个方面,包括但不限于环境准备、依赖项安装以及具体的应用场景适配。 #### 环境搭建 为了使 DeepSeek 能够顺利运作,在开始之前应当确认已正确设置了支持 CANN(Compute Architecture for Neural Networks)框架的开发环境[^1]。这通常意味着要先完成如下几项工作: - 安装适用于 ARM 架构的操作系统版本; - 下载对应版本的 CANN SDK,并按照官方文档指示完成必要的驱动程序与库文件设置; ```bash # 假设已经获取到CANN SDK包 tar -xvf cann_sdk_package.tar.gz cd cann_install_dir/ sudo ./install.sh --accept-license ``` #### 模型转换与优化 考虑到不同平台之间的差异性,可能还需要对原始预训练好的 DeepSeek 进行针对性调整以便更好地适应目标设备特性。此环节主要围绕着量化处理、剪枝操作展开,目的是减少计算量的同时保持较高的精度水平。 #### 应用集成 最后一步则是将经过上述两阶段加工后的 DeepSeek 整合进实际业务逻辑当中去。此时可以借助 Python 或者其他高级编程语言编写接口函数实现数据交互功能,同时利用多线程/进程机制提高并发性能表现。 ```python from mindspore import Model, context import numpy as np context.set_context(mode=context.GRAPH_MODE, device_target="Ascend") def load_model(model_path): net = ... # 初始化网络结构 model = Model(net) param_dict = ms.load_checkpoint(model_path) ms.load_param_into_net(net, param_dict) return model model = load_model('path/to/deepseek_v3') input_tensor = np.random.randn(1, 768).astype(np.float32) # 输入张量模拟 output = model.predict(input_tensor) print(output) ``` 通过以上步骤可以在升腾 910B 上成功部署 DeepSeek V3 版本的大规模语言理解解决方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值