ubuntu离线安装Ollama并部署Llama3.1 70B INT4并对外发布服务 ...

打印 上一主题 下一主题

主题 891|帖子 891|积分 2673

参考:
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、
  1. #查看Linux版本号
  2. cat /proc/version
  3. #查看cpu架构
  4. lscpu
复制代码
1.安装Ollama

1.1 下载

版本:v0.5.11
下载地址:https://github.com/ollama/ollama/releases
文件:ollama-linux-amd64.tgz
下载好之后,解压该文件
  1. sudo tar -C /usr -xzf ollama-linux-amd64.tgz
复制代码
给这个文件添加权限:
  1. sudo chmod +x /usr/bin/ollama # 这条命令没有用到
复制代码
根据下面的文章举行操纵:Ollama系列—【怎样离线安装ollama?】按这个
操纵完了就可以直接,下载大模子文件了
(上面的方法不用下载和执行install.sh,下面还有一种安装install.sh的ollama的安装方法)
1.2 验证Ollama是否安装完成

应该使用
  1. 本机ip:11434
复制代码
在欣赏器中打开即可验证,如果出现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文件,并写入以下内容:
  1. FROM ./deepseek-r1-distill-qwen-1.5b-q2_k.gguf # 以deepseek模型文件为例
复制代码
执行下面命令来验证
  1. ollama create my_DeepSeek-R1-Distill-Qwen-1.5B -f Modelfile
  2. ollama ls
  3. ollama run my_DeepSeek-R1-Distill-Qwen-1.5B
复制代码
下面是现实的操纵:
在uugf文件同一个目录下创建Modelfile文件,
  1. touch Modelfile
复制代码
使用插入模式i,并写入以下内容:
  1. FROM ./Meta-Llama-3.1-70B-Instruct-Q4_K_M.gguf #
复制代码
在uugf文件同一个目录下执行下面命令来验证
  1. ollama create llama-70B-INT4 -f Modelfile
  2. ollama ls
  3. 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保存情况变量,使用
  1. vim /home/用户/.bashrc
复制代码
打开.bashrc文件
添加
  1. export OLLAMA_HOST=0.0.0.0  
  2. export OLLAMA_MODELS=/放置模型权重文件的路径/ollama/models  # models里面放了模型文件,如Meta-Llama-3.1-70B-Instruct-Q4_K_M.gguf
复制代码
修改完后,退出vim,使用
  1. source /home/用户/.bashrc
复制代码
来更新这个bashrc文件
之后重启 ollama
  1. sudo systemctl daemon-reload
  2. 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
    重启完成后,启动大模子
  1. ollama run llama-70B-INT4
复制代码
3.2 验证大模子是否可以在内网访问

在欣赏器输入
  1. your-ip:11434 # 11434 is the port of ollama
复制代码

出现Ollama is running则表现Ollama可以被内网访问
同时还必要验证Ollama是否暴露了接口,验证方法是
  1. your-ip:11434/api/chat # ollama exposes the interface
复制代码
使用post方法去哀求上面的地址,有两种方法可以实验。如下
方法1:命令行
  1. curl
  2. -X POST http://10.151.233.254:11434/api/chat
  3. -H "Content-Type:application/json"
  4. -d '{"model":"llama-70B-INT4",
  5.      "messages":[
  6.                       {"role":"user",
  7.                        "content":"你好,你是谁"}
  8.                 ]
  9.      }'
复制代码
在输入时去掉上面的空格和换行,上面只是为了展示命令行内都包含哪些内容,此时返回

出现上面原因的是没有设置去阻止它每个token的逐个输出
使用
  1. curl
  2. -X POST http://10.151.233.254:11434/api/chat
  3. -H "Content-Type:application/json"
  4. -d '{"model":"llama-70B-INT4",
  5.      "messages":[
  6.                       {"role":"user",
  7.                        "content":"你好,你是谁"}
  8.                 ]
  9.      "stream":false # 多了这里一个参数
  10.      }'
复制代码
上面的false不能使用首字母大写,也不能加双引号
回复:
  1. {"model":"llama-70B-INT4",
  2. "created_at":"2025-02-28T06:23:52.387001243Z",
  3. "message":{"role":"assistant",
  4.             "content":"很高兴认识您!我是一个人工智能语言模型,我的名字叫做“LLaMA”,这是一个由Meta公司开发的聊天机器人。我可以理解和回答您的提问,提供信息,完成任务,并进行简单的对话。"
  5.             },
  6. "done_reason":"stop",
  7. "done":true,
  8. "total_duration":4626183582,
  9. "load_duration":36728356,
  10. "prompt_eval_count":15,
  11. "prompt_eval_duration":69000000,
  12. "eval_count":57,
  13. "eval_duration":4518000000}
复制代码

方法2:代码
  1. from abc import ABC, abstractmethod
  2. import json
  3. import requests
  4. def ollama_api(url, model_name, prompt):
  5.     headers = {
  6.         "Content-Type": "application/json; charset=utf-8",
  7.         "Accept": "application/json"
  8.     }
  9.     json_input = {
  10.         "model": model_name,
  11.         "messages": [{
  12.             "role": "user",
  13.             "content": prompt
  14.         }],
  15.         "stream": False
  16.     }
  17.     while True:
  18.      response = requests.post(url,
  19.                               headers=headers,
  20.                               data=json.dumps(json_input))
  21.     try:
  22.         response_json = response.json()
  23.         content = response_json.get("message", {}).get("content", "")
  24.         content = json.loads(content)
  25.         print(content)
  26.         return content
  27.     except (json.JSONDecodeError, ValueError):
  28.         print("error")
  29.     break
  30. url = "http://10.151.233.254:11434/api/chat"
  31. model_name = "llama-70B-INT4"
  32. prompt = "hello!"
  33. response = ollama_api(url, model_name, prompt)
  34. 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文件中
  1. ngrok config add-authtoken your-authtoken(这个authtoken在ngrok官网上获取)
复制代码
设置效果:

执行下面命令,通过 ngrok 工具将本地计算机上的 11434 端口暴露到公网,从而答应外部设备通过互联网访问该端口上的服务。
  1. ngrok http 11434
复制代码
执行上面命令后会出现

服务器在非公司内网的情况下执行以上命令,其他设备也不连公司网络,可以通过访问
3.4 在本机、非内网情况下验证

  1. # 本机可通过以下进行验证
  2. localhost:11434
  3. 127.0.0.1:11434
复制代码

  1. # 本机或其余设备都可通过以下命令来验证
  2. http//a826-2409-8931-1641-1e3-3aaf-61c2-517a-4774.ngrok-free.app/
复制代码
本机验证:

3.5 在外部设备、非内网情况下验证


3.6 在外部设备、内网情况下验证

外部设备使用了公司内网之后,再验证时出现错误:

在ngork启动后的界面中可以看出哪些设备使用什么方法(下图目前之列了get方法)哀求了该大模子的服务,以及是否哀求状态(成功与否)

3.7 在外部设备、非内网情况下验证

代码
  1. import json
  2. import requests
  3. def ollama_api(url, model_name, prompt):
  4.     headers = {
  5.         "Content-Type": "application/json; charset=utf-8",
  6.         "Accept": "application/json"
  7.     }
  8.     json_input = {
  9.         "model": model_name,
  10.         "messages": [{
  11.             "role": "user",
  12.             "content": prompt
  13.         }],
  14.         "stream": False
  15.     }
  16.     data = json.dumps(json_input)
  17.     print("post内容:", data)
  18.     while True:
  19.         response = requests.post(url,
  20.                                  headers=headers,
  21.                                  data=data)
  22.         try:
  23.             response_json = response.json()
  24.             content = response_json.get("message", {}).get("content", "")
  25.             print("回复:", content)
  26.         except Exception as er:
  27.             # print(er)
  28.             break
  29. if __name__ == "__main__":
  30.     url = "https://39e2-2409-8931-163b-76e1-427d-e147-c1ae-759b.ngrok-free.app/api/chat"
  31.     model_name = "llama-70B-INT4"
  32.     prompt = "hello!"
  33.     ollama_api(url, model_name, prompt)
复制代码
验证效果

如果要做一些其他使命即可将post的内容换成现实业务所必要的内容即可
3.8 ngrok设置固定域名

https://dashboard.ngrok.com/domains

右侧会出现
  1. ngrok http --url=noticeably-inspired-basilisk.ngrok-free.app 80
复制代码
更换成Ollama的11434端口即可
  1. 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
下载完应该必要对这个文件举行修改
把下面的内容删除:
  1. if curl -I --silent --fail --location "https://ollama.com/download/ollama-linux-${ARCH}.tgz${VER_PARAM}" >/dev/null ; then
  2.     status "Downloading Linux ${ARCH} bundle"
  3.     curl --fail --show-error --location --progress-bar \
  4.         "https://ollama.com/download/ollama-linux-${ARCH}.tgz${VER_PARAM}" | \
  5.         $SUDO tar -xzf - -C "$OLLAMA_INSTALL_DIR"
  6.     BUNDLE=1
  7.     if [ "$OLLAMA_INSTALL_DIR/bin/ollama" != "$BINDIR/ollama" ] ; then
  8.         status "Making ollama accessible in the PATH in $BINDIR"
  9.         $SUDO ln -sf "$OLLAMA_INSTALL_DIR/ollama" "$BINDIR/ollama"
  10.     fi
  11. else
  12.     status "Downloading Linux ${ARCH} CLI"
  13.     curl --fail --show-error --location --progress-bar -o "$TEMP_DIR/ollama"\
  14.     "https://ollama.com/download/ollama-linux-${ARCH}${VER_PARAM}"
  15.     $SUDO install -o0 -g0 -m755 $TEMP_DIR/ollama $OLLAMA_INSTALL_DIR/ollama
  16.     BUNDLE=0
  17.     if [ "$OLLAMA_INSTALL_DIR/ollama" != "$BINDIR/ollama" ] ; then
  18.         status "Making ollama accessible in the PATH in $BINDIR"
  19.         $SUDO ln -sf "$OLLAMA_INSTALL_DIR/ollama" "$BINDIR/ollama"
  20.     fi
  21. fi
复制代码
2.将两个文件上传到linux服务器,放于同一文件夹下
执行install.sh文件
  1. chmod +x install_ollama.sh    #给脚本赋予执行权限
  2. ./install_ollama.sh
  3. # 如果报错误: bash: ./build_android.sh:/bin/sh^M:解释器错误: 没有那个文件或目录,执行下面命令后,再执行./install_ollama.sh命令
  4. sed -i 's/\r$//' install_ollama.sh
复制代码
5. 安装并验证Ollama

  1. vim /etc/systemd/system/ollama.service
复制代码
  1. [Unit]
  2. Description=Ollama Service
  3. After=network-online.target
  4. [Service]
  5. ExecStart=/usr/local/bin/ollama serve
  6. User=ollama
  7. Group=ollama
  8. Restart=always
  9. RestartSec=3
  10. Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/bin"
  11. Environment="OLLAMA_HOST=0.0.0.0:11434"
  12. Environment="OLLAMA_ORIGINS=*"
  13. [Install]
  14. WantedBy=default.target
复制代码
  1. 修改后重载服务文件,重启ollamasudo systemctl daemon-reload
  2. sudo systemctl restart ollama
  3. 查看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模子的所在路径为:
  1. macOS: ~/.ollama/models
  2. Linux: **/usr/share/ollama/.ollama/models**
  3. Windows: C:Users<username>.ollamamodels
复制代码
自己在服务器上创建一个路径,打开ollama设置文件/etc/systemd/system/ollama.service
在内里参加你新创建的路径

接下来,找一个可以上网的主机,执行ollama run ***,当大模子下载完成后,找到models目录,将整个目录拷贝到服务器你新创建的路径下。
重启ollama,之后再执行ollama list命令,如果看到有模子了,证明搞定。
7. 模子文件归并

在碰到模子文件使用多个文件举行存储的情况,必要将这些文件举行归并。
  1. 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
复制代码
命令格式:
  1. copy /b 文件1+文件2+......文件N 合并后的文件名
复制代码
命令解说:使用"+"将多个相同或差别格式的文件归并为一个文件。
小提示:
1.在尾部潜伏了文本数据的图片文件,在使用了其他文件编辑器并保存后,潜伏的文本数据有大概丢失。
2.MP3文件在使用此方法连接后,就可以实现连续播放。
3.合成图片/歌曲这样的二进制文件必须使用/b参数(b代表Binaty,二进制),否则将会失败;另一个归并参数是/a(ASCII,文本文件),只能用于纯文本的归并。两参数不能同时使用,二进制方式可以归并文本文件和二进制文件,而文本方式用于纯文本的归并。
4.当举行软盘复制时,可在命令中参加"/v"参数,这样可以镌汰因操纵介质的问题而导致的数据写入失败。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

海哥

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表