deepseek本地部署

发布于:2025-09-06 ⋅ 阅读:(18) ⋅ 点赞:(0)

一、wsl安装

1.安装命令及出现的问题

因为deepseek部署至少要8G内存,使用VM虚拟机达不到最低内存的使用条件,会使运行速度降低, 所以我们在windows上安装WSL环境来部署deepseek。

WSL(Windows Subsystem for Linux) 是微软提供的一项功能,允许用户在 Windows 系统中 直接运行完整的 Linux 环境,无需虚拟机。

(1)使用wsl --install命令安装wsl

wsl --install

(2)执行wsl - l - v命令查看wsl版本

wsl -l -v

但出现问题:

(3)是没有安装ubuntu造成的,接下来执行命令

ubuntu

成功安装ubuntu,在安装过程中会让你输入用户名和密码。安装完成后自动进入ubuntu,按exit可以退出。

此时wsl -l -v命令也可以使用了,如图:

(另外,wsl.exe -d Ubuntu 可以自动进入WSL的ubuntu中)

出现了wsl的版本:

显示结果为WSL2,版本正确。

2.更改安装位置到其他盘

(后续新加的文件还是在C盘,但是该步骤会让你C盘空间多一些)

wsl默认安装在c盘,安装时无法修改,所以在安装后修改安装位置。

(1) 创建目标目录
打开 PowerShell,并运行(以管理员身份运行)以下命令来创建一个目录

mkdir D:\WSL\backup

(2)确认路径权限
确保你有权限在 D 盘上创建和写入文件。通过尝试在目标路径创建一个测试文件来确认权限:

echo "test" > D:\WSL\backup\test.txt

(3)导出当前的 WSL 发行版
运行以下命令来导出当前的 Ubuntu 发行版:

wsl --export Ubuntu D:\WSL\backup\Ubuntu.tar

这会将当前的 Ubuntu 发行版导出为一个 tar 文件。

(4)注销当前的 WSL 发行版
运行以下命令来注销当前的 Ubuntu 发行版:

wsl --unregister Ubuntu

(5)导入 WSL 发行版到新的位置
运行以下命令将导出的 Ubuntu 发行版导入到 D 盘的新位置:

wsl --import Ubuntu D:\WSL\Ubuntu D:\WSL\backup\Ubuntu.tar

这会将 Ubuntu 发行版重新安装到 D 盘的 D:\WSL\Ubuntu 目录中。

(6)验证安装
导入完成后,运行以下命令来验证安装是否成功:

wsl -l -v

你会看到之前的输出。

(7)启动 WSL
最后,启动 WSL:

wsl.exe -d Ubuntu

二、ollama安装

1更新软件源

打开windows命令提示符,输入wsl进入ubuntu。

输入指令 sudo apt-get update 等待软件源更新完成。

2.下载 ollama源码

Ollama 是一个开源的大型语言模型(LLM)平台,旨在让用户能够轻松地在本地运行、管理和与大型语言模型进行交互。 Ollama 提供了一个简单的方式来加载和使用各种预训练的语言模型,支持文本生成、翻译、代码编写、问答等多种自然语言处理任务。

(1)方法一: 在WSL中输入ollama官网复制的下载链接,进行下载。

curl -fsSL https://ollama.com/install.sh | sh

方法二: 使用已经下载好的压缩包,放在C盘的根目录下

(2)在WSL的ubuntu中输入 cd /mnt/c ,进入C盘的根目录

输入以下指令,解压压缩包(要自己手打)

sudo tar xvfz ollama-linux-amd64.tgz -C /

(3)解压后在WSL中运行 ollama 服务(手动打)

ollama serve

(这个界面可以先不用退出,因为接下来deepseek下载还要用到)

三、deepseek下载

考虑到电脑配置问题,本次使用 轻量级的DeepSeek-R1-1.5b版本

1.deepseek下载及注意细节

从官网复制的下载命令(要手动打)

ollama run deepseek-r1:1.5b

因为deepseek的下载需要ollama保持运行,因此再打开一个windows服务终端,用来输入下载指 令。此时windows要保证同时有2个服务终端同时运行。

放大图:

终端1:用来运行ollama

终端2:用来下载deepseek。

安装时间比较长, deepseek-r1:1.5b 大约有1.1GB。

2.输入对话

安装完成后,保证ollama开启的状态下,在deepseek所在的终端输入对话,可以得到回应。

退出时,在终端1上输入 ctrl + C 结束ollama服务, 在终端2上输入ctrl+D结束deepseek服务。

下次再运行时,先在终端1上开启ollama服务,然后在终端2上输入ollama run deepseek-r1:1.5b 运行deepseek。

四、网络测试

1.开启网卡监听

(1)在终端1上退出ollama服务,回到ubuntu,开启所有网卡监听。

#1、将命令写入脚本

echo 'export OLLAMA_HOST="0.0.0.0"' >> ~/.bashrc

echo 'export OLLAMA_ORIGINS="*"' >> ~/.bashrc

#2、重启脚本

source   ~/.bashrc

注意打空格,可以用上建得到前一条命令,就少打一些单词。

(2)在终端1上重启 ollama服务 

ollama serve

2.查看IP和curl测试

(3)查看IP

在终端2上退出 deepseek服务,回到ubuntu,安装网络服务。

sudo apt-get install net-tools

使用ifconfig 指令查看IP地址,此时可以看到IP地址是 172.31.51.30

(4)curl测试

将下文中的 172.26.1.100 替换成自己的IP地址,输入ubuntu终端,当返回结果为Ollama is running 时,表示测试成功。

curl http://172.26.1.100:11434/

curl http://127.0.0.1:11434/

ollama的测试接口主要参考以下文档:

API 参考文档 -- Ollama 中文文档|Ollama官方文档

五、测试deepseek

提问测试有两种,分别是 流式提问测试和非流式提问测试。

在流式提问测试中,数据是像水流一样连续、实时地进行传输和处理。提问者可以逐句或者逐词地输 入问题,系统也会即时对已接收到的部分内容进行处理并给出相应的反馈。例如,在一些智能语音助手 的实时交互场景中,用户一边说话,系统就一边开始分析和响应,而不需要等到用户把整个问题说完。

非流式提问测试要求将完整的问题一次性全部输入完成后,再统一提交给系统进行处理。系统接收到 完整的提问后,才开始进行分析和解答,并一次性给出最终的结果。就像在传统的网页搜索框中输入一 个完整的搜索问题,然后点击搜索按钮,等待系统返回搜索结果。  

1.流式提问测试

在终端2中输入以下内容

curl -X POST http://localhost:11434/api/generate 

-H "Content-Type: application/json" 

-d '{

"model": "deepseek-r1:1.5b",

"prompt": "你是谁?",

"stream": true

}'

2.非流式提问测试

curl -X POST http://localhost:11434/api/generate \

-H "Content-Type: application/json" \

-d '{

"model": "deepseek-r1:1.5b",

"prompt": "你是谁?",

"stream": false

}'

就"stream"不同,可以用上键了得到上个命令了,再修改一下。

六、C代码应用

1.安装Cjson库和gcc编译器

因为deepseek在传输数据时,采用json格式,所以先在终端2中输入以下指令,安装Cjson库。

sudo apt-get install libcjson-dev

sudo apt-get install gcc

中间会让你确定安装,打Y就好。

2.将测试代码放在c盘根目录下

修改测试代码中的第8行,将里面的内容修改为自己的IP地址。

测试代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 11434
#define SERVER_IP "172.31.51.30"
#define BUFFER_SIZE 4096 * 10

// argv[1] 就是外部参数
int main(int argc, char const *argv[])
{

    if (argc != 2)
    {
        printf("Usage: %s <prompt>\n", argv[0]);
        return 1;
    }

    int sock = 0;
    struct sockaddr_in serv_addr;
    char buffer[BUFFER_SIZE] = {0};

    // 创建 socket
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        printf("\n Socket creation error \n");
        return -1;
    }

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);

    // 将 IP 地址从字符串转换为二进制格式
    if (inet_pton(AF_INET, SERVER_IP, &serv_addr.sin_addr) <= 0)
    {
        printf("\nInvalid address/ Address not supported \n");
        return -1;
    }

    // 连接到服务器
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
    {
        printf("\nConnection Failed \n");
        return -1;
    }

    // 构造 HTTP 请求体(关闭流式响应)
    char request_body[1024] = {0};

    snprintf(request_body, 1024, "{\"model\": \"deepseek-r1:1.5b\", \"prompt\": \"%s\", \"stream\": false,\"include_context\": false}", argv[1]);

    // 请求头
    char request_headers[256] = {0};
    snprintf(request_headers, sizeof(request_headers),
             "POST /api/generate HTTP/1.1\r\n"
             "Host: 192.168.128.196:11434\r\n"
             "Content-Type: application/json\r\n"
             "Content-Length: %zu\r\n"
             "\r\n",
             strlen(request_body));

    // 请求协议
    char request[4096] = {0};
    snprintf(request, sizeof(request), "%s%s", request_headers, request_body);

    // 发送请求
    send(sock, request, strlen(request), 0);
    printf("Request sent:\n%s\n", request);

    while (1)
    {
        // 接收响应
        int valread = read(sock, buffer, BUFFER_SIZE);
        if (valread > 0)
        {
            printf("Response:\n%s\n", buffer);
        }
        else
        {
            printf("Failed to receive response.\n");
        }
    }

    // 关闭 socket
    close(sock);
    return 0;
}

将代码文件放在当前路径。

我的代码文件在这个位置

所以我使用下面的命令复制过去。

cp /mnt/e/deepseektest.c ./

WSL 会将 Windows 的磁盘映射到 /mnt/ 目录下,其中:

Windows 的 C 盘对应 /mnt/c/

Windows 的 D 盘对应 /mnt/d/

Windows 的 E 盘对应 /mnt/e/

看有没有成功复制过去。

ls -l deepseektest.c

3.编译时连接cjson库

gcc deepseektest.c -o deepseektest -lcjson

4.运行

运行时的格式如下:

./deepseektest   <对话>

到这就结束了,恭喜你,全部完成了,撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。


网站公告

今日签到

点亮在社区的每一天
去签到