【假期 AI 充电】揭秘大语言模型实践:分布式推理的工程化落地才是关键!

本文涉及的产品
应用实时监控服务-应用监控,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 【假期 AI 充电】揭秘大语言模型实践:分布式推理的工程化落地才是关键!

分布式推理成为大模型落地的首选方案


随着 3 月 15 日 OpenAI 重磅发布了 GPT4,其在司法考试、程序编程上的惊艳表现,将大家对大模型的热情推向了顶点,人们纷纷讨论是否我们已经进入到通用人工智能的时代。与此同时,基于大语言模型的应用也如雨后春笋出现在大家面前,其在协同办公、客服对话、语言翻译、内容生成等方面的使用均来带了前所未有的畅快体验。


在我们享受大语言模型带来的普惠 AI 能力时,它也给开发者带来了前所未有的挑战。GPT3 模型具有 1750 亿参数量,即使是针对学术界和初级用户的 Alpaca 也具有 70 亿的参数量,因此单机多卡的分布式推理便成为了大模型落地方案的不二选择。


本文将以 Bloom7B1 模型为样例,分享在阿里云容器服务 ACK 上,进行大语言模型分布式推理的具体实践。


工程化落地是大模型分布式推理的关键


随着越来越多的大语言模型发布,其中也有很多表现优秀的开源大语言模型能让大家体验,人们通过已有的大语言模型构建自己的应用也不再遥不可及。然而,与以往的模型不同,单张 GPU 卡的显存可能不足以支撑大语言模型。因此,需要使用模型并行技术,将大语言模型进行切分后,在多张 GPU 卡上进行推理。在本文中,我们使用 DeepSpeed Inference 来部署大语言模型分布式推理服务。


DeepSpeed Inference 是 Microsoft 提供的分布式推理解决方案,能够很好的支持 transformer 类型的大语言模型。DeepSpeed Inference 提供了模型并行能力,在多 GPU 上对大模型并行推理。通过张量并行技术同时利用多个 GPU,提高推理性能。DeepSpeed 还提供了优化过的推理定制内核来提高 GPU 资源利用率,降低推理延迟。详细信息可参考DeepSpeed Inference[3]


有了大模型分布式推理方案,然而想要在 Kubernetes 集群中高效部署大模型推理服务,还存在很多工程化挑战,比如大规模的 GPU 等异构资源如何高效地管理运维和自动调度?如何快速部署推理服务,服务上线后如何保证资源能够应对波动的访问量?以及没有适合的工具进行推理服务时延、吞吐、GPU 利用率、显存占用等关键指标监控,没有合理的模型切分方案,模型版本管理等。


本文使用阿里云容器服务 ACK 云原生 AI 套件进行 DeepSpeed 分布式推理的实践,可以轻松管理大规模异构资源,精细化的 GPU 调度策略和丰富的 GPU 监控告警能力,使用 Arena 快速提交和管理可弹性伸缩的推理服务,以及服务化运维等。


实践示例概述


本例中会使用以下组件:


  • Arena:Arena 是基于 Kubernetes 的机器学习轻量级解决方案,支持数据准备、模型开发,模型训练、模型预测的完整生命周期,提升数据科学家工作效率。同时和阿里云的基础云服务深度集成,支持 GPU 共享、CPFS 等服务,可以运行阿里云优化的深度学习框架,最大化使用阿里云异构设备的性能和成本的效益。更多 arena 信息,可以参考云原生 AI 套件开发者使用指南[1]
  • Ingress:在 Kubernetes 集群中,Ingress 作为集群内服务对外暴露的访问接入点,其几乎承载着集群内服务访问的所有流量。Ingress 是 Kubernetes 中的一个资源对象,用来管理集群外部访问集群内部服务的方式。您可以通过 Ingress 资源来配置不同的转发规则,从而达到根据不同的规则设置访问集群内不同的 Service 所对应的后端 Pod。更多 Ingress 信息,可以参考 Ingress 概述[2]
  • DeepSpeed Inference:是 Microsoft 提供的分布式推理解决方案,提供了对 GPT、BLOOM 等 LLM 模型的分布式推理优化,具体可参考 DeepSpeed Inference[3]


下列示例中,我们通过 Arena 在 Kubernetes 集群中部署了基于 Bloom 7B1 模型的单机多卡分布式推理服务,使用 DJLServing 作为模型服务框架。DJLServing 是由 Deep Java Library (DJL) 提供支持的高性能通用模型服务解决方案,能直接支持 DeepSpeed Inference,通过 HTTP 提供大模型推理服务,详细信息可参考 DJLServing[4]。使用 Arena 提交推理任务,在 Kubernetes 中使用 Deployment 部署推理服务,从共享存储 OSS 中加载模型和配置文件,通过 Service 暴露服务,为推理服务提供弹性伸缩、GPU 共享调度、性能监控、成本分析与优化等功能,降低您的运维成本。


实践示例步骤


环境准备

  • 创建包含 GPU 的 Kubernetes 集群[5]
  • 安装云原生 AI 套件[6]


大模型推理实践

接下来演示如何使用 Arena 命令行工具,在 ACK 容器服务中提交一个 Bloom7B1 模型的单机多卡分布式推理任务,并配置 Ingress 来进行服务访问。


1. 模型配置编写

模型配置中包括了两个方面的内容:


  • 配置文件,对应本例中的 serving.properties 文件,里面描述了模型配置的相关信息。这里重点关注两个参数:
  • tensor_parallel_degree:用于指定 tensor parallel 的 size,本例中设置为 2,也就是使用 2 张 GPU 卡进行分布式推理;
  • model_id:为模型的名称,huggingface 中 model 的名称,也可以是 download 后的模型地址;本例样例中,会将 bloom7B1 模型下载到 OSS 中,并通过 PVC 的形式挂载到容器内,因此这里会指定 OSS 的地址。


  • 推理逻辑文件,用于完成模型的加载和 request 的处理,具体如下:
  • get_model 函数:先进行 model 和分词器的加载,然后将 model 通过 deepspeed.init_inference 转换为具有分布式推理能力的 model,最后通过新生成的 model 来构建推理 pipeline;
  • handle 函数:通过调用 get_model 函数中生成的 pipeline 来完成 tokenize,forward 和 detokenize 流程。


serving.properties 内容如下:


  • 这里的 model_id 指定为 pvc 挂载后的容器内地址;如果没有提前 download 模型到本地,可以指定为 bigscience/bloom-7b1,程序会执行自动下载(模型文件一共 15G 作业)


engine=DeepSpeed
option.parallel_loading=true
option.tensor_parallel_degree=2
option.model_loading_timeout=600
option.model_id=model/LLM/bloom-7b1/deepspeed/bloom-7b1
option.data_type=fp16
option.max_new_tokens=100


model.py 内容如下:


mport os
import torch
from typing import Optional
import deepspeed
import logging
logging.basicConfig(format='[%(asctime)s] %(filename)s %(funcName)s():%(lineno)i [%(levelname)s] %(message)s', level=logging.DEBUG)
from djl_python.inputs import Input
from djl_python.outputs import Output
from transformers import pipeline, AutoModelForCausalLM, AutoTokenizer
predictor = None
def get_model(properties: dict):
    model_dir = properties.get("model_dir")
    model_id = properties.get("model_id")
    mp_size = int(properties.get("tensor_parallel_degree", "2"))
    local_rank = int(os.getenv('OMPI_COMM_WORLD_LOCAL_RANK', '0'))
    logging.info(f"process [{os.getpid()}  rank is [{local_rank}]]")
    if not model_id:
        model_id = model_dir
    logging.info(f"rank[{local_rank}] start load model")
    model = AutoModelForCausalLM.from_pretrained(model_id)
    tokenizer = AutoTokenizer.from_pretrained(model_id)
    logging.info(f"rank[{local_rank}] success load model")
    model = deepspeed.init_inference(model,
                                     mp_size=mp_size,
                                     dtype=torch.float16,
                                     replace_method='auto',
                                     replace_with_kernel_inject=True)
    logging.info(f"rank[{local_rank}] success to convert model to deepspeed kernel")
    return pipeline(task='text-generation',
                    model=model,
                    tokenizer=tokenizer,
                    device=local_rank)
def handle(inputs: Input) -> Optional[Output]:
    global predictor
    if not predictor:
        predictor = get_model(inputs.get_properties())
    if inputs.is_empty():
        # Model server makes an empty call to warmup the model on startup
        return None
    data = inputs.get_as_string()
    output = Output()
    output.add_property("content-type", "application/json")
    result = predictor(data, do_sample=True, max_new_tokens=50)
    return output.add(result)


分别将 serving.properties、model.py 和模型文件(可选)上传到 OSS 上。具体操作,请参见控制台上传文件[7]


上传到 OSS 之后,分别创建名称为 bloom7b1-pv 和 bloom7b1-pvc 的 PV 和 PVC,以用于推理服务的容器挂载。具体操作,请参见使用 OSS 静态存储卷[8]


2. 启动服务

将配置文件信息放入 PVC 中,可通过下列 arena 命令启动推理服务。


  • --gpus:设置为 2,表示需要使用 2 张 GPU 卡进行分布式推理
  • --data:bloom7b1-pvc 为上一步创建的 pvc,/model 为 pvc 挂载到容器中的路径


arena serve custom \
    --name=bloom7b1-deepspeed \
    --gpus=2 \
    --version=alpha \
    --replicas=1 \
    --restful-port=8080 \
    --data=bloom7b1-pvc:/model \
    --image=ai-studio-registry-vpc.cn-beijing.cr.aliyuncs.com/kube-ai/djl-serving:2023-05-19 \
    "djl-serving -m "


查看任务运行情况。


$ kubectl get pod | grep bloom7b1-deepspeed-alpha-custom-serving
bloom7b1-deepspeed-alpha-custom-serving-766467967d-j8l2l    1/1     Running     0          8s
# 查看启动日志
kubectl logs bloom7b1-deepspeed-alpha-custom-serving-766467967d-j8l2l -f


服务启动日志如下,通过日志我们可以看到:


  • 使用的 tensor parallel size 为 2 的分布式并行进行推理
  • 服务中启动了 process id 为 92 和 93 的两个进程,rank id 分别为 0 和 1
  • rank0 和 rank0 会同时进行 kernel 的转换和模型的加载,以实现分布式推理的任务


INFO  ModelServer Starting model server ...
INFO  ModelServer Starting djl-serving: 0.23.0-SNAPSHOT ...
INFO  ModelServer
INFO  PyModel Loading model in MPI mode with TP: 2.
INFO  PyProcess [1,0]<stdout>:process [92  rank is [0]]
INFO  PyProcess [1,0]<stdout>:rank[0] start load model
INFO  PyProcess [1,1]<stdout>:process [93  rank is [1]]
INFO  PyProcess [1,1]<stdout>:rank[1] start load model
INFO  PyProcess [1,0]<stdout>:rank[0] success to convert model to deepspeed kernel
INFO  PyProcess [1,1]<stdout>:rank[1] success to convert model to deepspeed kernel
INFO  PyProcess [1,0]<stdout>:rank[0] success load model
INFO  PyProcess [1,1]<stdout>:rank[1] success load model
INFO  PyProcess Model [deepspeed] initialized.
INFO  PyProcess Model [deepspeed] initialized.
INFO  PyModel deepspeed model loaded in 297083 ms.
INFO  ModelServer Initialize BOTH server with: EpollServerSocketChannel.
INFO  ModelServer BOTH API bind to: http://0.0.0.0:8080


3. 服务验证

这里我们启动 port-forward 来进行快速验证


# 使用 kubectl 启动port-forward
kubectl  -n default-group port-forward svc/bloom7b1-deepspeed-alpha 9090:8080


在另一个终端,请求服务


# 打开新的终端,执行下列命令
$ curl -X POST http://127.0.0.1:9090/predictions/deepspeed -H "Content-type: text/plain" -d "I'm very thirsty, I need"
[
  {
    "generated_text":"I'm very thirsty, I need some water.\nWhat are you?\n- I'm a witch.\n- I thought you'd say that.\nI know a great witch.\nShe's right in here.\n- You know where we can go?\n- That's right, in one moment.\n- You want to"
  }
]


4. Ingress 配置

我们可配置 Ingress 来将模型服务对外透出,以用来对外部流量进行管理,保证模型可用性。为上面创建的服务配置 Ingress 流程如下:


  • 登录容器服务管理控制台,在左侧导航栏选择集群。
  • 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择网络 > 路由。
  • 在路由页面,单击创建 Ingress,在创建 Ingress 对话框配置路由。


更详细的 Ingress 配置策略可以参考:创建 Nginx Ingress[9]


填写如下信息



Ingress 创建成功后,可以 Ingress 配置的域名来对 Bloom 模型进行访问。


% curl -X POST http://deepspeed-bloom7b1.c78d407e5fa034a5aa9ab10e577e75ae9.cn-beijing.alicontainer.com/predictions/deepspeed -H "Content-type: text/plain" -d "I'm very thirsty, I need"
[
  {
    "generated_text":"I'm very thirsty, I need to drink!\nI want more water.\nWhere is the water?\nLet me have the water, let me have the water...\nWait!\nYou're the father aren't you?\nDo you have water?\nAre you going to let me have some?\nGive me the"
  }
]


总结和展望


通过上面的例子,我们展示了如何使用 Arena 部署了一个 Bloom7B1 模型的单机多卡推理服务,使用 DeepSpeed-Inference 的模型并行推理技术,在多张 GPU 上进行推理。除了 DeepSpeed-Inference,当前也有一些其他的大模型分布式推理方案,比如 FastTransformer + Triton。后续我们也将不断探索,希望能够通过云原生 AI 套件,结合大模型分布式推理方案,用更低的成本支持高性能、低延迟、可弹性伸缩的大模型推理服务。


如果您希望深入了解更多关于 ACK 云原生 AI 套件的信息,或者需要与我们就 LLM/AIGC 等相关需求进行交流,欢迎加入我们的钉钉群:33214567。


相关链接:

[1] 云原生 AI 套件开发者使用指南

https://help.aliyun.com/document_detail/336968.html?spm=a2c4g.212117.0.0.14a47822tIePxy

[2] Ingress 概述

https://help.aliyun.com/document_detail/198892.html?spm=a2c4g.181477.0.0.67d5225chicJHP

[3] DeepSpeed Inference

https://www.deepspeed.ai/tutorials/inference-tutorial/

[4] DJLServing

https://github.com/deepjavalibrary/djl-serving

[5] 创建托管 GPU 集群

https://help.aliyun.com/document_detail/171074.html?spm=a2c4g.171073.0.0.4c78f95a00Mb5P

[6] 安装云原生 AI 套件

https://help.aliyun.com/document_detail/201997.html?spm=a2c4g.212117.0.0.115b1cb6yDEAjy

[7] 控制台上传 OSS 文件

https://help.aliyun.com/document_detail/31886.htm?spm=a2c4g.276055.0.0.528e663f4mIHH9#concept-zx1-4p4-tdb

[8] 使用 OSS 静态存储卷

https://help.aliyun.com/document_detail/134903.html?spm=a2c4g.134903.0.0.132a4e96wLxEPu

[9] 创建 Nginx ingress

https://help.aliyun.com/document_detail/86536.html?spm=a2c4g.198892.0.0.3acd663fsFwQPY

相关实践学习
使用ACS算力快速搭建生成式会话应用
阿里云容器计算服务 ACS(Container Compute Service)以Kubernetes为使用界面,采用Serverless形态提供弹性的算力资源,使您轻松高效运行容器应用。本文将指导您如何通过ACS控制台及ACS集群证书在ACS集群中快速部署并公开一个容器化生成式AI会话应用,并监控应用的运行情况。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
1524 54
|
1月前
|
人工智能 IDE Java
AI Coding实践:CodeFuse + prompt 从系分到代码
在蚂蚁国际信贷业务系统建设过程中,技术团队始终面临双重考验:一方面需应对日益加速的需求迭代周期,满足严苛的代码质量规范与金融安全合规要求;另一方面,跨地域研发团队的协同效率与代码标准统一性,在传统开发模式下逐渐显现瓶颈。为突破效率制约、提升交付质量,我们积极探索人工智能辅助代码生成技术(AI Coding)的应用实践。本文基于蚂蚁国际信贷技术团队近期的实际项目经验,梳理AI辅助开发在金融级系统快速迭代场景中的实施要点并分享阶段性实践心得。
346 25
AI Coding实践:CodeFuse + prompt 从系分到代码
|
1月前
|
人工智能 自然语言处理 测试技术
从人工到AI驱动:天猫测试全流程自动化变革实践
天猫技术质量团队探索AI在测试全流程的落地应用,覆盖需求解析、用例生成、数据构造、执行验证等核心环节。通过AI+自然语言驱动,实现测试自动化、可溯化与可管理化,在用例生成、数据构造和执行校验中显著提效,推动测试体系从人工迈向AI全流程自动化,提升效率40%以上,用例覆盖超70%,并构建行业级知识资产沉淀平台。
从人工到AI驱动:天猫测试全流程自动化变革实践
|
29天前
|
机器学习/深度学习 数据采集 人工智能
从ChatGPT到文心一言:AI为什么能“懂人话”?——大语言模型的底层逻辑揭秘
从ChatGPT到文心一言:AI为什么能“懂人话”?——大语言模型的底层逻辑揭秘
235 9
|
1月前
|
负载均衡 测试技术 调度
大模型分布式推理:张量并行与流水线并行技术
本文深入探讨大语言模型分布式推理的核心技术——张量并行与流水线并行。通过分析单GPU内存限制下的模型部署挑战,详细解析张量并行的矩阵分片策略、流水线并行的阶段划分机制,以及二者的混合并行架构。文章包含完整的分布式推理框架实现、通信优化策略和性能调优指南,为千亿参数大模型的分布式部署提供全面解决方案。
451 4
|
1月前
|
关系型数据库 Apache 微服务
《聊聊分布式》分布式系统基石:深入理解CAP理论及其工程实践
CAP理论指出分布式系统中一致性、可用性、分区容错性三者不可兼得,必须根据业务需求进行权衡。实际应用中,不同场景选择不同策略:金融系统重一致(CP),社交应用重可用(AP),内网系统可选CA。现代架构更趋向动态调整与混合策略,灵活应对复杂需求。
|
1月前
|
数据采集 存储 人工智能
从0到1:天猫AI测试用例生成的实践与突破
本文系统阐述了天猫技术团队在AI赋能测试领域的深度实践与探索,讲述了智能测试用例生成的落地路径。
从0到1:天猫AI测试用例生成的实践与突破
|
1月前
|
人工智能 新制造
TsingtaoAI受邀参加宁波AI海曙科创训练营并分享技术落地实践
10月12日至15日,由宁波市海曙区组织部主办的AI海曙科创训练营在宁波成功举办。作为受邀企业代表,TsingtaoAI团队深入参与了多项活动,与政府领导、行业专家及科创企业代表围绕AI技术在制造业、成果转化等领域的实际应用展开交流,用真实案例诠释了“技术扎根产业”的价值逻辑。
81 2
|
1月前
|
人工智能 运维 关系型数据库
云栖大会|AI时代的数据库变革升级与实践:Data+AI驱动企业智能新范式
2025云栖大会“AI时代的数据库变革”专场,阿里云瑶池联合B站、小鹏、NVIDIA等分享Data+AI融合实践,发布PolarDB湖库一体化、ApsaraDB Agent等创新成果,全面展现数据库在多模态、智能体、具身智能等场景的技术演进与落地。
|
人工智能 自然语言处理 前端开发
产品经理也能“开发”需求?淘宝信息流从需求到上线的AI端到端实践
淘宝推荐信息流业务,常年被“需求多、技术栈杂、协作慢”困扰,需求上线周期动辄一周。WaterFlow——一套 AI 驱动的端到端开发新实践,让部分需求两天内上线,甚至产品经理也能“自产自销”需求。短短数月,已落地 30+ 需求、自动生成 5.4 万行代码,大幅提升研发效率。接下来,我们将揭秘它是如何落地并改变协作模式的。
340 37
产品经理也能“开发”需求?淘宝信息流从需求到上线的AI端到端实践
下一篇
oss云网关配置