前言

之前已经在Linux服务器上使用Ollama部署了DeepSeek

这次在没有外网(应该说是被限制比较多)的服务器上部署,遇到一些坑,记录一下

ollama

ollama 自然无法使用在线安装脚本了

根据 ollama 的文档

先在本地电脑根据服务器的系统和CPU架构下载安装包

curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linux-amd64.tgz

然后使用 scp 等工具上传到服务器

scp ollama-linux-amd64.tgz 服务器地址:/temp

连接到服务器上后解压安装,跟着 ollama 文档来就行(见第一个参考资料)

sudo tar -C /usr -xzf ollama-linux-amd64.tgz

这时候已经能执行 ollama 程序了

ollama serve

然后再添加到服务,这也是 ollama 官方推荐的做法,方便管理

sudo useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama
sudo usermod -a -G ollama $(whoami)

在 /etc/systemd/system 下新建 ollama.service 文件

[Unit]
Description=Ollama Service
After=network-online.target [Service]
ExecStart=/usr/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=$PATH" [Install]
WantedBy=default.target

然后启用服务

sudo systemctl daemon-reload
sudo systemctl enable ollama

到这里 ollama 的安装就搞定了

模型部署

离线服务器是无法使用 ollama pull 拉取模型的

需要先在本地下载,可以在本地的电脑上执行 ollama pull 的操作

然后把模型文件找到并上传到服务器

大概思路就是这样,具体的接下来介绍

找到本地模型文件

如果没有特别配置,ollama 默认的模型文件都在 ~/.ollama/models/blobs

先执行命令看看指定模型的路径,比如说要找 deepseek-r1:32b 模型

ollama show deepseek-r1:32b --modelfile

执行命令后的输出(节选)

FROM C:\Users\deali\.ollama\models\blobs\sha256-96c415656d377afbff962f6cdb2394ab092ccbcbaab4b82525bc4ca800fe8a49
TEMPLATE """{{- if .System }}{{ .System }}{{ end }}
{{- range $i, $_ := .Messages }}
{{- $last := eq (len (slice $.Messages $i)) 1}}
{{- if eq .Role "user" }}<|User|>{{ .Content }}
{{- else if eq .Role "assistant" }}<|Assistant|>{{ .Content }}{{- if not $last }}<|end▁of▁sentence|>{{- end }}
{{- end }}
{{- if and $last (ne .Role "assistant") }}<|Assistant|>{{- end }}
{{- end }}"""
PARAMETER stop <|begin▁of▁sentence|>
PARAMETER stop <|end▁of▁sentence|>
PARAMETER stop <|User|>
PARAMETER stop <|Assistant|>

可以看到这一行

FROM C:\Users\deali\.ollama\models\blobs\sha256-96c415656d377afbff962f6cdb2394ab092ccbcbaab4b82525bc4ca800fe8a49

就是 ollama 下载到本地的模型的路径

把这个文件上传到服务器

导出Modelfile

这个文件格式类似 Dockerfile

使用以下命令导出

ollama show deepseek-r1:32b --modelfile > Modelfile

然后这个文件也要上传到服务器上

服务器上导入模型

模型文件和 Modelfile 上传之后,放在同一个目录下

先重命名一下,方便后续导入

mv sha256-96c415656d377afbff962f6cdb2394ab092ccbcbaab4b82525bc4ca800fe8a49 deepseek-r1_32b.gguf

接着编辑一下 Modelfile 文件,把 FROM 这一行改成,也就是刚才修改之后的模型文件名称

FROM ./deepseek-r1_32b.gguf

然后执行以下命令导入

ollama create deepseek-r1:32b -f Modelfile

如无意外就导入成功了,可以执行 ollama list 来查看是否已导入。

one-api

One API 是一款开源的 LLM(大语言模型)API 管理与分发系统,旨在通过标准的 OpenAI API 格式,统一访问多种大模型,开箱即用。 它支持多种主流大模型,包括 OpenAI ChatGPT 系列、Anthropic Claude 系列、Google PaLM2/Gemini 系列、Mistral 系列、字节跳动豆包大模型、百度文心一言系列模型、阿里通义千问系列模型、讯飞星火认知大模型、智谱 ChatGLM 系列模型、腾讯混元大模型等。

docker部署

one-api是用go的gin框架开发的,部署很容易,我一般用docker部署,这块不再赘述

services:
db:
image: mysql:8.1.0
container_name: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: mysql-password
volumes:
- ./data:/var/lib/mysql
one-api:
image: justsong/one-api
container_name: one-api
restart: always
ports:
- "3000:3000"
depends:
- db
environment:
- SQL_DSN=root:mysql-password@tcp(db:3306)/one_api
- TZ=Asia/Shanghai
- TIKTOKEN_CACHE_DIR=/TIKTOKEN_CACHE_DIR
volumes:
- ./data:/data
- ./TIKTOKEN_CACHE_DIR:/TIKTOKEN_CACHE_DIR networks:
default:
name: one-api

解决 tiktoken 问题

遇到的问题是它依赖了 tiktoken 这个库,tiktoken 需要联网下载 token encoder

解决方法是看错误日志,比如

one-api  | [FATAL] 2025/02/17 - 10:47:21 | relay/adaptor/openai/token.go:26 [InitTokenEncoders] failed to get gpt-3.5-turbo token encoder: Get "https://openaipublic.blob.core.windows.net/encodings/cl100k_base.tiktoken": dial tcp 57.150.97.129:443: i/o timeout, if you are using in offline environment, please set TIKTOKEN_CACHE_DIR to use exsited files

这里需要从 https://openaipublic.blob.core.windows.net/encodings/cl100k_base.tiktoken 下载

我们先在本地下载这个文件,然后上传到服务器

但这时还不行

tiktoken 只认 URL 的 SHA-1

生成 SHA-1

TIKTOKEN_URL=https://openaipublic.blob.core.windows.net/encodings/cl100k_base.tiktoken
echo -n $TIKTOKEN_URL | sha1sum | head -c 40

也可以合成一行命令

echo -n "https://openaipublic.blob.core.windows.net/encodings/cl100k_base.tiktoken" | sha1sum | head -c 40

在这行命令中,echo -n 用于输出指定的 URL 字符串(其 -n 参数的作用是禁止在输出的末尾添加换行符),sha1sum 计算其 SHA-1 哈希值,head -c 40 截取前 40 个字符,即哈希值的前 40 位。

执行结果是

9b5ad71b2ce5302211f9c61530b329a4922fc6a4

然后把 cl100k_base.tiktoken 文件重命名为输出的 9b5ad71b2ce5302211f9c61530b329a4922fc6a4

在前面的 docker-compose.yaml 里,我们已经指定了 TIKTOKEN_CACHE_DIR 环境变量

然后把这个 9b5ad71b2ce5302211f9c61530b329a4922fc6a4 文件放在 TIKTOKEN_CACHE_DIR 目录里即可。

后续还有遇到类似报错,重复以上操作,直到没有报错为止。

我目前使用的版本只下载了两个 encoder

参考资料

LLM探索:离线部署Ollama和one-api服务的更多相关文章

  1. 使用Autofac动态注入启动Api服务

    Autofac Autofac(https://autofac.org/)是一款.NET的IOC组件,它可以和Owin, Web Api, ASP.NET MVC, .NET Core完美结合,帮助开 ...

  2. arcgis api for js入门开发系列一arcgis api离线部署

    在我的GIS之家QQ群里,很多都是arcgis api for js开发的新手,他们一般都是GIS专业的学生,或者从计算机专业刚刚转向来的giser,他们难免会遇到各种webgis开发的简单问题,由于 ...

  3. arcgis api 4.x for js 离线部署

    在我的GIS之家群里,经常遇到 webgis 开发新手们提问 arcgis api for js 如何本地离线部署,而不是直接调用在线的,因为在线模式依赖互联网以及网速环境因素,受到的限制影响比较大. ...

  4. Arcgis api 离线部署

    Arcgis api 离线部署 修改 文件一(init.js)位置:arcgis_js_v317_api\arcgis_js_api\library\3.17\3.17\init.js 将[HOSTN ...

  5. ArcGis API for JavaScript学习——离线部署API

    ArcGis API for JavaScript开发笔记——离线部署API 以3.18版API为例: 在加载图图前引用GIS服务是必须的.有两种方法,一是在线引用,而是离线部署引用. 在线引用: & ...

  6. ArcGIS API for JS 4.x 离线部署(https)

    在离线部署查资料的过程中,基本全部都是部署在“Default Web Site”下面,部署在这个下面的默认是 http 方式请求的.并且不能修改. 但是系统中请求的都是 https,这样导致请求不到J ...

  7. Cesium简介以及离线部署运行

    Cesium简介 cesium是国外一个基于JavaScript编写的使用WebGL的地图引擎,一款开源3DGIS的js库.cesium支持3D,2D,2.5D形式的地图展示,可以自行绘制图形,高亮区 ...

  8. Cesium 之简介以及离线部署运行篇

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. C ...

  9. 离线部署ELK+kafka日志管理系统【转】

    转自 离线部署ELK+kafka日志管理系统 - xiaoxiaozhou - 51CTO技术博客http://xiaoxiaozhou.blog.51cto.com/4681537/1854684 ...

  10. 《ArcGIS Runtime SDK for Android开发笔记》——(5)、基于Android Studio构建ArcGIS Android开发环境(离线部署)(转)

    1.前言 在上一篇的内容里我们介绍了基于Android Studio构建ArcGIS Runtime SDK for Android开发环境的基本流程,流程中我们采用的是基于Gradle的构建方式,在 ...

随机推荐

  1. Java设计模式——适配器模式的精妙应用:探秘 JDK 源码中的 Set 类

    在 Java 编程的世界里,JDK 源码犹如一座神秘的宝藏,其中的 Set 类更是我们日常开发中频繁使用的利器.今天,就让我们像勇敢的探险家一样,深入 JDK 源码,揭开 Set 类的神秘面纱,重点剖 ...

  2. C#中使用IMemoryCache实现内存缓存

    1 缓存基础知识 缓存是实际工作中非常常用的一种提高性能的方法. 缓存可以减少生成内容所需的工作,从而显著提高应用程序的性能和可伸缩性. 缓存最适用于不经常更改的数据. 通过缓存,可以比从原始数据源返 ...

  3. 树莓派设置CPU运行的核心数为3,保留核心4号

    具体步骤:1.打开终端,输入 sudo nano /boot/cmdline.txt2.在第一行最后空一格加上isolcpus=33.保存

  4. 腾讯技术岗位笔试&面试题(四)

    说在前面 本篇文章是腾讯技术面试题目汇总第四篇. 后续将持续推出互联网大厂,如阿里,腾讯,百度,美团,头条等技术面试题目,以及答案和分析. 欢迎大家点赞关注转发. 原文链接:https://mp.we ...

  5. MongoDB备份脚本

    #!/bin/bash #backup MongoDB #mongodump命令路径 DUMP=/home/mongodb/bin/mongodump #临时备份目录 OUT_DIR=/home/mo ...

  6. 金Gien乐道 | 10月热点回顾

    ​ 收获之秋,中电金信Q4开篇捷报不断 ​ Q4开篇,中电金信迎来多个捷报.公司与青岛财通集团联合打造的核心业务系统(一体化业务平台)一期项目顺利投产上线并平稳运行:中标华南某全国性股份制商业银行新一 ...

  7. 利用GmSSL制作SM2国密证书

    Part 0前言 GmSSL是一个开源的密码工具箱,支持SM2/SM3/SM4/SM9/ZUC等国密(国家商用密码)算法.SM2国密数字证书及基于SM2证书的SSL/TLS安全通信协议,支持国密硬件密 ...

  8. 完美解决idea2020一直indexing,无法操作的问题

    hello,大家好,2021年的第一篇文章,希望疫情早日过去,大家早日恢复正常生活. 今天主要分享一下在使用idea 2020.3版本开发maven项目的时候,一直出现有效件index, 有时候是sc ...

  9. PHP API接口数据简单快速的加密解密

    php7.0版本以上不支持mcrypt_encryp函数进行加密的代码,加密方式改为openssl_encrypt 用自己私人的服务器来测试吧,99买阿里云 openssl_系列支持php5.3以上版 ...

  10. 通过shadow来更改ubuntu密码,并且使用frp组网

    局域网搜索 pings 所有设备找到在线设备并登录网页 :: 作者:mao 时间:2024 11.30 @echo off chcp 65001 >nul :: 启用延迟环境变量扩展 setlo ...