基于 MUSA 的大语言模型推理和服务框架vLLM
1. 引言
vLLM是一个高性能且内存高效的大语言模型推理和服务框架,也是当前业界使用范围最广的大模型推理框架,截至目前github star数28.4k。该框架性能优秀,而且部署容易,使用CUDA/ROCm提供GPU加速能力。但vLLM目前不支持使用摩尔线程GPU进行加速,应广大摩尔线程客户及MUSA开发者的呼声,我们对该框架进行了适配。
2. vLLM与MUSA
摩尔线程致力于构建完善好用的国产GPU应用生态,自主研发了MUSA架构及软件平台。现有的vLLM代码不支持摩尔线程GPU作为后端,因此我们新增了MUSA设备后端,从而让vLLM在摩尔线程GPU上流畅运行。
另外MUSA的一大优势是CUDA兼容,通过musify工具,我们可以快速将官方代码移植至MUSA软件栈,用户可以根据文档自行升级vLLM版本并适配MUSA软件栈。接下来我们将一步步介绍如何快速将vLLM适配到MUSA软件栈。
3. 软硬件依赖
以下是MUSA开发人员适配时所使用的环境,作为参考:
- ubuntu20.04
- vLLM: v0.4.2
- MUSA SDK: rc3.0.1
- pytorch: v2.2.0
- torch_musa: v1.3.0
- GPU: 摩尔线程S4000
- 模型: meta-llama/Llama-2-7b-hf
4. MUSA适配
4.1 MUSA移植
通过使用musify工具,用户可以快速将原有的CUDA代码无缝迁移到MUSA软件栈,大大提升了用户在MUSA软件栈上开发的效率。musify工具是一个文本替换工具,用于将用户代码中CUDA相关的接口转换为MUSA的对应接口,然后使用MUSA软件栈下的mcc编译器编译成为摩尔线程GPU的可执行文件。
目前用户有两种途径使用musify工具: 一种是通过MUSA SDK中自带的工具: /usr/local/musa/tools/musify-text
; 另一种是通过torch_musa中的torch_musa.utils.simple_porting
模块; 这两种方式都是musify工具的入口,用户可按需使用。
musify工具提供了常见的接口转换的映射关系,用户一般只需要运行:
# pip install ahocorapy
/usr/local/musa/tools/musify-text <source files/dir to be transformed>
由于用户代码的多样性,有时可能需要用户补充一些映射关系,这里展示了用户自定义映射关系转换的方式:
from torch_musa.utils.simple_porting import SimplePortingSimplePorting(cuda_dir_path="./csrc", mapping_rule={"#include <ATen/cuda/CUDAContext.h>": "#include \"torch_musa/csrc/aten/musa/MUSAContext.h\"","#include <c10/cuda/CUDAGuard.h>": "#include \"torch_musa/csrc/core/MUSAGuard.h\"","#include <ATen/cuda/Exceptions.h>": "#include \"torch_musa/csrc/core/MUSAException.h\"","#include <c10/cuda/CUDAStream.h>": "#include \"torch_musa/csrc/core/MUSAStream.h\"","at::kCUDA": "at::musa::kMUSA","at::cuda::getCurrentCUDAStream()": "at::musa::getCurrentMUSAStream()","__nv_bfloat16": "__mt_bfloat16",}).run()
限于篇幅,这里只展示了部分vLLM框架进行MUSA移植的映射关系,详情见: musa_porting.py
另外需要注意的是:CMakeLists.txt
文件中有时会将源文件一个个添加进去,所以也需要修改其中的文件名及后缀(或者使用musify工具)。
4.2 添加MUSA后端
该部分需要仿照代码中的CUDA后端,新增一个MUSA后端。该部分需要改动python层的代码,这里选取几个典型改动作为示例。
4.2.1 setup.py
首先需要导入torch_musa
库,同时使用torch_musa
中的MUSAExtension
将源文件添加到mcc的编译列表里,如下:
import torch_musa
from torch_musa.utils.musa_extension import BuildExtension, MUSAExtensionext_modules = []
ext_modules.append(MUSAExtension(name="vllm_C",sources=["csrc_musa/cache_kernels.mu","csrc_musa/attention/attention_kernels.mu","csrc_musa/pos_encoding_kernels.mu","csrc_musa/activation_kernels.mu","csrc_musa/layernorm_kernels.mu","csrc_musa/musa_utils_kernels.mu","csrc_musa/moe_align_block_size_kernels.mu","csrc_musa/pybind.cpp","csrc_musa/custom_all_reduce.mu",],extra_compile_args= {"cxx": ['-O3','-std=c++17'],}))
同时修改或新增一些后端的判断逻辑,让vLLM可以识别MUSA后端。
如在vllm/engine/arg_utils.py
中修改为:
parser.add_argument("--device",type=str,default=EngineArgs.device,choices=["auto", "cuda", "neuron", "cpu", "musa"],help='Device type for vLLM execution.')
4.2.2 torch.musa
vLLM框架中默认使用CUDA作为后端,因此在代码中直接调用了大量torch.cuda
相关的接口,对应的需要修改成torch.musa
相应的接口。或者添加判断条件,当后端设置为MUSA时,调用torch.musa
相应的接口。如:
# 官方代码:
# device_name = torch.cuda.get_device_name().replace(" ", "_")
# 修改为MUSA接口:
device_name = torch.musa.get_device_name().replace(" ", "_")
4.2.3 FlashAttention
摩尔线程 S4000(对应计算能力为mp_22)及之后的显卡均支持FlashAttention,对于pytorch框架我们需要使用scaled_dot_product_attention
接口。因此我们需要在vllm/attention/backends/flash_attn.py
文件中做如下修改:
import torch_musa
from torch.nn.functional import scaled_dot_product_attention# enable musa flash attention
torch.backends.cuda.enable_flash_sdp(True)
torch.backends.cuda.enable_math_sdp(False)
torch.backends.cuda.enable_mem_efficient_sdp(True)attn_output = scaled_dot_product_attention(query.contiguous(),key.contiguous(),value.contiguous(),attn_mask=att_mask.contiguous(),dropout_p=0.0,is_causal=False,)
这样我们就可以体验到MUSA软件栈的深度学习加速库:muDNN,带来的FlashAttention加速,充分释放硬件的计算能力。
4.2.4 分布式
CUDA架构使用NCCL作为分布式加速库,对应地,MUSA架构使用MCCL作为分布式加速库。我们需要在vllm/distributed/device_communicators/
目录下,仿照官方的pynccl.py
和pynccl_utils.py
创建相应的通信库组件,然后将其中cuda
,nccl
字样分别替换为musa
,mccl
即可,然后在vllm/distributed/parallel_state.py
中调用pymccl_utils
模块,在摩尔线程GPU上使用MCCL进行分布式加速。
5. 示例
接下来,我们通过一个简单的示例,展示下如何使用vLLM-MUSA进行大语言模型推理:
import torch
import torch_musa
from vllm import LLM, SamplingParams# modify to your model path
model_path = "/workspace/models/Llama-2-7b-chat-hf/"# prompts example
prompts = ["Hello, my name is","The capital of France is",
]# init vllm
sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
llm = LLM(model=model_path, trust_remote_code=True, device="musa")# generate result
outputs = llm.generate(prompts, sampling_params)# Print the outputs.
for output in outputs:prompt = output.promptgenerated_text = output.outputs[0].textprint(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")
可以看到相对于原生仓库,我们仅需要导入torch_musa
并将后端设置为musa
。
至此,我们成功完成了vLLM在MUSA平台的适配工作。
6. 寄语
vLLM-MUSA已经可在github获取: vllm_musa。
vLLM在MUSA平台快速便捷的适配过程,彰显了MUSA对CUDA的优良兼容性,助力用户业务实现快速高效迁移。我们期待更多的开发者,与我们一起,共同丰富完善MUSA开源社区,让MUSA变得越来越好。
相关文章:
基于 MUSA 的大语言模型推理和服务框架vLLM
1. 引言 vLLM是一个高性能且内存高效的大语言模型推理和服务框架,也是当前业界使用范围最广的大模型推理框架,截至目前github star数28.4k。该框架性能优秀,而且部署容易,使用CUDA/ROCm提供GPU加速能力。但vLLM目前不支持使用摩…...

鸿蒙网络编程系列48-仓颉版UDP回声服务器示例
1. UDP回声服务器简介 回声服务器指的是这样一种服务器,它接受客户端的连接,并且把收到的数据原样返回给客户端,本系列的第2篇文章《鸿蒙网络编程系列2-UDP回声服务器的实现》中基于ArkTS语言在API 9的环境下实现了UDP回声服务器,…...
android-studio-4.2下载 、启动
下载 分享一个国内的android studio网站,可以下载SDK和一些Android studio开发工具 https://www.androiddevtools.cn/ 启动 JAVA_HOME/app/zulu17.48.15-ca-jdk17.0.10-linux_x64/ /app5/android-studio-home/android-studio-ide-201.6568795-linux-4.2C1/bin/s…...
深度学习day2-Tensor 2
六 Tensor常见操作 Tensor:多维数组,用于存储和操作数据 1 获取元素值 data.item():单个元素tensor转为python数值 import torch #标量 xtorch.tensor(1) print(x.item()) #一阶 xtorch.tensor([100]) print(x.item()) #如果输入的数据超过1个&#…...
【Android踩过的坑】14.小米系统TTS无法生效的问题
【Android踩过的坑】14.小米系统TTS无法生效的问题 解决办法: 在AndroidManifest.xml中添加: <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"…...

RabbitMQ实现异步下单与退单
前言: 在电商项目中的支付模块也是一个很重要的模块,其中下订操作以及退订操作就是主要的操作。其次的下单是同步下单,也就是第三方支付、数据库扣减、积分增加、等等其他业务操作,等待全部执行完毕后向用户返回成功响应请求。对…...

鸿蒙NEXT开发案例:随机数生成
【引言】 本项目是一个简单的随机数生成器应用,用户可以通过设置随机数的范围和个数,并选择是否允许生成重复的随机数,来生成所需的随机数列表。生成的结果可以通过点击“复制”按钮复制到剪贴板。 【环境准备】 • 操作系统:W…...

nwjs崩溃复现、 nwjs-控制台手动操纵、nwjs崩溃调用栈解码、剪切板例子中、nwjs混合模式、xdotool显示nwjs所有进程窗口列表
-1. nwjs在低版本ubuntu运行情况 ubuntu16.04运行nw-v0.93或0.89报错找不到NSS_3.30、GLIBC_2.25 uname -a #Linux Asus 4.15.0-112-generic #113~16.04.1-Ubuntu SMP Fri Jul 10 04:37:08 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux cat /etc/issue #Ubuntu 16.04.7 LTS \n \l…...

视觉SLAM--经典视觉SLAM框架
整个视觉SLAM流程主要包括以下步骤: 1、传感器信息读取:在视觉SLAM中主要为相机图像信息的读取和预处理。 2、前端视觉里程计:估算相邻图像间相机的运动,以及局部地图的样子。 3、后端(非线性)优化&#…...

Wallpaper壁纸制作学习记录05
效果简介 效果可以应用于现有组件,主要是您导入的图像。您可以在图像图层、文本图层、全屏图层和合成图层上使用效果。要添加效果需要打开之前的项目或创建一个新的项目,然后点击右侧效果区域的添加按钮。 将鼠标悬停在效果列表是,将显示眼睛…...

Elasticsearch 中的热点以及如何使用 AutoOps 解决它们
作者:来自 Elastic Sachin Frayne 探索 Elasticsearch 中的热点以及如何使用 AutoOps 解决它。 Elasticsearch 集群中出现热点的方式有很多种。有些我们可以控制,比如吵闹的邻居,有些我们控制得较差,比如 Elasticsearch 中的分片分…...

springboot基于微信小程序的食堂预约点餐系统
摘 要 基于微信小程序的食堂预约点餐系统是一种服务于学校和企事业单位食堂的智能化解决方案,旨在提高食堂就餐的效率、缓解排队压力,并优化用户的就餐体验。系统作为一种现代化的解决方案,为食堂管理和用户就餐提供了便捷高效的途径。它不仅…...

字符串学习篇-java
API:应用程序编程接口。 ctrlaltv,自动生成一个变量接收数据 字符串: 注意点 创建string对象两种方式 1.直接赋值 2.构造器来创建 详情看黑马JAVA入门学习笔记7-CSDN博客 常用方法:比较 引用数据类型,比较的是地址值。 b…...

2024亚太杯数学建模C题【Development Analyses and Strategies for Pet Industry 】思路详解
C:宠物行业及相关产业的发展分析与战略 随着人们消费观念的发展,宠物行业作为一个新兴产业,正在全球范围内逐渐积聚势头,这得益于快速的经济发展和人均收入的提高。1992年,中国小动物保护协会成立,随后1993…...
STM32串口——5个串口的使用方法
参考文档 STM32串口——5个串口的使用方法_51CTO博客_stm32串口通信的接收与发送 串口是我们常用的一个数据传输接口,STM32F103系列单片机共有5个串口,其中1-3是通用同步/异步串行接口USART(Universal Synchronous/Asynchronous Receiver/Transmitter)…...

NVR接入录像回放平台EasyCVR视频融合平台加油站监控应用场景与实际功能
在现代社会中,加油站作为重要的能源供应点,面临着安全监管与风险管理的双重挑战。为应对这些问题,安防监控平台EasyCVR推出了一套全面的加油站监控方案。该方案结合了智能分析网关V4的先进识别技术和EasyCVR视频监控平台的强大监控功能&#…...
Ubuntu24.04安装gpfs客户端
文章目录 Ubuntu24.04安装gpfs客户端拷贝软件包在客户端执行命令,提取产品包进入安装包目录,安装相关产品包编译。编译过程中会检查系统依赖接入集群(后续) Ubuntu24.04安装gpfs客户端 拷贝软件包 scp /root/Spectrum_Scale_Dat…...

Android Framework层介绍
文章目录 前言一、Android Framework 层概述二、主要组件1. 应用程序接口(API)2. 系统服务3. Binder4. 资源管理5. Content Provider6. 广播接收器(BroadcastReceiver)7. 服务(Service) 三、与 Linux Kerne…...

如何利用 Puppeteer 的 Evaluate 函数操作网页数据
介绍 在现代的爬虫技术中,Puppeteer 因其强大的功能和灵活性而备受青睐。Puppeteer 是一个用于控制 Chromium 或 Chrome 浏览器的 Node.js 库,提供了丰富的 API 接口,能够帮助开发者高效地处理动态网页数据。本文将重点讲解 Puppeteer 的 ev…...

SpringMVC接收请求参数
(5)请求参数》五种普通参数 1.普通参数 代码块 RequestMapping("/commonParam") ResponseBody public String commonParam(String name,int age){System.out.println("普通参数传递 name > "name);System.out.println("普通…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...