0%

基于AutoDL+Ollama的大模型在线部署

AutoDL简介

AutoDL是一个GPU租用平台,它提供了各种型号的服务器供用户选择,使得用户可以在云端进行深度学习模型的训练和推理。这个平台的特点包括网络无要求、部署简单、稳定,且价格合理。无论是使用Mac电脑还是低配置的Windows电脑,用户都可以完全通过云端部署,自己租用服务器,并通过浏览器打开进行使用。AutoDL支持多种服务器配置,用户可以根据自己的需求租用相应配置的服务器,从而满足不同的计算需求。

Ollama简介

Ollama是一个功能强大的开源框架,旨在简化在Docker容器中部署和管理大型语言模型(LLM)的过程。本文将介绍Ollama的特点、优势以及如何在本地使用Ollama高效运行大型语言模型,为非专业读者提供清晰易懂的技术指南。

AutoDL和Ollama结合使用

Ollama安装包准备

Ollama官网给出了在Linux操作系统中安装Ollama的详细教程,但是由于网络原因使用官网中的教程将Ollama的下载在云服务器的速度非常慢,所以我的建议是先将OllamaLinux执行文件下载到本地,然后再将文件上传到AutoDL

点击下载Ollama的Linux版本应用

下载完成后会得到以下文件。

image-20240626135945038

AutoDL服务器租赁

进入AutoDL网站:https://www.autodl.com/market/list

建议使用微信扫码登录,AutoDL在微信端也提供了小程序,可以方便我们使用手机直接对自己的容器进行管理,不需要每次都进入网站。

登录完成后,得到以下页面。

image-20240626140225002

此时就可以根据自己的需求选用合适的GPU算力服务器了。

如何选择合适的显存呢?

这个时候就需要进入到Ollama模型页面,查看自己选用的大模型的大小。

image-20240626140444196

比如我选择qwen2,进入到详情页面,点击模型大小的下拉框可以查看到每个模型的大小,大家选择的显存大小不得低于这个模型大小,最好是高个1G左右,以免影响使用。

例如,qwen2:7b模型大小为4.4GB,那么我选用的GPU服务器显存就需要大于这个值。

image-20240626140514922

这里选择RTX 2080TI就够用了。

image-20240626140807984

点击1卡可租,进入到创建实例页面。安装以下配置选择镜像。

image-20240626140908636

选择完毕后点击立即创建。

image-20240626140931139

跳转到自己的容器实例页面,默认会自动开机。

image-20240626140717819

然后点击JupyterLab进入容器环境。

image-20240626141256884

环境配置

首先,在目录中点击进入autodl-tmp文件夹,然后将刚刚下载的Ollama Linux文件上传到该文件夹下,直接拖拽即可完成上传。

image-20240626141531967

接下来点击创建终端

image-20240626141332234

然后输入以下命令进行配置

1
2
3
cd ~/autodl-tmp
cp ollama-linux-amd64 /usr/bin/ollama
sudo chmod +x /usr/bin/ollama

由于AutoDL只能开放6006端口,所以我们要想在本地电脑访问到Ollama接口,必须手动设置Ollama端口为6006;同时将Ollama的模型保存地址也修改到autodl-tmp文件夹下。

编辑/etc/profile文件

1
vim /etc/profile

首先按G,然后再按o进入编辑模式,在文件底部加入以下内容。

1
2
export OLLAMA_HOST="0.0.0.0:6006"
export OLLAMA_MODELS=/root/autodl-tmp/models

接下来按EXC退出编辑模式,输入:wq保存文件。

然后输入以下命令使得配置生效。

1
source /etc/profile

检查配置是否生效。

1
echo $OLLAMA_HOST

image-20240626142416142

打印出0.0.0.0:6006说明配置生效。

启动Ollama服务

输入以下命令启动Ollama服务

1
nohup ollama serve &

查看服务后台是否有进程。

1
ps -aux|grep ollama

image-20240626142745418

到此,Ollama服务启动完成。

下载模型

下载模型命令为:

1
ollama pull <model_name>:<version>

例如,下载qwen2:7b,输入以下命令下载

1
ollama pull qwen2:7b

image-20240626142958823

下载时间根据模型大小的不同,所花费的时间也不一样。

执行模型

终端(CLI)执行

输入以下命令,在终端中开启指定模型进行问答。

1
ollama run qwen2:7b

注意,run命令后面也可以跟上未下载的模型,如果模型未下载则会自动下载。

image-20240626143240185

API执行

Ollama模型默认会开启两个API接口供用户访问。

  1. http://localhost:6006/api/generate
  2. http://localhost:6006/api/chat

想要访问AutoDL6006端口,还需要在本地开启一个代理。

回到容器实例页面,然后点击自定义服务

image-20240626143904539

下载桌面工具:

image-20240626143948323

下载完成后自行解压,打开文件夹中的AutoDL.exe可执行文件。

image-20240626144048219

然后,输入SSH指令和SSH密码,点击开始代理即可。

image-20240626144303807

如果是LinuxMac系统选择后面的版本,安装提示操作即可。

image-20240626144156310

为了方便大家使用,进行API访问时,我编写了以下脚本,大家可以直接使用。

ChatModel.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import requests
import json

class OllamaChat():
def __init__(self, system_message="你的名字叫做minglog,是一个由骆明开发的大语言模型。", url="http://localhost:11434/api/chat", model_name="qwen2:7b"):
"""
url: ChatModel API. Default is Local Ollama
# url = "http://localhost:6006/api/chat" # AutoDL
# url = "http://localhost:11434/api/chat" # localhost
model_name: ModelName.
Default is Qwen:7b
"""
self.url = url
self.model_name = model_name
self.system_message = {
"role": "system",
"content": f"""{system_message}"""
}
self.message = [self.system_message]

def __ouput_response(self, response, stream=False, is_chat=True):
if stream:
return_text = ''
# 流式接收输出
for chunk in response.iter_content(chunk_size=None):
if chunk:
if is_chat:
text = json.loads(chunk.decode('utf-8'))['message']['content']
else:
text = json.loads(chunk.decode('utf-8'))['response']
return_text += text
print(text, end='', flush=True)
else:
if is_chat:
return_text = ''.join([json.loads(response)['message']['content'] for response in response.text.split('\n') if len(response) != 0])
else:
return_text = ''.join([json.loads(response)['response'] for response in response.text.split('\n') if len(response) != 0])
return return_text

def chat(self, prompt, message=None, stream=False, system_message=None, **options):
"""
prompt: Type Str, User input prompt words.
messages: Type List, Dialogue History. role in [system, user, assistant]
stream: Type Boolean, Is it streaming output. if `True` streaming output, otherwise not streaming output.
system_message: Type Str, System Prompt. Default self.system_message.
**options: option items.
"""
if message is not None:
self.message = message
if message == []:
self.message.append(self.system_message)
if system_message:
self.message[0]['content'] = system_message
self.message.append({"role": "user", "content": prompt})
if 'max_tokens' in options:
options['num_ctx'] = options['max_tokens']
data = {
"model": self.model_name,
"messages": self.message,
"options": options
}
headers = {
"Content-Type": "application/json"
}
responses = requests.post(self.url, headers=headers, json=data, stream=stream)
return_text = self.__ouput_response(responses, stream)
self.message.append({"role": "assistant", "content": return_text})
return return_text, self.message

def generate(self, prompt, stream=False, **options):
generate_url = self.url.replace('chat', 'generate')
if 'max_tokens' in options:
options['num_ctx'] = options['max_tokens']
data = {
"model": self.model_name,
"prompt": prompt,
"options": options
}
headers = {
"Content-Type": "application/json"
}
responses = requests.post(generate_url, headers=headers, json=data, stream=stream)
return_text = self.__ouput_response(responses, stream, is_chat=False)
return return_text

if __name__ == "__main__":
Chat = OllamaChat()
return_text = Chat.generate('请你给我讲一个关于小羊的笑话。', stream=True)
print(return_text)

初始化参数含义:

  • system_message:初始化系统提示词。
  • urlOLLAMA API地址。
  • model_name:调用的模型名称。

参数含义:

  • Prompt:提示词。
  • message:上下文信息,在chat方法中会默认记住前面的聊天记录,如果不需要历史聊天记录,请将该值设置为[]
  • stream:是否流式输出,默认为False表示非流式输出;True表示流式输出。建议在交互时设置stream=True提高交互体验。
  • system_message:系统提示词,该值在chat方法中支持随时修改。
  • **options:配置项,常见配置项有:temperatureTop_pmax_tokensstop等等,详见官方说明

API测试

1
2
3
from ChatModel import OllamaChat
chat_model = OllamaChat(url="http://localhost:6006/api/chat", model_name='qwen2:7b')
chat_model.chat('你好,你是谁?', stream=True)

image-20240626144839690

关于Ollama的更多使用,可以查看以下内容:

-------------本文结束感谢您的阅读-------------