ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

FlexGen 单 GPU 高吞吐大模型推理引擎:论文解读与源码实战指南

FlexGen 单 GPU 高吞吐大模型推理引擎:论文解读与源码实战指南 推理引擎大模型【免费下载链接】FlexGenRunning large language models on a single GPU for throughput-oriented scenarios.项目地址https://gitcode.com/gh_mirrors/fl/FlexGen点击查看免费下载本文以 FlexGen 仓库中收录的论文《High-throughput Generative Inference of Large Language Models with a Single GPU》为核心骨架结合仓库源码flexgen/flex_opt.py、flexgen/compression.py、experimental/cost_model.py 等展开解读。通过本文你将理解 FlexGen 如何在单块普通 GPU如 16GB T4上通过 GPU/CPU/磁盘三级异构聚合、线性规划策略搜索与 4-bit 分组量化将 OPT-175B 级别的模型吞吐推升至 1 token/s 以上并掌握--percent卸载策略、压缩开关、HELM 基准接入与分布式扩展的完整实操方法。FlexGen 的定位是面向吞吐优先throughput-oriented场景的生成引擎这类任务批量评测、信息抽取、数据整理、表单处理需要以批处理方式在数百万 token 上反复运行 LLM对单次延迟不敏感但对整段运行时间的 token 吞吐率极为敏感。其核心思想是用 I/O 效率换延迟在低成本单 GPU 硬件上把批大小做到传统方案无法企及的规模从而显著提升最大吞吐。仓库 README 同时明确列出了其局限性作为基于卸载offloading的系统在弱 GPU 上、尤其是小批量场景下其速度仍远低于拥有足够强 GPU 将整个模型驻留显存的方案因此它主要针对单 GPU 上的批量处理设置优化。一、论文核心贡献为什么单卡能跑 175B 模型1.1 问题背景LLM 推理的资源门槛论文摘要指出大语言模型推理的传统路径需要多块高端加速器才能可行。而现实中出现了一批延迟不敏感latency-insensitive的批量处理任务公司内部全部私有文档的分类与抽取、HELM 基准上全部任务的跑分等。这类工作负载允许晚上提交作业、隔夜跑完的运行方式代价是吞吐率直接决定成本——吞吐被定义为任务整个运行时间可达数小时内每秒处理的 token 数。这种特性使得用延迟换吞吐成为可行策略也让低成本的普通商用 GPU 有了用武之地。1.2 三大关键技术FlexGen 应对资源约束的三大手段README How It Works 一节与论文摘要一致异构资源聚合GPU CPU Disk在不同硬件资源约束下灵活配置把权重、激活、注意力 KV cache 分散存放在 GPU 显存、CPU 内存与磁盘上按需加载计算线性规划LP策略优化器通过线性规划自动搜索张量存哪里、何时访问的最优模式在给定硬件GPU/CPU/磁盘容量与带宽约束下最大化吞吐4-bit 分组量化压缩对权重与注意力 KV cache 均压缩到 4 bit精度损失可忽略negligible从而把可容纳的批大小上限大幅抬升。1.3 代表性结果以论文/README 为准论文摘要给出了两个标志性结论均基于 GCP 上单块 NVIDIA T416GB实例、208GB DRAM、1.5TB SSD 的环境input seq len512output seq len32批大小调至各系统最大吞吐值运行 OPT-175B 时FlexGen首次在单 16GB GPU 上达到 1 token/s 的生成吞吐有效批大小 144配合压缩后的数字见下文性能表在 HELM 基准上FlexGen 用 16GB GPU 在 21 小时内完成了 30B 模型在 7 个代表性子场景下的跑分。二、上手实测从 OPT-1.3B 到 OPT-175B2.1 安装仓库 README 给出两种安装方式唯一硬性要求是PyTorch 1.12# 方式一pip 安装 pip install flexgen # 方式二源码安装 git clone https://github.com/FMInference/FlexGen.git cd FlexGen pip install -e .2.2 OPT-1.3B无卸载快速体验小模型可直接放进单 GPU无需卸载。FlexGen 会自动从 Hugging Face 下载权重python3 -m flexgen.flex_opt --model facebook/opt-1.3b运行后会看到 OPT-1.3B 生成的文本以及 benchmark 结果prefill/decode 延迟与吞吐见 flex_opt.py 的日志逻辑。2.3 OPT-30B引入 CPU 卸载与--percentpython3 -m flexgen.flex_opt --model facebook/opt-30b --percent 0 100 100 0 100 0--percent是 FlexGen 最核心的参数。它接收 6 个整数依次表示源码注释原文见 flex_opt.py位置含义默认值1权重放在 GPU 的百分比1002权重放在 CPU 的百分比03注意力 cache 放在 GPU 的百分比1004注意力 cache 放在 CPU 的百分比05激活activations放在 GPU 的百分比1006激活放在 CPU 的百分比0每一类的磁盘百分比是隐含的第三项由Policy属性计算得出flex_opt.pyproperty def w_disk_percent(self): # 权重磁盘占比 return 100 - self.w_gpu_percent - self.w_cpu_percent property def cache_disk_percent(self): # cache 磁盘占比 return 100 - self.cache_gpu_percent - self.cache_cpu_percent property def act_disk_percent(self): # 激活磁盘占比 return 100 - self.act_gpu_percent - self.act_cpu_percent实际分配时init_weight_list会按张量体积的累计分布cumsum把不同权重切成三段分别落到磁盘、CPU、GPUflex_opt.py。因此--percent 0 100 100 0 100 0的含义是权重全部放 CPU、cache 与激活全部放 GPU——这是 30B 在 16GB 显卡上的典型起点。参考策略可见 benchmark/flexgen/bench_suite.py30B 无压缩时通常采用--percent 20 80 0 100 0 100或--percent 10 90 0 100 0 100约 10%~20% 权重驻留 GPU其余在 CPU并搭配--gpu-batch-size 48 --num-gpu-batches 3之类的分批参数。2.4 OPT-175B全量卸载到磁盘OPT-175B 需要先从 metaseq 项目下载权重并按 Alpa 格式转换然后可将全部权重卸载到 SSDpython3 -m flexgen.flex_opt --model facebook/opt-175b --percent 0 0 100 0 100 0 --offload-dir YOUR_SSD_FOLDER--offload-dir默认值为~/flexgen_offload_dirflex_opt.py用于存放卸载到磁盘的张量。三、吞吐优先场景HELM 基准与数据整理应用3.1 将 FlexGen 接入 HELMFlexGen 可以作为 HELM 的执行后端。README 给出的 MMLU 场景示例命令可在单块 T416GB 200GB DRAM 上运行pip install crfm-helm python3 -m flexgen.apps.helm_run --description mmlu:modeltext,subjectabstract_algebra,data_augmentationcanonical --pad-to-seq-len 512 --model facebook/opt-30b --percent 20 80 0 100 0 100 --gpu-batch-size 48 --num-gpu-batches 3 --max-eval-instance 100实现侧flexgen/apps/helm_run.py 中的execute会构造ExecutionEnv与Policy将 HELM 请求按effective_bs分批get_batches先用 tokenizer 把 prompt 填充到pad_to_seq_len再按 batch_size 切分helm_run.py。README 提醒仅测试了部分 HELM 场景已测试场景清单见 flexgen/apps/helm_passed_30b.sh。3.2 数据整理Data Wrangling任务论文的姊妹工作《Can Foundation Models Wrangle Your Data?》中的示例可以直接复现操作说明位于 flexgen/apps/data_wrangle。该目录下 data_wrangle_run.py 同时提供single_query_test与batch_query_test两种模式分别对应单条查询与批量查询测试脚本如 test_batch_query_all_opt30b.sh正是吞吐优先场景的典型落地。四、API 使用Hugging Face 风格的生成接口4.1 生成 APIFlexGen 提供仿 Hugging Face transformers 风格的生成 API核心签名见 completion.pyoutput_ids model.generate( input_ids, do_sampleTrue, temperature0.7, max_new_tokens32, stopstop)底层OptLM.generate支持debug_mode、cut_gen_len截断生成长度用于快速调试等参数并内置 normal / overlap 两类生成循环generation_loop_normal、generation_loop_overlap_single_batch、generation_loop_overlap_multi_batch等见 flex_opt.py 中的方法定义。4.2 示例命令完整 OPT-6.7B至少 15GB 显存python3 -m flexgen.apps.completion --model facebook/opt-6.7b完整 OPT-30B约需 90GB CPU 内存python3 -m flexgen.apps.completion --model facebook/opt-30b --percent 0 100 100 0 100 0指令微调的 OPT-IML-MAX-30B同样约需 90GB CPU 内存python3 -m flexgen.apps.completion --model facebook/opt-iml-max-30b --percent 0 100 100 0 100 0注意completion.py内置了两个示例 prompt奥运会地点问答、机场代码抽取并在生成结束后调用env.close_copy_threads()关闭磁盘拷贝线程completion.py。五、性能数据与复现方法5.1 生成吞吐对比表README Performance Results 中的对比表括号内为有效批大小及其最低卸载层级硬件为 GCP 上 T4 16GB 208GB DRAM 1.5TB SSDworkload 为 input512 / output32批大小按各系统最大吞吐调优吞吐定义为 生成 token 数 ÷prompt 处理时间 生成时间系统OPT-6.7BOPT-30BOPT-175BHugging Face Accelerate25.12 (2 on GPU)0.62 (8 on CPU)0.01 (2 on disk)DeepSpeed ZeRO-Inference9.28 (16 on CPU)0.60 (4 on CPU)0.01 (1 on disk)Petals8.25 (2 on GPU)2.84 (2 on GPU)0.08 (2 on GPU)FlexGen25.26 (2 on GPU)7.32 (144 on CPU)0.69 (256 on disk)FlexGen with Compression29.12(72 on GPU)8.38(512 on CPU)1.12(144 on CPU)对应的有效批大小表与 Petals 基线说明见 benchmark/batch_size_table.md。完整复现方法含 1x1 / 1x4 / 4x1 等多种拓扑的 shell 脚本与 bench_suite.py 自动化套件见 benchmark/flexgen/README.md。从 bench_suite.py 可以直观看到压缩带来的批大小提升30B 无压缩时--gpu-batch-size 48 --num-gpu-batches 3有效批 144而启用--compress-cache后达到--gpu-batch-size 64 --num-gpu-batches 8有效批 512——与 README 表中数字一一对应。175B 压缩配置则采用--percent 0 100 0 100 0 100 --compress-weight --compress-cache的全 CPU策略配合--pin-weight 0以缓解内存压力。5.2 延迟-吞吐权衡Pareto 前沿README 中docs/throughput_vs_latency.jpg查看图片展示了三个基于卸载的系统在 OPT-175B左与 OPT-30B右上的延迟-吞吐曲线FlexGen 达成新的 Pareto 最优前沿最大吞吐显著更高而其他系统因内存不足无法继续增大批大小图中 FlexGen(c) 即启用压缩的 FlexGen。六、工作原理批调度、I/O 重叠与策略搜索6.1 吞吐视角下的延迟-吞吐权衡FlexGen 的关键洞见是主动利用延迟-吞吐权衡卸载方案天生难以实现低延迟但在吞吐优先场景下卸载的 I/O 效率可以被大幅提升。具体手段是block schedule块调度按块复用权重、把 I/O 与计算重叠overlap而基线系统普遍采用低效的逐行row-by-row调度。README 用 docs/block_schedule.jpg 直观对比了两种调度方式a 为基线逐行、b 为 FlexGen 块调度。这一思想在源码中落地为Policy的overlap字段默认 True见 flex_opt.py以及OptLM的三套生成循环generation_loop_overlap_single_batch与generation_loop_overlap_multi_batch专门负责在多 GPU batch 之间交错加载权重与计算从而隐藏磁盘/CPU 加载延迟。benchmark 套件中常见--overlap False的对照实验bench_suite.py便于量化重叠带来的收益。6.2 线性规划策略优化器与成本模型论文所述通过线性规划优化器搜索张量存储与访问的最优模式对应仓库 experimental/cost_model.py。它基于pulp线性规划库实现典型用法# 1. 在给定硬件约束下自动搜索最优策略 python cost_model.py --model facebook/opt-30b --prompt-len 512 --gen-len 32 \ --gpu-mem 16 --cpu-mem 200 --nvme-mem 1500 # 2. 估算给定策略的吞吐 python cost_model.py --model facebook/opt-30b --prompt-len 512 --gen-len 32 \ --gpu-mem 16 --cpu-mem 200 --nvme-mem 1500 \ --gpu-batch-size 48 --num-gpu-batches 3 \ --percent 20 80 0 100 0 100 \ --alpha-g 1.2 --alpha-c 1.2 --alpha-n 1.2文件头部注释明确给出了使用须知cost_model.py硬件常数CostModelConfig需要针对自己的设备重新拟合作者通过采集真实运行数据点用梯度下降拟合直接 profile 单个算子或从网络抄数都不准确alpha_g/alpha_c/alpha_n是峰值内存估计的松弛系数调小策略偏保守、调大偏激进当前模型不考虑 CPU 计算委托且量化支持不完整。README 的 Roadmap 也标注Release the cost model and policy optimizer为已完成项[X]。6.3 4-bit 分组量化权重与 KV cache 双压缩压缩由 flexgen/compression.py 实现核心是CompressionConfig分组量化配置与TorchCompressedDevice压缩张量管理设备。运行时通过两个开关开启--compress-weight # 压缩权重约省 70% 权重内存 --compress-cache # 压缩 KV cache两者默认的分组量化配置flex_opt.py为权重CompressionConfig(num_bits4, group_size64, group_dim0, symmetricFalse)cacheCompressionConfig(num_bits4, group_size64, group_dim2, symmetricFalse)从 compression.py 的实现可以看到压缩存储的具体形态4-bit 数据按group_size64分组data张量按每 2 个 4-bit 值打包成 1 个 uint8的方式存放data_shape shape[:group_dim] (num_groups * (group_size // 2),) ...并附带一个 fp16 的scale张量记录每组缩放因子。compress/decompress函数完成实际量化与反量化cache 压缩时还会在 CPU 上分配 fp32 反量化工作区init_attention_compute_workspace见 compression.py。README 提示权重压缩大约可减少 70% 的权重内存且论文报告压缩后精度损失可忽略negligible。6.4 执行环境与内存层级抽象FlexGen 把硬件抽象为统一的内存层级utils.py 的ExecutionEnv pytorch_backend.py 中的TorchDevice/TorchDisk/TorchMixedDevicegpu TorchDevice(cuda:0) cpu TorchDevice(cpu) disk TorchDisk(args.offload_dir) env ExecutionEnv(gpugpu, cpucpu, diskdisk, mixedTorchMixedDevice([gpu, cpu, disk]))权重按Policy的百分比切分后分别allocate在 disk/cpu/gpu 上init_weight_list推理时通过load_weight/load_cache/store_cache在层级间搬运磁盘侧使用多线程拷贝TorchDisk默认 4 个拷贝线程隐藏 I/O 延迟。--pin-weight 0可关闭 CPU 端权重页锁定pinned memory约减少 20% 以上的 CPU 权重内存占用README FAQ代价是拷贝稍慢。6.5 分布式扩展卸载 流水线并行当多机多卡但聚合显存仍小于模型大小时FlexGen 可把卸载与流水线并行pipeline parallelism结合DistOptLMdist_flex_opt.py继承OptLM引入pipeline_rank/num_pipeline_stages/comm_device等参数并通过send_hidden/recv_hidden在流水线阶段间传递激活。README 提示要获得可扩展的性能GPU 应分布在多台机器上同机多卡性能优化仍在其 Roadmap 中列为未完成项。分布式 benchmark 脚本见 benchmark/flexgen/bench_dist_single_node.sh 与 benchmark/flexgen/bench_dist_multi_node.sh。七、FAQ策略调参与内存不足排查7.1 如何设置卸载策略--percentREADME 明确说明目前需要手工尝试若干策略自动策略优化器已随 cost model 发布但调优仍需人工。总体原则是尽可能把参数与注意力 cache 卸载到 CPU、必要时到磁盘从而把显存让给更大的批大小。可直接参考 bench_suite.py 中的基准参考策略。出现 OOM 时把--percent中对应项调向 CPU/磁盘方向即可卸载更多张量。7.2 内存不足OOM时怎么办README FAQ 给出三条由省内存 → 更慢排序的应急手段不锁定权重加--pin-weight 0CPU 权重内存约省 20% 以上压缩权重加--compress-weight权重内存约省 70%权重全部落盘--percent 0 0 100 0 100 0配合--offload-dir几乎不占 CPU 与 GPU 内存。更进阶的排查可借助profile_bandwidth.pyflexgen/profile_bandwidth.py测磁盘与 PCIe 带宽与profile_matmul.pyflexgen/profile_matmul.py测矩阵乘性能先行刻画本机硬件常数再用 cost_model.py 预估各策略的吞吐减少盲目试参。八、结语与路线图FlexGen 证明了一条弱硬件 极致 I/O 调度 压缩 大批量的可行路径在 16GB 单卡上首次达到 OPT-175B 的 1 token/s 生成吞吐并把 HELM 30B 跑分压缩到 21 小时。它明确面向吞吐优先的批量场景代价是小批量/低延迟场景不具优势。README Roadmap 显示其后续计划包括优化同机多卡性能、支持更多模型BLOOM、CodeGen、GLM、MacbookM1/M2与 AMD 支持。论文全文出处为 docs/paper.md 所收录的 arXiv 论文《High-throughput Generative Inference of Large Language Models with a Single GPU》arXiv:2303.06865作者包括 Ying Sheng、Lianmin Zheng 等Subj 分类为 cs.LG / cs.AI / cs.PF。赞分享推理引擎大模型【免费下载链接】FlexGenRunning large language models on a single GPU for throughput-oriented scenarios.项目地址https://gitcode.com/gh_mirrors/fl/FlexGen点击查看免费下载相关推荐推荐文章FlexGen——单GPU下大型语言模型高吞吐量推理的新引擎推荐文章FlexGen——单GPU下大型语言模型高吞吐量推理的新引擎 在当今人工智能的快速发展中大型语言模型LLMs正以前所未有的方式重塑我们对信息处理推理引擎大模型FlexGen 单 GPU 高吞吐大语言模型推理引擎从安装、Offloading 策略到 HELM 与数据整理实战FlexGen 单 GPU 高吞吐大语言模型推理引擎从安装、Offloading 策略到 HELM 与数据整理实战 FlexGen 是一个面向吞吐优先th推理引擎大模型FlexGen 基准测试实战指南单 GPU 与多机多卡 OPT 模型吞吐量测试全解析FlexGen 基准测试实战指南单 GPU 与多机多卡 OPT 模型吞吐量测试全解析 本篇技术指南围绕 FlexGen 官方基准测试方案 benchmark推理引擎大模型上一篇终极指南如何使用 cmp-buffer 插件提升 Neovim 代码补全效率下一篇OpenVEX 漏洞披露数据管理指南以 minikube 仓库 .openvex 模板目录与 vexctl 发布集成为例创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表