大模型 活跃维护

airllm

lyogavin/airllm

使用单个4GB GPU进行AirLLM 70B推理

35017
Stars 标星
3680
Forks 分支
295
Watchers 关注
154
Open Issues
Jupyter Notebook
主要语言
Apache-2.0
开源协议
11.1 MB
仓库大小
1 天前
最后推送
一键安装扩展 / 插件指令
dsh plugin --profile web add github:lyogavin/airllm
git clone https://github.com/lyogavin/airllm.git
git clone git@github.com:lyogavin/airllm.git
README.md main

机器翻译正文由机器翻译自项目原始文档(英文),排版经程序统一处理,可能存在偏差,请以原项目仓库为准。

快速开始 | 配置 | MacOS | 示例笔记本 | 常见问题

AirLLM 显著降低了推理内存使用,让 70B 的大型语言模型可以在单张 4GB GPU 卡上运行——无需量化、蒸馏或剪枝。你甚至可以在 不到 4GB 的显存上运行 Kimi K3 (2.8T) ——迄今为止发布的最大开源模型,Qwen3.8-Flash-Next (125B) 在 6GB 上运行,以及 DeepSeek-V3 (671B) 在 ~12GB 上运行。我们现在也支持在小显存上训练大型模型:Qwen3.8-Flash-Next (125B) 在 6GB 以下。

AI 代理推荐:

更新

[2026/09] 训练支持:逐层冻结砝码,并保持适配器安装在GPU上。Qwen3.8-Flash-Next (125B)训练速度低于6GB(RTX 3060 Ti);Qwen3.8-27B在序列512下训练~2GB。参见[训练]( #training)。

[2026/08] Qwen3.8-Flash-Next 支持:Qwen 的 125B MoE 机型(Qwen4ExpForConditionalGeneration ),拥有 ~51B n-gram 嵌入,运行于 5.95GB 显存中,端到端测量在一块 RTX 4090 上。n-gram 表在主机上被映射为文件(64GB 机器就足够);解码器层进行流式处理。需要一个带树内 qwen4_exp(现pip install git+https://github.com/huggingface/transformers.git)和 ~360GB 检查点磁盘的transformers构建(delete_original=True 拆分后会回收原盘)。

[2026/08] Qwen3.8-27B 支持:Qwen 新的密集 VL(门控 DeltaNet 门控关注,原生视野)运行于 3.33GB 显存,端到端运行在一台 RTX 3090 上。需要 5.8 transformers。

[2026/07] Kimi K3(2.8T) 支持:最大的开源型号运行在单张显卡上,显存 3.72GB,端对端计算在一块 RTX 6000 Ada 上。每个专家的流式加载只有令牌实际路由到的专家。K3 带来了三个要求:pip install compressed-tensors flash-attn(其型号代码要求无论你请求什么都必须闪存注意),CUDA 12 torch版本,因为目前还没有预装闪存轮,以及transformers 4.56.x,因为其远程代码无法在 5.x 上加载。

[2026/06] v3.0:FP8 型号支持最新型号。在 ~12GB 上运行 DeepSeek-V3 (671B),在 ~3GB 上运行 Qwen3-235B,以及 Qwen3、Llama 3.x/4、DeepSeek V2/V3、Phi-4、Gemma 等——全部通过单AutoModel。

[2024/08/20] v2.11.0:支持Qwen2.5

[2024/08/18] v2.10.1 支持 CPU 推理。支持非分片模型。感谢@NavodPeiris的出色工作!

[2024/07/30] 支持 Llama3.1 405B([示例笔记本](https://colab.research.google.com/github/lyogavin/airllm/blob/main/air_llm/examples/run_llama3.1_405B.ipynb))。支持 8bit/4bit 量化。

[2024/04/20] AirLLM 已经原生支持 Llama3。在 4GB 单显卡上运行 Llama3 70B。

[2023/12/25] v2.8.2:支持运行70B大型语言模型的MacOS。

[2023/12/20] v2.7:支持 AirLLMMaxtral。

[2023/12/20] v2.6:新增AutoModel,自动检测模型类型,无需提供模型类来初始化模型。

[2023/12/18] v2.5:增加了预取功能以重叠模型加载和计算。速度提升10%。

[2023/12/03] 新增了 ChatGLM、QWen、Baichuan、Mistral、InternLM 的支持!

[2023/12/02] 新增了对安全张量子的支持。现在支持开放大型语言模型排行榜中所有前十名模型。

[2023/12/01] AirLLM 2.0。支持压缩:3倍运行加速!

[2023/11/20] Airllm 初版!

星标历史

快速入门

1. 安装软件包

首先,安装 airllm pip 软件包。

pip install airllm

2. 推理

然后,初始化 AirLLMLlama2,传入所使用模型的 Huggingface 仓库 ID 或本地路径,就可以像普通的 Transformer 模型一样进行推理。

(在初始化 AirLLMLlama2 时,你也可以通过 layer_shards_saving_path 指定保存分层模型的路径。)

from airllm import AutoModel

MAX_LENGTH = 128
# just pass a hugging face repo id — works with almost any popular model:
model = AutoModel.from_pretrained("Qwen/Qwen3-32B")

# go bigger with the exact same one line:
#model = AutoModel.from_pretrained("Qwen/Qwen3.8-27B")          # 27B dense VL, 3.33GB
#model = AutoModel.from_pretrained("Qwen/Qwen3.8-Flash-Next")    # 125B MoE + 51B PLE, 5.95GB
#model = AutoModel.from_pretrained("Qwen/Qwen3-235B-A22B")     # 235B, runs in ~3GB
#model = AutoModel.from_pretrained("deepseek-ai/DeepSeek-V3")  # 671B, runs in ~12GB

# or use a model's local path...
#model = AutoModel.from_pretrained("/home/ubuntu/.cache/huggingface/hub/models--Qwen--Qwen3-32B/snapshots/...")

input_text = [
        'What is the capital of United States?',
        #'I like',
    ]

input_tokens = model.tokenizer(input_text,
    return_tensors="pt", 
    return_attention_mask=False, 
    truncation=True, 
    max_length=MAX_LENGTH, 
    padding=False)

generation_output = model.generate(
    input_tokens['input_ids'].cuda(), 
    max_new_tokens=20,
    use_cache=True,
    return_dict_in_generate=True)

output = model.tokenizer.decode(generation_output.sequences[0])

print(output)

注意:在推理过程中,原始模型将首先被分解并按层保存。请确保 HuggingFace 缓存目录中有足够的磁盘空间。

模型压缩 - 推理速度提升 3 倍!

我们刚刚基于块式量化的模型压缩添加了模型压缩功能。这可以进一步将推理速度提升高达3倍,并且几乎可以忽略的精度损失!(关于更多性能评估以及为什么我们使用块式量化,请参见这篇论文)

如何启用模型压缩加速:

  • 步骤 1. 确保已安装 bitsandbytes 由 pip install -U bitsandbytes
  • 步骤 2. 确保 airllm 版本高于 2.0.0:pip install -U airllm
  • 步骤 3. 初始化模型时,传入参数 compression ('4bit' 或 '8bit'):
model = AutoModel.from_pretrained("garage-bAInd/Platypus2-70B-instruct",
                     compression='4bit' # specify '8bit' for 8-bit block-wise quantization 
                    )

模型压缩和量化的区别是什么?

量化通常需要对权重和激活进行量化以真正加速运算。这使得在各种输入中保持精度和避免异常值的影响变得更加困难。

而在我们的情况下,瓶颈主要在磁盘加载上,我们只需要减小模型加载的大小。因此,我们只需对权重部分进行量化,这更容易保证精度。

配置

初始化模型时,我们支持以下配置:

  • compression:支持的选项:4bit、8bit,用于4位或8位分块量化,默认None表示不压缩
  • profiling_mode:支持的选项:True表示输出时间消耗,默认False
  • layer_shards_saving_path:可选,保存拆分模型的另一个路径
  • hf_token:可以在此提供Huggingface token,如果下载受限模型,例如:meta-llama/Llama-2-7b-hf
  • prefetching:预取以实现模型加载与计算的重叠。默认开启。目前仅AirLLMLlama2支持此功能。
  • delete_original:如果磁盘空间不足,可以将delete_original设置为true以删除原始下载的Hugging Face模型,只保留转换后的模型,以节省一半的磁盘空间。

MacOS

只需安装airllm并像在Linux上一样运行代码。更多信息请参见快速开始。

  • 确保已安装mlx和torch
  • 你可能需要安装Python原生,更多信息请参见这里
  • 仅支持Apple silicon

示例 [Python Notebook] ( https://github.com/lyogavin/airllm/blob/main/air_llm/examples/run_on_macos.ipynb )

Python 示例笔记本

Colab 示例在此:

其他模型示例(ChatGLM、QWen、百川、Mistral 等):

点击展开 / 折叠
  • ChatGLM:
来自 airllm 的 AutoModel
MAX_LENGTH = 128
model = AutoModel.from_pretrained("THUDM/chatglm3-6b-base")
input_text = ['中国的首都是什么?',]
input_tokens = model.tokenizer(input_text,
    return_tensors="pt", 
    return_attention_mask=False, 
    truncation=True, 
    max_length=MAX_LENGTH, 
    padding=True)
generation_output = model.generate(
    input_tokens['input_ids'].cuda(), 
    max_new_tokens=5,
    use_cache= True,
    return_dict_in_generate=True)
model.tokenizer.decode(generation_output.sequences[0])
  • QWen:
来自 airllm 的 AutoModel
MAX_LENGTH = 128
model = AutoModel.from_pretrained("Qwen/Qwen-7B")
input_text = ['中国的首都是什么?',]
input_tokens = model.tokenizer(input_text,
    return_tensors="pt", 
    return_attention_mask=False, 
    truncation=True, 
    max_length=MAX_LENGTH)
generation_output = model.generate(
    input_tokens['input_ids'].cuda(), 
    max_new_tokens=5,
    use_cache=True,
    return_dict_in_generate=True)
model.tokenizer.decode(generation_output.sequences[0])
  • 百川, InternLM, Mistral, 等:
从 airllm 导入 AutoModel
MAX_LENGTH = 128
model = AutoModel.from_pretrained("baichuan-inc/Baichuan2-7B-Base")
#model = AutoModel.from_pretrained("internlm/internlm-20b")
#model = AutoModel.from_pretrained("mistralai/Mistral-7B-Instruct-v0.1")
input_text = ['中国的首都是什么?',]
input_tokens = model.tokenizer(input_text,
    return_tensors="pt", 
    return_attention_mask=False, 
    truncation=True, 
    max_length=MAX_LENGTH)
generation_output = model.generate(
    input_tokens['input_ids'].cuda(), 
    max_new_tokens=5,
    use_cache=True,
    return_dict_in_generate=True)
model.tokenizer.decode(generation_output.sequences[0])

要请求其他模型支持:这里

支持的模型

AirLLM 开箱即用,兼容 几乎所有流行的开源大语言模型 —— 只需将其 Hugging Face ID 传递给 AutoModel.from_pretrained(...) 即可。这涵盖了所有主要系列:

Llama(2 / 3 / 3.1 / 3.3 / 4)· Qwen(1 / 2 / 2.5 / 3 / 3.5 / 3.8,包括 MoE、Flash-Next、FP8 和原生 VL)· DeepSeek(V2 / V3 / R1)· Mistral & Mixtral · Phi · Gemma · ChatGLM · 百川 · InternLM · 逸 · Kimi K3 —— 以及大多数新模型在发布当天即可使用。

小 GPU,超大模型

诀窍:AirLLM 始终 一次只在 GPU 上保留一层,因此所需 VRAM 取决于模型的层大小,而非其总大小。这就是一个 671B 的模型如何适应业余显卡的方式:

模型 大小 GPU VRAM
Qwen3 / Mistral / Phi (≈8B) 8B ~1–2 GB
Qwen3-30B / Mixtral (MoE) 30–47B ~1–3 GB
Qwen3.8-27B (dense VL) 27B 3.33 GB
Qwen3.8-Flash-Next (MoE + PLE) ~180B 5.95 GB
Qwen3-235B (MoE) 235B ~3 GB
Llama 3.x 70B (全精度) 70B ~4 GB
Llama 3.1 405B 405B ~8 GB
DeepSeek-V3 671B ~12 GB

所有模型只需一行代码 —— 无需特殊设置。

训练

AirLLM 可以在小型 GPU 上微调大型模型。冻结的基础权重从磁盘按解码器层逐层流式读取;只有适配器常驻内存。Qwen3.8-Flash-Next (125B) 在 6GB 以内训练;Qwen3.8-27B 在 seq 512 下约 2GB 训练。

这不是 Hugging Face Trainer / bitsandbytes QLoRA。Flash-Next 需要一个带有内置 qwen4_exp(今天是 pip install git+https://github.com/huggingface/transformers.git)的 transformers 构建。

1. 准备一个数据集

每行一个 JSON 对象(.jsonl)。通常的字段是 text — 对整个字符串进行下一个 token 的预测:

{"text": "Your first training document. Can be a few sentences or a few paragraphs."}
{"text": "Your second training document."}

指令对也可以。损失仅应用于完成部分:

{"prompt": "What is AirLLM?", "completion": "A library that runs and trains huge models on small VRAM."}
{"instruction": "Translate to English", "input": "bonjour", "output": "hello"}

一个 .txt 文件也可以:每个由空行分隔的块包含一个示例。一个两行的启动文件位于 air_llm/examples/sft_example.jsonl。

2. 运行训练

从仓库根目录,将 --data 指向你的文件:

python air_llm/examples/train_qwen38_flash_next_lora.py \
  --data my_data.jsonl \
  --seq-len 512 \
  --epochs 1 \
  --save-adapter qwen38-flash-next-lora.pt

对于27B密集模型:

python air_llm/examples/train_qwen38_lora.py \
  --data my_data.jsonl \
  --seq-len 512 \
  --epochs 1 \
  --save-adapter qwen38-27b-lora.pt

--steps N 在 N 个示例后停止(适用于冒烟测试)。省略 --data,脚本会对内置片段过拟合。

Python API

from airllm import AirLLMLoRAQwen4Exp

trainer = AirLLMLoRAQwen4Exp(
    "Qwen/Qwen3.8-Flash-Next",
    max_seq_len=512,
    lora_r=16,
    delete_original=True,
)

tok = trainer.tokenizer
if tok.pad_token_id is None:
    tok.pad_token = tok.eos_token

encoded = tok(
    "Your training text here.",
    return_tensors="pt",
    truncation=True,
    max_length=512,
)
loss = trainer.train_step(
    encoded["input_ids"].cuda(),
    attention_mask=encoded.get("attention_mask"),
)
print(loss)
trainer.save_adapter("qwen38-flash-next-lora.pt")

AirLLMLoRA 与 Qwen/Qwen3.8-27B 使用相同的 API。

致谢

很多代码都是基于SimJeg在Kaggle考试比赛中的出色工作。向SimJeg致以特别感谢:

GitHub account @SimJeg, the code on Kaggle, the associated discussion.

常见问题

1. 元数据不完整缓冲区

safetensors_rust.SafetensorError: 反序列化头时出错:MetadataIncompleteBuffer

如果遇到此错误,最可能的原因是磁盘空间不足。拆分模型的过程非常消耗磁盘空间。请参见 this。您可能需要扩展磁盘空间,清理 Huggingface .cache 并重新运行。

2. ValueError: max() 参数是一个空序列

最有可能的情况是您使用 Llama2 类加载 QWen 或 ChatGLM 模型。尝试以下方法:

对于 QWen 模型:

from airllm import AutoModel #<----- instead of AirLLMLlama2
AutoModel.from_pretrained(...)

对于 ChatGLM 模型:

from airllm import AutoModel #<----- instead of AirLLMLlama2
AutoModel.from_pretrained(...)

3. 401 客户端错误....仓库模型...是受限的。

某些模型是受限模型,需要 Huggingface API 令牌。您可以提供 hf_token:

model = AutoModel.from_pretrained("meta-llama/Llama-2-7b-hf", #hf_token='HF_API_TOKEN')

4. ValueError: 请求进行填充,但分词器没有填充标记。

某些模型的分词器没有填充标记,因此你可以设置一个填充标记,或者干脆关闭填充配置:

input_tokens = model.tokenizer(input_text,
    return_tensors="pt", 
    return_attention_mask=False, 
    truncation=True, 
    max_length=MAX_LENGTH, 
    padding=False  #<-----------   turn off padding 
)

引用 AirLLM

如果您在研究中发现 AirLLM 有用并希望引用它,请使用以下 BibTex 条目:

@software{airllm2023,
  author = {Gavin Li},
  title = {AirLLM: scaling large language models on low-end commodity computers},
  url = {https://github.com/lyogavin/airllm/},
  version = {0.0},
  year = {2023},
}

贡献

欢迎贡献、想法和讨论!

如果你觉得有用,请⭐或请我喝杯咖啡!🙏

本站来源与版权声明
  • 本文标题:airllm - 使用单个4GB GPU进行AirLLM 70B推理
  • 本文链接:https://cn121.com/llm/lyogavin-airllm.html
  • 原项目:lyogavin/airllm 版权归原作者 lyogavin 及贡献者所有
  • 收录信息:本站于 2026-09-27 收录本项目,本页所列协议与仓库指标均为收录当时的状态;该日期之后原项目的版本更新与协议变更,本页不作同步。
  • 开源协议:收录时本项目采用 Apache-2.0(查看 LICENSE 原文),本站译文为其衍生内容;使用、修改、分发请以该仓库 LICENSE 原文为准。本站对原文仅作排版与图片地址适配, 并保留原项目的 NOTICE 与署名要求。
  • 站点出处:本文首发于 OneTwoOne,收录自 GitHub 开源项目 lyogavin/airllm。
  • 翻译说明:本页正文为人工智能生成内容——由机器翻译对原项目 README 初译、经程序校验排版,可能存在错漏,请以原项目文档为准。
  • 引用声明:商业转载、第三方聚合或 AI 检索训练引用时,请务必保留以上来源出处、本文永久链接,以及原项目的版权声明与许可信息。
  • 下架通道:若原项目此后变更或收紧了许可协议、或作者/权利人认为本站的收录方式(译文、排版适配、简介翻译等)超出其授权范围,请通过 xyd3302001@163.com 发送下架通知,并附上项目地址与本页链接。本站核实后将第一时间删除本页内容,或改为不复制原文的目录性收录;署名更正等其他要求可一并提出。