Skip to content

Xinference 本地部署大模型

本地部署平台比较

Ollama vs Xinference

对比

Xinference部署大模型

部署环境

我在MacBook Air M2上使用Xinference部署大模型。Mac是内存显存共用的。

MacBook

我们可以在MacBook Air上运行一些量化后的大模型。

什么是量化后的大模型:

量化后的大模型是指在模型压缩和优化过程中,将深度学习模型的权重和激活值从原始的高精度(通常是32位浮点数,即FP32)降低到较低精度(如8位整数、4位整数等)的过程。量化的目的是减少模型的内存占用和计算复杂度,从而加快推理速度并降低硬件要求,尤其是在资源受限的环境中。

量化版本是指通过降低模型参数的数值精度来减少模型大小和计算需求的技术。在深度学习中,模型通常使用高精度的浮点数(如32位浮点数,FP32)表示参数。量化技术将这些高精度参数转换为低精度表示(如8位整数,INT8),从而减小模型的存储空间和计算复杂度。

量化的主要目的包括:

减少存储需求:降低模型的存储空间,使其更适合在存储资源有限的设备上运行。

加速计算:低精度计算通常比高精度计算更快,尤其在硬件支持低精度运算时,能够提高推理速度。

降低能耗:低精度计算消耗的能量较少,有助于在移动设备等对能耗敏感的场景中应用。

常见的量化精度包括:

FP16(16位浮点数):相比FP32,内存占用减少一半,适用于需要较高精度的应用。

INT8(8位整数):进一步降低精度,显著减少模型大小和计算需求,适用于对精度要求不高的场景。

INT4(4位整数):极大地降低精度,进一步压缩模型,但可能导致较大的精度损失。

需要注意的是,量化可能会导致模型精度下降,因此在应用量化时需要权衡精度和效率之间的关系。

例如,GPTQ(Generalized Post-Training Quantization)是一种后训练量化技术,能够将模型的权重位宽降低到3-4位,在大幅减少模型大小和计算成本的同时还能保持模型性能。 BLOG.CSDN.NET

总之,量化版本通过降低模型参数的精度,实现了模型压缩和计算加速,是深度学习模型优化的重要技术之一。

FP16和BP16的区别:

FP16(半精度浮点数)和BP16(Brain浮点数)都是16位浮点数格式,但在表示方式和应用场景上有所不同。

FP16(半精度浮点数):

结构:1位符号位,5位指数位,10位尾数位。 精度与范围:提供较高的精度,适用于对精度要求较高的应用,如图像处理和科学计算。 应用:广泛用于深度学习的训练和推理过程中,尤其是在GPU和TPU上,提供更快的计算速度并减少内存使用,同时相对较少损失精度。 BLOG.CSDN.NET BP16(Brain浮点数):

结构:1位符号位,8位指数位,7位尾数位。 精度与范围:在指数范围方面与FP32相似,因此可以处理更大的数值范围,但尾数部分较少,导致精度比FP16稍低。 应用:主要适用于训练深度学习模型,尤其是在需要更高数值范围而不需要完全精确计算的情况下。 BLOG.CSDN.NET 总的来说,FP16适用于需要较高精度的任务,而BP16则在需要更大数值范围的深度学习训练中更为常见。

Python环境

conda env list
conda create -n xinference python=3.11.7
conda activate xinference
conda env list

安装Xinference

Mac安装Xinference的先决条件:

conda install -c conda-forge pynini=2.1.5
//安装Xinference
pip install "xinference[all]" -i https://pypi.mirrors.ustc.edu.cn/simple/

可能的报错:

Field name "schema" shadows a BaseModel attribute

解决:

pip install openai==1.39.0

安装成功后,使用以下命令查看xinference的安装路径

pip show xinference

启动Xinference

xinference-local --host 0.0.0.0 --port 9997

启动成功后,可以通过访问 http://127.0.0.1:9997/ui 来使用 UI,访问 http://127.0.0.1:9997/docs 来查看 API 文档。

启动

部署大模型

查询与 qwen1.5-chat 模型相关的参数组合,以决定它能够怎样跑在各种推理引擎上。

xinference engine -e http://127.0.0.1:9997 --model-name qwen1.5-chat
Name          Engine        Format      Size (in billions)  Quantization
------------  ------------  --------  --------------------  --------------
qwen1.5-chat  Transformers  pytorch                    0_5  4-bit
qwen1.5-chat  Transformers  pytorch                    0_5  8-bit
qwen1.5-chat  Transformers  pytorch                    0_5  none
qwen1.5-chat  Transformers  pytorch                    1_8  4-bit
qwen1.5-chat  Transformers  pytorch                    1_8  8-bit
qwen1.5-chat  Transformers  pytorch                    1_8  none
qwen1.5-chat  Transformers  pytorch                      4  4-bit
qwen1.5-chat  Transformers  pytorch                      4  8-bit
qwen1.5-chat  Transformers  pytorch                      4  none
qwen1.5-chat  Transformers  pytorch                      7  4-bit
qwen1.5-chat  Transformers  pytorch                      7  8-bit
qwen1.5-chat  Transformers  pytorch                      7  none
qwen1.5-chat  Transformers  pytorch                     14  4-bit
qwen1.5-chat  Transformers  pytorch                     14  8-bit
qwen1.5-chat  Transformers  pytorch                     14  none
qwen1.5-chat  Transformers  pytorch                     32  4-bit
qwen1.5-chat  Transformers  pytorch                     32  8-bit
qwen1.5-chat  Transformers  pytorch                     32  none
qwen1.5-chat  Transformers  pytorch                     72  4-bit
qwen1.5-chat  Transformers  pytorch                     72  8-bit
qwen1.5-chat  Transformers  pytorch                     72  none
qwen1.5-chat  Transformers  pytorch                    110  4-bit
qwen1.5-chat  Transformers  pytorch                    110  8-bit
qwen1.5-chat  Transformers  pytorch                    110  none
qwen1.5-chat  Transformers  gptq                       0_5  Int4
qwen1.5-chat  Transformers  gptq                       0_5  Int8
qwen1.5-chat  Transformers  gptq                       1_8  Int4
qwen1.5-chat  Transformers  gptq                       1_8  Int8
qwen1.5-chat  Transformers  gptq                         4  Int4
qwen1.5-chat  Transformers  gptq                         4  Int8
qwen1.5-chat  Transformers  gptq                         7  Int4
qwen1.5-chat  Transformers  gptq                         7  Int8
qwen1.5-chat  Transformers  gptq                        14  Int4
qwen1.5-chat  Transformers  gptq                        14  Int8
qwen1.5-chat  Transformers  gptq                        32  Int4
qwen1.5-chat  Transformers  gptq                        72  Int4
qwen1.5-chat  Transformers  gptq                        72  Int8
qwen1.5-chat  Transformers  gptq                       110  Int4
qwen1.5-chat  Transformers  awq                        0_5  Int4
qwen1.5-chat  Transformers  awq                        1_8  Int4
qwen1.5-chat  Transformers  awq                          4  Int4
qwen1.5-chat  Transformers  awq                          7  Int4
qwen1.5-chat  Transformers  awq                         14  Int4
qwen1.5-chat  Transformers  awq                         32  Int4
qwen1.5-chat  Transformers  awq                         72  Int4
qwen1.5-chat  Transformers  awq                        110  Int4
qwen1.5-chat  llama.cpp     ggufv2                     0_5  q2_k
qwen1.5-chat  llama.cpp     ggufv2                     0_5  q3_k_m
qwen1.5-chat  llama.cpp     ggufv2                     0_5  q4_0
qwen1.5-chat  llama.cpp     ggufv2                     0_5  q4_k_m
qwen1.5-chat  llama.cpp     ggufv2                     0_5  q5_0
qwen1.5-chat  llama.cpp     ggufv2                     0_5  q5_k_m
qwen1.5-chat  llama.cpp     ggufv2                     0_5  q6_k
qwen1.5-chat  llama.cpp     ggufv2                     0_5  q8_0
qwen1.5-chat  llama.cpp     ggufv2                     1_8  q2_k
qwen1.5-chat  llama.cpp     ggufv2                     1_8  q3_k_m
qwen1.5-chat  llama.cpp     ggufv2                     1_8  q4_0
qwen1.5-chat  llama.cpp     ggufv2                     1_8  q4_k_m
qwen1.5-chat  llama.cpp     ggufv2                     1_8  q5_0
qwen1.5-chat  llama.cpp     ggufv2                     1_8  q5_k_m
qwen1.5-chat  llama.cpp     ggufv2                     1_8  q6_k
qwen1.5-chat  llama.cpp     ggufv2                     1_8  q8_0
qwen1.5-chat  llama.cpp     ggufv2                       4  q2_k
qwen1.5-chat  llama.cpp     ggufv2                       4  q3_k_m
qwen1.5-chat  llama.cpp     ggufv2                       4  q4_0
qwen1.5-chat  llama.cpp     ggufv2                       4  q4_k_m
qwen1.5-chat  llama.cpp     ggufv2                       4  q5_0
qwen1.5-chat  llama.cpp     ggufv2                       4  q5_k_m
qwen1.5-chat  llama.cpp     ggufv2                       4  q6_k
qwen1.5-chat  llama.cpp     ggufv2                       4  q8_0
qwen1.5-chat  llama.cpp     ggufv2                       7  q2_k
qwen1.5-chat  llama.cpp     ggufv2                       7  q3_k_m
qwen1.5-chat  llama.cpp     ggufv2                       7  q4_0
qwen1.5-chat  llama.cpp     ggufv2                       7  q4_k_m
qwen1.5-chat  llama.cpp     ggufv2                       7  q5_0
qwen1.5-chat  llama.cpp     ggufv2                       7  q5_k_m
qwen1.5-chat  llama.cpp     ggufv2                       7  q6_k
qwen1.5-chat  llama.cpp     ggufv2                       7  q8_0
qwen1.5-chat  llama.cpp     ggufv2                      14  q2_k
qwen1.5-chat  llama.cpp     ggufv2                      14  q3_k_m
qwen1.5-chat  llama.cpp     ggufv2                      14  q4_0
qwen1.5-chat  llama.cpp     ggufv2                      14  q4_k_m
qwen1.5-chat  llama.cpp     ggufv2                      14  q5_0
qwen1.5-chat  llama.cpp     ggufv2                      14  q5_k_m
qwen1.5-chat  llama.cpp     ggufv2                      14  q6_k
qwen1.5-chat  llama.cpp     ggufv2                      14  q8_0
qwen1.5-chat  llama.cpp     ggufv2                      32  q2_k
qwen1.5-chat  llama.cpp     ggufv2                      32  q3_k_m
qwen1.5-chat  llama.cpp     ggufv2                      32  q4_0
qwen1.5-chat  llama.cpp     ggufv2                      32  q4_k_m
qwen1.5-chat  llama.cpp     ggufv2                      32  q5_0
qwen1.5-chat  llama.cpp     ggufv2                      32  q5_k_m
qwen1.5-chat  llama.cpp     ggufv2                      32  q6_k
qwen1.5-chat  llama.cpp     ggufv2                      32  q8_0
qwen1.5-chat  llama.cpp     ggufv2                      72  q2_k
qwen1.5-chat  llama.cpp     ggufv2                      72  q3_k_m
qwen1.5-chat  llama.cpp     ggufv2                      72  q4_k_m

llama.cpp 一般运行的是量化的模型 速度快 但是质量肯定有损失 就像 ollama, 而 transformers 就是加载原版的模型 需要大显存才能跑起来。

模型量化等级和最低GPU要求参考,以GLM为例启动

上下文128k,上下文通常指的是模型在处理输入时所能支持的最大令牌(token)数量为 128,000 个。这个 k 指的是 (1,000)。

大模型的调用

curl -X 'POST' \
  'http://127.0.0.1:9997/v1/chat/completions' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "qwen1.5-chat",
    "messages": [
        {
            "role": "system",
            "content": "You are a helpful assistant."
        },
        {
            "role": "user",
            "content": "What is the largest animal?"
        }
    ]
  }'

Dify配置本地大模型

Dify配置本地大模型

Dify配置本地大模型

补充知识:xinference 模型显存使用量计算

xinference cal-model-mem -s 1_8 -f pytorch -c 128000 -n qwen1.5-chat