在无sudo权限Linux上安装 Ollama 并使用 DeepSeek-R1 模型

本教程将指导你如何在 Linux 系统上安装 Ollama(一个本地运行大型语言模型的工具),并加载 DeepSeek-R1 模型。DeepSeek-R1 是一个高性能的开源语言模型,适用于多种自然语言处理任务。


DeepSeek-R1 简介

DeepSeek-R1 是 DeepSeek 开发的第一代推理模型,在数学、代码和推理任务上表现出色,性能媲美 OpenAI 的 GPT-3.5。DeepSeek 团队还通过蒸馏技术,将大模型的推理能力迁移到更小的模型中,显著提升了小模型在推理任务上的表现。


1. 准备工作

1.1 系统要求

  • 操作系统: Linux(推荐 Ubuntu 20.04 或更高版本)
  • 硬件:
    • CPU: 至少 4 核
    • 内存: 至少 16GB
    • 存储: 至少 20GB 可用空间
    • GPU(可选): 支持 CUDA 的 NVIDIA GPU(推荐显存 8GB 或更高)

1.2 依赖工具

确保以下工具已安装:

  • curl
  • tar
  • git(可选,用于克隆代码库)

如果没有安装,可以通过以下命令安装:

sudo apt update
sudo apt install curl tar git

2. 安装 Ollama

方法一:通过 Ollama 的压缩包下载

2.1.1 下载 Ollama

首先,使用 wgetcurl 分段下载 Ollama 的压缩包:

wget -c -O ollama-linux-amd64.tgz "https://gh-proxy.com/github.com/ollama/ollama/releases/download/v0.5.7/ollama-linux-amd64.tgz"
2.1.2 解压缩下载的文件

下载完成后,解压缩文件到您的主目录中的一个子目录(例如 ~/local/ollama):

mkdir -p $HOME/local/ollama
tar -xzf ollama-linux-amd64.tgz -C $HOME/local/ollama
2.1.3 设置环境变量

将解压缩后的可执行文件添加到您的 PATH 环境变量中,以便可以从命令行直接运行 ollama。将以下行添加到您的 ~/.bashrc~/.zshrc 文件中(取决于您使用的 shell):

export PATH="$HOME/local/ollama/bin:$PATH"

然后,重新加载 shell 配置文件:

source ~/.bashrc  # 或 source ~/.zshrc
2.1.4 验证安装

验证 ollama 是否已正确安装并可以运行:

ollama --version

如果一切正常,您应该会看到 ollama 的版本信息。

2.1.5 启动 Ollama 服务

在终端中运行以下命令以启动 Ollama 服务:

ollama serve

这将启动 Ollama 服务,并使其在后台运行。

在这里插入图片描述

方法二:通过安装脚本下载

以下脚本会将 Ollama 安装到用户目录(~/.local/bin),无需 sudo 权限。

2.2.1 安装脚本
#!/bin/sh
# This script installs Ollama on Linux without requiring sudo privileges.
# It installs Ollama to the user's local directory (~/.local/bin).

set -eu

red="$( (/usr/bin/tput bold || :; /usr/bin/tput setaf 1 || :) 2>&-)"
plain="$( (/usr/bin/tput sgr0 || :) 2>&-)"

status() { echo ">>> $*" >&2; }
error() { echo "${red}ERROR:${plain} $*"; exit 1; }
warning() { echo "${red}WARNING:${plain} $*"; }

TEMP_DIR=$(mktemp -d)
cleanup() { rm -rf $TEMP_DIR; }
trap cleanup EXIT

available() { 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" ;;
esac

IS_WSL2=false

KERN=$(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'" ;;
    *) ;;
esac

VER_PARAM="${OLLAMA_VERSION:+?version=$OLLAMA_VERSION}"

NEEDS=$(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 1
fi

# Install Ollama to ~/.local/bin
OLLAMA_INSTALL_DIR="$HOME/.local/bin"
mkdir -p "$OLLAMA_INSTALL_DIR"
export PATH="$OLLAMA_INSTALL_DIR:$PATH"

if [ -d "$OLLAMA_INSTALL_DIR/lib/ollama" ] ; then
    status "Cleaning up old version at $OLLAMA_INSTALL_DIR/lib/ollama"
    rm -rf "$OLLAMA_INSTALL_DIR/lib/ollama"
fi

status "Installing ollama to $OLLAMA_INSTALL_DIR"
status "Downloading Linux ${ARCH} bundle"
curl --fail --show-error --location --progress-bar \
    "https://gh-proxy.com/github.com/ollama/ollama/releases/download/v0.5.7/ollama-linux-${ARCH}.tgz" | \
    tar -xzf - -C "$OLLAMA_INSTALL_DIR"

if [ "$OLLAMA_INSTALL_DIR/bin/ollama" != "$OLLAMA_INSTALL_DIR/ollama" ] ; then
    status "Making ollama accessible in the PATH in $OLLAMA_INSTALL_DIR"
    ln -sf "$OLLAMA_INSTALL_DIR/bin/ollama" "$OLLAMA_INSTALL_DIR/ollama"
fi

# Check for NVIDIA JetPack systems with additional downloads
if [ -f /etc/nv_tegra_release ] ; then
    if grep R36 /etc/nv_tegra_release > /dev/null ; then
        status "Downloading JetPack 6 components"
        curl --fail --show-error --location --progress-bar \
            "https://gh-proxy.com/github.com/ollama/ollama/releases/download/v0.5.7/ollama-linux-${ARCH}-jetpack6.tgz" | \
            tar -xzf - -C "$OLLAMA_INSTALL_DIR"
    elif grep R35 /etc/nv_tegra_release > /dev/null ; then
        status "Downloading JetPack 5 components"
        curl --fail --show-error --location --progress-bar \
            "https://gh-proxy.com/github.com/ollama/ollama/releases/download/v0.5.7/ollama-linux-${ARCH}-jetpack5.tgz" | \
            tar -xzf - -C "$OLLAMA_INSTALL_DIR"
    else
        warning "Unsupported JetPack version detected. GPU may not be supported."
    fi
fi

install_success() {
    status 'The Ollama API is now available at 127.0.0.1:11434.'
    status 'Install complete. Run "ollama" from the command line.'
    status 'Make sure ~/.local/bin is in your PATH:'
    status '    export PATH="$HOME/.local/bin:$PATH"'
}
trap install_success EXIT

# Everything from this point onwards is optional.

# WSL2 only supports GPUs via nvidia passthrough
# so check for nvidia-smi to determine if GPU is available
if [ "$IS_WSL2" = true ]; then
    if available nvidia-smi && [ -n "$(nvidia-smi | grep -o "CUDA Version: [0-9]*\.[0-9]*")" ]; then
        status "Nvidia GPU detected."
    fi
    install_success
    exit 0
fi

# Don't attempt to install drivers on Jetson systems
if [ -f /etc/nv_tegra_release ] ; then
    status "NVIDIA JetPack ready."
    install_success
    exit 0
fi

# Install GPU dependencies on Linux
if ! available lspci && ! available lshw; then
    warning "Unable to detect NVIDIA/AMD GPU. Install lspci or lshw to automatically detect and install GPU dependencies."
    exit 0
fi

check_gpu() {
    # Look for devices based on vendor ID for NVIDIA and AMD
    case $1 in
        lspci)
            case $2 in
                nvidia) available lspci && lspci -d '10de:' | grep -q 'NVIDIA' || return 1 ;;
                amdgpu) available lspci && lspci -d '1002:' | grep -q 'AMD' || return 1 ;;
            esac ;;
        lshw)
            case $2 in
                nvidia) available lshw && lshw -c display -numeric -disable network | grep -q 'vendor: .* \[10DE\]' || return 1 ;;
                amdgpu) available lshw && lshw -c display -numeric -disable network | grep -q 'vendor: .* \[1002\]' || return 1 ;;
            esac ;;
        nvidia-smi) available nvidia-smi || return 1 ;;
    esac
}

if check_gpu nvidia-smi; then
    status "NVIDIA GPU installed."
    exit 0
fi

if ! check_gpu lspci nvidia && ! check_gpu lshw nvidia && ! check_gpu lspci amdgpu && ! check_gpu lshw amdgpu; then
    install_success
    warning "No NVIDIA/AMD GPU detected. Ollama will run in CPU-only mode."
    exit 0
fi

if check_gpu lspci amdgpu || check_gpu lshw amdgpu; then
    status "Downloading Linux ROCm ${ARCH} bundle"
    curl --fail --show-error --location --progress-bar \
        "https://gh-proxy.com/github.com/ollama/ollama/releases/download/v0.5.7/ollama-linux-${ARCH}-rocm.tgz" | \
        tar -xzf - -C "$OLLAMA_INSTALL_DIR"

    install_success
    status "AMD GPU ready."
    exit 0
fi

status "NVIDIA GPU detected. Note: CUDA driver installation requires sudo privileges."
install_success
2.2.2 运行脚本
  1. 将上述脚本保存为 install_ollama.sh
  2. 赋予执行权限:
    chmod +x install_ollama.sh
    
  3. 运行脚本:
    ./install_ollama.sh
    
2.2.3 验证安装

安装完成后,运行以下命令验证 Ollama 是否安装成功:

ollama --version

如果显示版本号,说明安装成功。

2.2.4 启动 Ollama 服务

在终端中运行以下命令以启动 Ollama 服务:

ollama serve

这将启动 Ollama 服务,并使其在后台运行。
在这里插入图片描述

3. 下载并加载 DeepSeek-R1 模型

3.1 模型地址

DeepSeek-R1 模型可以从以下地址下载,使用 Ollama 则不用下载:

  • Hugging Face: deepseek-ai/DeepSeek-R1
  • ModelScope: deepseek-ai/DeepSeek-R1

3.2 使用 Ollama 加载模型

Ollama 模型库

3.2.1 DeepSeek-R1
  • 模型大小: 671B 参数
  • 运行命令:
    ollama run deepseek-r1:671b
    
3.2.2 蒸馏模型

以下是通过蒸馏技术生成的小模型,适用于不同规模的硬件环境:

  • DeepSeek-R1-Distill-Qwen-1.5B

    ollama run deepseek-r1:1.5b
    
  • DeepSeek-R1-Distill-Qwen-7B

    ollama run deepseek-r1:7b
    
  • DeepSeek-R1-Distill-Llama-8B

    ollama run deepseek-r1:8b
    
  • DeepSeek-R1-Distill-Qwen-14B

    ollama run deepseek-r1:14b
    
  • DeepSeek-R1-Distill-Qwen-32B

    ollama run deepseek-r1:32b
    
  • DeepSeek-R1-Distill-Llama-70B

    ollama run deepseek-r1:70b
    

DeepSeek-R1 模型

3.3 通过 API 调用

Ollama 提供了一个简单的 API,可以通过 curl 调用:

curl -X POST http://127.0.0.1:11434/api/generate \
     -H "Content-Type: application/json" \
     -d '{
           "model": "deepseek-r1",
           "prompt": "你好,世界!",
           "max_tokens": 50
         }'

3.4 通过 Python 调用

安装 requests 库:

pip install requests

使用以下 Python 代码调用模型:

import requests

url = "http://127.0.0.1:11434/api/generate"
payload = {
    "model": "deepseek-r1",
    "prompt": "你好,世界!",
    "max_tokens": 50
}

response = requests.post(url, json=payload)
print(response.json())

4. 参考资源

  • 论文地址: DeepSeek-R1 论文
  • 开源地址: Hugging Face | ModelScope

5.常见问题

Windows 风格的行尾(CRLF),而不是 Unix 风格的行尾(LF)

错误信息表明您的 install.sh 脚本中存在 Windows 风格的行尾(CRLF),而不是 Unix 风格的行尾(LF)。这会导致 shell 脚本在 Unix 系统上运行时出现问题。

要解决此问题,您可以将脚本文件的行尾转换为 Unix 风格。以下是几种方法:

方法 1:使用 dos2unix 工具
如果您的系统上安装了 dos2unix 工具,可以使用它将文件转换为 Unix 格式:

dos2unix install.sh

方法 2:使用 tr 命令
您还可以使用 tr 命令来删除 Windows 行尾:

tr -d '\r' < install.sh > install_unix.sh
mv install_unix.sh install.sh

方法 3:使用文本编辑器
如果您使用的是文本编辑器(如 VSCode、Sublime Text 或 Notepad++),可以在保存文件时选择 Unix 格式的行尾。

方法 4:使用 sed 命令
您还可以使用 sed 命令来删除 Windows 行尾:

sed -i 's/\r$//' install.sh

方法 5:使用 Python 脚本
如果您有 Python 环境,可以使用以下 Python 脚本将文件转换为 Unix 格式:

with open('install.sh', 'rb') as file:
    content = file.read()

with open('install.sh', 'wb') as file:
    file.write(content.replace(b'\r\n', b'\n'))

改Ollama 的模型存储路径

好的!你可以通过以下步骤将 Ollama 的模型存储路径设置为 $HOME/local/ollama/mod,并使用符号链接来实现自定义路径。


步骤 1:创建自定义目录
首先,创建你希望存储模型的目录:

mkdir -p $HOME/local/ollama/mod

步骤 2:移动默认模型目录(如果已存在)
如果 Ollama 已经下载过模型,默认模型目录会位于 ~/.ollama/models。你可以将其移动到自定义目录:

mv ~/.ollama/models $HOME/local/ollama/mod

步骤 3:创建符号链接
创建一个符号链接,将 Ollama 的默认模型路径指向你的自定义目录:

ln -s $HOME/local/ollama/mod ~/.ollama/models

步骤 4:验证路径
运行以下命令,检查符号链接是否创建成功:

ls -l ~/.ollama/models

如果输出类似以下内容,说明符号链接已正确设置:

lrwxrwxrwx 1 user user 25 Oct 10 12:00 /home/user/.ollama/models -> /home/user/local/ollama/mod

步骤 5:运行 Ollama
现在,当你运行 ollama run deepseek-r1:70b 时,模型会被下载到 $HOME/local/ollama/mod 目录中。


完整脚本

如果你希望自动化上述步骤,可以使用以下脚本:

#!/bin/bash

# 自定义模型存储路径
CUSTOM_MODEL_DIR="$HOME/local/ollama/mod"

# 创建自定义目录
mkdir -p "$CUSTOM_MODEL_DIR"

# 移动默认模型目录(如果存在)
if [ -d "$HOME/.ollama/models" ]; then
    mv "$HOME/.ollama/models" "$CUSTOM_MODEL_DIR"
fi

# 创建符号链接
ln -s "$CUSTOM_MODEL_DIR" "$HOME/.ollama/models"

# 验证符号链接
echo "验证符号链接:"
ls -l "$HOME/.ollama/models"

# 提示信息
echo "Ollama 模型存储路径已设置为:$CUSTOM_MODEL_DIR"

将上述脚本保存为 setup_ollama_path.sh,然后运行:

chmod +x setup_ollama_path.sh
./setup_ollama_path.sh

注意事项

  1. 权限问题:确保你有权限在 $HOME/local/ollama/mod 目录中读写文件。
  2. Ollama 版本:确保你使用的是最新版本的 Ollama,以避免兼容性问题。
  3. 符号链接生效:符号链接创建后,Ollama 会自动将模型下载到自定义路径。

通过以上步骤,你可以成功将 Ollama 的模型存储路径设置为 $HOME/local/ollama/mod,并开始使用自定义路径下载和运行模型!


通过本教程,你可以在 Linux 系统上安装 Ollama 并加载 DeepSeek-R1 模型,轻松运行高性能的自然语言处理任务。如果有任何问题,欢迎在评论区留言!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/960361.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

arduino学习

一、log日志 只看自己 看指定 看错误日志 二、布局 重要&#xff1a;新建activity时需要的配置 若一个工程中有多个activity&#xff0c;需要修改开启activity属性、总容器标签、debug启动activity。下面流程内截图activity不一致&#xff0c;根据自己新建的activity配置&am…

obsidian插件——Metadata Hider

原本是要找导出图片时显示属性的插件&#xff0c;奈何还没找到&#xff0c;反而找到了可以隐藏属性的插件。唉&#xff0c;人生不如意&#xff0c;十之八九。 说一下功能&#xff1a; 这个插件可以把obsidian的文档属性放在右侧显示&#xff0c;或者决定只显示具体几项属性&a…

SimpleFOC STM32教程10|基于STM32F103+CubeMX,速度闭环控制(有电流环)

导言 SimpleFOC STM32教程09&#xff5c;基于STM32F103CubeMX&#xff0c;ADC采样相电流 如上图所示, 增加了电流环. 效果如下&#xff1a; 20250123-200906 RTT 如上图所示&#xff0c;三相占空比依然是马鞍波。当我用手去给电机施加阻力时&#xff0c;PID要维持目标转速&am…

Qt 5.14.2 学习记录 —— 이십일 Qt网络和音频

文章目录 1、UDP带有界面的Udp服务器&#xff08;回显服务器&#xff09; 2、TCP回显服务器 3、HTTP客户端4、音频 和Linux的网络一样&#xff0c;Qt封装了Linux的网络API&#xff0c;即Socket API。网络编程是在应用层写&#xff0c;需要传输层支持&#xff0c;传输层有UDP和T…

【C语言基础】编译并运行第一个C程序

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 博客内容主要围绕&#xff1a; 5G/6G协议讲解 高级C语言讲解 Rust语言讲解 文章目录 编译并运行第一个C程序一、编译上面的程序二、运行上面的程序…

TikTok 推出了一款 IDE,用于快速构建 AI 应用

字节跳动(TikTok 的母公司)刚刚推出了一款名为 Trae 的新集成开发环境(IDE)。 Trae 基于 Visual Studio Code(VS Code)构建,继承了这个熟悉的平台,并加入了 AI 工具,帮助开发者更快、更轻松地构建应用——有时甚至无需编写任何代码。 如果你之前使用过 Cursor AI,T…

HarmonyOS简介:HarmonyOS核心技术理念

核心理念 一次开发、多端部署可分可合、自由流转统一生态、原生智能 一次开发、多端部署 可分可合 自由流转 自由流转可分为跨端迁移和多端协同两种情况 统一生态 支持业界主流跨平台开发框架&#xff0c;通过多层次的开放能力提供统一接入标准&#xff0c;实现三方框架快速…

STM32 按键密码系统的实现

本次基于STM32F407开发板&#xff0c;来实现密码系统&#xff0c;输入四位密码&#xff0c;密码正确时LED1亮&#xff0c;密码错误时四个LED灯双闪。 LED双闪代码 简单的逻辑&#xff0c;让四个LED灯先亮然后再延时一会LED灯灭&#xff0c;循环4此实现双闪的效果。 按键密码的…

【C++ 动态规划】1024. 视频拼接|1746

本文涉及知识点 C动态规划 LeetCode1024. 视频拼接 你将会获得一系列视频片段&#xff0c;这些片段来自于一项持续时长为 time 秒的体育赛事。这些片段可能有所重叠&#xff0c;也可能长度不一。 使用数组 clips 描述所有的视频片段&#xff0c;其中 clips[i] [starti, end…

A7. Jenkins Pipeline自动化构建过程,可灵活配置多项目、多模块服务实战

服务容器化构建的环境配置构建前需要解决什么下面我们带着问题分析构建的过程:1. 如何解决jenkins执行环境与shell脚本执行环境不一致问题?2. 构建之前动态修改项目的环境变量3. 在通过容器打包时避免不了会产生比较多的不可用的镜像资源,这些资源要是不及时删除掉时会导致服…

Oracle-Java JDBC 连接超时之后的认知纠正

背景 偶然读到熊老师的文章《老熊的三分地-JDBC中语句超时与事务》了解到&#xff1a;JAVA代码的最后正常断开数据库连接&#xff0c;在默认情况下&#xff0c;正常断开的数据库连接会自动提交没有提交的事务。   通过文章的测试JAVA程序&#xff0c;可以表明&#xff0c;JDB…

redis的分片集群模式

redis的分片集群模式 1 主从哨兵集群的问题和分片集群特点 主从哨兵集群可应对高并发写和高可用性&#xff0c;但是还有2个问题没有解决&#xff1a; &#xff08;1&#xff09;海量数据存储 &#xff08;2&#xff09;高并发写的问题 使用分片集群可解决&#xff0c;分片集群…

【Linux】 冯诺依曼体系与计算机系统架构全解

Linux相关知识点可以通过点击以下链接进行学习一起加油&#xff01;初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G编译器make与Makefile自动化构建GDB调试器与Git版本控制工具Linux下进度条 冯诺依曼体系是现代计算机设计的基石&#xff0c;其统一存储和顺序执行理念推动…

【论文复现】基于维度狩猎学习的改进秃鹰搜索算法用于自动驾驶问题

目录 1.摘要2.秃鹰搜索算法BES原理3.改进策略4.结果展示5.参考文献6.代码获取 1.摘要 由于道路曲率穿透和参数不确定性带来的侧向偏差&#xff0c;自动驾驶车辆控制器面临提供准确、快速响应及小幅超调等性能挑战。本文提出了一种基于维度狩猎学习&#xff08;DLH&#xff09;…

【阅读笔记】基于整数+分数微分的清晰度评价算子

本文介绍的是一种新的清晰度评价算子&#xff0c;整数微分算子分数微分算子 一、概述 目前在数字图像清晰度评价函数中常用的评价函数包括三类&#xff1a;灰度梯度评价函数、频域函数和统计学函数&#xff0c;其中灰度梯度评价函数具有计算简单&#xff0c;评价效果好等优点…

电路研究9.2——合宙Air780EP使用AT指令

这里正式研究AT指令的学习了&#xff0c;之前只是接触的AT指令&#xff0c;这里则是深入分析AT指令了。 软件的开发方式&#xff1a; AT&#xff1a;MCU 做主控&#xff0c;MCU 发 AT 命令给模组的开发方式&#xff0c;模组仅提供标准的 AT 固件&#xff0c; 所有的业务控制逻辑…

输入带空格的字符串,求单词个数

输入带空格的字符串&#xff0c;求单词个数 __ueooe_eui_sjje__ ---->3syue__jdjd____die_ ---->3shuue__dju__kk ---->3 #include <stdio.h> #include <string.h>// 自定义函数来判断字符是否为空白字符 int isSpace(char c) {return c || c \t || …

基于Mybatis继承AbstractRoutingDataSource使用自定义注解实现动态数据源

一&#xff1a;实现 方式一&#xff1a;继承AbstractRoutingDataSource使用自定义注解实现 环境&#xff1a;springboot3 MyBatis3 mysql-connector8 DataSourceKeyEnum枚举类 有几个数据源就配置几个枚举类&#xff0c;和数据源数量一一对应 class DataSourceKeyEnum{D…

简单树形菜单

引言 在网页开发中&#xff0c;树形菜单是一种非常实用的&#xff0c;它可以清晰地展示具有层级关系的数据&#xff0c;并且能够方便用户进行导航和操作。 整体思路 整个项目主要分为三个部分&#xff1a;HTML 结构搭建、CSS 样式设计和 JavaScript 交互逻辑实现。通过 XMLHt…

Java的循环结构

今天学习一下Java的循环结构 while循环 while是最基本的循环&#xff0c;它的结构为&#xff1a; while(布尔表达式){//循环内容 } 只要布尔表达式为true&#xff0c;循环就会一直执行下去。 我们大多数情况是会让循环停止下来的&#xff0c;我们需要一个让表达式失效的方式…