本地多卡(3090)部署通义千问Qwen2-72B大模型提速实践:从龟速到够用

news2024/11/24 7:55:49

最近在做文本风格转化,涉及千万token级别的文本。想用大模型转写,在线的模型一来涉及数据隐私,二来又不想先垫钱再找报销。本地的7-9B小模型又感觉效果有限,正好实验室给俺配了4卡3090的机子,反正也就是做个推理,也不训练不微调,就想试试本地72B大模型能不能跑起来。

先上结论:

  • 模型:Qwen-72B-Chat-Int4
  • 使用2张3090 24G就能跑起来,但是上下文长度在一千汉字左右就会爆显存OOM
  • 使用4张3090 24G也可以跑,上下文长度可以拓展到万字级别
  • 速度:短上下文约10字/s,勉强够用:

下面讲讲怎么做的:

 首先,有博主做了双卡3090部署Qwen2-72B-Int4的教程:

大模型笔记之-Qwen72B-chat-int4部署 |使用双卡3090成功运行_运行qwen-72b-CSDN博客

笔者也是看着该教程跑起来的,但是完全按照该教程会出现很多的问题:比如刚跑起来的时候,推理速度非常慢,大约1token/s,官方文档里面同样模型用A100能做到11.32token/s,完全没道理的。

整体流程:

1. 下载模型

从魔搭社区下载,不需要梯子

from modelscope.hub.snapshot_download import snapshot_download

model_dir = snapshot_download('qwen/Qwen-72B-Chat-Int4')

# 在当前目录下创建一个名为model_dir的txt文件,里面包含model_dir变量的内容
with open('model_dir.txt', 'w') as f:
    f.write(model_dir)

2. 配置环境

笔者cuda driver版本(通过nvidia-smi查看)是12.0,使用cuda runtime版本(通过nvcc -V查看)也应为12.0/12.1,否则后面源码编译flash-attention时会报ptxas版本错误:(以前都是runtime<=driver就行了,现在终于碰见一种情况必须==了)

ptxas *.ptx, line 9; Fatal : Unsupported .version 8.0; current version is ‘7.1’ ptxas fatal

2.1. 基础conda环境

conda安装:

python==3.10

pytorch==2.1.0

pytorch-cuda==12.1

由于conda里面 cuda toolkit / cuda runtime 没有 12.0版本(conda search cudatoolkit最高11.8),所以还得源码编译,但是实验室的服务器咱也没有root权限,所以参考这篇文章中修改路径的做法:不用sudo权限安装cuda10.1_非sudo用户安装cuda-CSDN博客

2.2. Qwen pip依赖

接着就是安装Qwen需要的pip依赖,首先下载Qwen git仓库

git clone https://github.com/QwenLM/Qwen.git

安装pip依赖:

#1.切换至项目目录下
cd Qwen

#2.安装项目依赖
pip install -r requirements.txt
#使用镜像源加速 pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/

#3.使用web_demo.py 还需要安装web依赖
pip install -r requirements_web_demo.txt

2.3. 安装量化模块auto-gptq

因为我们用Int4量化版本,所以需要安装auto-gptq量化包。在官方指南中,直接使用了pip安装,事后笔者发现这样安装会出现严重问题(事实上,这样子做可能会让推理速度降至1/10,而且还很难排查),在此我们先给出完美方案(参考Auto-GBTQ源码编译):

git clone https://github.com/PanQiWei/AutoGPTQ.git && cd AutoGPTQ
pip install numpy gekko pandas
# 有点小久
pip install -vvv --no-build-isolation -e .

2.4. 安装flash-attention(可选)

flash-attention据悉可以加速模型加载和推理,笔者自己感觉没什么区别。

注意要安装的话需要将cuda runtime(nvcc -V)和cuda driver(nvidia-smi)的版本对齐。

git clone https://github.com/Dao-AILab/flash-attention
cd flash-attention && pip install .
# 下方安装可选,安装可能比较缓慢。
# pip install csrc/layer_norm
# 如果flash-attn版本高于2.1.1,下方无需安装。
# pip install csrc/rotary

3. 运行

Qwen git repo中cli_demo和web_demo均可运行

3.1. 修改DEFAULT_CKPT_PATH

修改DEFAULT_CKPT_PATH为前文1.中model_dir(cli_demo 19行,web_demo 18行)

3.2. 修改device_map为多卡配置

(cli_demo 52行,web_demo 48行):

 2卡参考大模型笔记之-Qwen72B-chat-int4部署 |使用双卡3090成功运行_运行qwen-72b-CSDN博客

4卡:

# 偏向于少分配给卡0,因为在推理时卡0需要承担高负载
device_map = {'transformer.wte': 0, 'transformer.drop': 0, 'transformer.rotary_emb': 0, 'transformer.h.0': 0,
                      'transformer.h.1': 0, 'transformer.h.2': 0, 'transformer.h.3': 0, 'transformer.h.4': 0,
                      'transformer.h.5': 0, 'transformer.h.6': 0, 'transformer.h.7': 0, 'transformer.h.8': 0,
                      'transformer.h.9': 1, 'transformer.h.10': 1, 'transformer.h.11': 1, 'transformer.h.12': 1,
                      'transformer.h.13': 1, 'transformer.h.14': 1, 'transformer.h.15': 1, 'transformer.h.16': 1,
                      'transformer.h.17': 1, 'transformer.h.18': 1, 'transformer.h.19': 1, 'transformer.h.20': 1,
                      'transformer.h.21': 1, 'transformer.h.22': 1, 'transformer.h.23': 1, 'transformer.h.24': 1,
                      'transformer.h.25': 1, 'transformer.h.26': 1, 'transformer.h.27': 1, 'transformer.h.28': 1,
                      'transformer.h.29': 1, 'transformer.h.30': 1, 'transformer.h.31': 1, 'transformer.h.32': 1,
                      'transformer.h.33': 1, 'transformer.h.34': 1, 'transformer.h.35': 1, 'transformer.h.36': 2,
                      'transformer.h.37': 2, 'transformer.h.38': 2, 'transformer.h.39': 2, 'transformer.h.40': 2,
                      'transformer.h.41': 2, 'transformer.h.42': 2, 'transformer.h.43': 2, 'transformer.h.44': 2,
                      'transformer.h.45': 2, 'transformer.h.46': 2, 'transformer.h.47': 2, 'transformer.h.48': 2,
                      'transformer.h.49': 2, 'transformer.h.50': 2, 'transformer.h.51': 2, 'transformer.h.52': 2,
                      'transformer.h.53': 2, 'transformer.h.54': 2, 'transformer.h.55': 2, 'transformer.h.56': 2,
                      'transformer.h.57': 2, 'transformer.h.58': 2, 'transformer.h.59': 2, 'transformer.h.60': 2,
                      'transformer.h.61': 3, 'transformer.h.62': 3, 'transformer.h.63': 3, 'transformer.h.64': 3,
                      'transformer.h.65': 3, 'transformer.h.66': 3, 'transformer.h.67': 3, 'transformer.h.68': 3,
                      'transformer.h.69': 3, 'transformer.h.70': 3, 'transformer.h.71': 3, 'transformer.h.72': 3,
                      'transformer.h.73': 3, 'transformer.h.74': 3, 'transformer.h.75': 3, 'transformer.h.76': 3,
                      'transformer.h.77': 3, 'transformer.h.78': 3, 'transformer.h.79': 3, 'transformer.ln_f': 3,
                      'lm_head': 3}

# 也可以用这个
device_map = 'balanced_low_0'

静态负载:

3.3. 修改模型加载方式为AutoGPTQ

web_demo 50-55行

cli_demo 54-59行

model = AutoGPTQForCausalLM.from_quantized(
        args.checkpoint_path,
        device_map=device_map,
        trust_remote_code=True,
        resume_download=True,
        # use_marlin=True,
    ).eval()

如果用的是gptq v7.0,会让你用use_marlin:

INFO - You passed a model that is compatible with the Marlin int4*fp16 GPTQ kernel but use_marlin is False. We recommend using `use_marlin=True` to use the optimized Marlin kernels for inference. Example: `model = AutoGPTQForCausalLM.from_quantized(..., use_marlin=True)`.

但是不知道为什么,用了就报错,所以我注释掉了。

加载模型速度对比:


# 加载模型612.5322902202606s
model = AutoGPTQForCausalLM.from_quantized(
        args.checkpoint_path,
        device_map=device_map,
        trust_remote_code=True,
        resume_download=True,
        use_marlin=False,
    ).eval()

# 加载模型612s
model = AutoModelForCausalLM.from_pretrained(
        args.checkpoint_path,
        device_map=device_map,
        trust_remote_code=True,
        resume_download=True,
        use_flash_attn=True
    ).eval()

可以看出加载模型GPTQ快20%,官方文档说GPTQ推理速度也快20%,没实测,但显然和上面的观察结果一致。

3.4. 修改web_demo中的服务器地址,否则局域网无法访问

33行,改IP为0.0.0.0

parser.add_argument("--server-name", type=str, default="0.0.0.0",
                        help="Demo server name.")

4. 关于我是如何发现并把推理速度提升10倍的

最初按照官方文档做完之后,双卡/四卡3090推理速度在1token/s左右,是官方1张A100速度的10%,完全不符合逻辑。本来打算放弃了,突然看到官方文档里有一句话说用AutoGPTQ加载能快20%,于是我就试了试AutoGPTQForCausalLM而不是AutoModelForCausalLM加载模型

model = AutoGPTQForCausalLM.from_quantized()

但是其中给了我警告(AutoModelForCausalLM没有给过这个警告):

意思是我的auto-gptq包没装好,其中的Exllamav2没有安装,这会导致推理显著变慢。

于是我按着gptq主页:AutoGPTQ/AutoGPTQ: An easy-to-use LLMs quantization package with user-friendly apis, based on GPTQ algorithm. (github.com)的教程从源码编译装好了,速度就拉满了。

现在3090多卡速度(10token/s)和官方单张A100速度(10token/s)接近,可以看出其实卡间通讯其实并不是瓶颈。

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

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

相关文章

掌握MySQL基础命令:数据表结构修改详细操作

MySQL数据表&#xff08;Table&#xff09;是MySQL数据库中存储数据的基本结构单元。简单来说&#xff0c;数据表可以被看作是一个二维的、由行&#xff08;Row&#xff09;和列&#xff08;Column&#xff09;组成的表格&#xff0c;其中每一行代表了一个记录&#xff08;Reco…

微服务的分布式事务解决方案

微服务的分布式事务解决方案 1、分布式事务的理论模型1.1、X/Open 分布式事务模型1.2、两阶段提交协议1.3、三阶段提交协议 2、分布式事务常见解决方案2.1、TCC补偿型方案2.2、基于可靠性消息的最终一致性方案2.3、最大努力通知型方案 3、分布式事务中间件 Seata3.1、AT 模式3.…

数据跨境法案:美国篇上

近年来随着全球数字化的加速发展&#xff0c;数据已成为国家竞争力的重要基石。在这样的背景下&#xff0c;中国软件和技术出海的场景日益丰富。本系列邀请到在跨境数据方面的研究人员针对海外的数据跨境政策进行解读。 本期将针对美国对数据跨境流动的态度和政策进行阐释。过…

基础权限存储

一丶要求 建立用户组shengcan&#xff0c;其id为 2000建立用户组 caiwu&#xff0c;其id 为2001建立用户组 jishu&#xff0c;其id 为 2002建立目录/sc,此目录是 shengchan 部门的存储目录&#xff0c;只能被 shengchan 组的成员操作4.其他用户没有任何权限建立目录/cw,此目录…

两个全开源的3D模型素材下载网站源码 3D图纸模型素材 三维图形素材会员下载站源码

今天推荐两个全开源的3D模型素材下载网站源码 3D图纸模型素材 三维图形素材会员下载站源码&#xff0c;这两个源码完整&#xff0c;都是基于thinkphp内核开发的&#xff0c;框架稳定&#xff0c;带数据库&#xff0c;源码文件&#xff0c;可以直接部署使用。 第一个&#xff1a…

数据库课设---学生宿舍管理系统(sql server+C#)

1.引言 1.1 内容及要求 设计内容&#xff1a;设计学生宿舍管理系统。 设计要求&#xff1a; &#xff08;1&#xff09;数据库应用系统开发的需求分析&#xff0c;写出比较完善系统功能。 &#xff08;2&#xff09;数据库概念模型设计、逻辑模型设计以及物理模型设计。 …

【基于R语言群体遗传学】-10-适应性与正选择

在之前的博客中&#xff0c;我们学习了哈代温伯格模型&#xff0c;学习了Fisher模型&#xff0c;学习了遗传漂变与变异的模型&#xff0c;没有看过之前内容的朋友可以先看一下之前的文章&#xff1a; 群体遗传学_tRNA做科研的博客-CSDN博客 一些新名词 &#xff08;1&#xf…

AI绘画Stable Diffusion【图生图教程】:图片高清修复的三种方案详解,你一定能用上!(附资料)

大家好&#xff0c;我是画画的小强 今天给大家分享一下用AI绘画Stable Diffusion 进行 高清修复&#xff08;Hi-Res Fix&#xff09;&#xff0c;这是用于提升图像分辨率和细节的技术。在生成图像时&#xff0c;初始的低分辨率图像会通过放大算法和细节增强技术被转换为高分辨…

隔离级别-隔离级别中的锁协议、隔离级别类型、隔离级别的设置、隔离级别应用

一、引言 1、DBMS除了采用严格的两阶段封锁协议来保证并发事务的可串行化&#xff0c;实现事务的隔离性&#xff0c;也可允许用户选择一个可以保证应用程序正确执行并且能够使并发度最大的隔离性等级 2、通常用隔离级别来描述隔离性等级&#xff0c;以下将主要介绍ANSI 92标准…

【数据结构】链表带环问题分析及顺序表链表对比分析

【C语言】链表带环问题分析及顺序表链表对比分析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C语言学习之路 文章目录 【C语言】链表带环问题分析及顺序表链表对比分析前言一.顺序表和链表对比1.1顺序表和链表的区别1.2缓存利用率&#…

Blender新手入门笔记收容所(一)

基础篇 基础操作 视角的控制 控制观察视角&#xff1a;鼠标中键平移视图&#xff1a;Shift鼠标中键缩放视图&#xff1a;滚动鼠标中键滚轮 选中物体后&#xff1a;移动物体快捷键G&#xff0c;移动后单击鼠标就会定下来。 进入移动状态后&#xff1a;按Y会沿着Y轴移动进入移动…

谷粒商城学习笔记-17-快速开发-逆向工程搭建使用

文章目录 一&#xff0c;克隆人人开源的逆向工程代码二&#xff0c;把逆向工程集成到谷粒商城的后台工程三&#xff0c;以商品服务为例&#xff0c;使用逆向工程生成代码1&#xff0c;修改逆向工程的配置2&#xff0c;以Debug模式启动逆向工程3&#xff0c;使用逆向工程生成代码…

机器学习Day12:特征选择与稀疏学习

1.子集搜索与评价 相关特征&#xff1a;对当前学习任务有用的特征 无关特征&#xff1a;对当前学习任务没用的特征 特征选择&#xff1a;从给定的特征集合中选择出相关特征子集的过程 为什么要特征选择&#xff1f; 1.任务中经常碰到维数灾难 2.去除不相关的特征能降低学习的…

ASCII码对照表(Matplotlib颜色对照表)

文章目录 1、简介1.1 颜色代码 2、Matplotlib库简介2.1 简介2.2 安装2.3 后端2.4 入门例子 3、Matplotlib库颜色3.1 概述3.2 颜色图的分类3.3 颜色格式表示3.4 内置颜色映射3.5 xkcd 颜色映射3.6 颜色命名表 4、Colorcet库5、颜色对照表结语 1、简介 1.1 颜色代码 颜色代码是…

Koa2实现多并发文件上传

koa2批量上传文件 目前的是为了实现批量导入md文件&#xff0c;发布文章。这样就不用自己一篇一篇同步文章了。一次可以同步几千篇文章。 实现界面 内容 主要包含上传的文件标题&#xff0c;文件大小&#xff0c;上传状态。 <el-upload ref"uploader" v-model:…

维护el-table列,循环生成el-table

1、lib/setting.js&#xff08;维护table列&#xff09; const columns[{ label: 类型, prop: energyName, width: 150, isText: true },{ label: 消耗量(t或10⁴m), prop: inputNum, isInput: true },{label: CO₂,children: [// { label: 核算因子, prop: co2FactorValue, w…

Hi6276 无Y应用电源方案IC

Hi6276 combines a dedicated current mode PWM controller with integrated high voltage power MOSFET.Vcc low startup current and low operating current contribute to a reliable power on startup design with Hi6276. the IC operates in Extended ‘burst mode’ to …

Python【打包exe文件两步到位】

Python打包Exe 安装 pyinstaller&#xff08;pip install pyinstaller&#xff09; 执行打包命令&#xff08;pyinstaller demo.py&#xff09; 打完包会生成 dist 文件夹&#xff0c;如下如

Linux muduo 网络库

主要记录示意图和知识点框架&#xff1a; 1、阻塞、非阻塞、同步、异步 在处理IO的时候&#xff0c;阻塞和非阻塞都是同步IO&#xff0c;只有使用了特殊的API才是异步IO。 2、五种IO模型&#xff1a; 阻塞、非阻塞、IO复用、信号驱动、异步IO 3、muduo网络库 muduo网络库给用…

AiPPT的成功之路:PMF付费率与增长策略

如果要给 2023 年的 AI 市场一个关键词&#xff0c;那肯定是“大模型”&#xff0c;聚光灯和大家的注意力、资金都投向了那些大模型公司&#xff1b;而如果要给 2024 年的 AI 市场一个关键词&#xff0c;则一定是 PMF&#xff08;产品市场契合&#xff09;。如果没有 PMF&#…