ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

【AI】大模型本地部署与量化:Ollama、transformers、llama.cpp实践

【AI】大模型本地部署与量化:Ollama、transformers、llama.cpp实践 部署即在本地电脑中下载并运行模型就像使用网络上的大模型API一样但区别在于模型是运行在本地的不收费也不会泄露信息。但模型可能很大本地电脑可能会内存不足这时候就需要量化来尝试缩小模型存储空间同时尽量避免模型性能损失。OllamaOllama是一个大模型部署工具用它只需要执行几个命令就可以在本地电脑下载和部署大模型。官网列出了非常多可以部署的模型有官方模型也有用户训练/调整过的模型。使用Ollama部署首先安装Ollama本身然后执行命令行。这里我们以Qwen3:0.6B为例进行安装因为这是一个非常小的模型大部分电脑都可以轻松部署。# 下载模型到本地ollama pull qwen3:0.6b# 列出本地下载的模型ollama list# 输出结果# NAME ID SIZE MODIFIED# qwen3:0.6b 7df6b6e09427 522 MB 50 seconds ago# 列出本地下载的模型ollama show qwen3:0.6b# 输出结果# Model# architecture qwen3# parameters 751.63M# context length 40960# embedding length 1024# quantization Q4_K_M# ...部分内容省略可以看到我们下载了Qwen3:0.6B的模型这个模型是Ollama自己提供的。模型是Q4_K_M量化即主要使用4bit表示一个参数但重要的位置会采用更高的精度。模型文件大小是522MB上下文为40960也就是40K。然后我们运行这个模型# 运行模型ollama run qwen3:0.6b运行模型后命令行就进入多轮对话模式我们可以直接与这个模型进行交流。最后输入/bye退出。HTTP接口形式使用前面的run命令或者直接使用serve命令可以开启本地的HTTP服务通过接口可以调用模型。# 开启本地模型HTTP服务ollama serve# 测试HTTP服务发送请求Invoke-RestMethod-Urihttp://localhost:11434/api/chat-MethodPost-Body{model:qwen3:0.6b,messages:[{role:user,content:你好}],stream:false}-ContentTypeapplication/json# 输出结果# model : qwen3:0.6b# created_at : 2026-08-18T16:30:26.4658699Z# message : {roleassistant; content好的我理解您的需求。如果您有其他问题或需要帮助请随时告诉我我会尽力解答。如果需要帮助请告诉我您想询问的内容。; thinkingOkay, the user is asking in Chinese, but the original message is in English. ...省略 }# done : True# done_reason : stop# total_duration : 29896113900# load_duration : 296963600# prompt_eval_count : 17# prompt_eval_duration : 37064000# eval_count : 834# eval_duration : 29539272000Ollama默认在11434端口提供服务。通过结果可以看到模型成功的通过HTTP接口给出了回复。但/api/chat接口的协议是Ollama自己的Ollama也有提供其它更通用的协议例如OpenAI的这样可以方便接入其它Agent。这里我们尝试将其接入OpenCode模型API接入配置填写如下base_urlhttp://localhost:11434/v1/,api_keyollamamodelqwen3:0.6b然后就可以在Agent中使用这个模型了。但是由于模型太小只有0.6B基本无法理解Agent注入的提示词因此基本无法完成功能。而且如果本地电脑配置不高例如没有显卡的Windows电脑那么回复会非常慢。例如下图左侧是Qwen3:0.6b的回复右侧是DeepSeek V4 Flash的回复左侧都直接把工具提示词回答了出来右侧则准确的完成了任务列出了项目中的文件。​使用Python运行人工智能开发的主要语言是Python提供了PyTorch等丰富的人工智能工具和库因此如果了解大模型那么还是要使用Python尝试运行。下载模型和工具包这里我们使用国内的魔搭下载模型地址https://www.modelscope.cn/models/Qwen/Qwen3-0.6B 。这里下载的并不是模型经过量化后的版本而是原始发布的模型本身可以看到是Safetensors格式的编码精度为BF16。# 安装魔搭pipinstallmodelscope# 下载模型到指定目录modelscope download--modelQwen/Qwen3-0.6B--local_dir./Qwen3-0.6B下载之后在模型中可以看到多个文件其中model.safetensors表示模型权重文件所有的参数都在这个文件中。由于是BF16格式一个参数用两个字节表示因此文件大小约为1.4GB。模型中还有一些配置文件词表文件和分词规则等等这里先不介绍了。# torch为PyTorch是最流行的深度学习框架库pipinstalltorch# transformers是Hugging Face的大模型工具库pipinstalltransformers# transformers的可选依赖用于自动适配不同硬件pipinstallaccelerate加载模型fromtransformersimportAutoModelForCausalLM,AutoTokenizer# 模型目录MODEL_DIR./Qwen3-0.6B# 加载分词器tokenizerAutoTokenizer.from_pretrained(MODEL_DIR)# 加载模型Auto 根据 config.json 自动识别架构Qwen3ForCausalLMmodelAutoModelForCausalLM.from_pretrained(MODEL_DIR,torch_dtypeauto,# 按模型配置自动选择精度此处为 bfloat16device_mapauto,# 自动分配到可用设备GPU无则 CPU)print(tokenizer)print(model)可以看到通过简单的两行代码即可加载模型。其中transformers内置了很多开源大模型的适配工具它会识别模型配置文件自动选择合适的模型处理方式。输出结果如下​其中第一句话为模型加载的进度条如果电脑性能较差可能要花费一段时间才能加载完成。Qwen2Tokenizer是加载的分词器叫做Qwen2是因为Qwen3和2使用了相同的分词方案中间列出了一些参数和特殊用途的token表。Qwen3ForCausalLM是Qwen3的模型结构其中输出了词嵌入层28层解码器等模型的大致结构。Qwen2Tokenizer和Qwen3ForCausalLM都是transformers内置的通过识别模型配置文件自动应用。多轮对话# 对话历史列表messages[]whileTrue:# 读取用户输入输入 exit 退出循环user_inputinput(\n你)# 去除字符串首尾空白ifuser_input.strip()exit:break# 把用户消息加入历史对话中messages.append({role:user,content:user_input})# 将历史对话按 Qwen3 模板转为纯文本# add_generation_prompt 在消息末尾附加模型回复的开始标记texttokenizer.apply_chat_template(messages,tokenizeFalse,add_generation_promptTrue,return_tensorspt)# 将文本编码为输入TokenID的列表(PyTorch tensor 格式)model_inputstokenizer(text,return_tensorspt)# 其余采样参数取模型默认配置# max_new_tokens512 最多生成 512 个新 tokenoutputsmodel.generate(**model_inputs,max_new_tokens512)# 解码出新增部分去掉输入部分跳过特殊 tokenresponsetokenizer.decode(outputs[0][len(model_inputs[input_ids][0]):],skip_special_tokensTrue)# 把模型回复加入历史用于下一轮对话的上下文messages.append({role:assistant,content:response})print(模型response)加载模型后使用上面的代码可以实现多轮对话效果如下图​下面我们来逐步分析代码。首先是一个无限循环读取用户输入如果输入为exit则退出。然后输入被放到messages中它存放着历史用户输入(role为user)和模型输出(role为assistant)的对话历史。例如当进行第三轮对话时内容是这样的太长的部分已省略[{role:user,content:你好},{role:assistant,content:think\n好的用户发来“你好”我需要 ...省略\n/think\n\n你好有什么可以帮助你的吗 },{role:user,content:你是谁},{role:assistant,content:think\n好的用户问“你是谁”我需要 ...省略\n/think\n\n我是...省略。有什么可以帮助您的吗 },{role:user,content:天空为什么是蓝色的}]messages的格式实际上也是分词器要求的格式。首先使用分词器将messages套入模型对话模板处理成纯文本。大模型实现多轮对话时如果需要理解上下文需要将前面的对话也一并读取因此这里是所有历史记录。下面是处理之后text的输出# 一轮对话text值|im_start|user 你好|im_end||im_start|assistant# 二轮对话text值|im_start|user 你好|im_end||im_start|assistant 你好有什么可以帮助你的吗|im_end||im_start|user 你是谁|im_end||im_start|assistant注意这里分词器将模型思考内容think/think省略了因为思考内容太长且保存意义不大。而且发现我们的内容前后有一些特殊符号这些是模型的对话模板格式有消息开始/结束标记角色标记等。不同的模型对话模板是不一致的。然后就是真正的分词将文本分割为一个一个的token然后转化为TokenID。输出outputs内容如下{input_ids:tensor([[151644,872,198,108386,151645,198,151644,77091,198]]),attention_mask:tensor([[1,1,1,1,1,1,1,1,1]])}input_ids中是一个PyTorch tensor 格式的TokenID列表对照模型文件中的词表可以将其转换为前面的文本。之所以是二维结构和有attention_mask是因为它可以适配批量输入不同对话同时进入模型这里我们使用不到因此忽略。下一步就是调用模型生成回复了输入中**model_inputs是Python解包将上述的结构解开后作为函数的入参。输出outputs结果如下tensor([[151644,872,198,108386,151645,198,151644,77091,198,151667,198,99692,3837,20002,28291,36407,99593,100908,...省略]])可以看到输出也是TokenID列表而且注意观察输出中是包含了输入的TokenID列表的。因此下面将tokenID解析为文本前需要将输出中的输入部分去掉再解析这里说明一下去掉的过程。outputs# tensor([[xxx, xxx, ...]]) 输出TokenID二维列表outputs[0]# [xxx, xxx, ...] 输出列表的第一行也是实际有数据的那行model_inputs# {input_ids: tensor([[xxx, xxx, ...]]) ... } # 输入结构model_inputs[input_ids]# tensor([[xxx, xxx, ...]]) 输入TokenID二维列表model_inputs[input_ids][0]# [xxx, xxx, ...] 输入列表的第一行也是实际有数据的那行len(model_inputs[input_ids][0])# 9 输入列表的第一行的长度len(model_inputs[input_ids][0]):# 9: Python语法可以将数组内部分内容截取outputs[0][len(model_inputs[input_ids][0]):]# 将outputs[0]的第9到最后一个元素截取出来通过上面的语法去掉输入部分只将这次模型输出的TokenID截取出来然后再给分词器进行解码同时去掉模板标记的特殊字符最后生成的response就是模型输出的文本也就是我们前面看到的结果了。格式和量化简介虽然都是同一个大模型Qwen3:0.6B但前面使用Ollama部署的模型格式和使用transformers加载的模型格式和文件大小是不相同的这与模型存储格式与量化精度有关。存储格式存储格式主要与运行模型的训练框架有关不同框架使用不同的存储格式。存储格式对应框架使用场景Safetensorstransformers最常用的格式GGUFllama.cppOllama等工具使用ONNXONNX Runtime跨平台部署使用.pt .pth .binPyTorch训练中使用.ckpt .pbTensorFlow训练中使用pt和pb都是训练中使用的格式并不直接作为大模型存储分发的数据格式。Safetensors是纯粹的数据格式即里面放的都是权重数据本身不包含可执行代码。还需要单独的模型配置文件分词器对话模板等。GGUF里面还可以包含分词器对话模板模型配置文件等数据。ONNX不仅包含权重还包含了模型结构定义计算图但不包含分词器对话模板等。由于包含了模型结构因此直接使用ONNX运行时即可运行模型。其他的格式都需要框架本身内置模型结构例如前面的Qwen3ForCausalLM就是transformers中内置的模型结构。通用量化精度在之前的【AI】一文读懂大模型生态分类/参数/结构/训练/GPU/评测/排行/社区文章中我们了解到大模型参数量巨大运行时一般放到GPU内存即显存中显存一般和GPU都是整体的非常贵不像内存可以独立添加更换。因此为了节约显存或提高运算速度将参数的存储位数压缩同时希望压缩后的数字与压缩前的区别尽量小这就是量化的含义。基础的量化精度格式是通用的基本在所有的存储格式和机器上都能运行。但有一些量化精度格式是部分存储格式专用的里面有特定的算法处理。还有一些精度格式需要特殊的指令集才能处理因此只有部分较新的硬件才能运行。首先来看看通用的量化精度精度格式位数适配存储格式适配机器FP32标准32位浮点数通用通用FP16标准16位浮点数通用通用前面FP32和FP16是两个基础格式实际上就是原样存储对应位数的浮点数。对应到C语言FP64就是doubleFP32是floatFP16则是_Float16C23标准引入。但这几个格式占用内存空间很大如果希望每个数字占用空间更小且还能保证数值和原来近似就需要公共缩放因子了。精度格式位数适配存储格式适配机器INT88位整数公共缩放因子通用GGUF除外通用INT44位整数公共缩放因子通用GGUF除外通用Q88位整数公共缩放因子仅GGUF通用Q44位整数公共缩放因子仅GGUF通用公共缩放因子是很多个数字共享的。使用INT8和INT4时需要将整数部分*缩放因子即可还原出原来的数字。但可想而知使用这种方式存储的数字会有误差损失。Q8和Q4是GGUF专用的格式与INT8和INT4结构类似只不过公共缩放因子共享的数据个数不同。虽然这是整数存储但缩放因子并不是整数因此实际上真正的数值还是浮点数。K-Quant方法GGUF格式有一个专用的量化方式叫做K-Quant方法。它将256个数字分为一个超级块使用两级缩放因子达到尽量节约空间和减小误差的效果。这里我们以Q4_K为例介绍一下​一个超级块包含一个超级块缩放因子和最小值这两个对超级块中所有的参数都生效超级块中包含8个子块每个子块包含32个参数值每个子块还包含一个子块缩放因子和子块最小值对子块中的所有参数生效还原单个参数值的公式q为存储的参数值 value (d × scales) × q - (dmin × mins)为什么要这么设计如果256个数字用同样的缩放因子那么数值可以表示的误差太大。如果每32个数字都用16bit的缩放因子和最小值那么不如K-Quant方法更节约空间。各种方式的空间举例如下256个FP16 256*16 4096 bits每32个数字都用16bit的缩放因子和最小值 2564 816*2 1280 bitsK-Quant方法 2564 862 162 1152 bits以K-Quant方法量化的格式命名叫做QX_K其中X表示单个参数存储的位数例如Q2_K, Q4_K等等。QX_K后面还能加后缀可以将模型按照重要程度使用不同的位数存储例如使用Q6或者Q8存储即混合精度_S 例如Q4_K_S 只对极少数最关键参数使用更高精度_M 例如Q4_K_M 更多参数使用更高精度_L 例如Q4_K_L 绝大多数层都使用更高精度新硬件精度前面讲的K-Quant方法是使用CPU/GPU进行解析并没有在硬件层面上做特殊支持。但有一些量化精度格式可以直接提供给专门的硬件指令集处理这样节约存储空间的同时计算效率也更高。但这种方式需要较新的硬件支持才行。首先我们介绍BF16它与FP16的存储位数一致而是在内部结构上有区别。FP16的指数位更大与FP32相同相应的缩小了尾数位这样数值表示的精细程度差但是表示的数字范围更多与FP32相同。这样对于大模型训练时防止溢出更方便。两者的区别如下​图片来源于网络通过图中可以看到BF16就是FP32截断了16位尾数部分。BF16和下面的其它精度格式在较新的硬件中可以直接使用硬件电路计算比程序处理要快得多。图中还提到了FP8这也是一种需要硬件支持的格式它使用8位即可表示完整一个浮点数。FP8有E5M2和E4M3两种除了固定的符号位不变外分别为5位指数2位小数和4位指数3位小数。FP8虽然精度不高但胜在节约空间。还有两种硬件相关的精度格式MXFP8和MXFP4。MXFP8还是使用FP8作为每个参数存储同时32个参数为一组共享一个8位的缩放因子。MXFP4只有4位1位符号2位指数1位尾数。还有32个元素共享同一个8位的指数。这两个格式可以将一组数据直接提供给支持的硬件计算因此计算速度更快。精度转换和torchao量化mmap使用transformers加载的模型在加载前后可以修改模型精度我们通过观察电脑对应进程消耗的空间即可直观感受到模型占用内存的大小。由于我目前的电脑是Windows且无显卡因此模型是在电脑内存中运行通过资源管理器直接查看对应Python进程消耗的空间即可例如下图。​首先我们将前面的代码重新运行发现内存使用量为371MB。要知道模型参数量为0.6B我们以模型发布时的原始精度BF16直接运行的为何内存占用只有这么少呢因为读取大模型文件时使用的是mmap这是一种由操作系统提供的虚拟内存地址技术。当大模型加载时并不直接将模型数据加载到内存中而是对硬盘中的模型数据进行映射提供给程序虚拟的内存地址。当大模型和用户对话时如果读到了存储在硬盘中的部分操作系统会将这部分数据直接加载到内存中后面再次读取同样的数据就不需要从硬盘中读取了。因此我们尝试和大模型对话时可以在资源管理器看到内存明显上涨硬盘也有较多读取量CPU计算量也有突变。因此这371MB完全不能表示模型真正在内存中占用的大小。mmap技术是由操作系统提供Python封装调用APItransformers中的safetensors包实际使用的。from_pretrained方法没有直接提供关闭mmap的方式因此我们读取大模型之后将大模型数据全部加载一遍放到内存中以此来感受大模型占用的空间大小。forpinmodel.parameters():p.datap.data.clone()在加载模型model后执行上述代码可以将参数全部放到内存中。对于Qwen3:0.6B默认的BF16格式此时使用的内存为1.5GB。因为除了模型之外还有Python本身模型框架等需要占用内存。转换运行精度transformers支持在模型加载前和加载后转换模型精度示例如下importtorch# 模型加载前转换精度modelAutoModelForCausalLM.from_pretrained(MODEL_DIR,torch_dtypetorch.bfloat16,device_mapauto,# 自动分配到可用设备GPU无则 CPU)# 模型加载后转换精度model.to(torch.float16)这种精度转换不叫作量化而且也只有几种选项可以选择。如果转换的精度与原精度不一致那么实际效果也是全部读取一遍参数到内存中就不需要前面的clone内存了。实测再clone一遍内存占用量会更大一点。不同选项值和对应的资源管理器内存如下auto等这里省略。从表格可以看到内存使用量与存储位数呈现明显的正相关关系。选项值精度格式实际存储位数资源管理器内存使用torch.bfloat16BF16161.5GBtorch.float16FP16161.5GBtorch.float32FP32322.6GBtorchao量化在模型加载前和加载后可以使用torchao对加载后的模型进行量化这里以INT8为例试一下。首先是在模型加载前就指定量化精度fromtransformersimportAutoModelForCausalLM,AutoTokenizer,TorchAoConfigfromtorchao.quantizationimportInt8WeightOnlyConfig,quantize_,PerGroup# 模型目录MODEL_DIR./Qwen3-0.6B# 加载分词器tokenizerAutoTokenizer.from_pretrained(MODEL_DIR)# 创建量化配置 granularity参数表示128个参数共享一个缩放因子quant_configInt8WeightOnlyConfig(granularityPerGroup(128))# 包装成transformers可识别的格式quantization_configTorchAoConfig(quant_typequant_config)# 加载模型modelAutoModelForCausalLM.from_pretrained(MODEL_DIR,torch_dtypeauto,device_mapauto,quantization_configquantization_config,# 指定量化配置)前面介绍过INT8是整数但使用时要通过共享的缩放因子转成浮点数运算。共享缩放因子的数量必须为模型向量维度可以整除的数字例如本模型必须被1024整除。虽然是INT8但只有线性层即模型结构中28层的参数被量化词嵌入是没有被量化的。使用这种方式运行的Qwen3:0.6B资源管理器内存消耗量为0.9GB。虽然内存小了但我实测推理速度更慢了因为运算时多了一个步骤INT8要先转为FP16再进行计算我也没有用GPU加速。使用这种方式量化的模型还可以直接保存成文件分词器和模型单独保存。保存后会在目录中生成model.safetensors以及其它几个配置文件。我们使用一开始的读取模型代码切换下目录即可成功运行模型。# 模型保存目录SAVE_MODEL_DIR./Qwen3-0.6B-int8# 保存量化模型model.save_pretrained(SAVE_MODEL_DIR)# 保存分词器tokenizer.save_pretrained(SAVE_MODEL_DIR)如果加载模型时没有量化还可以使用quantize_方法加载后再量化模型但这种方式量化后的模型无法保存为文件。fromtransformersimportAutoModelForCausalLM,AutoTokenizerfromtorchao.quantizationimportInt8WeightOnlyConfig,quantize_,PerGroupimportgc MODEL_DIR./Qwen3-0.6BtokenizerAutoTokenizer.from_pretrained(MODEL_DIR)modelAutoModelForCausalLM.from_pretrained(MODEL_DIR,torch_dtypeauto,device_mapauto,)# 创建量化配置quant_configInt8WeightOnlyConfig(granularityPerGroup(128))# 量化模型quantize_(model,quant_config)# 尝试清理内存gc.collect()这种先加载再量化的方式我感觉意义不大因为模型已经以较高精度加载进来了再进行量化既耗时又多耗费内存。实测量化完之后可能因为无用数据还没有被完全销毁内存占用量是2.2GB等我开始对话后才逐渐降到1GB多比加载前量化的方式多耗费了很多内存。由于我这里使用Intel的CPU运行因此仅支持INT8的格式INT4会报错。使用GPTQ/AWQ等量化方式一般在GPU上进行CPU效率较低且一些支持的工具已停止维护了因此这里不讨论了。GGUF量化生成GGUF文件与GGUF格式和K-Quant方法绑定的大模型框架叫做llama.cpp这是一个C编写的高性能大模型推理框架前面介绍的Ollama就是基于它开发的。注意一般只用作推理训练还是使用transformers。它有直接通过命令行终端使用的工具也适配了各种编程语言使用。使用前面下载的模型文件量化为GGUF需要两步第一步是将safetensors格式转换为GGUF第二步才是量化。这里首先描述第一步。格式转换工具在llama.cpp的GitHub上我们首先需要clone项目然后安装依赖再执行转换。# clone llama.cpp项目gitclone https://github.com/ggml-org/llama.cpp# 创建Python局部虚拟环境到python-llama-venv文件夹避免安装包污染全局python-mvenv python-llama-venv# 激活局部虚拟环境python-llama-venv\Scripts\activate# 安装依赖pipinstall-rrequirements\requirements-convert_hf_to_gguf.txt下载后需要按照requirements文件安装依赖。它的依赖版本条件写的比较严格如果直接安装会将全局Python安装包给覆盖掉因此先使用venv创建了一个虚拟环境这样安装的依赖包只影响局部。虽然版本条件严格但可能是为了非常多模型的兼容性。我这里实测不完全遵守版本也能成功转换。安装完成后执行llama代码中的python脚本即可完成转换# outfile 表示输出文件python convert_hf_to_gguf.py E:\llm\Qwen3-0.6B--outfileE:\llm\Qwen3-0.6B-model.gguf需要在创建的venv虚拟环境中执行。注意这里输出的仅有单个gguf文件这个文件中包含所有参数词表对话模板配置文件等一个模型文件即可实现模型的分发。默认输出的精度为BF16因此模型文件大小为1.5GB。​如何使用这个模型呢GGUF格式可以被前面介绍过的Ollama识别因此这里我们用Ollama尝试部署模型。首先创建一个文件名称为Modelfile没有扩展名内容是GGUF的模型文件完整路径FROM E:\llm\Qwen3-0.6B-model.gguf然后执行命令行即可在Ollama部署该模型。注意Ollama会将这个模型复制到它的存储目录后续就不会使用我们这个路径下的模型文件了。# 导入模型ollama create Qwen3-0.6B-GGUF# 运行模型ollama run Qwen3-0.6B-GGUF​llama运行GGUF这里我们类似前面的transformers使用llama.cpp提供的Python工具llama-cpp-python来运行模型。如果使用纯CPU可以使用这个指令安装pipinstallllama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu安装之后执行下面的代码即可运行模型实现多轮对话。代码与transformers的方式类似但是省略了加载分词器的部分。fromllama_cppimportLlama MODEL_PATH./Qwen3-0.6B-model.gguf# 模型文件路径# 加载模型llmLlama(model_pathMODEL_PATH,n_ctx4096,# 上下文大小n_threads8,# 指定 CPU 线程数verboseFalse,# 不打印详细日志)# 保存对话历史messages[]whileTrue:user_inputinput(你: ).strip()ifuser_input.strip()exit:break# 将用户输入加入历史messages.append({role:user,content:user_input})# 调用模型拿到回答outputsllm.create_chat_completion(messagesmessages,max_tokens512,)responseoutputs[choices][0][message][content].strip()# 将助手回复加入历史messages.append({role:assistant,content:response})print(f模型:{response}\n)虽然同样都是BF16的模型但使用llama-cpp-python加载模型实测比transformers快多了。这是因为llama.cpp专为部署模型设计且针对CPU部署做了优化。而transformers多半用于训练场景。模型返回的output是一个嵌套的字典结构包含信息如下{id:chatcmpl-a4f95093-43f1-4033-baef-3ca6081ca213,// 标识符object:chat.completion,// 对象类型created:1788191746,// 创建时的时间戳model:./Qwen3-0.6B-model.gguf,// 使用的模型名称choices:[// 模型生成的回复列表一般只有一个{index:0,// 在列表中的索引message:{role:assistant,// 角色模型固定为 assistantcontent:// 回复文本think\n 省略... \n/think\n\n你好有什么可以帮助你的吗需要帮忙吗,},logprobs:None,finish_reason:stop,// 生成结束的原因},],usage:{// 统计本次请求消耗的 Token 数量prompt_tokens:9,// 输入提示词消耗的 Token 数completion_tokens:112,// 输出回复消耗的 Token 数total_tokens:121// 两者总和},}同样的运行模型也默认开启了mmap这样内存中是看不出来模型真正的运行占用内存大小的。好在llama-cpp-python可以直接配置关闭mmap。关闭后运行模型查看内存使用量为1.9GB。llmLlama(model_pathMODEL_PATH,n_ctx4096,n_threads8,verboseFalse,use_mmapFalse# 关闭mmap)量化Q8Q4Q2使用llama-cpp-python包无法量化模型这里我们直接下载预编译好的可执行文件来量化地址在 https://github.com/ggml-org/llama.cpp/releases 。根据我的电脑类型选择了Windows x64 (CPU)。下载后解压到目录中执行命令行然后等待一段时间就输出新的模型文件了。# llama-quantize量化工具 输入模型 输出模型 量化精度.\llama-quantize.exe E:\llm\Qwen3-0.6B-model.gguf E:\llm\Qwen3-0.6B-q8-model.gguf Q8_0这里可以使用GGUF的多种量化类型我们尝试了多种不同精度的模型并查看加载后的内存使用量量化精度位数模型文件大小实际运行内存BF16(转换后未量化)16位1.4GB1.9GBQ8_08位767MB1.29GBQ4_K_M4位为主461MB980MBQ2_K2位331MB850MB我提问了几个简单问题实测Q4_K_M还是可以正常输出的但Q2_K的输出就只剩乱码根本不可用了。参考Ollamahttps://ollama.com/Ollama qwen3:0.6bhttps://ollama.com/library/qwen3:0.6bOllama文档 api/chathttps://docs.ollama.com/api/chatOllama文档 OpenAI compatibilityhttps://docs.ollama.com/api/openai-compatibility【AI】一文读懂大模型生态分类/参数/结构/训练/GPU/评测/排行/社区https://jzplp.github.io/2026/llm-stru.html魔搭社区https://www.modelscope.cn/GitHub llama.cpphttps://github.com/ggml-org/llama.cppGitHub llama.cpp releaseshttps://github.com/ggml-org/llama.cpp/releases
返回列表