魔搭开源推理引擎 DashInfer,助力CPU服务器解锁大模型超强推理

简介: ModelScope推出了预训练大语言模型(LLM)推理引擎DashInfer,采用C++ Runtime编写,提供C++和Python语言接口,具有生产级别的高性能表现,适用于多种CPU架构,包括x86和ARMv9。DashInfer支持连续批处理(Continuous Batching)和多NUMA推理(NUMA-Aware),能够充分利用服务器级CPU的算力,为推理14B及以下的LLM模型提供更多的硬件选择。该项工作已开源。

在CPU上高效推理大模型,是当前加速生成式AI应用广泛落地的核心命题。

就此,ModelScope推出了预训练大语言模型(LLM)推理引擎DashInfer,采用C++ Runtime编写,提供C++和Python语言接口,具有生产级别的高性能表现,适用于多种CPU架构,包括x86和ARMv9。DashInfer支持连续批处理(Continuous Batching)和多NUMA推理(NUMA-Aware),能够充分利用服务器级CPU的算力,为推理14B及以下的LLM模型提供更多的硬件选择。该项工作已开源。

代码开源地址:

https://github.com/modelscope/dash-infer

推理体验地址:

https://www.modelscope.cn/studios/modelscope/DashInfer-Demo

关于DashInfer

轻量级架构:仅需要最小程度的第三方依赖,并采用静态链接的方式引用依赖库。提供C++和Python接口,让DashInfer可以轻松集成到您的系统和其他编程语言中。

提供高精度实现:DashInfer经过严格的精度测试,能够提供与PyTorch、GPU引擎(vLLM)一致的推理精度。

优化的计算Kernel:结合OneDNN和自研汇编kernel,DashInfer能够在ARM和x86上发挥硬件的最大性能。ARM cpu+单batch条件下,推理Llama2-7B-Chat的16-bit权重和8-bit权重模型,DashInfer的生成性能分别是llama.cpp的1.5倍和1.9倍,详细性能测试结果参考performance.md

(https://github.com/modelscope/dash-infer/blob/main/documents/EN/performance.md)。

行业标准LLM推理技术:采用行业标准的LLM推理技术,例如:

  • 连续批处理(Continuous Batching),能够进行即时插入新请求,支持流式输出;
  • 基于请求的异步接口允许对每个请求的生成参数、请求状态等进行单独控制。

支持主流LLM开源模型:支持主流的开源LLM模型,包括Qwen、LLaMA、ChatGLM等,支持Huggingface格式的模型读取。

PTQ量化:使用DashInfer的InstantQuant(IQ),无需训练微调即可实现weight-only量化加速,提高部署效率。经过精度测试,IQ对模型精度不会产生影响。目前版本支持ARM CPU上的weight-only 8-bit量化。

优化的计算Kernel:结合OneDNN和自研汇编kernel,DashInfer能够在ARM和x86上发挥硬件的最大性能。

NUMA-Aware:支持多NUMA的tensor并行推理,充分发挥服务器级CPU的算力。通过numactl和多进程架构,精准控制计算线程的NUMA亲和性,充分利用多节点CPU的性能,并且避免跨NUMA访存带来性能下降问题。关于多NUMA的性能指导可以参考:Optimizing Applications for NUMA - Intel, What is NUMA?。

上下文长度(Context Length):目前版本支持11k的Context Length,未来还会继续支持更长Context Length。

提供多语言API接口:提供C++和Python接口,能够直接使用C++接口对接到Java、Rust等其他编程语言。

操作系统支持:支持Centos7、Ubuntu22.04等主流Linux服务器操作系统,并提供对应的Docker镜像。

硬件支持和数据类型

硬件支持

x86 CPU:

  • 要求硬件至少需要支持AVX2指令集。对于第五代至强(Xeon)处理器(Emerald Rapids)、第四代至强(Xeon)处理器(Sapphire Rapids)等(对应于阿里云第8代ECS实例,如g8i),采用AMX矩阵指令加速计算。

ARMv9 CPU:

  • 要求硬件支持SVE指令集。支持如倚天(Yitian)710等ARMv9架构处理器(对应于阿里云第8代ECS实例,如g8y),采用SVE向量指令加速计算。

数据类型

  • x86 CPU:支持FP32、BF16。
  • ARM Yitian710 CPU:FP32、BF16、InstantQuant。

InstantQuant

InstantQuant是一种weight-only量化技术。

在Yitian710 CPU(ARMv9)上,DashInfer支持weight-only量化。

要进行weight-only量化,需要修改模型配置文件的do_dynamic_quantize_convert和quantization_config字段,参数的详细说明参考Github。

weight-only量化,会在GroupSize的范围内求取weight的最大、最小值,并将weight数值映射到uint8的值域范围,计算公式如下:


推理过程中,量化的weight会被恢复成bfloat16进行矩阵乘法计算。

模型支持

Architecture

Models

DashInfer model_type

HuggingFace Models

ModelScope Models

QWenLMHeadModel

Qwen

Qwen_v10

Qwen/Qwen-1_8B-Chat,Qwen/Qwen-7B-Chat,Qwen/Qwen-14B-Chat, etc.

qwen/Qwen-1_8B-Chat,qwen/Qwen-7B-Chat,qwen/Qwen-14B-Chat, etc.

Qwen2ForCausalLM

Qwen1.5

Qwen_v15

Qwen/Qwen1.5-0.5B-Chat,Qwen/Qwen1.5-1.8B-Chat,Qwen/Qwen1.5-4B-Chat,Qwen/Qwen1.5-7B-Chat,Qwen/Qwen1.5-14B-Chat, etc.

qwen/Qwen1.5-0.5B-Chat,qwen/Qwen1.5-1.8B-Chat,qwen/Qwen1.5-4B-Chat,qwen/Qwen1.5-7B-Chat,qwen/Qwen1.5-14B-Chat, etc.

ChatGLMModel

ChatGLM

ChatGLM_v2

THUDM/chatglm2-6b,THUDM/chatglm2-6b-32k

ZhipuAI/chatglm2-6b,ZhipuAI/chatglm2-6b-32k

ChatGLMModel

ChatGLM

ChatGLM_v3

THUDM/chatglm3-6b,THUDM/chatglm3-6b-32k

ZhipuAI/chatglm3-6b,ZhipuAI/chatglm3-6b-32k

LlamaForCausalLM

LLaMA-2

LLaMA_v2

meta-llama/Llama-2-7b-chat-hf,meta-llama/Llama-2-13b-chat-hf

modelscope/Llama-2-7b-chat-ms,modelscope/Llama-2-13b-chat-ms

软件框架

推理流程



  1. 模型加载与序列化:此过程负责读取模型权重、配置模型转换参数及量化参数,并根据这些信息对模型进行序列化,并生成DashInfer格式(.asparam、.asgraph)的模型。此功能仅提供Python接口,并依赖于PyTorch和transformers库来访问权重。不同模型对PyTorch和transformers的版本要求可能有所不同,DashInfer本身并没有特殊的版本要求。
  2. 模型推理:此步骤负责执行模型推理,使用DashInfer推理序列化后的模型,不依赖PyTorch等组件。DashInfer采用DLPack格式的tensor来实现与外部框架(如PyTorch)的交互。DLPack格式的tensor,可以通过手动创建或由深度学习框架的tensor转换函数产生。对于C++接口,由于已经将几乎所有依赖静态编译,仅对openmp运行时库以及C++系统库的有依赖。我们进行了链接符号处理,以确保只有DashInfer的API接口符号可见,避免与客户系统中已有的公共库(如protobuf等)发生版本冲突。

说明:.asparam、.asgraph是由DashInfer内核(allspark)定义的一种特殊的模型格式。

使用Python接口时,可以将步骤1和2的代码放在一起。由于缺少C++层面加载Huggingface模型的功能,

C++接口只能进行DashInfer格式的模型推理,因此在使用C++接口前,必须先用Python接口先对模型进行序列化。

单NUMA架构图



在模型推理阶段,可以通过StartRequest传入请求输入token和生成参数发起推理请求,当请求成功后,DashInfer engine会返回一个输出队列ResultQueue和控制句柄RequestHandle。

  • ResultQueue用来获取输出token以及生成的状态,推理引擎会异步地把生成的token放到该队列中,可以阻塞(ResultQueue.Get())或非阻塞(ResultQueue.GetNoWait())地获取队列中的token。
  • RequestHandle是用来管理请求的句柄,DashInfer engine根据传入的RequestHandle实现对指定request的同步(Sync)、停止(Stop)和释放(Release)操作。其中SyncRequest操作,会在生成结束(生成的token数达到上限,或产生结束符)后返回,用来模拟同步接口的行为。

在单NUMA的模式下,DashInfer Runtime采用多线程和线程池的结构做调度。

多NUMA架构图


由于部分Linux内核无法在线程级别控制CPU亲和性,在多NUMA的CPU上采用单进程推理可能会出现跨NUMA访问内存访问,从而导致性能下降。为了能够精确地控制程序的CPU亲和性,DashInfer的多NUMA方案采用了多进程的client-server架构,实现tensor parallel的模型推理。在每个NUMA节点上,都有一个独立的进程运行DashInfer server,每个server负责一部分的tensor parallel推理,进程间使用OpenMPI进行协同(例如allreduce操作)。DashInfer client通过gRPC与server交互,提供唯一的对外接口,避免在调用DashInfer接口时,需要对多进程进行管理。


在API使用上,多NUMA和单NUMA的推理需要引用不同的头文件、.so库(或调用不同的python接口)。除了引用阶段外,其余接口一致,无需修改代码。具体可以参考examples中的示例。

  • 单NUMA
  • 头文件:allspark/allspark.h
  • .so库:liballspark_framework.so
  • python接口:allspark.Engine()


  • 多NUMA
  • 头文件:allspark/allspark_client.h
  • .so库:liballspark_client.so
  • python接口:allspark.ClientEngine()

注意:C++的liballspark_framework.so(单NUMA推理时调用)和

liballspark_client.so(多NUMA推理时调用)是互斥的,不能同时链接两个库。

性能测试

Llama-2-7b-chat在llama.cpp和DashInfer上的性能测试对比如下:


更多详细的性能测试结果请参考:

https://github.com/modelscope/dash-infer/blob/main/documents/EN/performance.md


该性能测试结果可用dashinfer_performance_test_example

(https://github.com/modelscope/dash-infer/tree/main/examples/python/1_performance) 中的脚本复现。

魔搭社区实战教程

1.modelscope个人主页进入我的Notebook,启动一个CPU实例

注意要选择与图示相同的预装镜像。


2.点击“查看Notebook”,进入创建的实例

进入实例需要按照界面提示绑定一下阿里云账号。


3.上传basic_example_qwen_v10_io.ipynb

https://github.com/modelscope/dash-infer/blob/main/examples/python/0_basic/basic_example_qwen_v10_io.ipynb


4.单步运行basic_example_qwen_v10_io.ipynb


未来规划

  • 首包加速:加入CPU实现的Flash-Attention等Attention加速技术;
  • Context Length:扩展到32k以上;
  • 低bit量化支持:支持4-bit量化;
  • QAT量化支持:支持GPTQ算法量化微调过的模型;
  • MoE:支持MoE模型和架构。

点击链接👇直达原文

https://www.modelscope.cn/studios/modelscope/DashInfer-Demo/summary

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
相关文章
|
18天前
|
存储 固态存储 安全
阿里云4核CPU云服务器价格参考,最新收费标准和活动价格
阿里云4核CPU云服务器多少钱?阿里云服务器核数是指虚拟出来的CPU处理器的核心数量,准确来讲应该是vCPU。CPU核心数的大小代表了云服务器的运算能力,CPU越高,云服务器的性能越好。阿里云服务器1核CPU就是一个超线程,2核CPU2个超线程,4核CPU4个超线程,这样云服务器可以同时处理多个任务,计算性能更强。如果网站流程较小,少量图片展示的企业网站,建议选择2核及以上CPU;如果网站流量较大,动态页面比较多,有视频等,建议选择4核、8核以上CPU。
阿里云4核CPU云服务器价格参考,最新收费标准和活动价格
|
29天前
|
存储 弹性计算 安全
ECS的安全责任共担模型
云服务器ECS的云上安全性是阿里云和客户的共同责任。本文介绍云服务器ECS(Elastic Compute Service)与客户在安全性方面各自应该承担的责任。
|
1月前
|
存储 弹性计算 固态存储
阿里云服务器CPU内存配置详细指南,如何选择合适云服务器配置?
阿里云服务器配置选择涉及CPU、内存、公网带宽和磁盘。个人开发者或中小企业推荐使用轻量应用服务器或ECS经济型e实例,如2核2G3M配置,适合低流量网站。企业用户则应选择企业级独享型ECS,如通用算力型u1、计算型c7或通用型g7,至少2核4G配置,公网带宽建议5M,系统盘可选SSD或ESSD云盘。选择时考虑实际应用需求和性能稳定性。
437 6
|
2天前
使用高性能服务器训练StableDiffusion——人物模型.safetensors
使用高性能服务器训练StableDiffusion——人物模型.safetensors
6 0
|
5天前
|
机器学习/深度学习 人工智能 网络安全
人工智能平台PAI产品使用合集之在本地可以成功进入模型流,但在服务器上无法进入,是什么原因
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
14天前
|
异构计算 弹性计算 并行计算
|
20天前
|
存储 弹性计算 缓存
阿里云2核CPU云服务器租用收费标准与活动价格参考
阿里云2核CPU云服务器多少钱?阿里云服务器核数是指虚拟出来的CPU处理器的核心数量,准确来讲应该是vCPU。CPU核心数的大小代表了云服务器的运算能力,CPU越高,云服务器的性能越好。阿里云服务器1核CPU就是一个超线程,2核CPU2个超线程,4核CPU4个超线程,这样云服务器可以同时处理多个任务,计算性能更强。如果网站流程较小,少量图片展示的企业网站,建议选择2核及以上CPU;如果网站流量较大,动态页面比较多,有视频等,建议选择4核、8核以上CPU。
阿里云2核CPU云服务器租用收费标准与活动价格参考
|
1月前
|
存储 机器学习/深度学习 人工智能
社区供稿 | Yuan2.0千亿大模型在通用服务器上的高效推理实现:以NF8260G7服务器为例
浪潮信息联合Intel在IPF大会上发布了可运行千亿参数大模型的AI通用服务器,首次实现了单机通用服务器,即可运行千亿参数大模型。并在发布现场演示了基于NF8260G7服务器进行yuan2.0-102B模型在代码编写、逻辑推理等高难度问题上的实时推理效果,引起了业界广泛的关注。本文将详细解读yuan2.0-102B模型在NF8260G7服务器上进行高效实时推理的原理和技术路径。
|
1月前
|
Linux
Linux rsyslog占用内存CPU过高解决办法
该文档描述了`rsyslog`占用内存过高的问题及其解决方案。
78 4
|
1月前
|
移动开发 运维 监控
掌握Linux运维利器:查看CPU和内存占用,轻松解决性能问题!
掌握Linux运维利器:查看CPU和内存占用,轻松解决性能问题!
117 0