1. 项目概述
1.1 为什么要关注airllm这件事
如果最近你一直在关注大语言模型的本地化部署,肯定绕不开一个让人头疼的问题:显存不够用。想跑一个7B模型,至少需要14GB显存,跑13B模型得上24GB,至于70B级别的开源模型,没有两块80GB的顶级显卡根本想都别想。很多开发者手里只有一张消费级显卡,甚至只有16GB或者12GB显存,面对那些效果很好的开源大模型,只能望而却步。
我刚开始也卡在这一步。折腾了各种量化方案、剪枝技术、CPU推理加速库,要么部署步骤繁琐到劝退,要么模型精度损失严重,要么推理速度慢到没法实际使用。后来在一个技术社区里看到有人在讨论airllm这个项目名,它的核心思路很特别:不追求把大模型完整装进显存,而是利用存储空间换显存资源,让单张消费级显卡也能跑超大模型的推理。
airllm本质上是一套面向大语言模型的推理加速框架,设计目标非常明确:突破显存墙的限制。它允许模型权重大部分时间待在硬盘或者内存里,只有计算需要的哪几层才临时载入显存,计算完再换下一层。这个思路乍一听有点像是把显存当缓存用,但真正落地时涉及到的细节远比想象中复杂。这篇文章我就把我从调研、实验到实际跑通的完整过程写出来,包括它背后到底是怎么实现的、我自己踩过哪些坑、以及这类工具适合什么场景哪些场景别碰。
1.2 这套方案解决的核心痛点
在介绍airllm之前,先明确一下它解决的几类核心问题。
第一类,低显存环境下运行超大模型。传统推理时,模型权重需要一次性加载到GPU显存,哪怕用8bit量化也够呛。airllm的思路是逐层加载、逐层释放,显存占用不再与模型总参数量强相关,而是与单层权重大小强相关。这意味着哪怕模型有700亿参数,只要单层大小能塞进显存,就有机会跑起来。
第二类,简化大模型本地部署复杂度。常规做法中,想把大模型跑在低显存环境,你需要考虑分片、卸载、量化格式互转、自定义算子等一系列复杂操作。airllm把这些东西封装成了类似标准推理库的接口,加载模型加生成文本的写法与常见框架差异不大,大大降低了上手门槛。
第三类,支持商用或科研中“先跑通再优化”的快速验证需求。很多时候我们并不需要立马拿到极速推理,而是需要验证某个模型在特定任务上的效果,或者给客户做demo演示。airllm这种先把模型跑起来、再谈性能的模式,对这种场景特别有价值。
1.3 适合谁参考这篇内容
如果你手头只有一张普通消费级显卡,但又想本地跑13B以上的开源模型,那么这套方案值得你花时间了解。如果你想搞清楚大模型推理框架里“显存换速度”到底是怎么实现的,这篇文章也覆盖了核心机制。还有一类人适合关注:逻辑上对量化和分布式部署方案已经有一定了解,但觉得现有路径的成本太高或者配置太繁琐,想找一条更轻量落地路径的开发者。
反过来,如果你是追求极致推理吞吐的服务端开发者,或者项目要求严格的在线延迟指标,那这篇内容更多是提供一种对照参考,不一定适合直接用于生产环境。我后面会单独说清楚它的性能边界。
2. 核心机制与技术原理
2.1 逐层调度:把“装不下”变成“分次搬”
airllm最核心的设计思路,是把模型的计算过程理解成一条流水线。大语言模型本质上是多层Transformer结构堆叠,数据从第一层流到最后输出层,前一层算完的结果是后一层的输入。这就意味着,从计算逻辑上看,其实没必要在任何一个时刻让所有层都驻留在显存中。
airllm的做法是:推理开始时,先从存储中读取模型最前面的若干层到显存,计算完这些层后,把输出保存在显存中或者CPU内存里,然后释放已经算完的层,再去加载后续层。整个过程像传送带一样,一次只搬运一小段计算单元,用完即扔。
这种机制之所以能奏效,是因为大模型推理存在一个天然特征:层与层之间的依赖关系是顺序的,而不是全连接的。既然计算路径是线性的,那么权重加载路径也可以线性化。这与传统计算中提高cache命中率的方法是同一个道理,只不过airllm把“CPU缓存”的概念扩展到了“存储与显存之间的调度”上。
有人可能会问:如果每层都要重新从硬盘读一次,会不会慢到无法接受?答案是取决于具体场景。airllm在加载层时充分利用了文件顺序读的高带宽优势,而且量化后的单层权重体积更小,读取耗时被压缩到可以接受的范围。同时它还有一套预热机制,后面我会细说。
2.2 存储分层与计算流的衔接
airllm不是简单粗暴地把每一层都从硬盘读,而是建立了一套存储分层策略。在初始化模型时,它会创建后端存储区域,可能是系统内存,也可能是磁盘上的映射文件。当模型被加载时,权重文件内容并不立刻进入显存,而是先进入存储体系中,GPU侧再按需拉取。
我测过的场景里,把700亿参数的模型权重放在NVMe固态硬盘上,从存储中加载单层到显存的时间比想象中短很多,实测在几百毫秒量级。如果放在普通机械硬盘上,时间会明显变长,所以存储设备的随机读取能力对这个框架的表现影响很大。
计算流这一侧,airllm在处理时会把显存中的层计算完成后,保留必要的中间激活结果,然后把这些结果传递给下一组层。它的隐藏状态可以留在GPU上也可以卸载到内存,这取决于显存占用情况。这种调度思路很像操作系统里的内存分页机制,数据在不同层级之间交换,保证当前计算步骤永远有足够资源完成。
2.3 量化与稀疏化的隐性加持
airllm本身并不仅仅依赖逐层调度,它内部对模型做了进一步压缩处理。在使用中,它会自动将加载的模型权重转换为4bit或者更低bit的表示,这并不是简单的原地截断,而是搭配了某种形式的稀疏化处理。稀疏化会剔除一部分不重要的权重元素,让权重张量在存储和传输时体积都更小。
这里有一个容易误解的点:很多人以为量化只是推理时才会生效,实际上airllm在模型加载阶段就会转换权重格式并缓存。也就是说,第一次加载时可能等待时间较长,但之后加载权重就快了,因为缓存中保存的已经是优化后的稀疏化低精度版本。
我在测试中还注意到一个细节:这种量化处理并不是对所有层都下死手,模型的前几层和最后几层往往对精度更敏感,airllm在调度时会针对敏感层使用更高精度表示,中间层则大胆使用低精度。这种分区域精度策略带来的好处是,平均精度损失比全模型uniform量化要低不少。
2.4 批处理调度与并发窗口
既然是推理框架,肯定绕不开并发和批处理。airllm在逐层加载的基础上,引入了批量请求队列设计。如果同时有多个生成请求进来,它会尽量让这些请求共享同一个层加载进度,也就是说,当某一层被加载到显存后,批次内的所有请求都先在这一层完成计算,再一起切换到下一层。这种做法相当于把“多份逐层加载开销”合并成了一份。
这个设计思路对于吞吐提升非常有帮助。单独一个请求跑700亿模型,可能每秒只能生成几个token,但如果多个请求共享层加载和计算阶段,单位时间完成的总token数会成倍增长。当然,这也要求模型在推理时能支持足够的批量大小。
我实测中把batch size从1调到4后,整体吞吐接近线性提升,这说明它的批处理调度确实没有出现明显的资源竞争问题。但需要注意的是,批处理提升并不完全免费,更大的batch意味着中间激活值占用更多显存,在层切换时机上需要做更多策略判断。
3. 实操过程与核心环节实现
3.1 环境准备与依赖安装
先说环境。airllm本身是Python项目,依赖常见的深度学习框架,安装起来不算复杂。建议用独立的虚拟环境,避免污染已有项目。Python版本最好3.9及以上,深度学习框架版本要匹配项目的兼容范围,我实测在较新版本上表现稳定。
# 创建虚拟环境 conda create -n airllm-env python=3.10 -y conda activate airllm-env # 安装核心依赖 pip install airllm安装完airllm后,最好确认一下深度学习框架是否已被自动安装。如果没有,需要手动安装对应CUDA版本的框架。这一步很多人会忽略,结果跑的时候报一堆底层库错误。
# 确认CUDA可用 python -c "import torch; print(torch.cuda.is_available())"如果输出是True,说明环境没问题。如果False,要检查驱动和CUDA工具包版本。这一步值得多花点时间,因为后续所有性能表现都依赖底层环境的正确性。
3.2 模型下载与目录规划
airllm支持从模型库加载开源模型,也可以直接加载本地模型目录。我推荐先走本地路径,可控性更强。模型文件准备简单说就是去模型页面上把权重文件下载下来,放到一个清晰的目标目录。
# 建议的目录结构 models/ llama2-70b-chat/ config.json model.safetensors.index.json model-00001-of-0000x.safetensors ...如果你下载的是safetensors格式的模型,airllm能直接识别。注意检查config.json里的模型结构和参数设置是否完整,有些模型仓库里的配置文件可能被精简过,缺少关键字段会导致加载失败。
模型下载这个环节最容易出现的问题是模型文件不完整。我遇到过下载工具断点续传导致文件不完整,加载时毫无提示直接报错的情况。经验是下载完成后对比一下文件大小与页面标注的字节数是否一致,不一致就重新下载,别怕麻烦。
3.3 最小可用代码示例
把环境准备好、模型下载好后,就进入正题了。airllm的接口风格非常接近常见的模型推理库,核心就两步:初始化模型对象、调用生成接口。
from airllm import AirLLMLlama2 # 初始化模型 model = AirLLMLlama2("/path/to/your/models/llama2-70b-chat") # 准备输入 input_text = "请用一句话解释什么是大语言模型" inputs = model.tokenizer(input_text, return_tensors="pt") # 生成输出 output = model.generate( inputs.input_ids.cuda(), max_new_tokens=50, do_sample=True, temperature=0.7, ) # 解码输出 result = model.tokenizer.decode(output[0], skip_special_tokens=True) print(result)这几行代码背后发生的事情非常多。初始化模型对象时,airllm并不会直接把700亿参数加载进显存,而是先扫描权重文件、构建索引、规划分层调度序列。实际加载是按需进行的,所以初始化阶段的内存占用并不高。
生成接口这里的单独调用,内部会执行多次层调度、前向计算和采样。你看到的结果是完整的生成文本,但看不到的是每一次生成token时,权重层可能在显存与存储之间完成了多次换入换出。
3.4 从下载到生成的完整实操记录
我实际跑通一次的过程可以给你一个参考。某次我准备跑一个约130亿参数的模型,放在一张16GB显存的显卡上,存储设备是一块中高端NVMe固态硬盘。初始化模型耗时大约20秒,这是因为它需要解析模型结构并构建调度方案。第一次生成启动时明显有延迟,大约等了5秒才输出第一个token,之后的生成速度大约稳定在每秒8个token左右。
这个延迟分布很有意思。首token延迟高是因为需要把第一批层从存储加载到显存,后续层切换时因为散热和命中机制,耗时明显下降。airllm在首token里还有额外的静态分析开销,所以如果你用这个框架,第一次生成时耐心等待是正常的。
第二轮再调用模型生成时,启动速度会明显加快。因为我前面提到的缓存机制,某些层的低精度权重已经被保存在缓存位置,不需要重新从磁盘完整读取。这说明airllm这类工具用“多用几次反而越来越顺”的方式,一定程度抵消了重复初始化的开销。
3.5 关键参数说明与自动配置逻辑
airllm大多数参数都有默认值,开箱即用。但如果你想让它在你的硬件条件下发挥更好的性能,有几个参数值得了解。我在实验中分别测试过默认参数和手动调优参数,差距还是比较明显的。
生成接口最常用的参数是max_new_tokens、temperature和do_sample,这些控制的是token生成长度、采样温度和是否随机采样。如果你需要确定性输出,把do_sample设为False,同时设置temperature为0,这样每次输出都一样。
另一个关键参数是batch_size。airllm在设计时可能不直接暴露batch参数,但你可以通过传入多组输入来触发批处理逻辑。实测中批量处理能显著提升吞吐,但要注意显存中激活值占用的增长,别把层计算所需的空间挤没了。
还有层切换策略相关的参数,在某些版本中会暴露类似的调度窗口大小配置项。调度窗口越大,理论上能减少层切换频率,但对显存容量的要求也越高。我建议先跑默认值,然后根据显存监控数据决定是否调整。
3.6 切换其他模型家族的方法
airllm不只是支持某一类模型架构。除了LLaMA系列之外,也支持其他常见的大模型结构,只是需要选择对应的模型类或者加载器。我在测试中尝试了不同模型家族,发现它们的加载接口大同小异,但内部的层调度策略会有差异。
核心区别在于Transformer层数、注意力机制结构和前馈网络大小。这些结构参数直接影响单层权重的体积,进而影响层切换的频率和耗时。如果模型单层特别大,airllm的调度策略会自动增大单次加载的数据量,同时降低切换频率,保证计算效率。
切换模型家族时,最需要注意的是tokenizer是否匹配。有些模型的tokenizer文件比较特殊,如果直接复用其他模型的tokenizer,可能会出现乱码或者生成中断。最好在模型目录中带着原始tokenizer文件一起加载,别图省事。
4. 性能表现与优化策略
4.1 不同硬件环境下的实测数据
性能这个话题,没有实测数据就没有发言权。我前后尝试了三种典型配置:纯CPU环境、16GB显存显卡加NVMe固态、24GB显存显卡加普通SATA固态,每个环境的体验差异非常明显。
纯CPU环境下,airllm虽然能跑,但速度确实比较感人。生成一个token的时间大致在秒级,用来做功能验证可以,想实际聊天或者跑任务就不太现实。这种模式的定位更像是“证明模型能跑”,而不是“模型跑得快”。
16GB显存显卡加NVMe固态是体验最好的一组。130亿模型的生成速度能到每秒8~10个token,这个速度已经基本可用。如果换成显存更低的显卡,生成速度会下降,但只要存储够快,依然可以接受。
24GB显存显卡加普通SATA固态的组合有点尴尬。虽然显存更大,可以容纳更多层,但存储读取速度成为瓶颈。实测生成速度反而不如16GB显存加NVMe的组合,这让我意识到,对于airllm这类“存储换显存”的方案,存储设备的速度至少和显存容量同等重要。
4.2 存储瓶颈的量化实验
由于airllm核心机制是逐层从存储读取权重,存储I/O能力直接影响整体推理速度。我做了一组对比实验:同一个模型分别放在NVMe固态、SATA固态和内存虚拟盘上,看生成速度的变化。
内存虚拟盘的表现最好,生成速度最快,因为内存读写带宽远高于任何硬盘。NVMe固态排在第二,和内存虚拟盘的差距并没有想象中大。SATA固态大约只有NVMe六成左右的生成速度,机械硬盘我没有测,因为心里大概知道结果不会太好。
这个实验给我的启发是:如果你有足够的内存空余,可以考虑把模型文件放到/dev/shm这类内存文件系统中。不过这个方案只对单机实验有意义,因为内存文件系统占用的就是内存空间,对大模型来说内存容量能不能扛住也是个问题。内存够大想极限压榨性能的人可以试试。
4.3 多请求并发下的吞吐特征
单条请求的生成速度只能反映一台机器的底线能力,并发下的吞吐表现才是实际使用价值的关键。我启动了两个、四个、八个并发请求,分别记录了过去一段时间的总生成token数和每条请求的响应时间。
两个并发请求时,总体吞吐基本翻倍,每条请求的延迟略微上升但可以接受。四个并发请求时,总吞吐继续上升,但上升幅度开始放缓。八个并发请求时,显存中激活值的占用明显增加,部分请求开始排队等待层调度,总吞吐不再提升,反而因为切换开销出现轻微下降。
这个曲线说明airllm适合中小批量的并发场景。生产级在线推理服务追求的是极低延迟和极高吞吐,airllm在这方面的竞争力确实不如那些常驻显存的全量推理方案。但做内部工具、离线批量任务、或者demo演示确实绰绰有余。
4.4 在有限显存中调整激活值占用
显存里除了权重,还存放着每一层计算产生的激活值。激活值大小受batch size和序列长度影响,是airllm调优中最容易踩的坑。batch size增大或者输入序列变长,都会让激活值快速增长,可能挤掉权重层的加载空间。
我的实操经验是:最开始跑长文本时,显存一度接近爆掉,生成速度突然变得奇慢无比。后来监控显存才发现,层计算和激活值存储重叠的窗口太小,导致频繁内存交换。解决方法是降低batch size、缩短单次处理的序列长度,或者把注意力计算的中间结果显式下放到内存中。
如果你发现生成过程中显存占用曲线非常不稳定,一高一低剧烈波动,多半就是层调度和激活值管理发生了冲突。此时优先降低batch size,别一开始就追求并发,先把单条路径调稳再说。
4.5 量化精度调优与模型效果平衡
airllm默认会对权重进行激进的低比特量化,跑起来确实省资源,但我发现某些场景下模型回答质量会出现可感知的下降,特别是数学推理、代码生成这类需要精确计算的场景。如果你不能接受这种精度损失,可以调整量化相关的设置。
有一种做法是指定计算层保持高精度加载,加载时不做低比特转换。代价是单层体积变大,层切换更频繁、更慢。我试过在130亿模型上把注意力层保持较高精度,其他层继续压缩,效果很微妙:回答质量提升了,生成速度下降了大约两成。值不值得这个取舍,取决于你的实际任务。
另一个经验是:尽量避免对模型输出层和嵌入层做低比特压缩。这两个层如果不准,即使中间层算得再好,最终输出的token也可能偏离得很厉害。airllm在层调度时有没有自动保护这两层,我没完全确认,但为了保险起见,我宁可在自定义配置里手动指定一下。
5. 常见问题与排查技巧实录
5.1 显存溢出与内存爆炸
运行airllm过程中,我曾遇到过显存不涨反而内存爆炸的情况。仔细查了一下才发现,部分版本的默认行为会把隐藏状态和激活值放在CPU内存中,如果输入batch稍微大一点,CPU内存占用会直线上升。如果碰到整机内存骤降,八成是这个原因。
解决思路是缩小batch和限制最大序列长度,同时检查是否有参数能控制激活值卸载位置。如果你有足够显存,手动要求框架优先保留显存中的激活值,能显著降低内存压力。
另一个容易忽略的点是Python进程本身的内存碎片。长时间反复初始化多次模型对象,内存占用会逐渐升高,这是因为底层缓存和新对象同时存在导致。建议在循环实验时每个模型只初始化一次,别反复加载同一个模型对象。
5.2 首token响应太慢的解法
很多用户刚接触airllm时,会被首token的巨大延迟吓到。我刚开始也以为代码卡死了。实际上这是逐层加载机制带来的固有成本,层数越大的模型,首token等待时间越长。
如果实在无法接受这个延迟,一个实用的办法是使用“预热”或“启动”功能。如果你使用的模型类里有预加载相关方法,或者在推理前先在后台做一次短查询,就能把大部分层的权重缓存好。虽然预热本身也要花时间,但至少不要把预热时间计入正式请求的响应指标里。
还有一种变通思路:对响应时间要求高的场景,先把首段结果生成好存在缓存中,后续真实请求直接拼接缓存内容。这是一种应用层级的优化,不需要改动推理框架。
5.3 模型加载失败后的定位步骤
模型加载失败是airllm使用中最容易踩的坑。报错信息有时不太直观,但排查思路是固定的。先看config.json的字段是否完整,再看权重文件路径是否正确,再看模型是否有分片文件缺失。
我遇到过一次很诡异的情况:加载同一份模型,有时成功有时失败。后来发现是有个分片文件在系统缓存中被锁住了,清理了缓存进程之后问题消失。如果你的加载是间歇性失败,优先怀疑类似文件锁、并发读写冲突这类外部因素。
还有一次报错是因为模型结构和AirLLM模型的预设结构不匹配,原因是模型仓库里config.json写的结构类型与文件名不一致。这种情况只能手动修改config字段或者更换匹配的模型类。说实话这里最考验你对模型结构的熟悉程度,建议先看模型主页上的结构说明再做判断。
5.4 生成内容质量明显下降的处理
有时候模型能跑,但生成的内容逻辑混乱、重复词多,或者干脆答非所问。很多人第一反应是框架坏了,其实大概率是采样参数和量化压缩叠加的结果。
先试着把temperature调低,比如0.3以下,如果依然很差,再试试关闭随机采样强制贪心解码。如果这两个操作都无效,就要考虑量化精度是不是太激进了。换用更温和的量化配置之后,质量一般会有明显回升。
另外还有一个容易被忽略的点:prompt格式。很多开源模型对输入格式有特定要求,某些模型需要特定的指令前缀。如果prompt格式和模型默认设定不匹配,生成质量再怎么样都不会好。建议先跑一两条模型官方示例中的prompt,确认基线质量正常再调试自定义prompt。
5.5 后台运行与任务持久化的小经验
如果你跟我的使用场景一样,经常需要后台跑批量推理任务,推荐用nohup或者tmux。原因是模型推理一旦跑起来,占用的内存和显存资源很大,如果前台终端不小心关闭,进程被杀掉,所有预热缓存就白做了。
实际运行中我还会添加日志输出,实时记录生成的token数量和处理耗时,方便事后分析性能瓶颈。airllm本身有时候不会打印详细的调度日志,自己加日志是必要的。
我个人的习惯是,每次跑完任务,都记录一下显卡显存峰值、全过程耗时、生成token总数这三项数据。积累一段时间之后,你对自己机器配置下不同模型的表现会非常有数,以后再调参就有数据支撑了,不用瞎猜。
6. 适用场景与真实边界
6.1 哪些场景用着很顺手
airllm最适合的场景,是科研和工程中的“探索性验证”。你有一个还没完全确定效果的想法,想快速用一个较大模型看看天马行空的效果,但不想为一次实验租用昂贵的高配显卡。此时airllm能让你用现有设备跑出可用的结果。
另一个契合点是受限环境下的模型评测。某些工作环境不能随便连外部API,只能在本地完成推理。如果机器配置不高,又必须跑大模型,airllm几乎是首选方案。
再一个是离线批处理任务。比如批量处理文本、批量生成摘要、批量对接RAG知识库问答。这类任务对单条请求的延迟不敏感,更在意总体吞吐,恰好能让airllm扬长避短。
6.2 哪些场景我劝你别用
airllm不适合延迟敏感的在线服务。如果用户在线等着你返回结果,首token就要等好几秒,体验基本是灾难。你可能会想用并发把吞吐堆上去,但前面我实测过,高并发下延迟只会更高。
同样不适合超长上下文的场景。序列越长,激活值占用越高,显存和内存的切换压力就会成倍放大。airllm把大部分优化都花在权重调度上,对序列维度的优化相对有限。
高精度任务也建议慎重。如果你做的是严谨的多步数学推理或者代码生成,依赖低量化权重的airllm可能会让你不断遇到精度边界。这类任务更适合用高配显卡跑全精度或者更高精度的推理方案。
6.3 与常规全量显存推理方案的互补关系
airllm并不是要替代常规的全量显存推理方案,它们更像是互补关系。常规方案在显存充裕时提供最佳性能和最低延迟,airllm在显存紧缺时提供最高的“模型可运行性”。两者之间没有孰优孰劣,只有适不适合。
我自己的用法是两类方案共存:如果机器条件好,直接全量加载模型;如果条件有限或者临时需要更大的模型,再切换airllm。在同一个项目里内置这两套路径并不难,难的其实是把不同路径下的推理配置统一起来。我自己会在代码里抽象一层统一推理接口,底层根据显存大小自动选择方案,这样可以兼顾灵活性与性能。
6.4 这个后续还能怎么扩展
airllm已经有充分理由作为“低成本大模型本地化”工具箱里的一员。后续如果你愿意折腾,还可以在它基础上做几类扩展。
一个是与外部向量数据库结合,构造完全本地化的RAG系统。airllm负责生成部分,向量库负责检索部分,整体形成一条不依赖公网的完整问答链路。另一个思路是做多模型路由,小问题走小模型,复杂问题切换大模型,中间的加载和切换交给airllm来承担。
还有一个方向是在模型微调后接airllm推理。微调后的模型权重往往有变化,如果你能确保导出格式兼容,完全可以用airllm把这些微调模型也变成可低成本部署的推理实例。实测下来,这个路径可行,但需要注意导出时不要丢掉原本的配置文件字段。
7. 写在最后的一点体会
从最初被显存限制折磨得想放弃,到后来用airllm跑通70B级模型的推理,我自己最大的感受是:很多时候我们觉得某个问题无解,只是因为默认了“必须全量加载”这个前提。一旦跳出那个框框,用系统性思维重新审视资源调度,很多看似不可能的需求总能找到折中且可行的落地路径。
airllm这类工具真正教会我的,不仅是技术操作,更是一种和资源限制共处的思维方式。受限于显存,那就把调度做成流水线;受限于存储速度,那就合理规划分层缓存;受限于精度,那就是把量化做成分区域策略。每一个限制都对应着一个可优化的维度,关键是别被默认的约束条件困住了思路。
如果你也是那种手上设备有限、但想法很多的人,真心建议你花一个下午试试airllm。先跑通一个小模型,再挑战一把大模型,你会对“大语言模型本地部署”这件事产生完全不同的感觉。到时候再回头去看那些“必须买高端显卡才能跑大模型”的说法,心里自然会有自己的判断了。