在离线环境Linux部署Ollama与Dify的CPU及CUDA版本,并将其整合至Spring AI ...

打印 上一主题 下一主题

主题 897|帖子 897|积分 2691


前言

以下适用于无法通过在线下令拉取的
  1. curl -fsSL https://ollama.com/install.sh
  2. | sh
复制代码
一.官网下载 0.3.13版本

ollama离线安装包下载地址


二.将文件包上传至ubuntu服务器



三.下载安装脚本

  1. curl -fsSL https://ollama.com/install.sh
复制代码
修改长途拉取ollama代码为当地解压
源需要修改的脚本代码如下
  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
复制代码
新改后代码
  1. status "Downloading Linux ${ARCH} bundle"
  2. #    curl --fail --show-error --location --progress-bar \
  3. #        "https://ollama.com/download/ollama-linux-${ARCH}.tgz${VER_PARAM}" | \
  4. $SUDO tar -xzf ./ollama-linux-amd64.tgz -C "$OLLAMA_INSTALL_DIR"
  5. BUNDLE=1
  6. if [ "$OLLAMA_INSTALL_DIR/bin/ollama" != "$BINDIR/ollama" ] ; then
  7.     status "Making ollama accessible in the PATH in $BINDIR"
  8.     $SUDO ln -sf "$OLLAMA_INSTALL_DIR/ollama" "$BINDIR/ollama"
  9. fi
复制代码
四.剔除GPU相关下载ROCM等,纯CPU运行脚本

在题目3的底子上,又剔除了GPU部分,即从wls2注释将下面全部删除
完整版 离线基于CPU的运行脚本
  1. #!/bin/sh# This script installs Ollama on Linux.# It detects the current operating system architecture and installs the appropriate version of Ollama.set -eustatus() { echo ">>> $*" >&2; }error() { echo "ERROR $*"; exit 1; }warning() { echo "WARNING: $*"; }TEMP_DIR=$(mktemp -d)cleanup() { rm -rf $TEMP_DIR; }trap cleanup EXITavailable() { command -v $1 >/dev/null; }require() {    local MISSING=''    for TOOL in $*; do        if ! available $TOOL; then            MISSING="$MISSING $TOOL"        fi    done    echo $MISSING}[ "$(uname -s)" = "Linux" ] || error 'This script is intended to run on Linux only.'ARCH=$(uname -m)case "$ARCH" in    x86_64) ARCH="amd64" ;;    aarch64|arm64) ARCH="arm64" ;;    *) error "Unsupported architecture: $ARCH" ;;esacIS_WSL2=falseKERN=$(uname -r)case "$KERN" in    *icrosoft*WSL2 | *icrosoft*wsl2) IS_WSL2=true;;    *icrosoft) error "Microsoft WSL1 is not currently supported. Please use WSL2 with 'wsl --set-version <distro> 2'" ;;    *) ;;esacVER_PARAM="${OLLAMA_VERSION:+?version=$OLLAMA_VERSION}"SUDO=if [ "$(id -u)" -ne 0 ]; then    # Running as root, no need for sudo    if ! available sudo; then        error "This script requires superuser permissions. Please re-run as root."    fi    SUDO="sudo"fiNEEDS=$(require curl awk grep sed tee xargs)if [ -n "$NEEDS" ]; then    status "ERROR: The following tools are required but missing:"    for NEED in $NEEDS; do        echo "  - $NEED"    done    exit 1fifor BINDIR in /usr/local/bin /usr/bin /bin; do    echo $PATH | grep -q $BINDIR && break || continuedoneOLLAMA_INSTALL_DIR=$(dirname ${BINDIR})status "Installing ollama to $OLLAMA_INSTALL_DIR"$SUDO install -o0 -g0 -m755 -d $BINDIR$SUDO install -o0 -g0 -m755 -d "$OLLAMA_INSTALL_DIR"status "Downloading Linux ${ARCH} bundle"
  2. #    curl --fail --show-error --location --progress-bar \
  3. #        "https://ollama.com/download/ollama-linux-${ARCH}.tgz${VER_PARAM}" | \
  4. $SUDO tar -xzf ./ollama-linux-amd64.tgz -C "$OLLAMA_INSTALL_DIR"
  5. BUNDLE=1
  6. if [ "$OLLAMA_INSTALL_DIR/bin/ollama" != "$BINDIR/ollama" ] ; then
  7.     status "Making ollama accessible in the PATH in $BINDIR"
  8.     $SUDO ln -sf "$OLLAMA_INSTALL_DIR/ollama" "$BINDIR/ollama"
  9. fi
  10. install_success() {    status 'The Ollama API is now available at 127.0.0.1:11434.'    status 'Install complete. Run "ollama" from the command line.'}trap install_success EXIT# Everything from this point onwards is optional.configure_systemd() {    if ! id ollama >/dev/null 2>&1; then        status "Creating ollama user..."        $SUDO useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama    fi    if getent group render >/dev/null 2>&1; then        status "Adding ollama user to render group..."        $SUDO usermod -a -G render ollama    fi    if getent group video >/dev/null 2>&1; then        status "Adding ollama user to video group..."        $SUDO usermod -a -G video ollama    fi    status "Adding current user to ollama group..."    $SUDO usermod -a -G ollama $(whoami)    status "Creating ollama systemd service..."    cat <<EOF | $SUDO tee /etc/systemd/system/ollama.service >/dev/null[Unit]Description=Ollama ServiceAfter=network-online.target[Service]ExecStart=$BINDIR/ollama serveUser=ollamaGroup=ollamaRestart=alwaysRestartSec=3Environment="PATH=$PATH"[Install]WantedBy=default.targetEOF    SYSTEMCTL_RUNNING="$(systemctl is-system-running || true)"    case $SYSTEMCTL_RUNNING in        running|degraded)            status "Enabling and starting ollama service..."            $SUDO systemctl daemon-reload            $SUDO systemctl enable ollama            start_service() { $SUDO systemctl restart ollama; }            trap start_service EXIT            ;;    esac}if available systemctl; then    configure_systemdfiinstall_success
复制代码

五.GPU CUDA版本


5.1 cuda版本检测

cmd运行
  1. nvidia-smi
复制代码

5.2 cuda ubuntu-wsl驱动下载

CUDA驱动官网

进入wsl实行安装下令
5.3 cuda全局变量设置

  1. cd ~
  2. vim .bashrc
  3. #=======start ==============
  4. #config cuda
  5. export CUDA_HOME=/usr/local/cuda-12.6
  6. export PATH=$PATH:$CUDA_HOME/bin      
  7. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CUDA_HOME/lib64
  8. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CUDA_HOME/extras/CUPTI/lib64
  9. #===========end =============
  10. source ~/.bashrc
  11. nvcc --version
复制代码
5.4 安装ollama

  1. curl -fsSL https://ollama.com/install.sh
  2. | sh
复制代码
若拉取不下来ollama,请参照剔除cpu版修改当地安装
六.ollama常用下令

  1. # 关闭ollama服务
  2. service ollama stop
  3. #ollama serve # 启动ollama
  4. sudo systemctl start ollama # 启动ollama
  5. ollama create # 从模型文件创建模型
  6. ollama show  # 显示模型信息
  7. ollama run qwen2.5:3b-instruct-q5_K_M  # 运行模型,会先自动下载模型
  8. ollama pull  # 从注册仓库中拉取模型
  9. ollama push  # 将模型推送到注册仓库
  10. ollama list  # 列出已下载模型
  11. ollama ps  # 列出正在运行的模型
  12. ollama cp  # 复制模型
  13. ollama rm  # 删除模型
复制代码
七. 长途测试

发起生产不开启,由于没有token等限定,必须留意接口调用安全
7.1 停止ollama服务

  1. systemctl stop ollama
复制代码
7.2修改ollama的service文件

  1. vim /etc/systemd/system/ollama.service
复制代码
7.3 ollama基本设置

  1. OLLAMA_DEBUG: 显示额外的调试信息(例如:OLLAMA_DEBUG=1)。
  2. OLLAMA_HOST: Ollama 服务器的 IP 地址(默认值:127.0.0.1:11434),如果你想要在局域网内的其他设备上访问它可以设置为0.0.0.0。
  3. OLLAMA_PORT: 如果默认的 11434 端口被占用了,可以用它设置一个新的,比如 4567
  4. OLLAMA_KEEP_ALIVE: 模型在内存中保持加载的时长(默认值:“5m”),防止睡眠,如果对外提供服务,可以设置类似24h这样的值,这样24小时内它就不会睡眠了,但同样的它也会一直加载在内存中。
  5. OLLAMA_MAX_LOADED_MODELS: 每个 GPU 上最大加载模型数量。
  6. OLLAMA_MAX_QUEUE: 请求队列的最大长度。
  7. OLLAMA_MODELS: 模型目录的路径,默认`.ollama/models`,如果你的系统盘空间不够,或者想把模型放在更大的硬盘上可以配置指定路径。
  8. OLLAMA_NUM_PARALLEL: 最大并行请求数。
  9. OLLAMA_NOPRUNE: 启动时不修剪模型 blob。
  10. OLLAMA_ORIGINS: 允许的源列表,使用逗号分隔。
  11. OLLAMA_SCHED_SPREAD: 始终跨所有 GPU 调度模型。
  12. OLLAMA_TMPDIR: 临时文件的位置。
  13. OLLAMA_FLASH_ATTENTION: 启用 Flash Attention。
  14. OLLAMA_LLM_LIBRARY: 设置 LLM 库以绕过自动检测。
复制代码
  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:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
  11. Environment="OLLAMA_HOST=0.0.0.0:11434"
  12. Environment="OLLAMA_NUM_PARALLEL=4" #并行处理请求的数量
  13. Environment="OLLAMA_MAX_LOADED_MODELS=4" #同时加载的模型数量
  14. [Install]
  15. WantedBy=default.target
复制代码
7.4 启动ollama

  1. sudo systemctl daemon-reload
  2. sudo systemctl start ollama
  3. # 若启动失败可以使用 ollama serve测试
复制代码
八. ollama集成自界说模型

实验过Stable Diffusion集成ollama,但是sd在ollama上无法良好运行。故此作罢。
ollama自界说模型导入文档
创建一个名为 Modelfile 的文件,并在其中包含一个 FROM 指令,该指令指向你想要导入的模型的当地文件路径
  1. sudo vim Modelfile
  2. #==================
  3. FROM ./sd3.5_medium-Q5_K_M.gguf
  4. #==================
  5. ollama create sd3.5_medium-Q5_K_M.gguf -f Modelfile
复制代码

九.安装Dify

Dify是集成AI引擎的大作,同时具备ai流派功能。可以作为对接ai的认证授权,限流处理。同时对接多个AI引擎。类似于360纳米AI助手。360就是强!

Dify官网 到github下载源码包
官方教程
访问http://localhost/install
八.对接spring AI

  1.      <dependencyManagement>
  2.         <dependencies>
  3.             <dependency>
  4.                 <groupId>org.springframework.ai</groupId>
  5.                 <artifactId>spring-ai-bom</artifactId>
  6.                 <version>1.0.0-SNAPSHOT</version>
  7.                 <type>pom</type>
  8.                 <scope>import</scope>
  9.             </dependency>
  10.         </dependencies>
  11.     </dependencyManagement>
  12.     <dependencies>
  13.         <dependency>
  14.             <groupId>org.springframework.boot</groupId>
  15.             <artifactId>spring-boot-starter-web</artifactId>
  16.         </dependency>
  17.         <!-- https://mvnrepository.com/artifact/org.springframework.ai/spring-ai-ollama -->
  18.         <dependency>
  19.             <groupId>org.springframework.ai</groupId>
  20.             <artifactId>spring-ai-ollama</artifactId>
  21.             <!--<version>1.0.0-M5</version>-->
  22.         </dependency>
  23.         <dependency>
  24.             <groupId>org.springframework.ai</groupId>
  25.             <artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
  26.         </dependency>
  27.     </dependencies>
  28.     <repositories>
  29.         <repository>
  30.             <id>spring-milestones</id>
  31.             <name>Spring Milestones</name>
  32.             <url>https://repo.spring.io/milestone</url>
  33.             <snapshots>
  34.                 <enabled>false</enabled>
  35.             </snapshots>
  36.         </repository>
  37.         <repository>
  38.             <id>spring-snapshots</id>
  39.             <name>Spring Snapshots</name>
  40.             <url>https://repo.spring.io/snapshot</url>
  41.             <releases>
  42.                 <enabled>false</enabled>
  43.             </releases>
  44.         </repository>
  45.     </repositories>
  46.     <build>
  47.         <plugins>
  48.             <plugin>
  49.                 <groupId>org.springframework.boot</groupId>
  50.                 <artifactId>spring-boot-maven-plugin</artifactId>
  51.             </plugin>
  52.         </plugins>
  53.     </build>
复制代码
若以上代码无法拉取,大概被setting.xml全局拦截到镜像站。 以上spring ai还未发布到maven中心仓库请参考maven多仓库私库模板设置
  1. spring:
  2.   application:
  3.     name: spring-ai-ollama
  4.   ai:
  5.     ollama:
  6.       base-url: http://192.168.200.94:11434
  7.       chat:
  8.         # 为了使模型输入内容拥有更多的多样性或随机性,应当增加temperature。
  9.         #在 temperature 非零的情况下,从 0.95 左右的 top-p(或 250 左右的 top-k )开始,根据需要降低 temperature。
  10.         # 如果有太多无意义的内容、垃圾内容或产生幻觉,应当降低 temperature 和 降低top-p/top-k。
  11.         # 如果 temperature 很高而模型输出内容的多样性却很低,应当增加top-p/top-k。
  12.         # 为了获得更多样化的主题,应当增加存在惩罚值。
  13.         # 为了获得更多样化且更少重复内容的模型输出,应当增加频率惩罚。
  14.         options:
  15.           # 配置文件指定时,现在程序中指定的模型,程序没有指定模型在对应查找配置中的模型
  16.           #          model: qwen:0.5b-chat
  17.           model: qwen2.5:3b-instruct-q4_K_M
  18.           # 支持的最大字符数
  19.           max_tokens: 2048
  20.           # 温度值越高,准确率下降,温度值越低,准确率上升
  21.           # 对于每个提示语只需要单个答案:零。
  22.           #对于每个提示语需要多个答案:非零。
  23.           temperature: 0.4
  24.           # 随机采样 值越大,随机性越高
  25.           # 在 temperature 为零的情况下:输出不受影响。
  26.           # 在 temperature 不为零的情况下:非零。
  27.           top_p: 0.2
  28.           # 贪心解码 值越大,随机性越高
  29.           top-k: 40
  30.           # 频率惩罚 让token每次在文本中出现都受到惩罚。这可以阻止重复使用相同的token/单词/短语,同时也会使模型讨论的主题更加多样化,更频繁地更换主题
  31.           # 当问题仅存在一个正确答案时:零。
  32.           # 当问题存在多个正确答案时:可自由选择。
  33.           frequency-penalty: 0
  34.           # 存在惩罚 如果一个token已经在文本中出现过,就会受到惩罚 使其讨论的主题更加多样化,话题变化更加频繁,而不会明显抑制常用词的重复
  35.           presence-penalty: 0
复制代码
  1. @RestController
  2. public class QianWenController {
  3.     @Resource
  4.     private OllamaChatModel ollamaChatModel;
  5.     @RequestMapping(value = "/ollama")
  6.     public Map<String, Object> ollama2(@RequestParam(value = "msg",defaultValue = "hello") String msg) {
  7.         Map<String, Object> map = new HashMap<String, Object>();
  8.         long start = System.currentTimeMillis();
  9.         ChatResponse chatResponse = ollamaChatModel.call(new Prompt(msg, OllamaOptions.builder()
  10.                 .model(OllamaModel.QWEN_2_5_7B)//使用哪个大模型
  11.                 .temperature(0.4)
  12.                 .build()));//温度,温度值越高,准确率下降,温度值越低,准确率上升
  13.         String content = chatResponse.getResult().getOutput().getText();
  14.         long end = System.currentTimeMillis();
  15.         map.put("content", content);
  16.         map.put("time", (end - start) / 1000);
  17.         return map;
  18.     }
  19.     @RequestMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE + ";charset=UTF-8")
  20.     public Flux<String> stream(@RequestParam(value = "msg",defaultValue = "hello") String msg) {
  21.         return ollamaChatModel
  22.                 .stream(new Prompt(msg))
  23.                 .flatMapSequential(chunk -> Flux.just(chunk.getResult().getOutput().getText()));
  24.     }
  25. }
复制代码



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

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

大号在练葵花宝典

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表