\#从第⼀步骤到第四步骤是完成DeepSeek本地部署和使⽤,可以满⾜中⼩企业环境的稳定 使⽤,第五步骤为基于AnythingLLM和本地数据进⾏训练(基于本地数据搭建本地知识 库): ⼀:京东云GPU云主机环境准备 ⼆:部署Ollama 三:运⾏DeepSeek模型 四:图形客户端使⽤ #第五步骤可以不执⾏ 五:本地数据投喂
⼀:京东云GPU云主机环境准备:
DeepSeek的不同版本模型对主机硬件(主要是CPU、内存和GPU)的要求不⼀样,推荐使⽤拥有单独GPU的主机进⾏部署以获得更好的使⽤体验,显卡推荐使⽤如NVIDIA RTX 3090或同等以上规格的显卡,CPU需要⽀持AVX2、AVX-512等指令集可以进⼀步提⾼响应性能, 如已有符合业务需求的主机环境可以跳过当前的主机环境准备步骤。
1.1: 京东云创建GPU云主机:
基于实际业务需求选择云主机计费模式、地域、可⽤区、CPU架构、系统镜像及系统版本, 企业环境对于稳定性要求⽐较⾼通常使⽤Linux系统运⾏业务系统, 本步骤以Ubuntu 22.04 LTS系统版本为例(Rocky Linux及RHEL的操作步骤⼀致)、GPU为vidia Tesla P40, 演示基于Ollama部署DeepSeek-R1 :
选择GPU实例规格类型,可选自动安装GPU驱动、或云主机运行成功后单独安装GPU驱动(本文档为单独安装GPU驱动)
自定义云盘类型及大小、然后下一步
自定义云主机网络、安全组、弹性公网IP, 安全组需要允许客户端访问11434端口, 然后下一步
自定义主机密码、主机名称等信息, 然后点击立即购买
勾选已阅读并同意并确认开通
创建完成:
然后在云主机控制台验证主机运行成功
1.2:安装GPU显卡驱动:
使⽤SSH⼯具远程连接到实例, 安装显卡驱动(以下为在Ubuntu 2204的显卡驱动安装过程)
root@deepseek-vm:~# apt update
root@deepseek-vm:~# ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:0a.0 ==
modalias : pci:v000010DEd00001B38sv000010DEsd000011D9bc03sc02i00
vendor : NVIDIA Corporation
model : GP102GL [Tesla P40]
driver : nvidia-driver-470-server - distro non-free
driver : nvidia-driver-450-server - distro non-free
driver : nvidia-driver-550 - distro non-free recommended
driver : nvidia-driver-535-server - distro non-free
driver : nvidia-driver-418-server - distro non-free
driver : nvidia-driver-545 - distro non-free
driver : nvidia-driver-470 - distro non-free
driver : nvidia-driver-535 - distro non-free
driver : nvidia-driver-390 - distro non-free
driver : xserver-xorg-video-nouveau - distro free builtin
root@deepseek-vm:~# apt install nvidia-driver-550 -y #通过ubuntu仓库安装推荐的驱动版本或使用其它方式安装显卡驱动
root@deepseek-vm:~# reboot #重启服务器以使显卡驱动生效
root@deepseek-vm:~# nvidia-smi #重启后验证驱动及显卡状态(当前演示主机为两块NVIDIA Tesla P40显卡)
Thu Feb 6 16:45:28 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.120 Driver Version: 550.120 CUDA Version: 12.4 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 Tesla P40 Off | 00000000:00:09.0 Off | 0 |
| N/A 24C P8 9W / 250W | 0MiB / 23040MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
| 1 Tesla P40 Off | 00000000:00:0A.0 Off | 0 |
| N/A 23C P8 9W / 250W | 0MiB / 23040MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| No running processes found |
+-----------------------------------------------------------------------------------------+
二:部署Ollama:
Ollama是一个开源的 LLM(large language model、大型语言模型)服务工具, 用于简化和降低在本地的部署和使用门槛, 可以快速在本地环境部署和管理LLM运行环境,。
官方地址:Ollama
下载地址:Download Ollama on macOS
ollama官方在linux 系统的安装是基于脚本从github下载安装包进行安装(https://ollama.com/install.sh、受网络环境因素安装过程不稳定)...
2.1:下载⼆进制安装包:
Ollama可以运⾏在Windows、Linux以及MacOS, 官⽅均提供对应的安装⽂件, ⽣产 环境对稳定性要求⽐较⾼因此会通常使⽤Linux系统, 本⽂的以Ubuntu 2204作为演 示环境:
https://myserver.s3.cn-north-1.jdcloud-oss.com/ollama-linuxam... #github下载地址
编辑
root\@deepseek-vm:\~# cd /usr/local/src/ root\@deepseek-vm:/usr/local/src# wget https://myserver.s3.cnnorth- 1.jdcloud-oss.com/ollama-linux-amd64.tgz
2.2: 部署ollama:
ollama/docs/linux.md at main · ollama/ollama · GitHub
root@deepseek-vm:/usr/local/src# tar -C /usr -xzf ollama-linux-amd64.tgz #解压安装文件
root@deepseek-vm:/usr/local/src# ollama serve 测试启动 Ollama
Couldn't find '/root/.ollama/id_ed25519'. Generating new private key.
Your new public key is:
ssh-ed25519 AAAA.....
2025/02/06 17:08:47 routes.go:1187: INFO server config env="map[CUDA_VISIBLE_DEVICES: GPU_DEVICE_ORDINAL: HIP_VISIBLE_DEVICES: HSA_OVERRIDE_GFX_VERSION: HTTPS_PROXY: HTTP_PROXY: NO_PROXY: OLLAMA_DEBUG:false OLLAMA_FLASH_ATTENTION:false OLLAMA_GPU_OVERHEAD:0 OLLAMA_HOST:http://127.0.0.1:11434 OLLAMA_INTEL_GPU:false OLLAMA_KEEP_ALIVE:5m0s OLLAMA_KV_CACHE_TYPE: OLLAMA_LLM_LIBRARY: OLLAMA_LOAD_TIMEOUT:5m0s OLLAMA_MAX_LOADED_MODELS:0 OLLAMA_MAX_QUEUE:512 OLLAMA_MODELS:/root/.ollama/models OLLAMA_MULTIUSER_CACHE:false OLLAMA_NOHISTORY:false OLLAMA_NOPRUNE:false OLLAMA_NUM_PARALLEL:0 OLLAMA_ORIGINS:[http://localhost https://localhost http://localhost:* https://localhost:* http://127.0.0.1 https://127.0.0.1 http://127.0.0.1:* https://127.0.0.1:* http://0.0.0.0 https://0.0.0.0 http://0.0.0.0:* https://0.0.0.0:* app://* file://* tauri://* vscode-webview://*] OLLAMA_SCHED_SPREAD:false ROCR_VISIBLE_DEVICES: http_proxy: https_proxy: no_proxy:]"
time=2025-02-06T17:08:47.465+08:00 level=INFO source=images.go:432 msg="total blobs: 0"
time=2025-02-06T17:08:47.465+08:00 level=INFO source=images.go:439 msg="total unused blobs removed: 0"
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] POST /api/pull --> github.com/ollama/ollama/server.(*Server).PullHandler-fm (5 handlers)
[GIN-debug] POST /api/generate --> github.com/ollama/ollama/server.(*Server).GenerateHandler-fm (5 handlers)
[GIN-debug] POST /api/chat --> github.com/ollama/ollama/server.(*Server).ChatHandler-fm (5 handlers)
[GIN-debug] POST /api/embed --> github.com/ollama/ollama/server.(*Server).EmbedHandler-fm (5 handlers)
[GIN-debug] POST /api/embeddings --> github.com/ollama/ollama/server.(*Server).EmbeddingsHandler-fm (5 handlers)
[GIN-debug] POST /api/create --> github.com/ollama/ollama/server.(*Server).CreateHandler-fm (5 handlers)
[GIN-debug] POST /api/push --> github.com/ollama/ollama/server.(*Server).PushHandler-fm (5 handlers)
[GIN-debug] POST /api/copy --> github.com/ollama/ollama/server.(*Server).CopyHandler-fm (5 handlers)
[GIN-debug] DELETE /api/delete --> github.com/ollama/ollama/server.(*Server).DeleteHandler-fm (5 handlers)
[GIN-debug] POST /api/show --> github.com/ollama/ollama/server.(*Server).ShowHandler-fm (5 handlers)
[GIN-debug] POST /api/blobs/:digest --> github.com/ollama/ollama/server.(*Server).CreateBlobHandler-fm (5 handlers)
[GIN-debug] HEAD /api/blobs/:digest --> github.com/ollama/ollama/server.(*Server).HeadBlobHandler-fm (5 handlers)
[GIN-debug] GET /api/ps --> github.com/ollama/ollama/server.(*Server).PsHandler-fm (5 handlers)
[GIN-debug] POST /v1/chat/completions --> github.com/ollama/ollama/server.(*Server).ChatHandler-fm (6 handlers)
[GIN-debug] POST /v1/completions --> github.com/ollama/ollama/server.(*Server).GenerateHandler-fm (6 handlers)
[GIN-debug] POST /v1/embeddings --> github.com/ollama/ollama/server.(*Server).EmbedHandler-fm (6 handlers)
[GIN-debug] GET /v1/models --> github.com/ollama/ollama/server.(*Server).ListHandler-fm (6 handlers)
[GIN-debug] GET /v1/models/:model --> github.com/ollama/ollama/server.(*Server).ShowHandler-fm (6 handlers)
[GIN-debug] GET / --> github.com/ollama/ollama/server.(*Server).GenerateRoutes.func1 (5 handlers)
[GIN-debug] GET /api/tags --> github.com/ollama/ollama/server.(*Server).ListHandler-fm (5 handlers)
[GIN-debug] GET /api/version --> github.com/ollama/ollama/server.(*Server).GenerateRoutes.func2 (5 handlers)
[GIN-debug] HEAD / --> github.com/ollama/ollama/server.(*Server).GenerateRoutes.func1 (5 handlers)
[GIN-debug] HEAD /api/tags --> github.com/ollama/ollama/server.(*Server).ListHandler-fm (5 handlers)
[GIN-debug] HEAD /api/version --> github.com/ollama/ollama/server.(*Server).GenerateRoutes.func2 (5 handlers)
time=2025-02-06T17:08:47.466+08:00 level=INFO source=routes.go:1238 msg="Listening on 127.0.0.1:11434 (version 0.5.7)"
time=2025-02-06T17:08:47.466+08:00 level=INFO source=routes.go:1267 msg="Dynamic LLM libraries" runners="[cpu cpu_avx cpu_avx2 cuda_v11_avx cuda_v12_avx rocm_avx]"
time=2025-02-06T17:08:47.466+08:00 level=INFO source=gpu.go:226 msg="looking for compatible GPUs"
time=2025-02-06T17:08:48.193+08:00 level=INFO source=types.go:131 msg="inference compute" id=GPU-a9100a2b-3c31-b1b4-0891-c11584b5a57f library=cuda variant=v12 compute=6.1 driver=12.4 name="Tesla P40" total="22.4 GiB" available="22.2 GiB"
time=2025-02-06T17:08:48.193+08:00 level=INFO source=types.go:131 msg="inference compute" id=GPU-d652ebd4-0571-78b9-bf01-9a8d1da592e5 library=cuda variant=v12 compute=6.1 driver=12.4 name="Tesla P40" total="22.4 GiB" available="22.2 GiB"
2.3:验证Ollama是否正在运行:
新建另外⼀个终端、验证Ollama是否正在运⾏: root\@deepseek-vm:\~# ollama -v ollama version is 0.5.7
2.4:添加 Ollama 作为启动服务:
新建账户和组、名称都叫ollama, 以普通账户的身份运⾏Ollama服务、并指定监听在 0.0.0.0:11434,以⽅便外部客户端访问。
root@deepseek-vm:~# useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama
root@deepseek-vm:~# usermod -a -G ollama root
创建/etc/systemd/system/ollama.service 启动文件:
root@deepseek-vm:~# vim /etc/systemd/system/ollama.service
[Unit]
Description=Ollama Service
After=network-online.target
[Service]
ExecStart=/usr/bin/ollama serve
Environment="OLLAMA_HOST=0.0.0.0:11434"
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=$PATH"
[Install]
WantedBy=default.target
#Ctrl+C退出2.3步骤运行的ollama服务、并通过service文件启动服务:
root@deepseek-vm:~# systemctl daemon-reload
root@deepseek-vm:~# systemctl enable ollama
Created symlink /etc/systemd/system/default.target.wants/ollama.service → /etc/systemd/system/ollama.service.
root@deepseek-vm:~# systemctl start ollama.service #启动ollama服务
root@deepseek-vm:~# systemctl status ollama.service #确认ollama服务处于运行状态
● ollama.service - Ollama Service
Loaded: loaded (/etc/systemd/system/ollama.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2025-02-06 17:13:32 CST; 12min ago
Main PID: 6871 (ollama)
Tasks: 20 (limit: 132577)
Memory: 980.6M
CPU: 8.662s
CGroup: /system.slice/ollama.service
└─6871 /usr/bin/ollama serve
Feb 06 17:20:05 deepseek-vm ollama[6871]: time=2025-02-06T17:20:05.644+08:00 level=INFO sou>
Feb 06 17:23:01 deepseek-vm ollama[6871]: time=2025-02-06T17:23:01.005+08:00 level=INFO sou>
Feb 06 17:24:56 deepseek-vm ollama[6871]: time=2025-02-06T17:24:56.005+08:00 level=INFO sou>
Feb 06 17:25:16 deepseek-vm ollama[6871]: time=2025-02-06T17:25:16.005+08:00 level=INFO sou>
Feb 06 17:25:24 deepseek-vm ollama[6871]: time=2025-02-06T17:25:24.006+08:00 level=INFO sou
查看日志并确认无报错:
root\@deepseek-vm:\~# journalctl -e -u ollama
验证ollama服务进程和端⼝, 11434为ollama的默认监听端⼝: root\@deepseek-vm:\~# netstat -tanlp
三:运行DeepSeek模型:
https://ollama.com/search #ollama可以部署不同类型的模型和版本
DeepSeek-R1在很多方面都已经达到或超越OpenAI-o1, 具体的模型版本可以根据实际业务需求进行安装, 本次为安装deepseek-r1:8b进行演示:
3.1:运行deepseek-r1:8b:
https://ollama.com/library/deepseek-r1 #官⽅⽂档
~~deepseek-r1:1.5b #需要在线下载1.1GB的数据,根据⽹络环境和服务端负载、⼤约
需要下载⼏分钟或更⻓时间
deepseek-r1:8b #需要在线下载4.9BG的数据,根据⽹络环境和服务端负载、⼤约
需要下载⼏⼗分钟或更⻓时间
root@deepseek-vm:~# ollama run deepseek-r1:1.5b #运⾏deepseekr1:
1.5b
root@deepseek-vm:~# ollama run deepseek-r1:8b #运⾏deepseekr1:
8b,本操作只⽤于说明不同版本的安装⽅式、可以不执⾏
根据模型的⼤⼩和⽹络环境,需要~~⼀定的下载时间,下载过程中如果⽹络中断或取消, 再
次执⾏⽀持断点续传。
deepseek-r1:1.5b下载中:
deepseek-r1:8b下载中:
下载完成后会直接进入命令行交互式窗口,可以通过命令行窗口进行会话
3.2:对话验证:
3.2.1:提问一:
请认真回答一下, 到底有没有外星人?
3.2.2:提问二:
介绍一下kubernetes的优缺点
四:图形客户端使用:
可以使用不同的图形客户端连接DeepSeek进行交互式使用,如Chatbox、LobeChat等, 本步骤以Chatbox为例
4.1:Windows环境Chatbox图形客户端:
Chatbox是一个通用的图形客户端,支持在MacOS、Windows、Linux、安卓手机、苹果手机等系统环境安装和使用, 只需要安装在需要访问DeepSeek的主机、并配置连接DeepSeek连接地址及模型版本即可, 甚至还可以直接启动网页版, 本步骤演示如何在windows系统安装和使用Chatbox, 本步骤介绍如果在Windows系统安装Chatbox及配置和使用过程。
https://chatboxai.app/zh#download#官方下载URLhttps://chatboxa... #安装文件下载地址
4.1.1:下载安装文件:
点击免费下载:
下载过程中:
下载完成:
4.1.2:安装Chatbox:
在下载目录双击安装文件执行安装:
可选择为当前用户还是所有用户安装、然后点击下一步:
可选安装路径、然后单机安装:
安装过程中:
安装完成, 点击完成并运行Chatbox:
4.1.3:配置Chatbox:
首次打开要配置一下使用的模型, 选择使用自己的API Key或模型:
选择使用Ollama API:
具体配置:
上下文消息数(保存的历史会话数量)可以不限制、然后点击保存:
4.1.4:对话测试:
Chatbox可以通过DeepSeek进行成功对话
4.1.4.1:提问一:
请认真回答一下, 到底有没有外星人?
4.1.4.2:提问二:
介绍一下kubernetes项目,包括几个主要的组件和功能?
4.1.4.3:提问三:
一个笼子里面有三只兔子和两只鸭,后来逃走了一只兔子,请回答以下两个问题:
1.在兔子逃走之前,笼子里一共有几条腿?
2.在一只兔子逃走之后,笼子里一共还有几条腿?
4.1.5:如果要切换模型版本:
如果在同一个DeepSeek服务器部署了不同版本的模型,可以在Chatbox右下角进行不同版本的切换
4.2:MacOS环境Chatbox图形客户端:
本步骤介绍如果在MacOS系统安装Chatbox及配置和使用过程
4.2.1:下载安装文件:
苹果系统(Intel CPU)下载的Chatbox.CE-0.10.4-mac.zip,如果是windows系统则是下载Chatbox.CE-0.10.4-Setup.exe
4.2.2:安装Chatbox:
苹果系统下载后解压, 会有个Chatbox CE程序:
可以拷贝到应用程序里面方便后期使用:
然后双击打开,首次打开需要信任:
进入系统菜单,设置-->隐私与安全性-->仍要打开:
确认仍要打开:
输入认证(密码或指纹认证)信息确认:
4.2.3:配置Chatbox:
首次使用需要配置Chatbox连接deepseek模型, 点击左侧菜单Settings:
Chatbox配置信息如下:
4.2.4:对话测试:
可选新建一个对话:
对话验证:
五:本地数据投喂:
基于AnythingLLM+DeepSeek进行数据投喂训练, 用于搭建本地离线知识库等场景, 本步骤是测试搭建本地知识库,非必须不需要执行。
https://github.com/Mintplex-Labs/anything-llm
5.1:下载并安装AnythingLLM:
5.2:AnythingLLM基础配置:
初始化AnythingLLM对接DeepSeek的配置
5.2.1:LLMPreference:
5.2.2:工作区对话设置:
将聊天模式从聊天改为查询, 将会根据本地上传和识别后的数据进行响应
更新保存配置:
5.2.3:配置embedder首选项为ollama:
5.2.4:代理配置:
5.2.5:工作区上传测试训练文档:
上传本地文档之前无法回答问题,因此要上传本地文档进行训练(支持PDF、Txt、Word、Excel、PPT等常见文档格式):
本地文档上传中:
本地文档上传完成:
选择指定的文档并移动到工作区:
保存并导入:
导入并识别中:
识别完成:
关闭窗口:
返回到对话窗口:
5.3:对话验证:
DeepSeek可以根据本地的知识内容进行匹配和回答
5.3.1:基于本地文档回答成功的:
5.3.2:本地没有的内容提问及对话:
经过多次提问、DeepSeek会尽可能使用本地文档内容进行回复
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。