当前位置: 首页 > news >正文

大模型推理:vllm多机多卡分布式本地部署

文章目录
    • 1、vLLM分布式部署
      • docker镜像构建
      • 通信环境配置
    • 2、其他大模型部署工具
    • 3、问题记录
    • 参考文献

单台机器GPU资源不足以执行推理任务时,一个方法是模型蒸馏量化,结果就是会牺牲些效果。另一种方式是采用多台机器多个GPU进行推理,资源不足就堆机器虽然暴力但也是个不错的解决方法。值得注意的是多机多卡部署的推理框架,也适用于单机多卡,单机单卡,这里不过多赘述。

1、vLLM分布式部署

我的需求是Ubuntu中部署70B+大模型,不量化,两台机器,每台机器4张4090 24G显卡,采用docker环境,在稍微调研了一些支持多级多卡、支持serving部署的工具后,最终选择vllm部署,主要原因是看着简单,主流的开源LLM都支持且提供OpenAI接口访问。

docker镜像构建

?? docker镜像构建基本上就是参照一位博主的文章vLLM分布式多GPU Docker部署踩坑记来构建的镜像,区别就是去掉了里面的ENTRYPOINT以及添加node的entrypoint,仅在执行命令docker run时加上了使容器不退出的一行代码:tail -f /dev/null。
去掉的主要原因是作为新手小白,部署环境在频繁的踩坑,需要随时stop/start ray集群。

docker run -d --runtime=nvidia --network=host --ipc=host -v ${volume_user}:/vllm --gpus $gpus --name $container_name vllm:v5 tail -f /dev/null

注意: dockerfile里面不要使用命令EXPOSE暴露任何端口, vllm:v5是我自己构建的docker image.

通信环境配置

?? 我是一台机器启动了一个docker,将docker当作一个节点,在docker里面执行ray start --head --port=6379,将另一台机器的docker作为worker节点,并加入到ray cluster中,如果机器间的通信没有问题,worker节点在几秒内就能加入集群。

  • docker run启动
    ray集群的构建,涉及到很多端口,且有些是在某个范围内随机分配端口,如果采用docker和容器间的端口一一映射形式启动docker,docker run命令会执行相当久且不利于firewall规则的配置,因此建议选用network=host ipc=host形式的docker启动方式

  • firewall规则的配置
    在work节点执行ray start --address==xxx命令后,work节点加入了ray cluster,短暂时间后执行ray status命令,work节点掉线了,多半是机器间的通信问题,如果是同一网段的两台机器,可以采用以下命令设置同一网段内的机器互相访问无限制(命令仅需在head节点的宿主机中操作,网段替换为宿主机的实际网段

    firewall-cmd --permanent --zone=trusted --add-source=192.168.0.0/16 #允许该网段所有访问所有端口
    firewall-cmd --reload
    

    不建议直接关闭掉防火墙,容易产生更大的安全问题。更多信息参考该博文。

  • 环境变量配置
    vllm多节点多GPU部署LLM,节点间的通信涉及到GOO、TCP、NCCL等,下面是一些配置信息(docker内编辑/etc/profile文件,并source /etc/profile,或者写入~/.bashrc,同样需要source ~/.bashrc)

    # 指定通信网卡
    export GLOO_SOCKET_IFNAME=eno16np0
    export TP_SOCKET_IFNAME=eno16np0# NCCL配置
    # export NCCL_SOCKET_NTHREADS=10
    export NCCL_SOCKET_IFNAME=eno16np0
    export NCCL_DEBUG=info
    export NCCL_NET=Socket
    export NCCL_IB_DISABLE=0
    

    eno16np0是容器中的网卡名称,指定采用哪个网卡进行通信。下面的CUDA_HOME替换为你的cuda的实际路径。

    # 环境变量
    export CUDA_HOME="/usr/local/cuda-12.1"
    export PATH="${CUDA_HOME}/bin${PATH:+:"${PATH}"}"
    export LD_LIBRARY_PATH="${CUDA_HOME}/lib64:${CUDA_HOME}/extras/CUPTI/lib64${LD_LIBRARY_PATH:+:"${LD_LIBRARY_PATH}"}"
    export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
    
  • docker里面的主机设置
    确保head节点的IP与指定的通信网卡的IP一致,同时,检查/etc/hosts里面的IP对应的主机名与docker的主机名是一致的。

2、其他大模型部署工具

  • 推理工具
    • Deepspeed-inference& Deepspeed-fastgen
    • Accelerate
    • TensorRT-LLM
    • ollama
    • llama.cpp
    • FastChat
  • serving部署工具
    • Triton inferece server(仅FasterTransformer后端支持多节点多卡部署)
    • LMdeploy
    • vllm

3、问题记录

  • 【1】vllm启动时出现 WARNING[XFORMERS]: xFormers can’t load C++/CUDA extensions. xFormers was built for 问题
    • 现象1:PyTorch 2.3.0+cu121 with CUDA 1201 (you have 2.3.0+cu118)
    • 现象2:Python 3.10.14 (you have 3.10.12)
    • 原因: xFormers与pytorch、cuda、python版本不一致,解决办法就是找到相应的包重新安装,conda-xFormers版本列表、Github-xFormers,或者更新你得pytorch版本,选择torch2.3.0+cu12
  • 【2】vllm启动时出现 NameError: name ‘vllm_ops’ is not defined 问题
    • 为保持整篇文章的整洁,原因分析和解决办法我放另一篇文章了
  • 【3】vLLM执行推理时出现:ValueError: Total number of attention heads (32) must be divisible by tensor parallel size (6).
    • 更改vLLM的tensor_parallel_size参数,使其可以被被部署的大模型的注意力头数整除即可,头数可以查看大模型config.json中的参数:num_attention_heads。
  • 【4】vllm在线OpenAI接口推理服务启动后出现:ValueError: Ray does not allocate any GPUs on the driver node. Consider adjusting the Ray placement group or running the driver on a GPU node
    • 可能是后台有相同的命令: python -m vllm.entrypoints.openai.api_server ,上次未正确退出导致,kill掉再次执行即可
    • 或者重启整个ray,即ray stop后再次ray start命令
  • 【5】启动ray集群后,再执行更新python库、环境变量变更等操作,尝试启动vllm推理可能不起作用
    • ray stop后重新启动ray cluster
  • 【6】vLLM未正常启动,出现报错:RuntimeError: Gloo connectFullMesh failed with […/third_party/gloo/gloo/transport/tcp/pair.cc:144] no erro 且
    Error executing method init_device. This might cause deadlock in distributed execution.
    • 未正确设置GLOO_SOCKET_IFNAME、TP_SOCKET_IFNAME或者NCCL通信相关的环境变量,按照上述通信环境配置-环境变量配置后,重启ray环境。极少可能是hosts文件中IP和主机名映射出现问题。

参考文献

  • vLLM分布式多GPU Docker部署踩坑记:博客
  • vLLM官方仓库及文档:Github

相关文章:

大模型推理:vllm多机多卡分布式本地部署

文章目录 1、vLLM分布式部署 docker镜像构建通信环境配置 2、其他大模型部署工具3、问题记录参考文献 单台机器GPU资源不足以执行推理任务时,一个方法是模型蒸馏量化,结果就是会牺牲些效果。另一种方式是采用多台机器多个GPU进行推理,资源不…...

clickhouse-backup配置及使用(Linux)

一、下载地址 Releases Altinity/clickhouse-backup GitHub 二、上传到服务器解压安装 自行上传至服务器,解压命令: tar xvf clickhouse-backup-linux-amd64.tar.gz 三、创建软连接 sudo ln -sv build/linux/amd64/clickhouse-backup /usr/local/bin/…...

【YashanDB知识库】启动yasom时报错:sqlite connection error

本文内容来自YashanDB官网,原文内容请见 https://www.yashandb.com/newsinfo/7817893.html?templateId1718516 【标题】启动yasom时报错:sqlite connection error 【问题分类】安装部署 【关键字】错误码sqlite3.Error、yasom启动失败、共享集群 、u…...

JAVA学习笔记_Redis进阶

文章目录 初识redisredis简介windows启动redis服务器linux启动redis服务器图形用户界面客户端RDM redis命令常用数据类型特殊类型字符串操作命令Key的层级格式哈希操作命令列表操作命令集合操作命令有序集合操作命令通用命令 java客户端Jedisjedis连接池SpringDataRedis序列化手…...

LabVIEW手部运动机能实验系统

在运动科学、人机交互和康复训练等领域,手部运动功能的研究具有重要的应用价值。开发了一个基于LabVIEW的手部运动机能实验系统设计,该系统利用力量作为关键参数,通过实时数据采集和反馈帮助受试者完成精确的手部动作,同时为研究人…...

SpringBoot的注解@SpringBootApplication及自动装配

目录 一、pom文件 二、SpringBootApplication注解 1.SpringBootApplication 2.Configuration 3.这个启动类也可以被看成是一个配置类 三、SpringBootApplication注解2 1.SpringBootConfiguration 2.Configuration 3.EnableAutoConfiguration!!&…...

STM32学习之EXTI外部中断(以对外式红外传感器 / 旋转编码器为例)

中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序处理完成后又返回原来被暂停的位置继续运行 中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急…...

数字赋能:制造企业如何靠“数字能力”实现可持续“超车”?

如今,制造业数字化转型可是个热门话题,全球都在积极推进。我国更是出台了一系列给力的政策来助力制造业数字化转型,像《中国制造 2025》就明确提出要加快制造业数字化、网络化、智能化发展,各省市也纷纷响应,从资金、税…...

.NET在中国的就业前景:开源与跨平台带来的新机遇

随着技术的不断发展和市场需求的变化,.NET在中国的就业前景正变得愈加广阔。尤其是在开源和跨平台的推动下,越来越多的中国中小型企业选择了.NET技术作为其开发平台,进一步提升了.NET技术人才的市场需求。尽管在中国市场,.NET的市…...

【基础篇】一、MySQL数据库基础知识

文章目录 Ⅰ. 什么是数据库1、普通文件的缺点2、数据库的概念3、主流数据库4、MySQL Ⅱ. MySQL中客户端、服务端、数据库的关系Ⅲ. 见一见数据库1、数据库文件存放的位置2、创建数据库3、使用数据库4、创建数据库表结构5、表中插入数据6、查询表中数据7、数据的存储逻辑 &#…...

预训练深度双向 Transformers 做语言理解

大家读完觉得有意义记得关注和点赞!!! 与 GPT 一样,BERT 也基于 transformer 架构, 从诞生时间来说,它位于 GPT-1 和 GPT-2 之间,是有代表性的现代 transformer 之一, 现在仍然在很多…...

理解js闭包,原型,原型链

闭包 一个函数嵌套了另一个函数,内部函数引用了外部函数的变量,这样,当外部函数在执行环境中执行完毕后,因为某个变量被引用就无法被GC回收,导致这个变量会一直保持在内存中不能被释放。因此可以用来封装一个私有变量…...

linux tar 文件解压压缩

文件压缩和解压 tar -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 -z:有gzip属性的 -j:有bz2属性的 -v:显示所有过程 -O:…...

【SQL server】教材数据库(5)

使用教材数据库(1)中的数据表完成以下题目: 1 根据上面基本表的信息定义视图显示每个学生姓名、应缴书费 2 观察基本表数据变化时,视图中数据的变化。 3利用视图,查询交费最高的学生。 1、create view 学生应缴费视…...

Oracle 11G还有新BUG?ORACLE 表空间迷案!

前段时间遇到一个奇葩的问题,在开了SR和oracle support追踪两周以后才算是有了不算完美的结果,在这里整理出来给大家分享。 1.问题描述 12/13我司某基地MES全厂停线,系统卡死不可用,通知到我排查,查看alert log看到是…...

java实现预览服务器文件,不进行下载,并增加水印效果

通过文件路径获取文件,对不同类型的文件进行不同处理,将Word文件转成pdf文件预览,并早呢更加水印,暂不支持Excel文件,如果浏览器不支持PDF文件预览需要下载插件。文中currentUser.getUserid(),即为增加的水…...

SAP月结、年结前重点检查事项(后勤与财务模块)

文章目录 一、PP生产模块相关的事务检查二、SD销售模块相关的事务检查:三、MM物料管理模块相关的事务检查四、FICO财务模块相关的事务检查五、年结前若干注意事项【SAP系统PP模块研究】 #SAP #生产订单 #月结 #年结 一、PP生产模块相关的事务检查 1、月末盘点后,生产用料的…...

MYSQL 高阶语句

目录 1、排列查询 2、区间判断 3、对结果进行分组查询 4、limit和distinct 5、设置别名 通配符 6、子查询 7、exists语句,判断子查询的结果是否为空 8、视图表 9、连接查询 1. 内连接 2. 左连接 3. 右连接 create table info ( id int primary key, name…...

VS Code中怎样查看某分支的提交历史记录

VsCode中无法直接查看某分支的提交记录,需借助插件才行,常见的插件如果git history只能查看某页面的改动记录,无法查看某分支的整体提交记录,我们可以安装GIT Graph插件来解决这个问题 1.在 VSCode的插件库中搜索 GIT Graph安装&a…...

知识库搭建实战一、(基于 Qianwen 大模型的知识库搭建)

基于 Qianwen 大模型的知识库开发规划 基础环境搭建可以参考文章:基础环境搭建 在构建智能应用时,知识库是一个重要的基础模块。以下将基于 Qianwen 大模型,详细介绍构建一个标准知识库的设计思路及其实现步骤。 知识库的核心功能模块 知识库开发的核心功能模块主要包括…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

基于django+vue的健身房管理系统-vue

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.8数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat12开发软件&#xff1a;PyCharm 系统展示 会员信息管理 员工信息管理 会员卡类型管理 健身项目管理 会员卡管理 摘要 健身房管理…...

OpenHarmony标准系统-HDF框架之I2C驱动开发

文章目录 引言I2C基础知识概念和特性协议&#xff0c;四种信号组合 I2C调试手段硬件软件 HDF框架下的I2C设备驱动案例描述驱动Dispatch驱动读写 总结 引言 I2C基础知识 概念和特性 集成电路总线&#xff0c;由串网12C(1C、12C、Inter-Integrated Circuit BUS)行数据线SDA和串…...

Linux【5】-----编译和烧写Linux系统镜像(RK3568)

参考&#xff1a;讯为 1、文件系统 不同的文件系统组成了&#xff1a;debian、ubuntu、buildroot、qt等系统 每个文件系统的uboot和kernel是一样的 2、源码目录介绍 目录 3、正式编译 编译脚本build.sh 帮助内容如下&#xff1a; Available options: uboot …...