DeepSeek本地部署

DeepSeek可以在网页端使用,但是有些时候可能不是很稳定,除了网页端,也能通过本地部署来使用。

一、Ollama本地安装Deepseek R1 模型

Ollama官网:https://ollama.com/,打开官网,然后点击下载,之后安装到本地。但默认从github下载比较慢,可以用这个github加速: https://ghfast.top/
打开网页并输入如下下载链接:https://github.com/ollama/ollama/releases/latest/download/OllamaSetup.exe

然后点击下载按钮,之后安装exe文件到本地,Ollama的大模型默认下到C盘,对空间占用比较大确保C盘空间够大。
如何更改?见后面附录描述。

安装界面

官方建议:应该至少有 8 GB 可用 RAM 来运行 7 B 型号,16 GB 来运行 13 B 型号,32 GB 来运行 33 B 型号。

然后打开Ollama 的模型列表,搜索到DeepSeek R1,
https://ollama.com/library/deepseek-r1

像我们普通的电脑安装1.5B、7B就可以使用,然后在【右上角的的代码】复制在命令行中运行。


输入【ollama list】,就可以查看安装的模型。

ollama run deepseek-r1:1.5b启动模型,run后面的参数是上图的模型名称。第一次运行会下载相关的镜像文件。


安装需要一段时间,我们等一下就可以等success,就代表安装成功。

第二次运行无需下载过程,直接进入命令行交互页面。

测试一下问答效果:


API方式调用DeepSeek:
curl http://localhost:11434/api/generate -d "{\"model\":\"deepseek-r1:1.5b\", \"prompt\":\"介绍一下大模型在2025年有哪些亮点?\", \"stream\": false}"

接口请求支持 stream 模式,上边这个请求响应 10s 左右,如果使用 stream 模式,体验会更好。
curl http://localhost:11434/api/generate -d "{\"model\":\"deepseek-r1:1.5b\", \"prompt\":\"介绍一下大模型在2025年有哪些亮点?\", \"stream\": true}"

二、其他命令

ollama serve Start ollama
运行之后,访问 localhost:11434,查看Ollama是否正常运行:

ollama show deepseek-r1:1.5b Show information for a model

ollama ps List running models

ollama stop Stop a running model

三、Ollama运行本地模型

Ollama 通常支持 GGUF 等格式的模型,而 .pt 文件一般是 PyTorch 保存的模型文件,不能直接被 Ollama 使用。若要使用 Ollama 与本地 .pt 模型进行交互,需要将 .pt 模型转换为 Ollama 支持的格式。

    import torch

    # 加载 .pt 模型
    try:
        # 设置 weights_only=True 来加载模型权重
        model_pt = torch.load('GuoPT.pt', weights_only=True)
    except Exception as e:
        print(f"加载模型时出现错误: {e}")

    # 这里需要根据具体模型架构和 GGUF 格式要求进行处理
    # 例如,提取模型的权重、偏置等参数,并按照 GGUF 格式进行存储
    # 由于 GGUF 格式较为复杂,具体实现需要参考相关文档和规范

    # 保存转换后的模型
    # 这里只是示例,实际保存为 GGUF 格式需要更详细的处理
    torch.save(model_pt, 'converted_model.gguf')

得到转换后的模型文件。


3.1 将转换后的模型添加到 Ollama

转换完成后,将转换后的 GGUF 模型添加到 Ollama 中。在终端中输入以下命令启动 Ollama 服务:

ollama serve

创建Modelfile文件:
在你的工作目录中创建一个名为Modelfile的文本文件(扩展名可以省略)。在文件中写入一句话,指定GGUF模型文件的路径。例如:FROM ./path/to/your-model.gguf
创建Ollama模型:打开终端或命令行界面,运行以下命令来创建Ollama模型:
ollama create my_llama_model -f Modelfile
其中,my_llama_model是你为模型指定的名称,-f选项后面跟的是Modelfile文件的路径。

检查模型是否创建成功:运行以下命令来检查Ollama中是否已包含你创建的模型:
ollama list
你应该能在列表中看到你的模型名称。
运行模型:一旦模型创建成功,你就可以使用以下命令来运行它:
ollama run my_llama_model
此时,Ollama将加载你指定的GGUF模型文件,并运行该模型。

3.2 使用 Ollama 与模型进行交互
3.2.1 命令行交互

添加模型成功后,在终端中使用 ollama run 命令与模型进行交互:

ollama run my_converted_model

输入问题后,按下回车键,模型会生成相应的回答。若要结束交互,按下 Ctrl + C

3.2.2 API 交互

也可以通过 API 的方式与模型进行交互,以下是一个 Python 示例:

import requests

url = "http://localhost:11434/api/generate"
data = {
    "model": "my_converted_model",
    "prompt": "请介绍一下人工智能",
    "stream": False
}

response = requests.post(url, json=data)
if response.status_code == 200:
    result = response.json()
    print(result["response"])
else:
    print(f"请求失败,状态码: {response.status_code}")
3.2.3 Web页面交互

Ollama有个开源的WebUI,但是需要安装Node.js、Docker等。索性自己写了一个轻量级的前端页面与DeepSeek R1交互(实质是与Ollama的API进行交互,API的入参指定模型名称)。
如果页面直接请求http://localhost:11434/api/generate会有跨域问题,后端会拒绝页面请求。由于我们无法修改Ollama的代码,结合上面我们通过Python代码调用正常,我们用Python写个代理服务器,让页面请求代理(下述代码执行了CORS(app) # 允许所有来源的跨域请求),代理再请求后端API。

使用 Flask 包装 Ollama 的 API,代理服务器文件名:OllamaProxy.py,具体代码:

from flask import Flask, request, jsonify
from flask_cors import CORS
import requests

app = Flask(__name__)
CORS(app)  # 允许所有来源的跨域请求

@app.route('/api/generate', methods=['POST'])
def generate():
    data = request.get_json()
    url = "http://localhost:11434/api/generate"
    response = requests.post(url, json=data)
    if response.status_code == 200:
        result = response.json()
        return jsonify(result)
    else:
        return jsonify({"error": f"请求失败,状态码: {response.status_code}"}), response.status_code

if __name__ == '__main__':
    app.run(host='localhost', port=5000)  # 可以选择不同的端口

启动代理服务器:python OllamaProxy.py

成功启动后的代理服务

JS代码:

// 获取 DOM 元素
const chatContainer = document.getElementById('chat-container');
const userInput = document.getElementById('user-input');
const sendButton = document.getElementById('send-button');

// 发送消息的函数
function sendMessage() {
    const message = userInput.value.trim();
    if (message === '') return;

    // 显示用户输入的消息
    displayMessage(message, 'user');

    // 清空输入框
    userInput.value = '';

    // 构建请求数据
    const data = {
        model: "deepseek-r1:7b",
        prompt: message,
        stream: false
    };

    // 发送 POST 请求到后端 API
    fetch("http://localhost:5000/api/generate", {
        method: 'POST',
        // mode: 'no-cors',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(data)
    })
      .then(response => {
            if (!response.ok) {
                throw new Error(`请求失败,状态码: ${response.statusCode}`);
            }
            return response.json();
        })
      .then(result => {
            // 显示大模型的响应消息
            displayMessage(result.response, 'bot');
        })
      .catch(error => {
            // 显示错误消息
            displayMessage(error.message, 'bot');
        });
}

// 显示消息的函数
function displayMessage(message, sender) {
    const messageElement = document.createElement('div');
    messageElement.classList.add(`${sender}-message`);
    messageElement.textContent = message;
    chatContainer.appendChild(messageElement);
    // 滚动到最新消息
    chatContainer.scrollTop = chatContainer.scrollHeight;
}

// 为发送按钮添加点击事件监听器
sendButton.addEventListener('click', sendMessage);

// 为输入框添加按键事件监听器,当按下回车键时发送消息
userInput.addEventListener('keydown', function (event) {
    if (event.key === 'Enter') {
        sendMessage();
    }
});

Html代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>大模型交互界面</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 20px;
        }

        #chat-container {
            width: 400px;
            border: 1px solid #ccc;
            border-radius: 5px;
            padding: 10px;
            margin-bottom: 20px;
            max-height: 400px;
            overflow-y: auto;
        }

        #input-container {
            display: flex;
            width: 400px;
        }

        #user-input {
            flex: 1;
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 5px 0 0 5px;
        }

        #send-button {
            padding: 10px 20px;
            background-color: #007BFF;
            color: white;
            border: none;
            border-radius: 0 5px 5px 0;
            cursor: pointer;
        }

        #send-button:hover {
            background-color: #0056b3;
        }

        .user-message {
            background-color: #e0f7fa;
            padding: 8px;
            margin: 5px 0;
            border-radius: 5px;
            text-align: right;
        }

        .bot-message {
            background-color: #f1f8e9;
            padding: 8px;
            margin: 5px 0;
            border-radius: 5px;
            text-align: left;
        }
    </style>
</head>

<body>
    <div id="chat-container">
        <!-- 聊天消息将显示在这里 -->
    </div>
    <div id="input-container">
        <input type="text" id="user-input" placeholder="输入你的问题">
        <button id="send-button">发送</button>
    </div>
    <script src="script.js"></script>
</body>

</html>

js和html文件在同一目录,结构如下:



使用浏览器打开本地的index.html页面进行交互。


四、附录

在 Ollama 中,你可以通过设置环境变量来修改模型的下载位置。以下是详细的步骤和示例:

步骤

  1. 关闭正在运行的 Ollama 服务:在修改模型下载位置之前,需要先确保 Ollama 服务没有在运行,避免出现冲突。

  2. 设置环境变量:通过设置 OLLAMA_MODELS 环境变量来指定模型的下载位置。不同的操作系统设置环境变量的方法有所不同,下面分别介绍。

在 Linux 或 macOS 系统上

你可以通过以下几种方式设置环境变量:

临时设置(当前终端会话有效)
打开终端,输入以下命令,将 /new/path/to/models 替换为你想要的模型存储路径:

export OLLAMA_MODELS=/new/path/to/models

然后启动 Ollama 服务:

ollama serve

在这个终端会话中,Ollama 会将模型下载到你指定的新路径。

永久设置
如果你希望每次启动系统时都自动设置该环境变量,可以将设置命令添加到 shell 的配置文件中。例如,对于大多数 Linux 用户和 macOS 用户,如果你使用的是 Bash shell,可以编辑 ~/.bashrc 文件;如果你使用的是 Zsh shell,可以编辑 ~/.zshrc 文件。

echo 'export OLLAMA_MODELS=/new/path/to/models' >> ~/.bashrc  # 对于 Bash
# 或者
echo 'export OLLAMA_MODELS=/new/path/to/models' >> ~/.zshrc  # 对于 Zsh

然后使配置文件生效:

source ~/.bashrc  # 对于 Bash
# 或者
source ~/.zshrc  # 对于 Zsh

最后启动 Ollama 服务:

ollama serve

在 Windows 系统上

临时设置(当前命令提示符会话有效)
打开命令提示符,输入以下命令,将 C:\new\path\to\models 替换为你想要的模型存储路径:

set OLLAMA_MODELS=C:\new\path\to\models

然后启动 Ollama 服务:

ollama serve

永久设置
你可以通过系统的环境变量设置界面来永久设置 OLLAMA_MODELS 环境变量。步骤如下:

  1. 右键点击“此电脑”,选择“属性”。
  2. 点击“高级系统设置”。
  3. 在“系统属性”窗口中,点击“环境变量”按钮。
  4. 在“系统变量”部分,点击“新建”。
  5. 在“变量名”输入框中输入 OLLAMA_MODELS,在“变量值”输入框中输入你想要的模型存储路径,例如 C:\new\path\to\models
  6. 点击“确定”保存设置。
  7. 重新打开命令提示符,启动 Ollama 服务:
ollama serve
  1. 下载模型:设置好环境变量并启动 Ollama 服务后,当你使用 ollama pull 命令下载模型时,模型将被下载到你指定的新位置。例如:
ollama pull llama2

通过以上步骤,你就可以成功修改 Ollama 下载模型的位置。


下载后的模型在新的D盘目录下
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容