基于ollama和CPU运行本地gguf量化模型

前言

本文先以Windows电脑运行为例,Linux同理
本案运行配置:
Win11/CPU i5/RAM 32G (实际运行使用约占用10G)

假设你已经下载好了需要的xxx.gguf模型文件,本案:
wizardcoder-python-13b-v1.0.Q5_K_M.gguf
下载地址:https://huggingface.co/TheBloke/WizardCoder-Python-13B-V1.0-GGUF

一、安装ollama

  1. ollama官方GitHub下载安装包:
    https://github.com/ollama/ollama/releases/tag/v0.1.31
    下载 OllamaSetup.exe 和 ollama-windows-amd64.exe
  2. 安装 OllamaSetup.exe,运行点击即可完成

二、创建ollama模型

在 wizardcoder-python-13b-v1.0.Q5_K_M.gguf 同目录下创建Modelfile.txt文件
本案模型地址:D:\develop\model\wizardcoder-python-13b\wizardcoder-python-13b-v1.0.Q5_K_M.gguf
创建文件:D:\develop\model\wizardcoder-python-13b\Modelfile.txt
Modelfile.txt 内容如下(仅一行)
FROM D:\develop\model\wizardcoder-python-13b\wizardcoder-python-13b-v1.0.Q5_K_M.gguf
进入ollama-windows-amd64.exe所在目录,命令行打开终端cmd
运行如下命令
ollama-windows-amd64.exe create wizardcoder-13b-Q5 -f D:\develop\model\wizardcoder-python-13b\Modelfile.txt
create 后面紧跟的一个参数是创建模型名称,可以自定义

三、运行模型

# 使用python3.10 清华源安装ollama
pip install ollama -i https://pypi.tuna.tsinghua.edu.cn/simple

python 代码如下

import ollama

stream = ollama.chat(
    model='wizardcoder-13b-Q5:latest',
    messages=[{'role': 'user', 'content': 'what is 1 plus 1. show me python code. \nresponse:'}],
    stream=True,
)

for chunk in stream:
  print(chunk['message']['content'], end='', flush=True)

在这里插入图片描述
流式输出结果如上图,运行时 RAM 大约增加 10G

下面也写一个非流式输出代码,供参考

import ollama

response = ollama.chat(model='wizardcoder-13b-Q5:latest', messages=[
  {
    'role': 'user',
    'content': 'what is 1 plus 1. show me python code. \nresponse:',
  },
])
print(response['message']['content'])

整体内容到这里就结束了,接下来就可以自己尝试各种量化模型,并再自己封装成API使用了

四、编写API
如果想做个API集成,接下来这里使用 flask 创建一个 API (假设你会安装和使用 flask),非最佳实践,仅供测试参考

pip install flask -i https://pypi.tuna.tsinghua.edu.cn/simple
import time

from flask import Flask, request, Response, stream_with_context, jsonify
import ollama

app = Flask(__name__)


def call_ollama(content):
    response = ollama.chat(
        model='wizardcoder-13b-Q5:latest',
        messages=[{'role': 'user', 'content': content}],
        stream=False,
    )
    return response


def generate(content):
    result = ollama.chat(
        model='wizardcoder-13b-Q5:latest',
        messages=[{'role': 'user', 'content': content}],
        stream=True,
    )
    for chunk in result:
        print(chunk['message']['content'], end='', flush=True)
        yield f"data: {chunk['message']['content']}\n\n"


@app.route('/chat', methods=['POST'])
def chat():
    data = request.get_json()
    if data is None or 'content' not in data:
        return jsonify({'error': 'Missing content field'}), 400
    content = data['content']
    stream = data.get('stream', False)
    if stream:
        # 创建流式响应对象
        return Response(generate(content=content), mimetype='text/event-stream')
    else:
        # 使用非流式输出
        response = call_ollama(content=content)
        return response


if __name__ == '__main__':
    app.run(debug=True)

在这里插入图片描述

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
基于编辑路径的版本差异量化模型是一种常用的文件版本控制和代码比较工具中的算法。它基于编辑距离(Levenshtein 距离)的概念,通过计算两个版本之间的编辑路径,来度量它们之间的差异量。 具体地,假设我们有两个版本 A 和 B,它们分别由字符序列 a 和 b 表示,长度分别为 m 和 n。我们可以将 A 转换为 B 的操作分为三种: 1. 插入操作(insertion):在 b 中插入一个字符,使得 b[i] = a[j],此时需要将 a[j+1:] 中的所有字符向后移动一个位置。 2. 删除操作(deletion):删除 b 中的一个字符,此时需要将 b[i+1:] 中的所有字符向前移动一个位置。 3. 替换操作(substitution):将 b 中的一个字符替换成 a 中的一个字符,此时不需要移动其他字符。 对于两个版本 A 和 B,它们之间的编辑路径是一个由一系列插入、删除和替换操作构成的序列,使得将 A 转换为 B 的总操作数最小。这个序列可以通过动态规划的方法来计算,具体地,设 dp[i][j] 表示将 a[0:i] 转换为 b[0:j] 的最小操作数,则有如下状态转移方程: 1. 当 a[i] == b[j] 时,dp[i][j] = dp[i-1][j-1]; 2. 当 a[i] != b[j] 时,dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1。 最终的编辑距离就是 dp[m][n],也就是将 A 转换为 B 的最小操作数。通过分析编辑路径,我们可以得到两个版本之间的差异信息,进而量化它们之间的差异量。例如,替换操作可以看作是一个删除操作和一个插入操作的组合,因此我们可以把它们看作是两个操作,然后统计插入、删除和替换操作的数量,来度量两个版本之间的差异量。 需要注意的是,编辑距离和编辑路径的计算复杂度为 O(mn),因此对于大型文件或代码库来说,可能需要采用一些优化方法来提高效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gallonyin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值