ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

openEuler 22.03 LTS 部署 Ollama 本地 AI 助手:企业级性能基准测试与 TaoToken 统一接入实践

openEuler 22.03 LTS 部署 Ollama 本地 AI 助手:企业级性能基准测试与 TaoToken 统一接入实践 1. 为什么要在 openEuler 22.03 LTS 上跑 Ollama 本地 AI 助手openEuler 22.03 LTS 是不少企业在信创环境里优先选用的服务器操作系统内核 5.10 长期支持、对 ARM/x86 双架构友好加上 dnf 包管理和 systemd 体系成熟很适合承载 Ollama 这类本地 AI 助手。Ollama 本身是一个轻量级本地大模型推理引擎一条命令就能拉起 Qwen、LLaMA、Mistral 等开源模型数据不出内网对隐私敏感的企业知识库问答、代码补全、文档摘要场景非常合适。但能跑起来和企业级可用是两回事。我在 openEuler 上部署时踩过的坑主要集中在三块一是系统默认参数对长连接推理不友好二是 Ollama 默认串行处理导致并发一上来延迟就爆炸三是本地模型能力有限遇到复杂任务还是得接云端大模型而多厂商 Key 管理又很乱。这篇就把这三件事一次讲清楚先给出可复制的 openEuler Ollama 部署与调优配置再用压测脚本量化首 Token 延迟、吞吐量和并发表现最后用 TaoToken 统一 Key/API 通道把本地 Ollama 和云端多模型接成一条链路做端到端验证。适合谁看正在做信创 AI 落地的运维/后端工程师、想把本地模型接进内部系统的开发者、需要给团队统一模型入口的技术负责人。全文命令和脚本都可以直接复制到你的 openEuler 22.03 LTS 机器上跑。2. TaoToken 前置准备统一 Key 与多模型通道本地 Ollama 解决的是数据不出内网和零边际成本的问题但它有两个天然短板一是 7B 级别模型在复杂推理、长上下文、代码生成上明显弱于云端大模型二是企业里往往同时用多家模型服务Key 分散、计费分散、切换成本高。TaoToken 的价值就在这里——它提供一个统一的 API 通道和统一 Key把多家模型服务收敛到一个 Base URL 下本地 Ollama 和云端模型可以用同一套调用习惯管理。你需要先拿到两样东西一个 TaoToken API Key以及确认要用的模型 ID。操作路径如下打开官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册并登录进入控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 在 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 创建一个新 Key复制保存。然后在模型列表里确认你要用的 Model ID比如常见的对话模型和代码模型。如果你打算长期做编码或 Agent 任务可以顺带看下 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它更适合高频调用场景。这里要强调一个概念TaoToken 的 API 入口是 https://taotoken.net/api 它兼容 OpenAI 风格的/v1/chat/completions调用方式。也就是说你本地 Ollama 用的是http://localhost:11434/api/chat云端走的是https://taotoken.net/api/v1/chat/completions两者请求体结构接近封装一层适配就能统一调用。这样内部系统只需要维护一个 Key、一个 Base URL就能在本地模型和云端模型之间按任务复杂度路由。注意API Key 属于敏感凭证不要写进前端代码或提交到 Git 仓库建议放在服务端环境变量或配置中心里。拿到 Key 之后先别急着改业务代码用一条 curl 验证通道是否通。这一步很关键很多后续报错其实是 Key 或 Base URL 写错导致的。验证命令在下一节给出。3. 可复制配置openEuler 系统调优 Ollama TaoToken 接入这一节是全文的核心操作区分三块openEuler 系统层调优、Ollama 安装与 systemd 配置、TaoToken 接入配置。每块都给可直接复制的片段。3.1 openEuler 22.03 LTS 系统层调优先更新系统并装齐依赖工具sudo dnf update -y sudo dnf install -y curl wget git vim htop sysstat python3 python3-pip pip3 install requests确认 CPU 指令集AVX2/AVX-512 对推理速度影响很大lscpu | grep -i avx cat /proc/cpuinfo | grep flags | head -1调整内核参数重点是减少 swap 换出、提升网络连接队列这对长连接推理服务很关键sudo tee -a /etc/sysctl.conf EOF vm.swappiness 10 net.core.somaxconn 65535 net.ipv4.tcp_max_syn_backlog 65535 vm.overcommit_memory 1 EOF sudo sysctl -p启用透明大页大模型推理涉及大量连续内存访问能减少 TLB 缺失echo always | sudo tee /sys/kernel/mm/transparent_hugepage/enabled echo always | sudo tee /sys/kernel/mm/transparent_hugepage/defrag3.2 Ollama 安装与 systemd 配置安装 Ollamacurl -fsSL https://ollama.com/install.sh | sh ollama --version sudo systemctl status ollama sudo systemctl enable ollama如果机器没有 GPU日志会提示走纯 CPU 模式这是正常的。接下来改 systemd 服务把并发和环境变量配好。编辑/etc/systemd/system/ollama.service在[Service]段加入[Service] EnvironmentOLLAMA_HOST0.0.0.0:11434 EnvironmentOLLAMA_NUM_PARALLEL4 EnvironmentOLLAMA_MAX_LOADED_MODELS2 EnvironmentOLLAMA_FLASH_ATTENTION1 EnvironmentOLLAMA_KEEP_ALIVE30m重载并重启sudo systemctl daemon-reload sudo systemctl restart ollama拉取模型并预热ollama pull qwen2.5:7b ollama list ollama run qwen2.5:7b 你好请用一句话介绍自己3.3 TaoToken 接入配置JSON 片段TaoToken 兼容 OpenAI 协议你可以用一个统一的客户端配置来管理。下面是一个可复制的 JSON 配置片段放在项目config/llm.json里{ local_ollama: { base_url: http://localhost:11434/api, model: qwen2.5:7b, api_key: not-required }, taotoken_cloud: { base_url: https://taotoken.net/api/v1, model: your-model-id, api_key: sk-your-taotoken-key }, routing: { simple_qa: local_ollama, complex_reasoning: taotoken_cloud, code_generation: taotoken_cloud } }如果你用 Python 的 openai SDK接入 TaoToken 只需改base_url和api_keyfrom openai import OpenAI client OpenAI( base_urlhttps://taotoken.net/api/v1, api_keysk-your-taotoken-key ) resp client.chat.completions.create( modelyour-model-id, messages[{role: user, content: 用一句话解释什么是云原生}] ) print(resp.choices[0].message.content)如果你用 Claude Code 这类工具需要配置三件套Base URL 填https://taotoken.net/apiKey 填你的 TaoToken KeyModel ID 填控制台里确认的模型名。三者缺一不可少填 Model ID 是最常见的报错来源。相关文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。4. 验证请求与性能基准测试结果配置完成后必须做端到端验证分两步先验证本地 Ollama 和 TaoToken 通道各自可用再跑压测脚本量化性能。4.1 通道连通性验证本地 Ollama 非流式验证curl http://localhost:11434/api/generate -d { model: qwen2.5:7b, prompt: 解释什么是容器技术, stream: false }TaoToken 通道验证curl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-your-taotoken-key \ -H Content-Type: application/json \ -d { model: your-model-id, messages: [{role: user, content: 你好}] }两条都返回正常 JSON 后说明本地和云端通道都通了。4.2 首 Token 延迟测试脚本把下面脚本保存为test_ttft.py运行测不同 Prompt 长度下的首 Token 延迟#!/usr/bin/env python3 import requests, time, statistics def test_ttft(prompt, iterations10): url http://localhost:11434/api/generate latencies [] for i in range(iterations): payload {model: qwen2.5:7b, prompt: prompt, stream: True} start time.time() resp requests.post(url, jsonpayload, streamTrue) first None for line in resp.iter_lines(): if line: first time.time() break if first: ttft (first - start) * 1000 latencies.append(ttft) print(f迭代 {i1}: TTFT {ttft:.2f} ms) return { mean: statistics.mean(latencies), median: statistics.median(latencies), stdev: statistics.stdev(latencies), min: min(latencies), max: max(latencies) } cases [ (短提示词, 你好), (中等提示词, 请详细解释什么是容器技术以及它与虚拟机的区别), (长提示词, 请撰写一篇关于云原生技术发展趋势的文章包括容器、微服务、DevOps、服务网格等关键技术的演进历程) ] for name, prompt in cases: print(f\n{*50}\n测试场景: {name}\n{*50}) stats test_ttft(prompt) print(f平均: {stats[mean]:.2f} ms | 中位: {stats[median]:.2f} ms | 标准差: {stats[stdev]:.2f} ms)在 16 核 32GB 的纯 CPU 实例上Qwen2.5:7b 的实测结果大致是短提示词平均 TTFT 约 645ms中等提示词约 707ms长提示词约 815ms。长提示词比短提示词多出约 26%主要消耗在 Attention 计算阶段这是 Transformer 架构的固有特性。4.3 持续吞吐量测试脚本保存为test_throughput.py跑 5 分钟持续推理#!/usr/bin/env python3 import requests, time def test_throughput(duration300): url http://localhost:11434/api/generate prompts [ 解释 Kubernetes 的核心概念, 介绍 Docker 容器技术的优势, 说明微服务架构的设计原则, 描述 CI/CD 流水线的最佳实践, 阐述云原生应用的十二要素 ] total_requests total_tokens 0 start time.time() idx 0 while (time.time() - start) duration: prompt prompts[idx % len(prompts)] idx 1 payload { model: qwen2.5:7b, prompt: prompt, stream: False, options: {num_predict: 200} } req_start time.time() try: resp requests.post(url, jsonpayload, timeout60) if resp.status_code 200: data resp.json() tokens data.get(eval_count, 0) total_requests 1 total_tokens tokens elapsed time.time() - start print(f请求 {total_requests}: {tokens} tokens, f耗时 {time.time()-req_start:.2f}s, f当前 TPS: {total_tokens/elapsed:.2f}) except Exception as e: print(f请求失败: {e}) total_time time.time() - start print(f\n总时长: {total_time:.2f}s | 请求数: {total_requests} | f总 tokens: {total_tokens} | 平均 TPS: {total_tokens/total_time:.2f}) test_throughput(300)实测下来5 分钟持续测试完成约 15 个请求、生成 3000 tokens平均吞吐量约 9.54 tokens/s平均每请求耗时约 21 秒。这个数字在纯 CPU 环境下属于正常水平说明 openEuler 的调度器能稳定利用多核资源。4.4 并发压力测试并发测试用多线程模拟多用户同时访问脚本核心逻辑是启动 N 个线程各发 10 个请求统计成功率和响应时间。实测并发度从 1 提到 4 时平均响应时间从约 15.6 秒线性增长到约 59.6 秒而请求吞吐始终维持在 0.06-0.07 req/sToken 吞吐稳定在 9.6 左右。这说明 Ollama 当前版本对单请求已经吃满 CPU并发提升不会带来吞吐增益反而拉长排队时间。企业落地时如果要多用户并发要么加机器做水平扩展要么把重任务路由到 TaoToken 云端通道。5. 本篇常见报错排查部署和接入过程中下面几类报错出现频率最高逐个对照排查。401 Unauthorized调用 TaoToken 通道时返回 401九成是 Key 写错或没带Bearer前缀。检查Authorization: Bearer sk-xxx格式确认 Key 没有多余空格。如果 Key 是从控制台复制的注意别把换行符带进去。local proxy failed / connection refused本地 Ollama 调用报连接失败先确认服务在跑sudo systemctl status ollama。如果服务正常但外部访问不了检查OLLAMA_HOST是否设成了0.0.0.0:11434默认只监听127.0.0.1。另外 openEuler 的 firewalld 可能拦了端口sudo firewall-cmd --add-port11434/tcp --permanent sudo firewall-cmd --reload。reading choices 报错 / 返回结构解析失败这类错误通常是把本地 Ollama 的响应结构和 TaoToken 的 OpenAI 结构混用了。Ollama 的/api/generate返回字段是response而 OpenAI 兼容接口返回的是choices[0].message.content。封装客户端时一定要按通道区分解析逻辑别用同一套解析代码。OAuth / 认证失败如果你用 Claude Code 或类似工具接入报 OAuth 相关错误多半是 Base URL、Key、Model ID 三件套没配全。Base URL 用https://taotoken.net/apiKey 用 TaoToken 的 KeyModel ID 必须填控制台里确认的模型名三者缺一不可。配置文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。模型加载超时 / OOMopenEuler 上内存不足时 Ollama 会加载失败。用free -h看可用内存7B 模型量化后大约需要 5-6GB。如果内存紧张换更小的模型或调低OLLAMA_MAX_LOADED_MODELS。推理速度异常慢先确认 CPU 支持 AVX2再检查是否误用了 swap。vm.swappiness10要生效另外用taskset把 Ollama 进程绑到固定核心能减少缓存失效sudo taskset -cp 0-15 $(pidof ollama)。6. 本地 云端统一接入的落地建议把本地 Ollama 和 TaoToken 云端通道接成一条链路后实际落地时建议按任务复杂度做路由简单问答、内部文档摘要走本地 Ollama数据不出内网、零调用成本复杂推理、代码生成、长上下文任务走 TaoToken 云端通道用统一 Key 管理多家模型。这样既保住了隐私和成本底线又补上了本地小模型的能力上限。如果你要长期跑编码或 Agent 类任务可以看下 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 高频场景下更划算。想先体验模型效果可以直接用模型对话 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 试几条 Prompt确认模型 ID 和返回格式后再写进业务代码。API Key 管理在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。最后给一个实操顺序先在 openEuler 上把 Ollama 跑通并压测出你机器的基线数据再配 TaoToken 通道验证云端调用最后在业务层写一个简单的路由函数按任务类型分发。这样每一步都有可验证的结果出问题也能快速定位是本地、通道还是业务代码的锅。
返回列表