离线内网服务器部署 Qwen2.5-7B 本地大模型完全指南 离线内网服务器部署 Qwen2.5-7B 本地大模型完全指南目标在完全离线的内网 GPU 服务器上从零部署一个免费、可商用的本地大模型 (Qwen2.5-7B)专门用于从 OCR 识别出的文字中智能提取业务字段且不能影响已有的 PaddleOCR 服务。硬件环境NVIDIA L20 (46 GB 显存)、Ubuntu 24.04、Docker 27.3.1、已有 PaddleOCR 服务 (占用约 21 GB 显存)。核心挑战离线环境无法访问任何外网、显存紧张剩余约 25 GB、堡垒机链路资源过载会导致失联、技术栈为 C#。整个过程历时半天最终成功在11434端口启动 Ollama Qwen2.5-7B 量化模型显存占用仅增加约5 GB与原有 OCR 服务和平共处。本文将详细记录每一步操作、命令解释以及踩坑总结可作为未来离线部署大模型的参考手册。一、方案选型为什么选择 Ollama Qwen2.5-7B部署大模型前我们评估了三种常见方案方案部署难度显存占用适用场景Ollama Docker⭐ 极低几行命令低 (使用量化版)快速部署、API 调用、低并发vLLM (原生或Docker)⭐⭐⭐ 较高需手动调优中等高并发、生产环境、极致吞吐一体化 Docker 镜像⭐ 低高 (镜像内含完整模型)开箱即用但体积大、版本滞后最终选择 Ollama 的理由部署难度最低Ollama 封装了模型加载、GPU 调度、API 服务等复杂细节仅需几条命令即可完成部署。其离线安装方式与当初搬运 PaddleOCR 镜像的思路完全一致。显存友好支持导入 GGUF 格式的量化模型Q4_K_M 量化版仅占用约 5 GB 显存与 OCR 服务21 GB共存毫无压力。API 风格简洁提供标准的 HTTP APIC# 调用与普通 REST 接口无异无需额外 SDK。模型合规Qwen2.5-7B 采用 Apache 2.0 开源协议完全免费且可商用无任何法律风险。二、硬件环境确认部署前务必检查服务器资源避免因资源不足导致服务异常或堡垒机失联之前曾有类似事故。1. GPU 显存余量检查nvidia-smi输出示例GPU Name ... Memory-Usage 0 NVIDIA L20 ... 21264MiB / 46068MiB当前已占用约 21 GB主要是 PaddleOCR 的 VLLM 引擎剩余约24 GB远超 Q4_K_M 量化模型的需求约 5 GB。2. Docker 环境检查docker--version# 确保版本足够新 (27.3.1 可用)nvidia-container-toolkit--version# 确保容器能访问 GPU如果没有安装nvidia-container-toolkit请先联系管理员安装通常已具备因为 PaddleOCR 容器已在用 GPU。3. 磁盘空间检查df-h/root/hjl/data/确保目标目录有至少20 GB可用空间Docker 镜像约 2 GB 模型文件约 5 GB。4. 内存检查free-h总内存 251 GB可用超过 200 GB非常充裕。三、第一阶段在联网电脑上准备离线资源由于服务器无法访问外网我们需要在一台可上网的电脑例如你的 Windows 开发机上提前下载好所有文件再通过 U 盘或内网共享传入服务器。1. 拉取 Ollama Docker 镜像使用国内加速直接从 Docker Hub 拉取可能非常缓慢我们使用华为云的国内镜像加速# 在联网的 Windows PowerShell 中执行docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/ollama/ollama:latest下载完成后将其保存为一个 tar 文件以便离线传输docker save-o D:\ollama.tar swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/ollama/ollama:latest文件大小约1.75 GB。2. 下载 Qwen2.5-7B-Instruct-Q4_K_M.gguf 量化模型文件Ollama 原生支持 GGUF 格式且 Q4_K_M 量化版已在精度和显存之间取得良好平衡无需再次转换一步到位。下载链接国内镜像 hf-mirror可直接访问https://hf-mirror.com/bartowski/Qwen2.5-7B-Instruct-GGUF/resolve/main/Qwen2.5-7B-Instruct-Q4_K_M.gguf文件大小约4.5 GB。若链接失效可访问 hf-mirror.com 搜索 “Qwen2.5-7B-Instruct-GGUF” 手动下载同名文件。将下载好的ollama.tar和.gguf文件一同拷贝到 U 盘或移动硬盘然后传入服务器的/root/hjl/data/目录。四、第二阶段在服务器上导入镜像并启动容器1. 加载 Docker 镜像cd/root/hjl/data/dockerload-iollama.tar验证dockerimages|grepollama输出应包含swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/ollama/ollama:latest。2. 创建模型数据持久化目录mkdir-p/data/ollama-dataOllama 导入模型后会在此目录下存储量化后的模型文件映射到宿主机可避免容器删除后模型丢失。3. 启动 Ollama 容器这里是一行完整命令避免换行符问题dockerrun-d--nameollama--gpusall-p11434:11434-v/data/ollama-data:/root/.ollama-v/root/hjl/data:/models/host--memory16g--restartunless-stopped swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/ollama/ollama:latest参数详解参数含义--name ollama容器命名为ollama方便后续docker exec进入--gpus all允许容器使用全部 GPU没有此参数模型将仅用 CPU速度极慢-p 11434:11434将容器内 Ollama API 的默认端口映射到宿主机供 C# 程序调用-v /data/ollama-data:/root/.ollama持久化模型存储容器重启不丢失模型-v /root/hjl/data:/models/host将宿主机存放.gguf文件的目录挂载为/models/host容器内可直接访问--memory16g限制容器最大内存使用为 16 GB防止内存泄漏耗尽主机资源导致堡垒机失联--restart unless-stopped容器异常退出或主机重启后自动恢复保证服务可用性启动后检查dockerps|grepollama状态应为Up。五、第三阶段在容器内导入 Qwen2.5-7B 模型1. 进入容器dockerexec-itollamabash2. 创建 ModelfileModelfile 是 Ollama 的模型配置文件用来指定模型文件路径和对话模板。cat/tmp/Modelfile_ggufEOF FROM /models/host/Qwen2.5-7B-Instruct-Q4_K_M.gguf TEMPLATE |im_start|system {{ .System }}|im_end| |im_start|user {{ .Prompt }}|im_end| |im_start|assistant EOF为什么必须设置 TEMPLATEQwen2.5 模型在预训练时使用特殊的标记|im_start|和|im_end|来区分系统提示、用户输入和助手回答。如果缺少这个模板模型将无法正确理解对话格式导致输出混乱甚至无响应。3. 创建模型ollama create qwen2.5:7b-f/tmp/Modelfile_gguf此步骤会读取 GGUF 文件并注册为一个名为qwen2.5:7b的模型耗时约 1 分钟。验证ollama list应输出类似NAME ID SIZE MODIFIED qwen2.5:7b xxxxxxxxxxxx 4.7 GB Just now退出容器exit4. 检查显存占用在宿主机执行nvidia-smi你会看到显存占用仅增加了约4.7 GB总占用约 26 GB离 46 GB 上限还有充足余量。六、第四阶段功能验证与 API 集成1. 本地命令行测试curlhttp://localhost:11434/api/generate-d{ model: qwen2.5:7b, prompt: 请返回一个JSON{\status\:\ok\}, stream: false }若返回类似{model:qwen2.5:7b,response:{\status\:\ok\},done:true}的 JSON则说明模型服务正常工作。2. 开放防火墙端口如需要如果11434端口被公司网络设备拦截就像当初的6511端口一样需要提工单申请开放 TCP 端口11434用途说明“内部 AI 智能字段提取 API 服务”。3. 在 C# 业务代码中调用目前你已有DeviceController只需在extract接口中调用 Ollama API 即可。调用示例varclientnewHttpClient{BaseAddressnewUri(http://10.13.13.221:11434)};varpayloadnew{modelqwen2.5:7b,prompt你的字段提取提示词,streamfalse};varresponseawaitclient.PostAsync(/api/generate,newStringContent(JsonSerializer.Serialize(payload),Encoding.UTF8,application/json));七、常见错误与解决方案问题现象可能原因解决办法docker run报错could not select device driver未安装 NVIDIA Container Toolkit在宿主机安装nvidia-container-toolkitollama create报错Error: unsupported architecture使用的模型文件格式不被支持如 HuggingFace safetensors换用 GGUF 格式模型Ollama 原生支持模型导入后 API 返回乱码或无响应TEMPLATE 设置错误检查 Modelfile 中的|im_start|标记是否正确容器启动后显存瞬间被占满模型加载了非量化版本确认使用的是 Q4_K_M 量化版 GGUF 文件堡垒机失去连接容器内存占用过高在docker run时增加--memory16g限制curl测试返回connection refused端口未开放或容器未监听检查防火墙规则确认docker ps中11434端口映射正常多行命令粘贴时报错command not found换行符后有多余的空格或不可见字符将整条命令复制到文本编辑器去除\后的空格再粘贴或改用单行命令八、部署完成后的服务架构服务端口功能部署方式PaddleOCR6511图片文字识别Docker 容器使用 vLLM 推理引擎Ollama Qwen2.511434文字字段智能提取Docker 容器使用量化版 GGUF 模型两个服务互不干扰在 C# Controller 中可串联上传图片 → OCR 识别 → LLM 提取字段 → 返回 EquipmentDto。九、后续维护与扩展建议模型更新若需升级或切换其他模型只需下载新模型的 GGUF 文件放入挂载目录在容器内新建 Modelfile 并用ollama create注册即可。资源监控定期检查nvidia-smi和docker stats ollama关注显存和内存使用趋势。并发优化Ollama 默认单线程推理若未来调用量增大可考虑升级到 vLLM 架构或使用多实例负载均衡。日志管理容器日志会不断累积可配置docker log rotate或在docker run时添加--log-opt max-size10m限制。至此离线内网环境下本地大模型的部署已全部完成。本文不仅记录了每一步的具体操作还解释了关键参数和常见问题的应对策略希望能为你的后续工作提供一份可复用的参考手册。