轻量化推理框架,让开发者在普通显卡上本地部署和运行大模型,降低开发和实验的硬件门槛。
本项目目前已归档。后续开发将在 ExLlamaV3 中继续。
ExLlamaV2 是一个推理库,用于在现代消费级 GPU 上运行本地 LLM。
ExLlamaV2 官方推荐使用的后端服务器是 TabbyAPI。它为本地或远程推理提供兼容 OpenAI 的 API,并扩展了 HF 模型下载、embedding 模型支持以及 HF Jinja2 聊天模板支持等功能。
有关入门帮助,请参阅 wiki。
ExLlamaV2 现已通过 Flash Attention 2.5.7+ 支持 paged attention。
新生成器支持动态批处理、智能 prompt 缓存、K/V cache 去重,并提供了更简洁的 API。
动态生成器将此前两个生成器的全部推理、采样和 speculative decoding 功能整合进了同一个 API。唯一的例外是 FP8 cache,但它支持 Q4 cache 模式,而且后者无论如何都有更好的表现,详见此处。
生成器的详细说明见此处。
单条生成:output = generator.generate(prompt = "Hello, my name is", max_new_tokens = 200)
output = generator.generate(prompt = "Hello, my name is", max_new_tokens = 200)
批量生成:outputs = generator.generate( prompt = [ "Hello, my name is", "Once upon a time,", "Large language models are", ], max_new_tokens = 200 )
outputs = generator.generate(
prompt = [
"Hello, my name is",
"Once upon a time,",
"Large language models are",
],
max_new_tokens = 200
)
使用 asyncio 进行流式生成:job = ExLlamaV2DynamicJobAsync( generator, input_ids = tokenizer.encode("You can lead a horse to water"), banned_strings = ["make it drink"], gen_settings = ExLlamaV2Sampler.Settings.greedy(), max_new_tokens = 200 ) async for result in job: text = result.get("text", "") print(text, end = "")
job = ExLlamaV2DynamicJobAsync(
generator,
input_ids = tokenizer.encode("You can lead a horse to water"),
banned_strings = ["make it drink"],
gen_settings = ExLlamaV2Sampler.Settings.greedy(),
max_new_tokens = 200
)
async for result in job:
text = result.get("text", "")
print(text, end = "")
完整且已更新的示例见此处。
下面是一些与 ExLlama V1 进行性能对比的快速测试。未来可能还会有更多性能优化;不同 GPU 上的速度会有所差异,而性能较弱的 CPU 仍可能成为瓶颈:
若要直接从仓库安装,你需要准备 CUDA Toolkit,并在 Linux 上安装 gcc,或在 Windows 上安装 Visual Studio(或其 Build Tools)。另外,请确保安装了合适版本的 PyTorch,然后运行:
git clone https://github.com/turboderp/exllamav2
cd exllamav2
pip install -r requirements.txt
pip install .
python test_inference.py -m <path_to_model> -p "Once upon a time,"
# Append the '--gpu_split auto' flag for multi-GPU inference
项目中包含一个简单的控制台聊天机器人。运行方式如下:
python examples/chat.py -m <path_to_model> -mode llama -gs auto
-mode 参数用于选择要使用的 prompt 格式。raw 会生成一种简单的聊天日志式对话,适用于 base model 和各种其他 finetune。使用 -modes 可查看所有可用的 prompt 格式。你也可以使用 -sp 提供自定义 system prompt。
TabbyAPI 是一个基于 FastAPI 的服务器,提供与 SillyTavern 及其他前端兼容的 OpenAI 风格 Web API。
TabbyAPI 是一个基于 FastAPI 的服务器,提供与 SillyTavern 及其他前端兼容的 OpenAI 风格 Web API。
ExUI 是一个简单、独立的单用户 Web UI,可以直接为 ExLlamaV2 实例提供服务,并支持聊天和 notebook 模式。
ExUI 是一个简单、独立的单用户 Web UI,可以直接为 ExLlamaV2 实例提供服务,并支持聊天和 notebook 模式。
text-generation-webui 通过 exllamav2 和 exllamav2_HF loader 支持 ExLlamaV2。
text-generation-webui 通过 exllamav2 和 exllamav2_HF loader 支持 ExLlamaV2。
lollms-webui 通过 exllamav2 binding 支持 ExLlamaV2。
lollms-webui 通过 exllamav2 binding 支持 ExLlamaV2。
若要安装当前的开发版本,请克隆仓库并运行安装脚本:
git clone https://github.com/turboderp/exllamav2
cd exllamav2
pip install -r requirements.txt
pip install .
默认情况下,该过程还会编译并安装这个库所依赖的 Torch C++ extension(exllamav2_ext)。你可以通过设置 EXLLAMA_NOCOMPILE 环境变量跳过此步骤:
EXLLAMA_NOCOMPILE= pip install .
这将安装软件包的“JIT 版本”,也就是仅安装 Python 组件,而不在安装过程中构建 C++ extension。作为替代,extension 会在第一次使用该库时构建,随后缓存到 ~/.cache/torch_extensions,供后续使用。
此处提供了 release,其中包含带有 extension 二进制文件的预构建 wheel。请务必下载与平台、Python 版本(cp)和 CUDA 版本匹配的正确版本。尤其需要注意的是,由于 Torch C++ extension 的 ABI 会在 PyTorch 每次发布新版本时发生不兼容变化,你还必须确保预构建 wheel 与 PyTorch 版本相匹配。
你可以下载合适的 wheel,也可以直接通过对应的 URL 安装:
pip install https://github.com/turboderp/exllamav2/releases/download/v0.0.12/exllamav2-0.0.12+cu121-cp311-cp311-linux_x86_64.whl
py3-none-any.whl 是 JIT 版本,会在首次启动时构建 extension。.tar.gz 文件也可以用这种方式安装,并会在安装期间构建 extension。
此外也提供了 PyPI 软件包。它与 JIT 版本相同,详见上文。安装方式如下:
pip install exllamav2
ExLlamaV2 支持与 V1 相同的 4-bit GPTQ 模型,同时还支持一种新的“EXL2”格式。EXL2 基于与 GPTQ 相同的优化方法,支持 2、3、4、5、6 和 8-bit 量化。该格式允许在单个模型中混合使用不同的量化级别,从而实现每个权重平均 2~8 bit 之间的任意 bitrate。
此外,还可以对每个 linear layer 应用多种量化级别,从而产生一种类似 sparse quantization 的效果:更重要的权重(列)会使用更多 bit 进行量化。正是得益于让 ExLlama 能够高效处理 act-order 模型的同一种重映射技巧,这些格式的混合几乎不会影响性能。
参数选择会自动完成:系统会对每个矩阵进行多次量化,并针对每一层的多种可能设置,测量相对于所选 calibration data 的量化误差。最后,系统会选择一种组合,在满足目标平均 bitrate 的同时,尽可能降低整个模型中的最大量化误差。
在我的测试中,这套方案可以让 Llama2 70B 以每个权重 2.55 bit 的配置,在单张 24 GB GPU 上运行,并支持 2048-token context,生成的内容连贯且大体稳定。13B 模型能以 2.65 bit 的配置在 8 GB VRAM 内运行,不过目前这些模型都没有使用 GQA,因此 context size 实际上被限制在 2048。无论哪种情况,模型都不太可能在桌面环境运行的同时装进显存。至少目前如此。
项目提供了用于量化模型的脚本。转换大型模型可能会比较慢,请提前留意。转换脚本及其选项在此处有详细说明。
项目提供了多个 evaluation 脚本。详情见此处。
项目提供了一个测试社区:https://discord.gg/NSFwVuCjRq。`#bot test` 提供免费量化服务。计算资源由 The Bloke 慷慨提供,并由 Lambda Labs 支持。
我已经向 Hugging Face 上传了几个经过 EXL2 量化的模型,供大家试用,见此处。
我已经向 Hugging Face 上传了几个经过 EXL2 量化的模型,供大家试用,见此处。
LoneStriker 在 Hugging Face 上提供了大量 EXL2 模型。
LoneStriker 在 Hugging Face 上提供了大量 EXL2 模型。
bartowski 在 HF 上还提供了更多 EXL2 模型。
bartowski 在 HF 上还提供了更多 EXL2 模型。