参考:
1、 怎样在离线的Linux服务器上部署 Ollama,并运行 Qwen 大模子(附教程)
2、 【三步搭建 本地 编程助手 ollama + codegeex】
本文的目的:记录将Ollama和Llama3.1 70B INT4版本离线安装在一台有4张A5000显卡的Ubuntu20.04系统上,并使用ngrok实现外部设备可以免费调用大模子
在现实安装的过程中,照旧对能力有一些要求的
比如:
1、熟悉ollama的命令
2、熟悉linux的一些命令,如tar、chmod、touch、cat、curl 、vim、nvidia-smi -l
3、相识欣赏器的哀求方法和怎样用post方法哀求一个地址
可以参考:
1、Ollama命令总结
2、Linux vi中 wq 、wq!、x、q、q!区别
3、
- #查看Linux版本号
- cat /proc/version
- #查看cpu架构
- lscpu
复制代码 1.安装Ollama
1.1 下载
版本:v0.5.11
下载地址:https://github.com/ollama/ollama/releases
文件:ollama-linux-amd64.tgz
下载好之后,解压该文件
- sudo tar -C /usr -xzf ollama-linux-amd64.tgz
复制代码 给这个文件添加权限:
- sudo chmod +x /usr/bin/ollama # 这条命令没有用到
复制代码 根据下面的文章举行操纵:Ollama系列—【怎样离线安装ollama?】按这个
操纵完了就可以直接,下载大模子文件了
(上面的方法不用下载和执行install.sh,下面还有一种安装install.sh的ollama的安装方法)
1.2 验证Ollama是否安装完成
应该使用
在欣赏器中打开即可验证,如果出现Ollama is running,则表现Ollama安装完成
2. 设置大模子
2.1 下载所必要的大模子文件
在下载模子前首先必要清晰Ollama是怎样加载离线的大模子的
使用ollama导入模子话,有两种的大模子的文件格式可以使用,分别是GGUF和Safetensors文件(Safetensors文件必要使用llama.cpp先转换为GGUF文件才行)
分别对两种下载并导入到Ollama中的方式举行介绍:
1)下载对应的Llama-3.1-70B、INT4计算精度的GGUF文件:Meta-Llama-3.1-70B-Instruct-Q4_K_M.gguf
下载地址:https://www.modelscope.cn/models/lmstudio-community/Meta-Llama-3.1-70B-Instruct-GGUF/files
2)下载的Safetensors文件:Meta-Llama-3.1-70B-Instruct-GPTQ-INT4:
下载地址:https://hf-mirror.com/hugging-quants/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4/tree/main
2.2 加载.GGUF文件(推荐、更轻易)
可以参考:Ollama自定义导入DeepSeek-R1-Distill-Qwen-1.5B模子(第二部分)
下面是上面的博主给的:
创建Modelfile文件,并写入以下内容:
- FROM ./deepseek-r1-distill-qwen-1.5b-q2_k.gguf # 以deepseek模型文件为例
复制代码 执行下面命令来验证
- ollama create my_DeepSeek-R1-Distill-Qwen-1.5B -f Modelfile
- ollama ls
- ollama run my_DeepSeek-R1-Distill-Qwen-1.5B
复制代码 下面是现实的操纵:
在uugf文件同一个目录下创建Modelfile文件,
使用插入模式i,并写入以下内容:
- FROM ./Meta-Llama-3.1-70B-Instruct-Q4_K_M.gguf #
复制代码 在uugf文件同一个目录下执行下面命令来验证
- ollama create llama-70B-INT4 -f Modelfile
- ollama ls
- ollama run llama-70B-INT4
复制代码 2.3 加载.Safetensors文件(不发起使用)
Ollama 仅支持 GGUF 格式的模子,因此需使用llama.cpp库将 .safetensors 转换为 .gguf 格式:
由于似乎必要llama.cpp对该文件举行处理,比较麻烦就不介绍了,之后碰到这种情况,就在这里记录
可以参考:Ollama自定义导入DeepSeek-R1-Distill-Qwen-1.5B模子(第三部分)
3. 使用ngrok发布大模子服务
3.1 设置情况变量使Ollama可以供外部调用
首先设置情况变量,一样平常是在/home/用户/.bashrc保存情况变量,使用
打开.bashrc文件
添加
- export OLLAMA_HOST=0.0.0.0
- export OLLAMA_MODELS=/放置模型权重文件的路径/ollama/models # models里面放了模型文件,如Meta-Llama-3.1-70B-Instruct-Q4_K_M.gguf
复制代码 修改完后,退出vim,使用
来更新这个bashrc文件
之后重启 ollama
- sudo systemctl daemon-reload
- sudo systemctl restart ollama
复制代码 systemctl是一个用于控制系统服务(systemd services)的命令工具。systemd是Linux系统中常用的初始化系统(init system),它负责管理系统启动过程和运行时的服务。
- daemon-reload是systemctl命令的一个参数选项。daemon-reload的作用是重新加载系统服务的设置文件。当你修改了服务的设置文件(比如.service文件)后,必要运行这个命令来让systemd重新读取设置,这样新的设置才能生效。
- restart 命令用于重启系统服务。这个命令是systemd的一部分,systemd是一个系统和服务管理器,用于替代传统的init系统。通过systemctl,用户可以启动、停止、重启和管理各种系统服务。使用命令 systemctl restart 服务名称。例如,要重启Apache服务,可以使用 systemctl restart apache2
重启完成后,启动大模子
- ollama run llama-70B-INT4
复制代码 3.2 验证大模子是否可以在内网访问
在欣赏器输入
- your-ip:11434 # 11434 is the port of ollama
复制代码
出现Ollama is running则表现Ollama可以被内网访问
同时还必要验证Ollama是否暴露了接口,验证方法是
- your-ip:11434/api/chat # ollama exposes the interface
复制代码 使用post方法去哀求上面的地址,有两种方法可以实验。如下
方法1:命令行
- curl
- -X POST http://10.151.233.254:11434/api/chat
- -H "Content-Type:application/json"
- -d '{"model":"llama-70B-INT4",
- "messages":[
- {"role":"user",
- "content":"你好,你是谁"}
- ]
- }'
复制代码 在输入时去掉上面的空格和换行,上面只是为了展示命令行内都包含哪些内容,此时返回
出现上面原因的是没有设置去阻止它每个token的逐个输出
使用
- curl
- -X POST http://10.151.233.254:11434/api/chat
- -H "Content-Type:application/json"
- -d '{"model":"llama-70B-INT4",
- "messages":[
- {"role":"user",
- "content":"你好,你是谁"}
- ]
- "stream":false # 多了这里一个参数
- }'
复制代码 上面的false不能使用首字母大写,也不能加双引号
回复:
- {"model":"llama-70B-INT4",
- "created_at":"2025-02-28T06:23:52.387001243Z",
- "message":{"role":"assistant",
- "content":"很高兴认识您!我是一个人工智能语言模型,我的名字叫做“LLaMA”,这是一个由Meta公司开发的聊天机器人。我可以理解和回答您的提问,提供信息,完成任务,并进行简单的对话。"
- },
- "done_reason":"stop",
- "done":true,
- "total_duration":4626183582,
- "load_duration":36728356,
- "prompt_eval_count":15,
- "prompt_eval_duration":69000000,
- "eval_count":57,
- "eval_duration":4518000000}
复制代码
方法2:代码
- from abc import ABC, abstractmethod
- import json
- import requests
- def ollama_api(url, model_name, prompt):
- headers = {
- "Content-Type": "application/json; charset=utf-8",
- "Accept": "application/json"
- }
- json_input = {
- "model": model_name,
- "messages": [{
- "role": "user",
- "content": prompt
- }],
- "stream": False
- }
- while True:
- response = requests.post(url,
- headers=headers,
- data=json.dumps(json_input))
- try:
- response_json = response.json()
- content = response_json.get("message", {}).get("content", "")
- content = json.loads(content)
- print(content)
- return content
- except (json.JSONDecodeError, ValueError):
- print("error")
- break
- url = "http://10.151.233.254:11434/api/chat"
- model_name = "llama-70B-INT4"
- prompt = "hello!"
- response = ollama_api(url, model_name, prompt)
- print(response)
复制代码 输出
3.3 安装ngork
注册并登录ngrok网站:https://dashboard.ngrok.com/get-started/setup/linux
下载ngrok-v3-stable-linux-amd64.tgz,并将该文件加压到、/usr/local/bin目录下
运行下面的命令可以将自己的authtoken添加为ngrok.yml文件中
- ngrok config add-authtoken your-authtoken(这个authtoken在ngrok官网上获取)
复制代码 设置效果:
执行下面命令,通过 ngrok 工具将本地计算机上的 11434 端口暴露到公网,从而答应外部设备通过互联网访问该端口上的服务。
执行上面命令后会出现
服务器在非公司内网的情况下执行以上命令,其他设备也不连公司网络,可以通过访问
3.4 在本机、非内网情况下验证
- # 本机可通过以下进行验证
- localhost:11434
- 或
- 127.0.0.1:11434
复制代码
- # 本机或其余设备都可通过以下命令来验证
- http//a826-2409-8931-1641-1e3-3aaf-61c2-517a-4774.ngrok-free.app/
复制代码 本机验证:
3.5 在外部设备、非内网情况下验证
3.6 在外部设备、内网情况下验证
外部设备使用了公司内网之后,再验证时出现错误:
在ngork启动后的界面中可以看出哪些设备使用什么方法(下图目前之列了get方法)哀求了该大模子的服务,以及是否哀求状态(成功与否)
3.7 在外部设备、非内网情况下验证
代码
- import json
- import requests
- def ollama_api(url, model_name, prompt):
- headers = {
- "Content-Type": "application/json; charset=utf-8",
- "Accept": "application/json"
- }
- json_input = {
- "model": model_name,
- "messages": [{
- "role": "user",
- "content": prompt
- }],
- "stream": False
- }
- data = json.dumps(json_input)
- print("post内容:", data)
- while True:
- response = requests.post(url,
- headers=headers,
- data=data)
- try:
- response_json = response.json()
- content = response_json.get("message", {}).get("content", "")
- print("回复:", content)
- except Exception as er:
- # print(er)
- break
- if __name__ == "__main__":
- url = "https://39e2-2409-8931-163b-76e1-427d-e147-c1ae-759b.ngrok-free.app/api/chat"
- model_name = "llama-70B-INT4"
- prompt = "hello!"
- ollama_api(url, model_name, prompt)
复制代码 验证效果
如果要做一些其他使命即可将post的内容换成现实业务所必要的内容即可
3.8 ngrok设置固定域名
https://dashboard.ngrok.com/domains
右侧会出现
- ngrok http --url=noticeably-inspired-basilisk.ngrok-free.app 80
复制代码 更换成Ollama的11434端口即可
- ngrok http --url=noticeably-inspired-basilisk.ngrok-free.app 11434
复制代码 参考:内网穿透学习笔记
TODO List
1)使用post哀求接口,看是否有回复 √
2)在上面的基础上实验在公司内网情况下把大模子的服务举行发布,使无论公司内网照旧外网都可以访问从公司内网发布的大模子服务
3)使用固定域名举行哀求 √
-------------------------------------下面内容供参考-------------------------------------------
4. 下载安装Ollama的安装命令文件install.sh
下载地址:https://github.com/ollama/ollama/blob/main/scripts/install.sh
下载完应该必要对这个文件举行修改
把下面的内容删除:
- if curl -I --silent --fail --location "https://ollama.com/download/ollama-linux-${ARCH}.tgz${VER_PARAM}" >/dev/null ; then
- status "Downloading Linux ${ARCH} bundle"
- curl --fail --show-error --location --progress-bar \
- "https://ollama.com/download/ollama-linux-${ARCH}.tgz${VER_PARAM}" | \
- $SUDO tar -xzf - -C "$OLLAMA_INSTALL_DIR"
- BUNDLE=1
- if [ "$OLLAMA_INSTALL_DIR/bin/ollama" != "$BINDIR/ollama" ] ; then
- status "Making ollama accessible in the PATH in $BINDIR"
- $SUDO ln -sf "$OLLAMA_INSTALL_DIR/ollama" "$BINDIR/ollama"
- fi
- else
- status "Downloading Linux ${ARCH} CLI"
- curl --fail --show-error --location --progress-bar -o "$TEMP_DIR/ollama"\
- "https://ollama.com/download/ollama-linux-${ARCH}${VER_PARAM}"
- $SUDO install -o0 -g0 -m755 $TEMP_DIR/ollama $OLLAMA_INSTALL_DIR/ollama
- BUNDLE=0
- if [ "$OLLAMA_INSTALL_DIR/ollama" != "$BINDIR/ollama" ] ; then
- status "Making ollama accessible in the PATH in $BINDIR"
- $SUDO ln -sf "$OLLAMA_INSTALL_DIR/ollama" "$BINDIR/ollama"
- fi
- fi
复制代码 2.将两个文件上传到linux服务器,放于同一文件夹下
执行install.sh文件
- chmod +x install_ollama.sh #给脚本赋予执行权限
- ./install_ollama.sh
- # 如果报错误: bash: ./build_android.sh:/bin/sh^M:解释器错误: 没有那个文件或目录,执行下面命令后,再执行./install_ollama.sh命令
- sed -i 's/\r$//' install_ollama.sh
复制代码 5. 安装并验证Ollama
- vim /etc/systemd/system/ollama.service
复制代码- [Unit]
- Description=Ollama Service
- After=network-online.target
- [Service]
- ExecStart=/usr/local/bin/ollama serve
- User=ollama
- Group=ollama
- Restart=always
- RestartSec=3
- Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/bin"
- Environment="OLLAMA_HOST=0.0.0.0:11434"
- Environment="OLLAMA_ORIGINS=*"
- [Install]
- WantedBy=default.target
复制代码- 修改后重载服务文件,重启ollamasudo systemctl daemon-reload
- sudo systemctl restart ollama
- 查看ollama运行状态sudo systemctl status ollama.service4.防火墙设置开放11434端口sudo firewall-cmd --permanent --zone=public --add-port=11434/tcp重新加载:sudo firewall-cmd --reload5.访问测试:使用其他计算机访问:http:/<服务器域名>:11434若返回Ollama is running,说明可成功访问
复制代码 6. 设置大模子文件
由于我们的服务器是完全内网情况,所以即便安装ollama后也无法下载大模子,因此必要我们手动将模子放到ollama可以识别的地方。
默认情况下ollama模子的所在路径为:
- macOS: ~/.ollama/models
- Linux: **/usr/share/ollama/.ollama/models**
- Windows: C:Users<username>.ollamamodels
复制代码 自己在服务器上创建一个路径,打开ollama设置文件/etc/systemd/system/ollama.service
在内里参加你新创建的路径
接下来,找一个可以上网的主机,执行ollama run ***,当大模子下载完成后,找到models目录,将整个目录拷贝到服务器你新创建的路径下。
重启ollama,之后再执行ollama list命令,如果看到有模子了,证明搞定。
7. 模子文件归并
在碰到模子文件使用多个文件举行存储的情况,必要将这些文件举行归并。
- copy /b qwen1_5-72b-chat-q4_k_m.gguf.a + qwen1_5-72b-chat-q4_k_m.gguf.b qwen1_5-72b-chat-q4_k_m.gguf
复制代码 命令格式:
- copy /b 文件1+文件2+......文件N 合并后的文件名
复制代码 命令解说:使用"+"将多个相同或差别格式的文件归并为一个文件。
小提示:
1.在尾部潜伏了文本数据的图片文件,在使用了其他文件编辑器并保存后,潜伏的文本数据有大概丢失。
2.MP3文件在使用此方法连接后,就可以实现连续播放。
3.合成图片/歌曲这样的二进制文件必须使用/b参数(b代表Binaty,二进制),否则将会失败;另一个归并参数是/a(ASCII,文本文件),只能用于纯文本的归并。两参数不能同时使用,二进制方式可以归并文本文件和二进制文件,而文本方式用于纯文本的归并。
4.当举行软盘复制时,可在命令中参加"/v"参数,这样可以镌汰因操纵介质的问题而导致的数据写入失败。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |