ToB企服应用市场:ToB评测及商务社交产业平台

标题: llama.cpp摆设 [打印本页]

作者: 麻花痒    时间: 6 天前
标题: llama.cpp摆设
llama.cpp

先容

摆设

先容

大模型的研究分为练习和推理两个部门:

练习完成之后,模型的参数就固定了,这时候就可以使用模型举行推理,对外提供服务。
llama.cpp 主要办理的是推理过程中的性能题目。主要有两点优化:

盘算类 Python 库的优化手段之一就是使用 C 重新实现,这部门的性能提升非常明显。另外一个是量化,量化是通过牺牲模型参数的精度,来变更模型的推理速度。llama.cpp 提供了大模型量化的工具,可以将模型参数从 32 位浮点数转换为 16 位浮点数,乃至是 8、4 位整数。
除此之外,llama.cpp 还提供了服务化组件,可以直接对外提供模型的 API 。
使用量化模型

下载编译 llama.cpp
  1. git clone https://github.com/ggerganov/llama.cpp
  2. cd llama.cpp
  3. make
复制代码
在目次下会生成一系列可实行文件

准备 llama.cpp 支持的模型
llama.cpp 支持转换的模型格式有 PyTorch 的 .pth 、huggingface 的 .safetensors 、另有之前 llamma.cpp 采用的 ggmlv3。
在 huggingface 上找到符合格式的模型,下载至 llama.cpp 的 models 目次下。
  1. git clone https://huggingface.co/4bit/Llama-2-7b-chat-hf ./models/Llama-2-7b-chat-hf
复制代码
格式转化

llama.cpp 项目下带有 requirements.txt 文件,直接安装依赖即可。
  1. pip install -r requirements.txt
复制代码

  1. python convert.py ./models/Llama-2-7b-chat-hf --vocabtype spm
  2. params = Params(n_vocab=32000, n_embd=4096, n_mult=5504, n_layer=32, n_ctx=2048, n_ff=11008, n_head=32, n_head_kv=32, f_norm_eps=1e-05, f_rope_freq_base=None, f_rope_scale=None, ftype=None, path_model=PosixPath('models/Llama-2-7b-chat-hf'))
  3. Loading vocab file 'models/Llama-2-7b-chat-hf/tokenizer.model', type 'spm'
  4. ...
  5. Wrote models/Llama-2-7b-chat-hf/ggml-model-f16.gguf
复制代码
vocabtype 指定分词算法,默认值是 spm,如果是 bpe,需要显示指定。
量化模型

quantize 提供各种精度的量化。
  1. ./quantize
  2. usage: ./quantize [--help] [--allow-requantize] [--leave-output-tensor] model-f32.gguf [model-quant.gguf] type [nthreads]
  3.   --allow-requantize: Allows requantizing tensors that have already been quantized. Warning: This can severely reduce quality compared to quantizing from 16bit or 32bit
  4.   --leave-output-tensor: Will leave output.weight un(re)quantized. Increases model size but may also increase quality, especially when requantizing
  5. Allowed quantization types:
  6.    2  or  Q4_0   :  3.56G, +0.2166 ppl @ LLaMA-v1-7B
  7.    3  or  Q4_1   :  3.90G, +0.1585 ppl @ LLaMA-v1-7B
  8.    8  or  Q5_0   :  4.33G, +0.0683 ppl @ LLaMA-v1-7B
  9.    9  or  Q5_1   :  4.70G, +0.0349 ppl @ LLaMA-v1-7B
  10.   10  or  Q2_K   :  2.63G, +0.6717 ppl @ LLaMA-v1-7B
  11.   12  or  Q3_K   : alias for Q3_K_M
  12.   11  or  Q3_K_S :  2.75G, +0.5551 ppl @ LLaMA-v1-7B
  13.   12  or  Q3_K_M :  3.07G, +0.2496 ppl @ LLaMA-v1-7B
  14.   13  or  Q3_K_L :  3.35G, +0.1764 ppl @ LLaMA-v1-7B
  15.   15  or  Q4_K   : alias for Q4_K_M
  16.   14  or  Q4_K_S :  3.59G, +0.0992 ppl @ LLaMA-v1-7B
  17.   15  or  Q4_K_M :  3.80G, +0.0532 ppl @ LLaMA-v1-7B
  18.   17  or  Q5_K   : alias for Q5_K_M
  19.   16  or  Q5_K_S :  4.33G, +0.0400 ppl @ LLaMA-v1-7B
  20.   17  or  Q5_K_M :  4.45G, +0.0122 ppl @ LLaMA-v1-7B
  21.   18  or  Q6_K   :  5.15G, -0.0008 ppl @ LLaMA-v1-7B
  22.    7  or  Q8_0   :  6.70G, +0.0004 ppl @ LLaMA-v1-7B
  23.    1  or  F16    : 13.00G              @ 7B
  24.    0  or  F32    : 26.00G              @ 7B
复制代码

  1. ./quantize ./models/Llama-2-7b-chat-hf/ggml-model-f16.gguf ./models/Llama-2-7b-chat-hf/ggml-model-q4_0.gguf Q4_0
  2. llama_model_quantize_internal: model size  = 12853.02 MB
  3. llama_model_quantize_internal: quant size  =  3647.87 MB
  4. llama_model_quantize_internal: hist: 0.036 0.015 0.025 0.039 0.056 0.076 0.096 0.112 0.118 0.112 0.096 0.077 0.056 0.039 0.025 0.021
复制代码
量化之后,模型的大小从 13G 低落到 3.6G,但模型精度从 16 位浮点数低落到 4 位整数。
运行 GGUF 模型

下载模型
在 llama.cpp 项目标首页 https://github.com/ggerganov/llama.cpp 有列举支持的模型
去 https://huggingface.co/models 找 GGUF 格式的大模型版本,下载模型文件放在 llama.cpp 项目 models 目次下。
  1. git clone https://huggingface.co/rozek/LLaMA-2-7B-32K-Instruct_GGUF ./models/LLaMA-2-7B-32K-Instruct_GGUF
复制代码
堆栈中包含各种量化位数的模型,Q2、Q3、Q4、Q5、Q6、Q8、F16。量化模型的命名方法遵照: “Q” + 量化比特位 + 变种。
量化位数越少,对硬件资源的要求越低,但是模型的精度也越低。
   使用 git clone 下令下载的模型会加载失败,提示 magic 不匹配。
  在网页直接下载的模型可以正常使用。
  推理
在 llama.cpp 项目标根目次,编译源码之后,实行下面的下令,使用模型举行推理。
  1. ./main -m ./models/llama-2-7b-langchain-chat-GGUF/llama-2-7b-langchain-chat-q4_0.gguf -p "What color is the sun?" -n 1024
  2. What color is the sun?
  3. nobody knows. It’s not a specific color, more a range of colors. Some people say it's yellow; some say orange, while others believe it to be red or white. Ultimately, we can only imagine what color the sun might be because we can't see its exact color from this planet due to its immense distance away!
  4. It’s fascinating how something so fundamental to our daily lives remains a mystery even after decades of scientific inquiry into its properties and behavior.” [end of text]
  5. llama_print_timings:        load time =   376.57 ms
  6. llama_print_timings:      sample time =    56.40 ms /   105 runs   (    0.54 ms per token,  1861.77 tokens per second)
  7. llama_print_timings: prompt eval time =   366.68 ms /     7 tokens (   52.38 ms per token,    19.09 tokens per second)
  8. llama_print_timings:        eval time = 15946.81 ms /   104 runs   (  153.33 ms per token,     6.52 tokens per second)
  9. llama_print_timings:       total time = 16401.43 ms
复制代码
当然,也可以用上面量化的模型举行推理。
  1. ./main -m  ./models/Llama-2-7b-chat-hf/ggml-model-q4_0.gguf -p "What color is the sun?" -n 1024
  2. What color is the sun?
  3. sierp 10, 2017 at 12:04 pm - Reply
  4. The sun does not have a color because it emits light in all wavelengths of the visible spectrum and beyond. However, due to our atmosphere's scattering properties, the sun appears yellow or orange from Earth. This is known as Rayleigh scattering and is why the sky appears blue during the daytime. [end of text]
  5. llama_print_timings:        load time = 90612.21 ms
  6. llama_print_timings:      sample time =    52.31 ms /    91 runs   (    0.57 ms per token,  1739.76 tokens per second)
  7. llama_print_timings: prompt eval time =   523.38 ms /     7 tokens (   74.77 ms per token,    13.37 tokens per second)
  8. llama_print_timings:        eval time = 15266.91 ms /    90 runs   (  169.63 ms per token,     5.90 tokens per second)
  9. llama_print_timings:       total time = 15911.47 ms
复制代码
四位量化模型,在没有 GPU 的情况下,根本能够实现实时推理。敲完下令,按回车,就能看到模型的回复。
main 下令有一系列参数可选,其中比较紧张的参数有:
-ins 交互模式,可以连续对话,上下文会保存
-c 控制上下文的长度,值越大越能参考更长的对话汗青(默认:512)
-n 控制回复生成的最大长度(默认:128)
–temp 温度系数,值越低回复的随机性越小
交互模式下使用模型
  1. ./main -m ./models/llama-2-7b-langchain-chat-GGUF/llama-2-7b-langchain-chat-q4_0.gguf -ins
  2. > 世界上最大的鱼是什么?
  3. 卡加内利亚鲨为世界最大的鱼,体长达60英尺(18)。牠们的头部相当于一只小车,身体非常丑,腹部有两个气孔,气孔之间还有一个大口径的鳃,用于进行捕食。牠们通常是从水中搴出来到陆地上抓到的小鱼,然后产生大量液体以解脱自己的身体。
  4. > 现在还有这种鱼吗?
  5. 作者所提到的“卡加内利亚鲨”,应该是指的是“卡加内利亚鳄”。卡加内利亚鳄是一种大型淡水肉食性鱼类,分布于欧洲和非洲部分区域。这种鱼的体长最大可达60英尺(18),是世界上已知最大的鱼之一。
  6. 不过,现在这种鱼已经消失了,因为人类对戒备和保护水生生物的意识程度低下,以及环境污染等多方面原因。
复制代码
交互模式下,以对话的情势,有上下文的连续使用大模型。
提供模型的 API 服务

有两种方式,一种是使用 llama.cpp 提供的 API 服务,另一种是使用第三方提供的工具包。
使用 llama.cpp server 提供 API 服务
前面编译之后,会在 llama.cpp 项目标根目次下生成一个 server 可实行文件,实行下面的下令,启动 API 服务。
  1. ./server -m ./models/llama-2-7b-langchain-chat-GGUF/llama-2-7b-langchain-chat-q4_0.gguf --host 0.0.0.0 --port 8080
  2. llm_load_tensors: mem required  = 3647.96 MB (+  256.00 MB per state)
  3. ..................................................................................................
  4. llama_new_context_with_model: kv self size  =  256.00 MB
  5. llama_new_context_with_model: compute buffer total size =   71.97 MB
  6. llama server listening at http://0.0.0.0:8080
  7. {"timestamp":1693789480,"level":"INFO","function":"main","line":1593,"message":"HTTP server listening","hostname":"0.0.0.0","port":8080}
复制代码
这样就启动了一个 API 服务,可以使用 curl 下令举行测试。
  1. curl --request POST \
  2.     --url http://localhost:8080/completion \
  3.     --header "Content-Type: application/json" \
  4.     --data '{"prompt": "What color is the sun?","n_predict": 512}'
  5. {"content":".....","generation_settings":{"frequency_penalty":0.0,"grammar":"","ignore_eos":false,"logit_bias":[],"mirostat":0,"mirostat_eta":0.10000000149011612,"mirostat_tau":5.0,......}}
复制代码
使用第三方工具包提供的 API 服务
在 llamm.cpp 项目标首页 https://github.com/ggerganov/llama.cpp 中有提到各种语言编写的第三方工具包,可以使用这些工具包提供 API 服务,包括 Python、Go、Node.js、Ruby、Rust、C#/.NET、Scala 3、Clojure、React Native、Java 等语言的实现。
以 Python 为例,使用 llama-cpp-python 提供 API 服务。

  1. pip install llama-cpp-python -i https://mirrors.aliyun.com/pypi/simple/
复制代码
如果需要针对特定的硬件举行优化,就配置 “CMAKE_ARGS” 参数,详情请参数 https://github.com/abetlen/llama-cpp-python 。我本地是 CPU 情况,就没有举行额外的配置。

  1. python -m llama_cpp.server --model ./models/llama-2-7b-langchain-chat-GGUF/llama-2-7b-langchain-chat-q4_0.gguf
  2. llama_new_context_with_model: kv self size  = 1024.00 MB
  3. llama_new_context_with_model: compute buffer total size =  153.47 MB
  4. AVX = 1 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 1 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 |
  5. INFO:     Started server process [57637]
  6. INFO:     Waiting for application startup.
  7. INFO:     Application startup complete.
  8. INFO:     Uvicorn running on http://localhost:8000 (Press CTRL+C to quit)
复制代码

  1. curl -X 'POST' \
  2.   'http://localhost:8000/v1/chat/completions' \
  3.   -H 'accept: application/json' \
  4.   -H 'Content-Type: application/json' \
  5.   -d '{
  6.   "messages": [
  7.     {
  8.       "content": "You are a helpful assistant.",
  9.       "role": "system"
  10.     },
  11.     {
  12.       "content": "Write a poem for Chinese?",
  13.       "role": "user"
  14.     }
  15.   ]
  16. }'
  17. {"id":"chatcmpl-c3eec466-6073-41e2-817f-9d1e307ab55f","object":"chat.completion","created":1693829165,"model":"./models/llama-2-7b-langchain-chat-GGUF/llama-2-7b-langchain-chat-q4_0.gguf","choices":[{"index":0,"message":{"role":"assistant","content":"I am not programmed to write poems in different languages. How about I"},"finish_reason":"length"}],"usage":{"prompt_tokens":26,"completion_tokens":16,"total_tokens":42}}
复制代码

  1. # -*- coding: utf-8 -*-
  2. import openai
  3. openai.api_key = 'random'
  4. openai.api_base = 'http://localhost:8000/v1'
  5. messages = [{'role': 'system', 'content': u'你是一个真实的人,老实回答提问,不要耍滑头'}]
  6. messages.append({'role': 'user', 'content': u'你昨晚去哪里了'})
  7. response = openai.ChatCompletion.create(
  8.     model='random',
  9.     messages=messages,
  10. )
  11. print(response['choices'][0]['message']['content'])
复制代码
参考文档

大模型摆设工具 llama.cpp

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4