导读
随着 Llama2 的开源,以及通义千问、百川、智谱等国内大模型的问世,很多用户有了本地部署去尝试大模型的需求,然而硬件的需求阻碍了很多人的尝试,并不是所有人都拥有一块英伟达显卡的,所以 Llama2 问世不久,大神 Andrej Karpathy 的一个 weekend project 爆火——llama2.c。
llama2.c 是用 C 语言实现的,没有任何依赖的大模型推理库,它能够以比较高效的方式运行在 CPU 上,可以在个人电脑,比如 Macbook 上完成大模型的推理任务,解决了很多没有显卡却想试一下部署 Llama2 的用户需求。
其实,在这个项目之前,就有一个开源项目专门针对个人用户的大模型推理需求,适配各种硬件的推理框架,包括 Andrej Karpathy 的 llama2.c 项目也是受其启发,那就是 llama.cpp,一个目前在 Github 有超过 4万 star 的项目。
llama.cpp
llama.cpp 是一个用 C/C++ 编写的推理框架,没有任何依赖,能够在几乎所有系统和硬件运行,支持包括 LLaMA 2、Code Llama、Falcon、Baichuan 等 llama 系的模型。除了能够使用 CPU 推理,它也可以利用 CUDA、Metal 和 OpenCL 这些 GPU 资源加速,所以不管是英伟达、AMD还是 Apple 的 GPU 都能够帮助提升推理性能。
除了硬件的支持,llamacpp 还有一个重要的特性就是支持模型量化,可以极大地减少模型对显存或者内存使用量,下面的表列出了不同量化方式的模型大小以及模型效果。
Name | Quant method | Bits | Size | Max RAM required | Use case |
llama-2-70b-chat.Q2_K.gguf | Q2_K | 2 | 29.28 GB | 31.78 GB | smallest, significant quality loss - not recommended for most purposes |
llama-2-70b-chat.Q3_K_S.gguf | Q3_K_S | 3 | 29.92 GB | 32.42 GB | very small, high quality loss |
llama-2-70b-chat.Q5_K_S.gguf | Q5_K_S | 5 | 30.57 GB | 33.07 GB | large, low quality loss - recommended |
llama-2-70b-chat.Q3_K_M.gguf | Q3_K_M | 3 | 33.19 GB | 35.69 GB | very small, high quality loss |
llama-2-70b-chat.Q3_K_L.gguf | Q3_K_L | 3 | 36.15 GB | 38.65 GB | small, substantial quality loss |
llama-2-70b-chat.Q4_0.gguf | Q4_0 | 4 | 38.87 GB | 41.37 GB | legacy; small, very high quality loss - prefer using Q3_K_M |
llama-2-70b-chat.Q4_K_S.gguf | Q4_K_S | 4 | 39.07 GB | 41.57 GB | small, greater quality loss |
llama-2-70b-chat.Q4_K_M.gguf | Q4_K_M | 4 | 41.42 GB | 43.92 GB | medium, balanced quality - recommended |
llama-2-70b-chat.Q5_0.gguf | Q5_0 | 5 | 47.46 GB | 49.96 GB | legacy; medium, balanced quality - prefer using Q4_K_M |
llama-2-70b-chat.Q5_K_M.gguf | Q5_K_M | 5 | 48.75 GB | 51.25 GB | large, very low quality loss - recommended |
llama-2-70b-chat.Q6_K.gguf | Q6_K | 6 | 56.59 GB | 59.09 GB | very large, extremely low quality loss |
llama-2-70b-chat.Q8_0.gguf | Q8_0 | 8 | 73.29 GB | 75.79 GB | very large, extremely low quality loss - not recommended |
本地部署
模型
为了方便使用到 llamacpp 的能力,我们在魔搭平台上传了模型的 gguf 版本,目前已经支持的模型包括以下列表:
- llama-2-7b-chat(https://modelscope.cn/models/Xorbits/Llama-2-7b-Chat-GGUF)
- llama-2-13b-chat(https://modelscope.cn/models/Xorbits/Llama-2-13b-Chat-GGUF)
- codellama-7b-instruct(https://modelscope.cn/models/Xorbits/CodeLlama-7B-Instruct-GGUF)
- codellama-13b-instruct(https://modelscope.cn/models/Xorbits/CodeLlama-13B-Instruct-GGUF)
- codellama-34b-instruct(https://modelscope.cn/models/Xorbits/CodeLlama-34B-Instruct-GGUF)
后续更多的模型也在持续支持中,欢迎大家在社区列出需要的模型,我们会第一时间上传到魔搭。
Xinference
Xinference(https://github.com/xorbitsai/inference) 是一个开源推理平台,能够帮助用户非常方便地在本地部署开源大模型,借助 Xinference,你能够在云端、本地设备,甚至是笔记本电脑上运行任何开源大语言模型、语音识别模型等多模态模型的推理,llamacpp 的模型同样也是支持的。同时,Xinference 和魔搭也做了深度集成,对于在魔搭中能够找到的模型,优先从魔搭下载,对于本地部署非常友好。
安装
安装 Xinference:
pip install xinference
安装 llamacpp:
- CPU 版本
pip install llama-cpp-python
- CUDA 版本
CMAKE_ARGS="-DLLAMA_CUBLAS=on" pip install llama-cpp-python
- Apple Metal 版本
CMAKE_ARGS="-DLLAMA_METAL=on" pip install llama-cpp-python
其余硬件可以参考文档
https://github.com/abetlen/llama-cpp-python#installation-with-hardware-acceleration
部署模型
通过命令行拉起 Xinference 服务:
xinference
默认会有一个模型选择的 Web UI,选择任意想部署的模型。
也可以通过代码部署模型与推理:
from xinference.client import Client client = Client("http://127.0.0.1:9997") model_uid = client.launch_model( model_name="llama-2-chat", model_format="ggufv2", model_size_in_billions=7, quantization="Q4_K_M", ) model = client.get_model(model_uid) chat_history = [] prompt = "What is the largest animal?" model.chat( prompt, chat_history=chat_history, generate_config={"max_tokens": 1024} )
多端体验
1 使用魔搭社区PAI-DSW的CPU实例
进入魔搭社区-notebook(https://modelscope.cn/my/mynotebook/preset)
选择CPU机型,拉起Xinference服务,以llama-2-chat 7B GGUF为例,27秒完成192个token:
内存占用:
2 在Mac-M1也可以轻松完成推理
Embedding模型
除了大语言模型,embedding 模型在 AI 应用中也占有非常重要的位置,我们在魔搭里上传了 MTEB 排行中靠前的 embedding 模型,也可以通过 xinference 非常方便地在本地部署。这是目前已经支持的模型列表,包括中文和英文模型:
- bge-large-en
- bge-base-en
- gte-large
- gte-base
- e5-large-v2
- bge-large-zh
- bge-large-zh-noinstruct
- bge-base-zh
- multilingual-e5-large
- bge-small-zh
- bge-small-zh-v1.5
- bge-base-zh-v1.5
- bge-large-zh-v1.5
- bge-small-en-v1.5
- bge-base-en-v1.5
- bge-large-en-v1.5
目前 embedding 模型支持通过代码推理:
In [1]: client = Client("http://localhost:9997") In [2]: uid = client.launch_model(model_name="gte-base", model_type="embedding") In [3]: model = client.get_model(model_uid=uid) In [4]: model.create_embedding("write a poem.") Out[4]: {'object': 'list', 'model': '3ef99480-496f-11ee-9009-c2c8e4cad3f6', 'data': [{'index': 0, 'object': 'embedding', 'embedding': [-0.003699747147038579, 0.019329899922013283, ..., -0.05098249390721321, -0.001861078548245132]}], 'usage': {'prompt_tokens': 37, 'total_tokens': 37}}
总结
使用魔搭与 Xinference 平台,可以快速搭建本地大模型服务,赶快试用起来吧,更多的模型陆续支持中,欢迎大家的反馈。