一、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 <对话>
到这就结束了,恭喜你,全部完成了,撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。