基于 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.pypynccl_utils.py创建相应的通信库组件,然后将其中cudanccl字样分别替换为musamccl即可,然后在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变得越来越好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/886869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI震撼发布:桌面版ChatGPT,Windows macOS双平台AI编程体验!

【雪球导读】 「OpenAI推出ChatGPT桌面端」 OpenAI重磅推出ChatGPT桌面端&#xff0c;全面支持Windows和macOS系统&#xff01;这款新工具为用户在日常生活和工作中提供了前所未有的无缝交互体验。对于那些依赖桌面端进行开发工作的专业人士来说&#xff0c;这一更新带来了令人…

Python小白学习教程从入门到入坑------习题课3(基础巩固)

目录 一、选择题 二、实战题 2.1 实战一:从键盘获取一个4位整数&#xff0c;分别输出个位、十位、百位、千位上的数字 2.2 实战二&#xff1a;根据父母身高预测儿子的身高 一、选择题 1、以下哪项不是Python语言的保留字符&#xff08; C &#xff09; A. False B. and C. …

湘潭大学软件工程算法设计与分析考试复习笔记(四)

回顾 湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;一&#xff09;湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;二&#xff09;湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;三&#xff09; 前言 现在是晚上十一点&#xff0c;我平时是十…

Python学习29天

二分查找 # 定义函数冒泡排序法从大到小排列 def bbble_sort(list):# i控制排序次数for i in range(len(list) - 1):# j控制每次排序比较次数for j in range(len(list) - 1 - i):if list[j] < list[j 1]:list[j], list[j 1] list[j 1], list[j] # 定义二分查找函数 def…

SparkSQL的执行过程:从源码角度解析逻辑计划、优化计划和物理计划

SparkSQL的执行过程可以分为以下几个阶段&#xff1a;从用户的SQL语句到最终生成的RDD执行&#xff0c;涵盖逻辑计划、优化计划和物理计划。以下是详细的源码角度解析&#xff1a; 1. 解析阶段&#xff08;Parsing&#xff09; SQL语句解析&#xff1a;Spark 使用 Catalyst 引…

(Linux)搭建静态网站——基于http/https协议的静态网站

简单了解nginx配置文件 1.下载并开启nginx服务 下载 [rootlocalhost ~]# dnf install nginx -y开启 [rootlocalhost ~]# systemctl restart nginx 1.(1)搭建静态网站——基于http协议的静态网站 实验1&#xff1a;搭建一个web服务器&#xff0c;访问该服务器时显示“hello w…

【数据结构-表达式解析】力扣227. 基本计算器 II

给你一个字符串表达式 s &#xff0c;请你实现一个基本计算器来计算并返回它的值。 整数除法仅保留整数部分。 你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。 注意&#xff1a;不允许使用任何将字符串作为数学表达式计算的内置函数&#…

「六」体验HarmonyOS端云一体化开发模板——本地真机运行应用

关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 「目录」 「一」HarmonyOS端云一体化概要 「二」体验HarmonyOS端云一…

【Bug合集】——Java大小写引起传参失败,获取值为null的解决方案

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;本文面向的人群 二&#xff1a;错误场景引入 三&#xff1a;正确场景引入 四&#xf…

使用Kotlin写一个将字符串加密成short数组,然后可以解密还原成原始的字符串的功能

文章目录 一、运行效果1.1 单个字符串加解密1.2 多个字符串数组加解密二、源代码2.1 控制流图2.2 实现的源代码一、运行效果 1.1 单个字符串加解密 待加密的单个字符串: 测试字符串转化成short数组-----字节卷动 单个字符串加密后的数据: [19914, -21676, 31702, 23463, 2833…

云原生学习

1、云原生学习 文章目录 1、云原生学习1. 介绍2. Docker容器化 1. 介绍 什么是云原生&#xff1f;原生指使用JAVA等语言编写的项目&#xff0c;云是指将项目部署到云服务器上云平台&#xff1a;公有云、私有云 本地平台是指直接部署在自己计算机&#xff0c;而开发的应用一定要…

Python | 日志logging模块最基础的应用

之前总结过关于在项目中使用logging模块的好处&#xff0c;时间过去三四个月&#xff0c;结果从新遇到这个东西&#xff0c;又想不起它的基础用法&#xff0c;翻看过去文章发现还是有些进阶的&#xff0c;特此&#xff0c;写一篇最基础的应用来结束对logging的认识 过去两篇文…

Redis模拟延时队列 实现日程提醒

使用Redis模拟延时队列 实际上通过MQ实现延时队列更加方便&#xff0c;只是在实际业务中种种原因导致最终选择使用redis作为该业务实现的中间件&#xff0c;顺便记录一下。 该业务是用于日程短信提醒&#xff0c;用户添加日程后&#xff0c;就会被放入redis队列中等待被执行发…

【第4章 | 分类与逻辑回归】(python机器学习)

一、逻辑回归 1.1逻辑回归 二项逻辑回归 • Binomial logistic regression model是一种分类模型 • 由条件概率P(Y|X)表示的分类模型 • 形式化为logistic distribution • X取实数&#xff0c;Y取值1,0 特点&#xff1a; • 事件的几率odds&#xff1a;事件发生与事件不发生…

VSCode+ESP-IDF开发ESP32-S3-DevKitC-1(1)开发环境搭建

VSCodeESP-IDF开发ESP32-S3-DevKitC-1&#xff08;1&#xff09;开发环境搭建 1.开发环境搭建&#xff08;安装ESP-IDF&#xff09;2.开发环境搭建&#xff08;安装VS Code&#xff09;3.开发环境搭建&#xff08;VSCode中安装ESP-IDF插件及配置&#xff09; 1.开发环境搭建&am…

RAID存储技术 详解

RAID&#xff08;Redundant Array of Independent Disks&#xff0c;独立磁盘冗余阵列&#xff09;是一种将多个物理硬盘组合为一个逻辑存储单元的技术。它通过分布数据、冗余校验和容错能力&#xff0c;提高存储系统的性能、可靠性和容量利用率。 以下从底层原理和源代码层面…

Makefile 之 自动生成依赖性

在Makefile中的依赖关系可能会需要包含一系列的头文件&#xff0c;比如&#xff0c; 如果的main.c中有一句"#include defs.h"&#xff0c;那么的依赖关系应该是&#xff1a; main.o : main.c defs.h 但是&#xff0c;如果是一个比较大型的工程&#xff0c;必需清…

深入理解TTY体系:设备节点与驱动程序框架详解

往期内容 本专栏往期内容&#xff1a;Uart子系统 UART串口硬件介绍 interrupt子系统专栏&#xff1a; 专栏地址&#xff1a;interrupt子系统Linux 链式与层级中断控制器讲解&#xff1a;原理与驱动开发 – 末片&#xff0c;有专栏内容观看顺序 pinctrl和gpio子系统专栏&#xf…

Qt如何屏蔽工具栏(QToolBar)自动折叠功能

最近发现Qt上工具栏一行放不下的时候&#xff0c;会自动折叠起来。当用户点击展开功能的小三角按钮时&#xff0c;工具栏会展开成多行。这个功能本身没什么问题&#xff0c;但是当工具栏展开的时候&#xff0c;鼠标光标一旦不小心移动到了工具栏外面&#xff0c;这时候&#xf…

【大语言模型】ACL2024论文-17 VIDEO-CSR:面向视觉-语言模型的复杂视频摘要创建

【大语言模型】ACL2024论文-17 VIDEO-CSR&#xff1a;面向视觉-语言模型的复杂视频摘要创建 VIDEO-CSR&#xff1a;面向视觉-语言模型的复杂视频摘要创建 目录 文章目录 【大语言模型】ACL2024论文-17 VIDEO-CSR&#xff1a;面向视觉-语言模型的复杂视频摘要创建目录摘要研究…