快速入门|配置| macOS |示例笔记本|常问问题
AirLLM优化了推理内存使用,允许 70B 大型语言模型在单个 4GB GPU 卡上运行推理,无需量化、蒸馏和剪枝。现在您可以在8GB vram上运行405B Llama3.1 。
[2024/08/20] v2.11.0: 支持Qwen2.5
[2024/08/18] v2.10.1 支持CPU推理。支持非分片模型。感谢@NavodPeiris 的出色工作!
[2024/07/30] 支持Llama3.1 405B (示例笔记本)。支持8bit/4bit量化。
[2024/04/20] AirLLM 已经原生支持 Llama3。在 4GB 单 GPU 上运行 Llama3 70B。
[2023/12/25] v2.8.2:支持MacOS运行70B大语言模型。
[2023/12/20] v2.7:支持AirLLMMixtral。
[2023/12/20] v2.6:新增AutoModel,自动检测模型类型,无需提供模型类来初始化模型。
[2023/12/18] v2.5:添加预取以重叠模型加载和计算。速度提高 10%。
[2023/12/03] 增加了对ChatGLM 、 QWen 、 Baichuan 、 Mistral 、 InternLM的支持!
[2023/12/02]增加了对安全张量的支持。现在支持开放 llm 排行榜中的所有前 10 名模型。
[2023/12/01]airllm 2.0。支持压缩:运行时间加快 3 倍!
[2023/11/20]airllm 初始版本!
首先,安装airllm pip 包。
pip install airllm
然后,初始化AirLLMLlama2,传入正在使用的模型的huggingface repo ID,或者本地路径,就可以像常规的transformer模型一样进行推理。
(也可以在初始化AirLLMLlama2时通过layer_shards_ saving_path指定分割后的分层模型的保存路径。
from airllm import AutoModel
MAX_LENGTH = 128
# could use hugging face model repo id:
model = AutoModel . from_pretrained ( "garage-bAInd/Platypus2-70B-instruct" )
# or use model's local path...
#model = AutoModel.from_pretrained("/home/ubuntu/.cache/huggingface/hub/models--garage-bAInd--Platypus2-70B-instruct/snapshots/b585e74bcaae02e52665d9ac6d23f4d0dbc81a0f")
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 倍,而精度损失几乎可以忽略不计! (查看更多性能评估以及为什么我们在本文中使用逐块量化)
pip install -U bitsandbytes
Bitsandbytes 安装了 BitsandBytespip install -U airllm
model = AutoModel . from_pretrained ( "garage-bAInd/Platypus2-70B-instruct" ,
compression = '4bit' # specify '8bit' for 8-bit block-wise quantization
)
量化通常需要量化权重和激活,才能真正加快速度。这使得保持准确性和避免各种输入中异常值的影响变得更加困难。
虽然在我们的例子中,瓶颈主要在于磁盘加载,但我们只需要减小模型加载大小即可。所以,我们只对权重部分进行量化,这样更容易保证准确性。
初始化模型时,我们支持以下配置:
只需安装airllm并像在linux上一样运行代码即可。请参阅快速入门了解更多信息。
示例 [python 笔记本] (https://github.com/lyogavin/airllm/blob/main/air_llm/examples/run_on_macos.ipynb)
合作实验室示例如下:
from airllm import AutoModel
MAX_LENGTH = 128
model = AutoModel . from_pretrained ( "THUDM/chatglm3-6b-base" )
input_text = [ 'What is the capital of China?' ,]
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 ])
from airllm import AutoModel
MAX_LENGTH = 128
model = AutoModel . from_pretrained ( "Qwen/Qwen-7B" )
input_text = [ 'What is the capital of China?' ,]
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 ])
from airllm import 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 = [ 'What is the capital of China?' ,]
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 ])
很多代码都基于 SimJeg 在 Kaggle 考试竞赛中的出色工作。向 SimJeg 致敬:
GitHub账号@SimJeg,Kaggle上的代码,相关讨论。
safetensors_rust.SafetensorError:反序列化标头时出错:MetadataIncompleteBuffer
如果遇到此错误,最可能的原因是磁盘空间不足。分割模型的过程非常消耗磁盘。看到这个。您可能需要扩展磁盘空间、清除 Huggingface .cache 并重新运行。
您很可能正在使用 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 (...)
有些模型是门控模型,需要 Huggingface api 令牌。您可以提供 hf_token:
model = AutoModel . from_pretrained ( "meta-llama/Llama-2-7b-hf" , #hf_token='HF_API_TOKEN')
某些模型的标记生成器没有填充标记,因此您可以设置填充标记或简单地关闭填充配置:
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 对您的研究有用并希望引用它,请使用以下 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},
}
欢迎贡献、想法和讨论!
如果你觉得有用,请或者请我喝杯咖啡!