ollama 本地大模型 for macbook

  • 良好的网络,下载容器镜像和模型非常需要

    • 配置代理等不属于本文范围
  • 建议 盘大亿点点,后面会用到

  • 安装好 容器

  • 下载 ollama

  • 下载的安装包,解压后,拖拽到 应用程序 文件夹

  • 打开 ollama 后 点击确认

  • 再 提示 Install the command line,点击输入管理员密码后

  • 提示 Finish

  • 确认安装

1
2
3
4
5
$ ollama --help
# 确认 ollama 运行在 11434 端口上
$ lsof -i :11434
COMMAND   PID   USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
ollama  76055 sinlov    6u  IPv4  0x832815bf96a7e5b      0t0  TCP localhost:11434 (LISTEN)
  • list列出已经安装的模型
  • pull 拉取模型
  • run run 除了拉取模型,还同时将模型对应的交互式控制台运行了起来,不建议这么做,限定死了启动方式
  • rm 移除本地下载的模型
  • ps查看当前硬件资源占用
  • serve 启动 大模型后台服务

macOS 上的 Ollama 将文件存储在几个不同的位置

  • ~/.ollama/
    • ~/.ollama/models 拉取的本地模型所在目录
    • ~/.ollama/logs 本地日志
  • /Applications/Ollama.app程序文件夹
  • ~/Library/Preferences/com.electron.ollama.plist 设置文件
  • ~/Library/Application\ Support/Ollama 支持目录
  • ~/Library/Saved\ Application\ State/com.electron.ollama.savedState 状态文件夹

查找模型的链接

  • 模型格式 <name>:<num><arg>
    • name 为模型发布名称,后面 <num><arg> 多少 B 表示模型有 多少 十亿 参数
    • 参数规模规格为 B 十亿 M 百万 K 千
    • 参数越多,所需 显存 越大,30b 左右差不多需要 20G 专有显存推理
    • 参数多不代表准确,不过太小参数的 LLM 容易出现幻觉(瞎扯给结果)

下面演示常用模型

1
2
3
4
5
6
# 文本大模型
ollama pull qwen2:7b

# 代码方面
ollama pull codellama:7b
ollama pull starcoder2:7b

打开应用其实已经在后台 端口 11434 运行

  • OLLAMA 支持的环境变量和用途见 源码

  • OLLAMA_KEEP_ALIVE 修改这个时间,可以防止重复挂载模型,缺点是更占用资源

  • OLLAMA_HOST 定义当前运行 服务 host

  • OLLAMA_ORIGINS 跨域配置,这个需要点跨域知识,实在不会问生成式AI,大不了错几次

  • OLLAMA_MODELS 模型文件存储位置,这个选项可以更换下载位置

1
2
3
4
5
6
7
8
# 修改模型载入保留时间
launchctl setenv OLLAMA_KEEP_ALIVE "30m"

# 设置跨域主要是允许 容器使用
launchctl setenv OLLAMA_ORIGINS "http://127.0.0.1:*,http://localhost:*,http://172.17.0.1:*,http://host.docker.internal:*"

# 可选项设置跨域
launchctl setenv OLLAMA_ORIGINS "http://127.0.0.1:*,http://localhost:*,http://172.17.0.1:*,http://host.docker.internal:*,http://192.168.50.0:*"

修改后,重启 ollama 服务,方法是 在状态栏点击退出,重新打开即可

说明文档见

1
2
3
4
5
6
7
OLLAMA_HOST="0.0.0.0:11433"
OLLAMA_KEEP_ALIVE="30m"
OLLAMA_ORIGINS="http://127.0.0.1:*,http://localhost:*,http://172.17.0.1:*,http://host.docker.internal:*,http://192.168.50.0:*"

# 这里修改了启动端口 11433
# ollama 启动!!!
ollama serve

注意: ollama 是一组后台服务, 使用 大模型交互前端 需要另外的部署,这里演示的是 open-webui

创建目录,新增 docker-compose.yml 文件

1
2
3
$ mkdir ollama-app && cd ollama-app
# 使用 vscode 打开目录
$ code .
  • docker-compose
    • environment
      • WEBUI_SECRET_KEY webui secret key 可以通过 openssl rand -hex 16 生成
      • OLLAMA_BASE_URL 这个根据实际情况配置
      • HF_ENDPOINT 可以加速模型下载
    • volumes
      • ./open-webui/data:/app/backend/data 这个为 当前 docker-compose.yml 文件相对目录存储数据
    • ports
      • 11435:8080 这个是 webUI 对外服务的 端口 设置 映射到 11435,如果端口占用可以跟换
    • network_mode: host 如果开启,需要 OrbStack 支持,并且 webUI 服务端口就是 8080
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
services:
  ollama-local-open-ui:
    container_name: "ollama-local-open-ui"
    # image: ghcr.io/open-webui/open-webui:v0.3.21-ollama
    image: ghcr.io/open-webui/open-webui:v0.3.21
    pull_policy: if_not_present
    environment: # https://docs.openwebui.com/getting-started/env-configuration/
      OLLAMA_BASE_URL: 'http://host.docker.internal:11434' # 这里需要注意,这个地址连不上,也就是支持 extra_hosts 有问题,使用完整 IP address 即可
      HF_ENDPOINT: 'https://hf-mirror.com' # 从 https://hf-mirror.com 镜像,而不是https://huggfacing.co 官网下载所需的模型
      WEBUI_SECRET_KEY: 'e2ac9c8f3462a9831b238601b8546807' # webui secret key
      # PORT: '11435'
    extra_hosts:
      - host.docker.internal:host-gateway
    ports:
      - "11435:8080"
    # network_mode: host
    volumes:
      - "./open-webui/data:/app/backend/data"
    restart: unless-stopped # always on-failure:3 or unless-stopped default "no"
    logging:
      driver: json-file
      options:
        max-size: 2m

第一次需要注册账号

  • 设置,进入设置 Settings

    • 修改语言 General -> Language 修改为你需要的语言
  • 设置,进入 设置 -> 管理员设置

    • 外部链接 确认本地 ollama 链接 http://host.docker.internal:11434 可以正常使用
    • 也可以添加远程 ollama 链接

https://cdn.jsdelivr.net/gh/tailwoodencat/CDN@main/uPic/2024/09/17/9y9Idp-IGa5Ua.png

输入需要拉的模型

https://cdn.jsdelivr.net/gh/tailwoodencat/CDN@main/uPic/2024/09/17/TOdc0X-KAdbKD.png

Continue 是领先的开源AI代码助手。您可以连接任何模型和任何上下文,在其中构建自定义的自动完成和聊天体验 VS Code 或者 JetBrains

配置前,查找模型的链接, 需要先拉本地模型

1
2
3
4
5
6
7
8
9
# 文本大模型
ollama pull qwen2:7b

# 代码大模型
ollama pull codellama:7b
ollama pull starcoder2:7b
ollama pull codeqwen:7b

# 也可以调整当前设备可以支持

工程目录下

  • 新增文件 .continuerc.json
    • apiBase 内容 http://127.0.0.1:11434 更换为其他地址,也可以
 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
{
  "cody.autocomplete.advanced.provider": "experimental-ollama",
  "models": [
    {
      "title": "codellama:7b",
      "model": "codellama:7b",
      "provider": "ollama",
      "apiBase": "http://127.0.0.1:11434"
    }
  ],
  "tabAutocompleteModel": {
    "title": "StarCoder2:7b",
    "model": "starcoder2:7b",
     "contextLength": 16384,
    "provider": "ollama",
    "apiBase": "http://127.0.0.1:11434"
  },
  "embeddingsProvider": {
    "title": "qwen2:7b",
    "model": "qwen2:7b",
	  "contextLength": 2048,
    "provider": "ollama",
    "apiBase": "http://127.0.0.1:11434"
  },
  "customCommands": [
    {
      "name": "test",
      "prompt": "{{{ input }}}\n\nWrite a comprehensive set of unit tests for the selected code. It should setup, run tests that check for correctness including important edge cases, and teardown. Ensure that the tests are complete and sophisticated. Give the tests just as chat output, don't edit any file.",
      "description": "Write unit tests for highlighted code"
    }
  ],
  "contextProviders": [
    {
      "name": "diff",
      "params": {}
    },
    {
      "name": "folder",
      "params": {}
    },
    {
      "name": "codebase",
      "params": {}
    },
    {
      "name": "terminal"
    },
    {
      "name": "docs"
    },
    { "name": "search" },
    { "name": "tree" },
    { "name": "os" },
    {
      "name": "locals",
      "params": {
        "stackDepth": 3
      }
    },
    {
      "name": "open",
      "params": {
        "onlyPinned": true
      }
    }
  ],
  "slashCommands": [
    {
      "name": "edit",
      "description": "Edit selected code"
    },
    {
      "name": "comment",
      "description": "Write comments for the selected code"
    },
    {
      "name": "share",
      "description": "Export the current chat session to markdown"
    },
    {
      "name": "commit",
      "description": "Generate a git commit message"
    }
  ]
}
  • 如果内存小可以使用这个配置
 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
{
  "cody.autocomplete.advanced.provider": "experimental-ollama",
  "models": [
    {
      "title": "qwen2:7b",
      "model": "qwen2:7b",
      "provider": "ollama",
      "apiBase": "http://127.0.0.1:11434"
    }
  ],
  "tabAutocompleteModel": {
    "title": "StarCoder2:7b",
    "model": "starcoder2:7b",
     "contextLength": 16384,
    "provider": "ollama",
    "apiBase": "http://127.0.0.1:11434"
  },
  "embeddingsProvider": {
    "title": "qwen2:7b",
    "model": "qwen2:7b",
	  "contextLength": 2048,
    "provider": "ollama",
    "apiBase": "http://127.0.0.1:11434"
  },
  "customCommands": [
    {
      "name": "test",
      "prompt": "{{{ input }}}\n\nWrite a comprehensive set of unit tests for the selected code. It should setup, run tests that check for correctness including important edge cases, and teardown. Ensure that the tests are complete and sophisticated. Give the tests just as chat output, don't edit any file.",
      "description": "Write unit tests for highlighted code"
    }
  ],
  "contextProviders": [
    {
      "name": "diff",
      "params": {}
    },
    {
      "name": "folder",
      "params": {}
    },
    {
      "name": "codebase",
      "params": {}
    },
    {
      "name": "terminal"
    },
    {
      "name": "docs"
    },
    { "name": "search" },
    { "name": "tree" },
    { "name": "os" },
    {
      "name": "locals",
      "params": {
        "stackDepth": 3
      }
    },
    {
      "name": "open",
      "params": {
        "onlyPinned": true
      }
    }
  ],
  "slashCommands": [
    {
      "name": "edit",
      "description": "Edit selected code"
    },
    {
      "name": "comment",
      "description": "Write comments for the selected code"
    },
    {
      "name": "share",
      "description": "Export the current chat session to markdown"
    },
    {
      "name": "commit",
      "description": "Generate a git commit message"
    }
  ]
}