无需云端!国产开源大语言模型llama.cpp本地实战
作者:高瑞冬
注:
文章是2023年底写的。代码和运行方式虽有些旧,但基本原理一样。现在出来ollama,vllm等工具框架用来本地部署大模型,顺便更新一下。
@[TOC](最后有彩蛋)
背景
上海人工智能实验室与商汤科技联合香港中文大学和复旦大学正式推出书生·浦语200亿参数模型版本 InternLM-20B ,InternLM-20B 在超过 2.3T Tokens 包含高质量英文、中文和代码的数据上进行预训练,其中 Chat 版本还经过了 SFT 和 RLHF 训练,使其能够更好、更安全地满足用户的需求。
根据以上官方提供的描述和性能指标,这款新模型还是值得期待的。
根据相关文献,大语言模型在处理复杂任务时需要其大参数规模加持,才能够出色的完成任务。这个问题相信大家使用中也有体会。7B乃至13B在普通聊天任务中可能胜任。但是在比较复杂的任务中,比如使用react框架做推理时往往表现差强人意。所以,我们往往需要选择13B以上的参数规模的模型以便圆满完成这些任务。但是这种规模的模型的运行需要内存和gpu资源对于普通开发环境来说都是很高的要求。那么如何在16GB内存的开发机器上完成这样的开发工作呢?
通过研读internLM开源的代码,发现internLM可能也是llama架构的模型。这让我想到了llama.cpp的框架。根据llama.cpp文档经过模型转换和试验成功将20b运行在一个openai rest api的后端。试验结果表明,gpu加速下运行的速度非常惊艳。我使用的是苹果的m2 ultra。以下是具体步骤,希望对其他小伙伴有所帮助:
见证奇迹的过程
-
下载internLM 20b模型:
git clone https://www.modelscope.cn/Shanghai_AI_Laboratory/internlm-chat-20b
-
下载llama.cpp源码并准备环境
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
#检出稳定版本,成文时这个是最新的:
git chechout b1204
#编译c++代码:
make
#安装python需要的组件
Pip3 install -r requirement.txt
-
转换模型
#转换20b模型到ggml fp16格式,会在模型路径下生成ggml-model-f16.gguf:
python3 convert.py ../internlm-chat-20b
#以q4_0方式量化模型:
./quantize ../internlm-chat-20b/ggml-model-f16.gguf ../internlm-chat-20b/internlm-chat-20b-ggml-q4_0.gguf q4_0
这个过程会消耗70GB空间,确保你的磁盘空间足够。
如果不想麻烦自己,可以这里下载量化好的模型文件:
https://www.modelscope.cn/models/ruidong/internLM-20b-chat-gguf/summary
-
运行模型推断
#运行llama.cpp的web服务端点:
./server -m ../internlm-chat-20b/internlm-chat-20b-ggml-q4_0.gguf -a internLM-20b -c 8192 -ngl 60
#注意:如果没有gpu可用,需要使用-ngl 0,否则报错。
#在本机8081运行符合openai规格的rest api端点:
Python ./example/server/api_like_OAI.py
#注意:这个需要参考模型的文档给出相应的提示模板。比如对于AquilaChat2-34B-16K 模型,需要如下参数指定提示模板:
nohup python3 examples/server/api_like_OAI.py --user-name 'Human:' --ai-name 'Assistant:' --system-name 'System:' --chat-prompt 'A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human questions.' &
#不然会出现奇怪的回答。
此时对于AI应用开发的小伙伴,可以在需要配置openai地址的地方设置127.0.0.1:8081/v1,开始你的探索开发之路了。
开启体验
一切正常的话,可以这样试验一下部署的符合openai规格的本地AI服务:
curl -X POST http://localhost:8081/v1/chat/completions -H 'Content-Type: application/json' -d'{"model": "internLM","messages": [{"role": "user", "content": "who are you"}]}'
正常情况下返回如下:
{"choices":[{"finish_reason":"stop","index":0,"message":{"content":" I am an AI Assistant designed to provide assistance for various tasks and answer questions. How can I assist you today?","role":"assistant"}}],"created":1698217685,"id":"chatcmpl","model":"LLaMA_CPP","object":"chat.completion","truncated":false,"usage":{"completion_tokens":23,"prompt_tokens":36,"total_tokens":59}}
另外一款大模型BAAI/AquilaChat2-34B-16K,可以使用同样的方法运行。只是在运行convert时使用一个参数指定字典类型:
python3 convert.py ../AquilaChat2-34B-16K --vocabtype bpe
其他都一样。
实际测试下来,计算全部offload到gpu上的推断速度非常感人(26 token/s)
如果不想麻烦自己,可以这里下载量化好的模型文件:
https://www.modelscope.cn/models/ruidong/AquilaChat2-34B-16K-QU/summary
花絮:划重点
为什么一定要用 llama.cpp 框架?
1,性能好;2,生态好;3,最大瓶颈价格通过内存显存一体化技术突破
4万多,拥有(192g)超大显存的模型训练和推理本地环境(Mac Studio M2 Ultra)
2万多,拥有(64g)显存的模型训练和推理本地环境(Mac Studio M2 Max)
而NVIDIA H100 80GB PCIe显卡 $30,000 - $40,000,约216,000 - 288,000元
价格只有1/5,但最重要的显存容量确是2.4倍,想训练什么大模型都可以