news 2026/2/25 22:49:39

Qwen All-in-One运维监控:CPU占用率跟踪实战教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Qwen All-in-One运维监控:CPU占用率跟踪实战教程

Qwen All-in-One运维监控:CPU占用率跟踪实战教程

1. 引言

1.1 业务场景描述

在部署轻量级大语言模型(LLM)服务时,资源监控是保障系统稳定运行的关键环节。尤其在边缘计算或无GPU环境下,CPU占用率直接决定了推理延迟与并发能力。本文以「Qwen All-in-One」项目为背景——一个基于 Qwen1.5-0.5B 的单模型多任务AI服务,深入讲解如何实现对 CPU 占用率的实时跟踪与可视化,帮助开发者全面掌握服务性能表现。

该服务通过 In-Context Learning 实现情感分析与开放域对话的统一推理,具备零额外模型加载、纯净技术栈和极致CPU优化等优势。然而,这些特性也带来了新的运维挑战:如何在不增加推理负担的前提下,精准采集并展示 CPU 使用情况?

1.2 痛点分析

传统监控方案常依赖外部工具(如 Prometheus + Node Exporter),配置复杂且难以嵌入轻量级服务中。对于仅使用transformerspytorch的极简架构而言,引入重量级监控组件违背了“Zero-Download”原则。此外,多数方案无法做到:

  • 与推理逻辑无缝集成
  • 实时反馈当前请求处理时的瞬时CPU消耗
  • 在Web界面中直观呈现趋势变化

1.3 方案预告

本文将手把手带你构建一套轻量、可嵌入、低开销的 CPU 占用率监控系统,核心内容包括:

  • 利用psutil实现进程级 CPU 监控
  • 将监控数据注入 FastAPI 响应流
  • 在前端动态展示实时 CPU 曲线
  • 结合推理日志进行性能归因分析

最终实现效果:用户每提交一条输入,页面不仅返回 AI 情感判断与回复,还同步显示本次请求处理期间的CPU 占用波动曲线


2. 技术方案选型

2.1 为什么选择 psutil?

工具安装复杂度是否需系统权限数据粒度适用场景
psutilpip install psutil进程级、系统级轻量嵌入式监控
top/htop系统自带系统级手动排查
Prometheus + Node Exporter多组件部署主机级集群监控
glancespip install glances系统级综合诊断

从上表可见,psutil是唯一满足以下条件的方案: -零依赖冲突:纯 Python 库,兼容现有技术栈 -细粒度采集:支持按进程采样 CPU% -低侵入性:API 简洁,易于集成进推理流水线 -跨平台支持:Linux / Windows / macOS 均可用

因此,我们选择psutil作为核心监控引擎。


3. 实现步骤详解

3.1 环境准备

确保已安装以下基础库:

pip install torch transformers fastapi uvicorn[standard] psutil jinja2

注意:本项目不使用 ModelScope Pipeline,所有模块均来自官方 Hugging Face 生态,避免下载失败风险。

启动命令示例:

uvicorn app:app --host 0.0.0.0 --port 7860

3.2 核心代码实现

3.2.1 初始化模型与监控器
# app.py import torch from transformers import AutoTokenizer, AutoModelForCausalLM import psutil import time from fastapi import FastAPI, Request from fastapi.templating import Jinja2Templates from fastapi.staticfiles import StaticFiles app = FastAPI() templates = Jinja2Templates(directory="templates") # 全局监控变量 cpu_samples = [] # 加载 Qwen1.5-0.5B 模型(CPU模式) model_name = "Qwen/Qwen1.5-0.5B" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained( model_name, torch_dtype=torch.float32, # FP32适配CPU device_map=None # 不使用GPU ) # 锁定主线程PID用于监控 main_pid = psutil.Process()
3.2.2 定义带监控的推理函数
def generate_with_cpu_monitor(prompt: str, max_new_tokens=64): global cpu_samples cpu_samples.clear() # 清空上次记录 # 启动监控线程(模拟连续采样) start_time = time.time() sample_interval = 0.1 # 每100ms采样一次 generated_text = "" try: inputs = tokenizer(prompt, return_tensors="pt") # 开始生成前启动CPU采样 while not generated_text: cpu_percent = main_pid.cpu_percent(interval=None) cpu_samples.append({ "time": round(time.time() - start_time, 2), "cpu": cpu_percent }) time.sleep(sample_interval) # 执行推理(非流式) with torch.no_grad(): outputs = model.generate( inputs.input_ids, max_new_tokens=max_new_tokens, pad_token_id=tokenizer.eos_token_id ) generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True) break except Exception as e: generated_text = f"Error: {str(e)}" return generated_text
3.2.3 FastAPI 接口集成监控数据
@app.post("/chat") async def chat(request: Request): form_data = await request.form() user_input = form_data["message"] # 构造 Prompt(情感分析 + 对话) sentiment_prompt = ( "你是一个冷酷的情感分析师。请严格判断下列语句情感倾向," "只能输出【正面】或【负面】:\n" f"{user_input}" ) chat_prompt = ( "<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n" f"<|im_start|>user\n{user_input}<|im_end|>\n" "<|im_start|>assistant\n" ) # 执行带监控的推理 sentiment_raw = generate_with_cpu_monitor(sentiment_prompt, max_new_tokens=8) sentiment = "正面" if "正面" in sentiment_raw else "负面" response_text = generate_with_cpu_monitor(chat_prompt, max_new_tokens=128) # 返回结果含CPU采样数据 return { "sentiment": sentiment, "response": response_text, "cpu_usage": cpu_samples } @app.get("/") async def index(request: Request): return templates.TemplateResponse("index.html", {"request": request})

3.3 前端展示实时CPU曲线

创建templates/index.html

<!DOCTYPE html> <html> <head> <title>Qwen All-in-One 监控面板</title> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> </head> <body> <h1>🧠 Qwen All-in-One:情感+对话一体化服务</h1> <form id="chatForm"> <input type="text" id="message" placeholder="请输入你的内容..." required /> <button type="submit">发送</button> </form> <div id="result"></div> <canvas id="cpuChart" width="400" height="150"></canvas> <script> const ctx = document.getElementById('cpuChart').getContext('2d'); let chart = new Chart(ctx, { type: 'line', data: { labels: [], datasets: [{ label: 'CPU 占用率 (%)', data: [], borderColor: 'rgb(75, 192, 192)', tension: 0.1 }] }, options: { responsive: true } }); document.getElementById('chatForm').addEventListener('submit', async (e) => { e.preventDefault(); const input = document.getElementById('message').value; const res = await fetch('/chat', { method: 'POST', body: new FormData(e.target) }); const data = await res.json(); // 更新结果 document.getElementById('result').innerHTML = ` <p><strong>😄 LLM 情感判断:</strong> ${data.sentiment}</p> <p><strong>💬 AI 回复:</strong> ${data.response}</p> `; // 更新图表 chart.data.labels = data.cpu_usage.map(d => d.time); chart.data.datasets[0].data = data.cpu_usage.map(d => d.cpu); chart.update(); }); </script> </body> </html>

3.4 性能优化建议

3.4.1 减少监控干扰

由于psutil.Process().cpu_percent()本身会占用少量CPU,建议:

  • 降低采样频率:从每100ms改为每200ms,在精度与开销间平衡
  • 异步采样:使用独立线程采集,避免阻塞主推理流程
import threading class CPUMonitor: def __init__(self, interval=0.2): self.interval = interval self.samples = [] self.running = False self.thread = None self.pid = psutil.Process() def start(self): self.samples.clear() self.running = True self.thread = threading.Thread(target=self._monitor, daemon=True) self.thread.start() def _monitor(self): while self.running: self.samples.append({ "time": round(time.time(), 3), "cpu": self.pid.cpu_percent(interval=None) }) time.sleep(self.interval) def stop(self): self.running = False return self.samples

调用方式:

monitor = CPUMonitor(interval=0.2) # 推理前 monitor.start() output = model.generate(...) cpu_data = monitor.stop()
3.4.2 内存复用优化

避免频繁创建列表对象,可预分配固定长度缓冲区:

class RingBuffer: def __init__(self, size=50): self.size = size self.buffer = [None] * size self.index = 0 self.full = False

4. 实践问题与解决方案

4.1 问题一:首次推理延迟过高

现象:第一次请求耗时超过5秒,CPU占用飙升至100%

原因:PyTorch JIT 编译 + 模型首次加载缓存未命中

解决方法: - 在服务启动后立即执行一次 dummy 推理预热 - 设置torch.set_num_threads(4)限制线程数防过载

# 预热模型 def warm_up(): dummy_input = tokenizer("test", return_tensors="pt") with torch.no_grad(): model.generate(dummy_input.input_ids[:, :2], max_new_tokens=2)

4.2 问题二:CPU采样数据抖动严重

现象:图表出现剧烈毛刺,难以反映真实趋势

原因cpu_percent()返回的是两个采样点之间的平均值,高频波动明显

解决方法: - 使用滑动窗口平滑处理 - 或改用指数加权移动平均(EWMA)

def ewma(data, alpha=0.3): smoothed = [] for i, x in enumerate(data): if i == 0: smoothed.append(x) else: smoothed.append(alpha * x + (1 - alpha) * smoothed[-1]) return smoothed

5. 总结

5.1 实践经验总结

本文围绕「Qwen All-in-One」这一轻量级 LLM 服务,实现了 CPU 占用率的全流程监控,关键收获如下:

  • 极简集成:仅需psutil+chart.js即可完成端到端监控
  • 零侵入改造:无需修改模型代码,通过上下文管理器即可采集性能数据
  • 可解释性强:将每次推理与对应的 CPU 消耗关联,便于性能归因
  • 完全兼容CPU环境:所有组件均支持无GPU部署,符合边缘计算需求

最佳实践建议

  1. 监控粒度按需调整:高并发场景下降低采样频率以防自身成为瓶颈
  2. 结合内存监控:扩展psutil.virtual_memory()获取RAM使用情况
  3. 异常阈值告警:当CPU持续 > 90% 超过3秒时触发日志警告

获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/22 14:23:57

Qwen3-4B-Instruct-2507性能瓶颈分析:GPU利用率优化路径

Qwen3-4B-Instruct-2507性能瓶颈分析&#xff1a;GPU利用率优化路径 1. 背景与问题提出 随着大模型在实际业务场景中的广泛应用&#xff0c;推理服务的效率和资源利用率成为影响用户体验和部署成本的关键因素。Qwen3-4B-Instruct-2507作为通义千问系列中40亿参数规模的非思考…

作者头像 李华
网站建设 2026/2/25 0:06:37

Glyph超时错误?超参调整与重试机制设置教程

Glyph超时错误&#xff1f;超参调整与重试机制设置教程 在当前大模型应用中&#xff0c;长文本上下文处理已成为关键挑战之一。传统的基于Token的上下文扩展方式面临显存占用高、推理成本大的瓶颈。为此&#xff0c;智谱AI推出的Glyph——一种创新的视觉推理框架&#xff0c;通…

作者头像 李华
网站建设 2026/2/25 0:10:26

没万元显卡别慌:NewBie-image云端平替方案实测

没万元显卡别慌&#xff1a;NewBie-image云端平替方案实测 你是不是也和我一样&#xff0c;看到 NewBie-image-Exp0.1 那惊艳的动漫生成效果时两眼放光&#xff1f;线条干净、色彩通透、角色神态生动&#xff0c;简直是 ACG 爱好者的梦中情“图”。但当你点进部署教程&#xf…

作者头像 李华
网站建设 2026/2/25 15:07:01

Qwen-Image-Edit-2511冻结非编辑区,原图结构完美保留

Qwen-Image-Edit-2511冻结非编辑区&#xff0c;原图结构完美保留 在图像编辑领域&#xff0c;一个长期存在的难题是&#xff1a;如何在修改局部内容的同时&#xff0c;确保其余区域不受干扰&#xff1f;传统AIGC模型常因全局重绘导致“越修越糊”&#xff0c;而手动掩码又效率…

作者头像 李华
网站建设 2026/2/24 2:27:28

Glyph视觉推理部署教程:3步完成GPU算力适配实战

Glyph视觉推理部署教程&#xff1a;3步完成GPU算力适配实战 1. 引言 1.1 技术背景与学习目标 随着大模型对上下文长度需求的不断增长&#xff0c;传统基于Token的长文本处理方式面临显存占用高、推理速度慢等瓶颈。智谱AI推出的Glyph&#xff0c;作为一种创新的视觉推理框架…

作者头像 李华