Ollama部署deepseek
参考Ollama是一个工具。他不是docker,不是前端或者后端,它就仅仅是一个工具官网我下面以aarch系统为例子做一下deepseek的部署。
参考 RDK X3上——部署deepseek - 嵌入式系统 -电子工程世界-论坛 -手机版
Ollama是一个工具。他不是docker,不是前端或者后端,它就仅仅是一个工具
官网 Ollama

我下面以aarch系统为例子做一下deepseek的部署
目录
1 下载ollama
windows、linux(amd)、mac 直接在官网上下载就行


linux的aarch需要在github的release中

下载 ollama-linux-arm64.tgz


2 安装ollama
把这个包搞到 /opt/ollama 中

然后解压

解压之后这有个bin

进目录之后有个ollama

在bin下执行./ollama serve
- 这里换了个aarch的机器截图,前面的流程都是一样的
- 这里不是卡死了,而是这本身是个服务,它就是一个不终止的终端

这时候就能看一下ollama中已经下载好的镜像了。由于是新的所以这什么都没有

使用ollama服务的时候,会在ollama serve中有响应

为了不每次开关机启动一次服务,你可以让它开机自启。为了不每次到/opt/ollama/bin下执行,你可以搞一个自定义命令
在~/.bashrc中定义一个自定义命令

然后在任意位置就能使用ollama了

3 通过ollama使用modelscope中的模型
ollama可以加载modelscope中的gguf模型(gguf模型可以理解为类似deepseek的模型)
- 文档地址 魔搭社区

访问 魔搭社区 之后,点击框架,然后再点击gguf就可以看到modelscope的所有gguf模型

我们在这里可以看到deepseek

点击模型文件,然后你就随便点一个,比如我点第一个

然后就能看到模型了

这里的模型太大了,不适合在小型设备上使用,我们换个小的
我这里找了一下其他的deepseek,发现这个还可以

开启后执行 ollama run modelscope.cn/unsloth/DeepSeek-R1-Distill-Qwen-1.5B-GGUF:DeepSeek-R1-Distill-Qwen-1.5B-Q2_K.gguf
它首先会下载(第一次下载完成后第二次不会再次下载),下载好了你就直接问就行了

我随便问个内容

我们回过头来分析一下ollama run这个指令,拆解一下就是 ollama run [红色线的部分]:[绿色线的部分]

ollama不同的系统可能会下载到不同的位置,比如说RDKX3的模型默认会放到 /usr/share/ollama/.ollama/models/

deepseek在这

对于jetsonnx就会放在这

4 通过python请求ollama
4.1 思考过程
我们在上面启动ollama服务的时候我们能看到,实际上ollama就是一个服务

而且它看起来还像是一个http,我们可以用浏览器访问一下,访问一下你发现也能用

知道这个之后我在网上有针对性的找了找,找到了对应的接口
ollama其实有官方的请求方法 GitHub - ollama/ollama-python: Ollama Python library ,但是这个库我没下载下来

4.2 ollama官方接口文档
翻了翻ollama的Readme,后面我们发现它提供了接口文档 ollama/docs/api.md at main · ollama/ollama · GitHub

4.3 python请求
首先需要确保ollama serve开启

之后通过代码请求/api/generate这个接口
import requests
url = 'http://127.0.0.1:11434/api/generate'
question = "hello"
max_word = 20
data = {
"model":"modelscope.cn/unsloth/DeepSeek-R1-Distill-Qwen-1.5B-GGUF:DeepSeek-R1-Distill-Qwen-1.5B-Q2_K.gguf",
"prompt":question,
"stream":False,
"options":{"temperature":0.7,"num_predict":max_word}
}
response = requests.post(url,json=data)
print(response)
print(type(response))
print(response.text)
print(type(response.text))
true = True
ollama_response = eval(response.text).get("response").splitlines()
print(olloma_response)
if len(olloma_response)>=5:
ollama_answer = ollama_response[4:]
ollama_answer = ' '.join(ollama_answer)
elif len(olloma_response)==3:
ollama_answer = "I don't want to talk to you"
else:
ollama_answer = "It's hard to answer you in " + str(max_word) + " words"
print(ollama_answer)
我们先看效果

我们说一下我代码中用到的参数
4.3.1 model 用的哪个模型
这个是用到的模型,类型是字符串,写 ollama list 查出来的结果

4.3.2 prompt 提问的问题
向deepseek提问的问题,类型是字符串
4.3.3 stream 是否启用流式回答
是否启用流式回答,流式回答就是一个字一个字往外蹦,但是由于咱们是http请求,它最后的结果最后也是一起出。我们可以简单用一下

它返回的是一堆键值对,画红框的地方是它要回复的文字。如果使用流式回复,后面的处理方式要有变化,我这里没改就报错了

4.3.4 options 其余配置项
代码中用到的是下面两个
- temperature 回答的灵动程度。如果这个值越高,回答的结果就越跳脱。
- num_predict 回答字数限制
我们代码中限制字数是20,字数越少它响应的就越快。这个回答字数限制不是它会在20字以内回答问题,而是它回答问题,回答到20个字之后它就不说了。我们做个例子

我们可以看到画红箭头的实际上是它的回答,这里回答了20个字就砍掉了。我们可以对比上面的回答,上面的回答是有 <think> </think> 这个东西的。但是我们把回答砍断了就没有 </think>
绿色的箭头是做个了容错,告诉你很难在20字以内回答你的问题

还有一种情况它思考完了,它不返回任何东西。这种情况不多,我们也可以做一个容错

4.3.5 流式请求
效果

我们可以看到流式请求并不是一次返回所有的内容,而是一段话一段话地返回
代码
# 导入requests库,用于发送HTTP请求
import requests
# 定义API服务的URL地址(本地运行)
url = 'http://127.0.0.1:11434/api/generate'
# 获取用户输入的问题
question = input("请输入你要提问的问题:")
# 设置最大生成词数限制为20
#max_word = 50
# 构造请求数据字典
data = {
# 指定使用的模型路径(来自ModelScope平台)
"model":"modelscope.cn/unsloth/DeepSeek-R1-Distill-Qwen-1.5B-GGUF:DeepSeek-R1-Distill-Qwen-1.5B-Q2_K.gguf",
# 用户提问内容作为生成提示
"prompt":question,
"stream":True,
# 生成配置选项
"options":{
# 控制生成随机性(数值越大回答结果越死板)
"temperature":0.7,
# 回答的最大文字数量(超过会自动终止)
#"num_predict":max_word
}
}
# 发送POST请求到API服务,携带JSON格式数据
response = requests.post(url,json=data,stream=True)
print(response)
#response = requests.get(url, stream=True)
false = False
true = True
for chunk in response.iter_content(decode_unicode=True, chunk_size=1024):
if chunk:
try:
print(eval(chunk.decode())["response"],end='')
except:
pass
print()
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)