银河麒麟V10离线部署DeepSeek:ARM无显卡纯CPU推理实战
简介这份文档面向需要在银河麒麟V10Kylin-Desktop-V10-SP1ARM64架构上离线部署大语言模型的技术人员解决无外网或受限网络环境下搭建AI服务的问题。内容围绕ollama服务安装、deepseek-r1:14b蒸馏模型的离线下载与导入、系统服务与环境变量配置以及chatbox客户端安装、桌面快捷方式创建和远程连接方式展开适合具备一定Linux命令行基础、希望掌握国产操作系统AI部署流程的读者。资源包共1个docx文件约2.69MB以图文步骤形式记录完整操作路径与关键配置项。目前已有5531人学习下载。读者可据此获得从模型拉取、gguf文件重命名导入到服务开机自启的完整排错思路并学会将模型配置为系统服务、通过chatbox实现本地交互同时了解远程访问本地模型的参数设置便于在飞腾FT-2000等无显卡设备上稳定运行。1. 银河麒麟V10离线部署deepseek一台没显卡的ARM机器怎么把大模型跑起来手里有一台银河麒麟V10的ARM机器CPU是飞腾FT-2000没显卡网络还出不去——这种场景下想跑个本地大模型很多人第一反应是不可能。但实际拆下来ollama加deepseek-r1蒸馏模型加chatbox这套组合在纯CPU的ARM环境里是能跑通的14b的蒸馏版大概9GB内存够就能推理速度不快但能用。这份部署指南解决的就是离线ARM无显卡三个约束同时存在时的落地问题适合在信创环境里做AI能力预研的工程师也适合手头只有国产化整机、想先跑通再谈优化的开发者。整条链路分四段装ollama、配系统服务、离线导入模型、装chatbox客户端每一步都有具体的路径和参数照着走能复现。2. 装ollama并配成systemd服务路径、用户和三个环境变量ollama是整个链路的底座它负责加载GGUF模型文件、暴露HTTP API、管理模型生命周期。在ARM的麒麟V10上装ollama不能用apt官方也没提供麒麟的包正确做法是下载arm64的tgz压缩包手动解压。这一步的关键不是解压本身而是解压之后的三件事建独立用户、写systemd单元、配环境变量文件。这三件事决定了ollama能不能开机自启、模型文件放哪、能不能被远程访问。2.1 解压与目录规划先把压缩包放到一个统一的工作目录下示例里用的是/opt/deepseek这个目录后面还要放chatbox和模型所以提前规划好能省很多事。解压命令用tar -C直接指定目标目录避免先cd再解压的来回切换。# 进入工作目录压缩包已经放在这里 cd /opt/deepseek # 创建ollama的安装目录 mkdir ollama # 解压到指定目录-C 指定解压目标-xzf 对应 tgz 格式 tar -C /opt/deepseek/ollama -xzf ollama-linux-arm64.tgz # 确认解压结果bin目录下应该有ollama可执行文件 ls /opt/deepseek/ollama/bin/解压完成后/opt/deepseek/ollama/bin/ollama就是主程序。这里有个容易忽略的点tgz包里除了bin还有lib目录里面是ollama依赖的动态库所以后续配环境变量时PATH要指向bin但整个ollama目录都不能随便挪挪了lib路径就断了。2.2 创建专用用户与权限归属ollama官方推荐用独立的系统用户跑服务不用root也不用当前登录用户。这样做的好处是服务进程权限收敛模型文件归属清晰后续chown一次就行。# 创建ollama系统用户-r表示系统用户-s /bin/false禁止登录 # -U创建同名用户组-m创建家目录-d指定家目录位置 sudo useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama # 把当前用户加入ollama组方便后续操作模型文件 sudo usermod -a -G ollama $(whoami) # 把整个ollama目录的属主改成ollama用户 sudo chown -R ollama:ollama /opt/deepseek/ollama-s /bin/false这个参数很关键它让ollama用户不能登录shell纯做服务账户用。usermod -a -G把当前用户加进组是为了后面不用sudo也能读模型目录但改完组之后当前终端要重新登录才生效这个坑后面避坑章节会细说。2.3 写systemd单元与环境变量文件systemd单元负责拉起ollama进程环境变量文件负责告诉ollama模型放哪、监听哪个地址。两者分开写的好处是改配置不用动单元文件systemctl daemon-reload之后重启服务就行。# 创建systemd服务单元 sudo vim /etc/systemd/system/ollama.service单元文件内容如下[Unit] DescriptionOllama Service Afternetwork-online.target [Service] ExecStart/opt/deepseek/ollama/bin/ollama serve Userollama Groupollama Restartalways RestartSec3 EnvironmentFile/opt/deepseek/ollama/ollama.conf [Install] WantedBydefault.targetExecStart指向解压出来的ollama二进制User和Group指定用ollama账户跑Restartalways保证进程挂了自动拉起EnvironmentFile把环境变量从单独文件读进来。接着写环境变量文件sudo vim /opt/deepseek/ollama/ollama.confOLLAMA_HOME/opt/deepseek/ollama OLLAMA_MODELS/opt/deepseek/ollama/models OLLAMA_HOST0.0.0.0 OLLAMA_ORIGINS* PATH$OLLAMA_HOME/bin:$PATH四个变量的作用分别是OLLAMA_HOME定安装根目录OLLAMA_MODELS定模型文件存放路径OLLAMA_HOST设成0.0.0.0表示监听所有网卡OLLAMA_ORIGINS设成*允许跨域请求。后两个是给远程访问用的如果只在本机用OLLAMA_HOST可以改成127.0.0.1更安全。PATH那行是为了让服务进程内部调用ollama子命令时能找到二进制。2.4 启动服务并验证状态配置写完按顺序执行重载、开机自启、启动、查状态四步。# 重载systemd配置让新单元生效 sudo systemctl daemon-reload # 设置开机自启 sudo systemctl enable ollama # 立即启动服务 sudo systemctl start ollama # 查看运行状态 sudo systemctl status ollama状态输出里看到Active: active (running)就说明服务起来了日志里会打印[GIN-debug]开头的路由注册信息那是ollama内置的HTTP框架在注册API端点。如果状态是failed用journalctl -u ollama -n 50看最近50行日志常见原因是路径写错或权限不对。最后把ollama的bin目录加进系统PATH这样终端里直接敲ollama就能用sudo vim /etc/profile # 追加一行 export PATH/opt/deepseek/ollama/bin:$PATH # 让配置生效 source /etc/profile注意source /etc/profile要在当前终端执行新开的终端会自动读。到这一步ollama服务就跑起来了但还没有模型下一步解决离线导入。3. 离线导入deepseek-r1模型从联网机器拉取到GGUF重命名离线环境最大的障碍是模型文件拿不到。ollama的pull命令需要联网麒麟机器出不去所以要在另一台同架构arm64的联网机器上先把模型拉下来再想办法把模型文件抠出来拷过去。这里的关键是理解ollama的模型存储结构——它不是存一个单独的gguf文件而是存一堆按sha256命名的blob外加一个manifest。要离线迁移得先用ollama show --modelfile把模型定义导出来找到FROM指向的那个blob重命名成gguf再导入。3.1 在联网机器上拉取模型找一台同样是arm64架构、能联网的机器装上ollama然后拉取deepseek-r1的14b蒸馏版。# 联网机器上执行拉取14b蒸馏模型 ollama pull deepseek-r1:14b # 确认模型已下载 ollama listdeepseek-r1:14b是蒸馏版本体积约9GB相比完整版对内存和算力要求低很多适合纯CPU推理。拉取完成后模型存在~/.ollama/models下但直接拷这个目录到离线机器不一定能用因为manifest里的路径和blob命名是绑定的更稳妥的方式是导出modelfile再重建。3.2 导出modelfile并定位GGUF文件这一步是整个离线迁移的核心。ollama show --modelfile会把模型的完整定义打印出来其中FROM那一行指向的就是实际的模型权重文件。# 查看模型的modelfile定义 ollama show --modelfile deepseek-r1:14b输出内容里找到FROM开头的那一行它后面跟的是一个路径通常指向~/.ollama/models/blobs/sha256-xxxx这样的文件。把这个路径记下来然后把整个输出内容复制保存成modelfile.txt。接着把FROM指向的那个blob文件复制出来重命名为deepseek-r1-14b.gguf。# 假设FROM指向的blob路径是 /root/.ollama/models/blobs/sha256-6e9f90f02bb3... # 复制并重命名 cp /root/.ollama/models/blobs/sha256-6e9f90f02bb3b39b59e81916e8cfce9deb45aeaeb9a54a5be4414486b907dc1e \ /tmp/deepseek-r1-14b.gguf # 确认文件大小14b模型约9GB ls -lh /tmp/deepseek-r1-14b.gguf同时要修改modelfile.txt里的FROM行把原来的blob路径改成新的gguf文件名这样在离线机器上导入时才能找到文件。改完后把modelfile.txt和deepseek-r1-14b.gguf一起拷到离线机器比如放到/opt/deepseek/下。3.3 在离线机器上导入模型离线机器上ollama服务已经在跑现在用ollama create从modelfile导入模型。# 进入存放modelfile和gguf的目录 cd /opt/deepseek # 从modelfile创建模型-f指定modelfile路径 ollama create deepseek-r1:14b -f modelfile.txt导入过程会输出一系列copying file、parsing GGUF、creating new layer的日志最后出现success就表示导入完成。这里的逻辑是ollama读取modelfile里的FROM指向的gguf文件解析GGUF格式然后按自己的blob结构重新组织存储到OLLAMA_MODELS指定的目录下。导入完成后验证# 列出已导入的模型 ollama list # 运行模型进入交互 ollama run deepseek-r1:14bollama list应该能看到deepseek-r1:14b大小约9GB。ollama run进入交互后出现提示符就说明模型加载成功可以输入问题测试。纯CPU推理首token延迟会比较明显14b模型在飞腾FT-2000上大概几秒到十几秒出第一个字后面逐字输出属于正常范围。3.4 配置模型开机自启ollama服务本身开机自启了但模型不会自动加载需要再写一个systemd单元来拉起模型。sudo vim /etc/systemd/system/deepseek.service[Unit] Descriptiondeepseek Service Afterollama.service [Service] ExecStart/opt/deepseek/ollama/bin/ollama run deepseek-r1:14b ExecStop/opt/deepseek/ollama/bin/ollama stop deepseek-r1:14b Userollama Groupollama Restartalways RestartSec3 EnvironmentFile/opt/deepseek/ollama/ollama.conf [Install] WantedBydefault.targetAfterollama.service保证ollama先起来再拉模型ExecStop在服务停止时卸载模型释放内存。启用sudo systemctl daemon-reload sudo systemctl enable deepseek注意这个单元只enable不start因为模型常驻内存会占资源按需启动更合理。如果希望开机就加载加一个sudo systemctl start deepseek即可。4. 装chatbox客户端并配桌面图标AppImage在麒麟上的落地模型跑起来了但命令行交互对普通用户不友好chatbox作为图形客户端能直接对接ollama的API。麒麟V10是ARM64架构chatbox官方提供了arm64的AppImage包AppImage的好处是免安装、单文件、双击即用但在麒麟上直接双击可能会因为缺依赖或没执行权限而失败需要补几个步骤。4.1 AppImage的放置与执行权限把下载的AppImage放到/opt/deepseek下然后赋予执行权限。# 进入工作目录 cd /opt/deepseek # 赋予执行权限 chmod x Chatbox-1.9.8-arm64.AppImage # 先命令行试运行确认能起来 ./Chatbox-1.9.8-arm64.AppImage命令行运行能看到chatbox窗口弹出就说明AppImage本身没问题。如果报错提示缺库最常见的是缺zlib1g-dev麒麟的源里如果有就直接sudo apt install zlib1g-dev离线环境则用dpkg装对应的deb包sudo dpkg -i zlib1g-dev_1%3a1.2.11.dfsg-2kylin1.5k0.2_arm64.deb装完依赖再运行AppImage一般就能正常启动。4.2 制作桌面图标AppImage每次都要进目录敲命令太麻烦做一个.desktop文件放到桌面双击就能开。# 在桌面创建desktop文件 sudo vim ~/Desktop/Chatbox.desktop[Desktop Entry] Version1.0 NameChatbox CommentAI Chat Client Exec/opt/deepseek/Chatbox-1.9.8-arm64.AppImage Icon/opt/deepseek/Chatbox.png Terminalfalse TypeApplication CategoriesUtility;Application;Exec指向AppImage的绝对路径Icon指向提前准备好的png图标Terminalfalse表示不弹终端窗口。保存后赋执行权限chmod x ~/Desktop/Chatbox.desktop双击图标就能打开chatbox。如果图标显示为空白或双击无反应检查Exec路径是否写对、AppImage是否有执行权限、Icon文件是否存在。4.3 配置chatbox对接ollama打开chatbox后进设置模型提供方选OLLAMA APIAPI域名填http://127.0.0.1:11434模型选deepseek-r1:14b。11434是ollama的默认端口如果之前改过OLLAMA_HOST的端口这里要对应改。配置保存后新建对话输入问题就能看到模型回复。远程连接的情况比如在另一台网络互通的机器上装chatboxAPI域名填ollama所在机器的IP加端口比如http://192.168.1.100:11434。前提是ollama的OLLAMA_HOST设成了0.0.0.0且防火墙放行了11434端口。OLLAMA_ORIGINS*也是为远程跨域准备的如果只本机用可以收紧成具体域名。5. 避坑与排查离线部署里最容易翻车的五个点这套流程走下来大部分问题集中在权限、路径、依赖和网络配置上。下面五条是实际部署里出现频率最高的每条按现象、原因、解决三段说。5.1 ollama服务启动失败日志报permission denied现象systemctl status ollama显示failedjournalctl里看到permission denied打开某个文件或目录。原因ollama目录的属主没改成ollama用户或者OLLAMA_MODELS指向的目录ollama用户没有写权限。systemd以ollama身份跑服务但目录还是root的自然写不进去。解决sudo chown -R ollama:ollama /opt/deepseek/ollama确认OLLAMA_MODELS指向的目录也在chown范围内。如果模型目录单独放在别处也要一并chown。5.2 导入模型时报file not found现象ollama create执行到一半报找不到文件或者parsing GGUF阶段失败。原因modelfile.txt里的FROM行还指向原来的blob路径没改成重命名后的gguf文件名或者gguf文件不在当前工作目录下ollama按相对路径找不到。解决打开modelfile.txt确认FROM那行写的是deepseek-r1-14b.gguf而不是一长串sha256路径且gguf文件和modelfile在同一目录执行ollama create时也在这个目录下。5.3 chatbox连不上ollama提示connection refused现象chatbox配置好API域名后发消息报连接失败。原因三种可能——ollama服务没跑、OLLAMA_HOST没设成0.0.0.0导致只监听本地、防火墙挡了11434端口。解决先systemctl status ollama确认服务在跑再ss -tlnp | grep 11434看监听地址是不是0.0.0.0:11434如果是127.0.0.1:11434就改ollama.conf里的OLLAMA_HOST然后重启服务。远程访问还要确认防火墙放行。5.4 当前用户加组后不生效现象usermod -a -G ollama $(whoami)执行了但当前终端还是读不了模型目录。原因Linux的组权限在登录时确定改完组之后当前会话不会自动刷新要重新登录或开新终端才生效。解决退出当前终端重新登录或者用newgrp ollama临时切换组。最省事的办法是直接开一个新终端窗口。5.5 AppImage双击无反应或报缺库现象桌面图标双击没反应或者命令行运行报error while loading shared libraries。原因麒麟V10的ARM环境里缺AppImage运行需要的依赖库最常见的是zlib相关。解决命令行运行AppImage看具体报错缺什么装什么。zlib1g-dev用dpkg离线装其他库同理。装完依赖再试确认AppImage有执行权限。6. 进阶技巧用ollama API做批量推理和远程调用命令行交互和chatbox适合日常对话但如果要把模型能力接进自己的脚本或系统直接调ollama的HTTP API更灵活。ollama暴露了/api/generate和/api/chat两个主要端点前者单轮生成后者多轮对话。下面这段Python脚本演示怎么批量跑问题列表把结果存成文件适合做批量测试或数据标注。import requests import json # ollama服务的地址本机就是127.0.0.1远程换成对应IP OLLAMA_URL http://127.0.0.1:11434/api/generate # 待处理的问题列表 questions [ 用一句话解释什么是操作系统, ARM架构和x86架构的主要区别是什么, 什么是GGUF格式, ] results [] for q in questions: payload { model: deepseek-r1:14b, # 模型名要和ollama list里一致 prompt: q, stream: False, # False表示等生成完一次性返回 options: { temperature: 0.7, # 控制随机性0到1之间 num_predict: 256, # 最多生成256个token } } # 超时设长一点纯CPU推理首token慢 resp requests.post(OLLAMA_URL, jsonpayload, timeout300) data resp.json() results.append({ question: q, answer: data.get(response, ), eval_count: data.get(eval_count, 0), # 生成的token数 }) print(f完成: {q[:20]}...) # 结果写文件 with open(/opt/deepseek/batch_results.json, w, encodingutf-8) as f: json.dump(results, f, ensure_asciiFalse, indent2) print(f共处理 {len(results)} 条)这段脚本的关键参数有三个stream设False适合批量场景不用处理流式分块temperature控制输出随机性做事实性问答可以调到0.2左右更稳定num_predict限制最大生成长度防止单条卡太久。timeout要设大纯CPU上14b模型生成256个token可能要一两分钟设小了会超时。远程调用时把OLLAMA_URL换成ollama所在机器的IP前提是OLLAMA_HOST已经设成0.0.0.0且防火墙放行。如果脚本跑在另一台机器上还要确认网络互通。批量跑的时候建议加个间隔或控制并发ollama默认单请求串行处理同时发太多会排队。验证API是否通可以先用curl快速测一下# 测ollama是否响应 curl http://127.0.0.1:11434/api/tags # 测生成接口 curl http://127.0.0.1:11434/api/generate -d { model: deepseek-r1:14b, prompt: 你好, stream: false }/api/tags返回模型列表能看到deepseek-r1:14b就说明服务正常。/api/generate返回JSON里response字段就是模型输出。这两个接口通了后面接什么系统都好办。从那以后我每次在离线环境部署模型都先把ollama.conf里的OLLAMA_MODELS和OLLAMA_HOST确认一遍再启动服务这两个参数错了后面全是白忙。模型导入前也一定先ollama show --modelfile把FROM路径核对清楚重命名那步看着简单实际最容易漏。希望帮到你。本文还有配套的精品资源点击获取