这两年做国产化环境下的本地化大模型部署,最大的感受就是:网上教程一抓一大把,但真正能在一台国产服务器上顺顺当当跑起来的,少得可怜。很多文章默认你用的是Intel/AMD加NVIDIA,默认你的操作系统能随便apt/pip,默认你的容器镜像能随便拉——可一旦环境切换到国产CPU、国产操作系统、国产AI加速卡的组合拳,这些默认条件几乎全部作废。
这篇文章,我结合自己落地过的几个国产化项目,把本地化服务器架构从硬件选型、模型选型、推理框架、数据接入到稳定运行踩过的坑,尽量完整地捋一遍。内容偏实操,适合正在做国产化迁移的运维、后端和算法同学参考。不吹不黑,把我踩过的和看到的都写出来。
1. 先看硬件底座:国产化部署的“第一道坎”是架构互认
很多人拿到一台国产服务器,第一反应是装系统、装驱动、跑模型,结果第一步就卡住了:驱动装不上,或者PyTorch压根识别不到算力卡。这不是你操作的问题,是生态没有打通。
1.1 CPU和操作系统的“组合拳”先盘清楚
国产化环境最常见的几个CPU路线:鲲鹏(ARM架构)、飞腾(ARM/自主架构)、龙芯(LoongArch)、海光(x86兼容)、兆芯(x86兼容)。不同CPU直接决定了你的软件包从哪儿来,因为很多基础软件在ARM上编译会有坑,在LoongArch上更是冷门。
操作系统这边,统信UOS和麒麟(银河麒麟、中标麒麟)出现频率最高。具体是哪个版本的内核、哪个glibc版本,直接影响驱动能不能装。比如昇腾的驱动和CANN(异构计算架构)对内核版本和系统版本有严格匹配关系,系统版本太新或太老都可能装不上。
我建议所有项目开工前,先做一张环境矩阵表。别嫌麻烦,这张表能救你后半程的命:
| 组件 | 必查项 | 常见坑 |
|---|---|---|
| CPU | 架构(x86/ARM/LoongArch) | ARM环境很多软件无预编译包 |
| 操作系统 | 发行版、内核版本、glibc版本 | 内核太新,驱动不认 |
| 算力卡 | 型号、驱动版本、计算框架版本 | CUDA/CANN/寒武纪工具链不互通 |
| Python | 版本、是否conda | 3.10以上部分框架支持差 |
| 容器 | Docker是否可用、是否内网离线 | 镜像拉不下来 |
我之前在一个项目里就是栽在版本匹配上:机器是飞腾CPU,系统是银河麒麟V10,想装寒武纪的加速卡驱动,结果驱动要求内核版本必须低于某个值,而系统自带内核比那个高,最后只能找厂商要定制版内核。这类问题如果前期做矩阵盘点时不查,中期跳出来特别耗时间。
1.2 算力卡的“适配陷阱”:没有CUDA,一切都得绕道
国产化项目里,最常见的几类AI算力卡:华为昇腾(310P、910B系列)、寒武纪(MLU370系列)、海光DCU、天数智芯等。这些卡在硬件性能上各有千秋,但在软件生态上,跟NVIDIA的CUDA差距是真真实实存在的。
最核心的问题是:很多模型和推理框架只适配了CUDA,国产卡要走的是各自的兼容层或适配层。昇腾有CANN和MindIE,寒武纪有PyTorch的适配版本,海光DCU号称兼容ROCm生态,但真正跑起来都有一堆“磨人”的细节。
比如昇腾卡,模型要先用ATC工具转成OM模型,或者用MindIE做在线推理;如果直接用PyTorch,走的是torch_npu插件,很多算子不支持。寒武纪那边也有类似问题。所以选型时别只看硬件参数,得先确认你打算用的模型和框架有没有官方适配。
一个相对稳妥的验证方法:把“最小闭环”做到最快——先用一张卡、一个小模型(比如1.5B的参数),跑通一个简单的推理请求。如果这一步能在半天内跑通,说明后面大模型的路大概率能走通;如果这一步就卡了两三天,赶紧评估换硬件或者换方案,别硬扛。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 模型选型:不是所有大模型都适合往国产环境里塞
大模型不是越大越好。在国产化部署里,选模型的逻辑跟用NVIDIA GPU时完全不一样:要优先考虑能不能跑、好不好适配、部署之后推理时延能不能接受。模型再强,跑不动或者跑起来太慢,业务也接不住。
2.1 参数量、量化级别和显存/内存的估算逻辑
很多人问:“7B模型到底要多少显存?”这个问题如果不把量化和框架开销算进去,答案往往不准。
一个粗略但好用的估算基准:权重本身占的量 = 参数量 × 每个参数占用的字节数。FP16是2字节,INT8是1字节,INT4约0.5字节。然后还得加上KV Cache、中间激活值、框架自身开销。实际经验是,7B模型FP16权重大约14GB,推理时显存要再留6-8GB;如果做INT8量化,权重约7GB,整体10-12GB基本能跑。
| 模型规模 | 精度 | 权重占用 | 推理建议显存 |
|---|---|---|---|
| 7B | FP16 | 约14GB | 20GB以上 |
| 7B | INT8 | 约7GB | 12GB以上 |
| 7B | INT4 | 约4GB | 8GB以上 |
| 13B | INT8 | 约13GB | 20GB以上 |
| 33B | INT8 | 约33GB | 48GB以上 |
这里要特别提醒:国产卡对量化的支持程度不一样。有些框架在INT8量化上做得不错,但INT4可能没有高效内核,跑起来的收益很有限,甚至因为反量化开销导致更慢。所以别光看显存能不能装下,也要看推理框架对量化格式的支持情况。我踩过的一个坑就是,在寒武纪卡上用INT4量化跑7B模型,显存是够了,但推理速度反而比INT8慢。
2.2 模型文件获取与可信度问题
国产化环境大多在内网,外网访问受限。模型文件怎么进去,是个容易被低估的大问题。
方案一般有三种:一是用移动硬盘拷进去,最朴素也最可靠;二是通过内网中转服务器搭一个私有模型仓;三是如果环境能访问特定镜像站,直接从镜像站拉。第二条路我建议稍微花点时间做出来,因为后面迭代模型、加新模型都会用到。
另一个容易被忽视的问题:模型的来源验证。大模型文件动辄几个GB到几十GB,从第三方渠道获取时一定要核对哈希值。圈子里发生过把模型文件替换成恶意版本的情况,模型“投毒”后的行为很难排查,而且大模型是数据敏感系统,投毒测试这类问题在国产化落地时尤其需要重视。不管从哪个渠道拿模型,拿到之后先算SHA256,跟官方公布的摘要对一遍,这是基本操作。
2.3 多模态、知识抽取等场景的模型组合问题
如果业务不只是聊天机器人,还要做知识库问答、OCR、信息抽取,那问题就变得更复杂。比如国产化项目里经常要做“关系数据库的数据加工成大模型能读懂的数据”,这背后涉及知识抽取框架(比如OneKE)、Embedding模型、RAG流程。这些组件的模型都得逐一适配。
有一次我们做了一个农业场景的落地项目,需要把土壤、气象传感器数据和大语言模型结合,做实时监测、智能灌溉施肥的决策辅助。真正的难点不是模型本身,而是把这些结构化数据转成模型能接受的文本或向量,再配合提示词模板。模型选型只是第一步,后面数据管线和框架适配的工作量,往往比模型本身还大。
3. 推理框架与部署形态:Ollama、Dify、RAGFlow各有各的脾气
模型选好之后,下一步就是用什么框架把它跑起来。这块的坑最多,因为网上教程多、案例少,很多教程在NVIDIA环境能跑通,换到国产环境就各种报错。
3.1 框架选型:先明确你的场景需要什么
我的经验是,先回答三个问题再选框架:
- 你是只做模型推理,还是需要做完整的应用编排?
- 你的并发请求量大概多少?
- 你的团队后续是自己维护,还是希望平台化?
| 框架 | 优势 | 局限 | 适合场景 |
|---|---|---|---|
| vLLM | 吞吐高、推理优化好 | 对国产卡适配参差不齐 | 生产级纯推理服务 |
| Ollama | 安装简单、内置量化模型 | 管理功能弱、并发吞吐一般 | 单机部署、快速验证 |
| Dify | 应用编排完整、插件机制丰富 | 本地化插件部署有坑 | RAG应用、Agent工作流 |
| RAGFlow | 文档解析能力强 | 部署组件多、依赖复杂 | 深度知识库场景 |
| MindIE(昇腾) | 华为官方推理引擎 | 只支持昇腾 | 昇腾卡生产部署 |
如果你只是想在国产单机上跑个DeepSeek、GLM之类的开源模型供小团队试用,Ollama绝对是最快的,命令少、模型管理方便。但如果要做成业务系统,Ollama的并发能力和可观测性都不太够,建议直接用vLLM。
Dify和RAGFlow则更适合做应用层。Dify有可视化的工作流编排,插件生态也很丰富,但“dify本地化插件部署太难了”这句话,我深有体会。插件要拉取Docker镜像,国产内网环境经常拉不下来,网上教程大多默认有外网,很容易卡在镜像拉取环节。
3.2 Docker离线部署:没有外网的镜像搬运指南
国产化内网环境,容器化部署几乎是标配。但它最大的痛点就是镜像来源问题。没有外网,Docker Hub访问不了,镜像怎么进来?
标准做法是在一台有外网的机器上把需要的镜像拉好,然后docker save成tar包,搬到内网后docker load。但这里有个细节很多人会忽略:同一个镜像的不同版本、不同架构,保存时体积会很大;而且ARM架构的镜像必须是在ARM机器上拉取,或者使用docker pull --platform指定架构。跨架构拉镜像,跑起来会直接报exec format error。
还有一个更隐蔽的坑:镜像里的基础层可能依赖某些内网没有的DNS解析。即使镜像成功load进来,容器内部如果要做反向代理或者访问内网服务,DNS配置必须跟着内网环境改。前面热词里提到“windows架构dns服务器”相关的部署问题,Windows上的DNS配置和Linux容器里的配置是两回事,别拿Windows的思维去配Linux容器。
Dify这块,如果是离线部署,光是构建它的子组件镜像就够折腾:API服务、Worker、Postgres、Redis、Weaviate、Sandbox等等。我的建议是先把所有组件列个清单,逐个拉取离线保存,再在内网一台机器上搭一个私有Registry(比如Harbor)。这样后续扩展组件,只需要从Registry拉,不用再等搬运工。
3.3 进程托管与开机自启
很多人部署好之后,一个nohup或者一个docker run就完事了。但生产环境不能这么干。大模型服务一挂,业务就断,必须把进程托管做好。
Docker容器用--restart always是基本盘。如果是裸机进程用vLLM或者Ollama,建议写systemd服务单元。这里有个细节:Ollama默认的下载目录在用户主目录下,通过systemd运行时,HOME环境变量可能不对,导致模型路径出问题。我遇到过的最诡异的一个case,是服务全部正常,但模型就是加载不出来,排查半天发现是systemd指定的用户和Ollama默认目录不一致。
4. 业务数据接入:从关系数据库到检索增强,数据清洗的量比想象中大
模型部署完成,才到真正“见真章”的部分——让大模型处理你现有的业务数据。这往往是国产化项目里耗时最长、返工率最高的环节。
4.1 把关系数据库里的数据“加工”成大模型能懂的数据
很多业务系统里,数据都存在MySQL、PostgreSQL或者国产数据库(达梦、人大金仓等)里。但大模型本身不是数据库,它没法直接跑SQL。要做到业务场景的问答,通常得把关系数据转成检索增强生成(RAG)能用的形式。
具体加工链路大概是:先做数据抽取,从表结构里把业务字段提取出来;然后做知识结构化,把一条条记录转成自然语言描述或知识图谱结构;再用知识抽取框架(比如OneKE)抽取出实体、关系、属性;最后向量化存入向量数据库。
这里最容易被低估的是数据预处理的“脏活量”。比如,一个数据库里有几万条记录,每条记录有几十个字段,不是所有字段都适合进知识库。你写清洗规则的时候,必须跟业务方反复确认:哪些字段敏感不能进库、哪些字段是无效的、哪个字段最能代表一条记录的核心含义。这些规则不确认清楚,后面嵌入和检索的效果都会打折扣。
4.2 文档解析与切片:RAG应用的效果瓶颈在索引
RAGFlow这类工具,处理PDF、Word等文档的能力比传统方案强很多,但在国产化场景用起来仍然要调。文档里的表格、扫描件、复杂排版,解析效果直接决定后续检索质量。
切片策略是另一个常被忽视的环节。切片太小,检索到的上下文不完整;切片太大,检索噪音高、向量化效果差。我常用的经验值:一般中文文档按二级标题或段为基本单位切,每片控制在500-800字;代码或表格类内容单独处理,不要跟正文混在一起。
花了大把时间选Embedding模型、调向量数据库参数,最后发现效果差,大概率不是模型问题,而是文档解析和切片的“底座”没打好。这个结论我反复验证过多次:先保证解析和切片质量,再谈Embedding模型的优劣。
4.3 向量库选型:国产化环境下的轻量选择
热词里提到Doris安装部署,Doris确实是分析型数据库里常见的国产化选择,但Doris本身不是向量数据库。如果只是做RAG的向量检索,与其在Doris上硬凑,不如直接选轻量方案。
单机场景,用专门的向量库或支持向量检索的数据库都可以。考虑到部署复杂度,在国产化单机上我更多推荐直接用支持向量索引的轻量方案,比如用SQLite加向量扩展,或者用PostgreSQL的pgvector。如果团队熟悉某款OLAP数据库,也可以用它的向量检索能力,但前提是确认版本支持以及内网依赖能否解决。
一个踩过的坑:部署了一个专门的向量数据库服务,结果它的启动参数里需要指定外网HuggingFace模型下载做文本嵌入,导致启动卡死。后来改成离线加载Embedding模型,才正常。做国产化项目,所有涉及模型下载的步骤都要提前考虑离线方案。
5. 稳定运行与调优:部署成功之后才是真正的开始
模型成功跑起来、业务也能问答了,很多人觉得“上线了”。但真正到了生产环境,并发一上来、磁盘一满、进程一崩,之前没考虑的问题全冒出来了。稳定运行这块,是国产化部署里最容易被忽视、但后期最要命的环节。
5.1 依赖离线安装:从PyPI到conda的内网源
先说依赖这关。大模型部署相关的Python库多且杂,内网环境不能直接联网下载,每一层都存在离线依赖问题。
一个可靠的做法:在一台有外网的、同架构的机器上,用pip download -r requirements.txt -d ./packages把依赖包全部下载好,连同requirements文件一起搬到内网,再pip install --no-index --find-links=./packages安装。注意必须保持架构一致,ARM机器上的包不能拿x86的顶替。
conda环境同理,可以在外网用conda-pack打包环境,直接带到内网解压。这招我在飞腾的机器上用过,比重新装一遍环境省太多时间。
5.2 监控、日志与“过载雪崩”问题
大模型服务跟普通Web服务的一个显著区别:单次请求的算力开销和响应时间极不稳定。同样的输入,可能几秒返回,也可能几十秒还在生成。这种不稳定性导致一个常见现象——“过载雪崩”。
当请求QPS超过一定阈值,推理服务的队列会迅速积压,每个请求都在等GPU/NPU,整体吞吐反而下降,最终服务假死。处理这个问题的思路跟普通服务限流差不多,但阈值要通过对真实场景压测得出。
监控方面,Zabbix在国产化环境里出现频率很高。除了常规CPU、内存、磁盘,一定要把GPU/NPU的关键指标加进去:显存/内存占用、温度、算力利用率、排队请求数。尤其是队列长度,这是判断服务是否要雪崩的早期信号。
我自己的经验是,把“队列请求数超过某个值”设成告警条件,比看CPU利用率灵敏得多。因为大模型服务CPU利用率和卡利用率往往不是线性关系,光看前者很容易误判健康度。
另一个隐蔽问题:日志与磁盘空间。模型推理服务因为每次请求的输入输出文本长,日志增长极快,7B模型服务跑一天,日志几十GB不是开玩笑。务必做日志轮转,并且确认日志所在磁盘空间。有一次项目上线没几天,系统提示磁盘满,结果不是模型文件放的,是容器日志撑爆了磁盘。
5.3 并发与资源分配的经验值
并发能力不能拍脑袋定。一个直观的估算方法:先测单请求平均响应时间。如果7B模型一次推理平均5秒,单卡单实例的极限QPS大概在0.2左右(理论值,实际还要打折),那么想支撑10 QPS,至少需要50个并发实例的算力。
但算力卡数量有限,所以更现实的办法是三个方向组合:第一,用vLLM这类连续批处理框架,把多个请求拼成一个批次推理,吞吐能提升好几倍;第二,减少最大生成长度,很多时候业务根本不需要8192个token的上下文;第三,对同一个模型起两个实例做负载均衡,而不是一个实例硬扛。
实测下来,vLLM在适配到位的条件下,单卡吞吐通常能达到Ollama的3-5倍。这也是我为什么建议做生产系统直接上vLLM的原因。前提是确认vLLM版本对国产卡的适配情况,有些国产卡需要用特定的vLLM分支或兼容层。
5.4 关于“一键部署脚本”的态度
国产化环境里最不可信的一句话就是“一键部署”。很多网上流传的部署脚本,默认带有外网、默认有NVIDIA GPU、默认系统里装了全套依赖。到了国产环境,这三个默认条件几乎全不成立。
我的建议是:脚本要看,但别直接跑。把脚本拆开,逐段理解它做了什么,跟你自己的环境差异在哪里,然后改成你自己的版本。这个过程确实耗时,但一旦做出来,后面多台机器批量部署就爽了。
比如Ollama官方脚本,本质就是下载二进制文件和systemd配置;Dify的docker-compose,本质就是把各个服务编排起来。逐个理解清楚,再根据内网镜像源、国产卡驱动做调整,就完全可控了。
6. 个人最后的几点体会
把国产化大模型部署这件事做完一遍之后,我最大的体会是:这不是一个纯算法问题,而是一个系统工程问题。真正的门槛不在大模型本身,而在GPU/NPU适配、内网依赖、数据清洗和稳定性保障这些“脏活累活”上。
如果让我给准备做国产化落地的团队提一个最直接的建议:先盘环境、再选模型、最后才谈框架。环境矩阵没盘清楚之前,不要轻信任何一份教程里的部署步骤。你最信任的,应该是自己测试出来的一张表格、一套离线依赖包、一条条验证过的命令。
另外一个经验是:从最小闭环开始。不要一上来就上33B模型、上完整的Dify+RAGFlow+向量库全套,先用一台机器、一个小模型、一个最简单的问答接口跑通全链路,确认每一环都没问题,再往大了加。这样做,遇到问题时排查范围会小很多,心态也会稳很多。
最后再分享一个小技巧:把整个部署过程中的所有坑、所有错误提示、所有解决办法,都记在一个文档里。这个文档最后会变成团队最值钱的知识库。大模型部署的问题大多有极强的场景性,过了几个月再遇到类似情况,翻这个文档比重新踩一遍坑高效太多。
