news 2026/6/9 9:03:43

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/6/8 12:16:45

电商客服实战:用Meta-Llama-3-8B-Instruct快速搭建智能问答系统

电商客服实战&#xff1a;用Meta-Llama-3-8B-Instruct快速搭建智能问答系统 1. 引言&#xff1a;构建高效电商客服系统的挑战与机遇 在当前的电商平台运营中&#xff0c;客户咨询量呈指数级增长&#xff0c;涵盖商品参数、库存状态、物流信息、退换货政策等多个维度。传统人工…

作者头像 李华
网站建设 2026/6/7 23:16:21

基于Python和django的农产品商城直供蔬菜销售与配送系统

目录系统概述核心功能技术实现创新点应用价值项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作系统概述 该系统基于Python和Django框架开发&#xff0c;旨在构建一个高效的农产品直供电商平台&#xff0c;专…

作者头像 李华
网站建设 2026/6/8 0:07:38

DDColor黑白照片修复用户手册编写:技术文档实战

DDColor黑白照片修复用户手册编写&#xff1a;技术文档实战 1. 引言 1.1 技术背景与应用场景 随着数字影像技术的发展&#xff0c;老照片的数字化保存和修复需求日益增长。大量珍贵的历史影像以黑白形式留存&#xff0c;受限于时代技术条件&#xff0c;普遍存在分辨率低、噪…

作者头像 李华
网站建设 2026/6/7 4:20:42

基于视频融合平台EasyCVR的变电站智慧消防远程监控系统设计与实现

一、方案背景 近年来&#xff0c;电力系统中变电站火灾事故频发&#xff0c;消防势态不容乐观。强化变电站的消防安全管理&#xff0c;成为电网企业核心的任务之一&#xff0c;预防火灾、消除隐患不容延缓。随着大数据、物联网和智能视频监控技术的快速发展&#xff0c;将智慧…

作者头像 李华
网站建设 2026/6/8 0:07:09

网络安全技术全景解读:构建数字世界的五大关键支柱与前沿趋势

1 TCP/IP 模型基础 OSI参考模型 OSI(Open System Interconnect Reference Model)&#xff0c;开放式系统互联参考模型&#xff0c;它是由 国际标准化组织 ISO 提出的一个网络系统互连模型。 OSI 模型的设计目的是成为一个所有销售商都能实现的开放网络模型&#xff0c;来克服…

作者头像 李华
网站建设 2026/6/8 0:09:02

构建网络安全核心知识图谱:关键技术、攻防体系与演进趋势全解析

1.网络安全的概念 网络安全的定义 ISO对网络安全的定义&#xff1a;网络系统的软件、硬件以及系统中存储和传输的数据受到保护&#xff0c;不因偶然的或者恶意的原因而遭到破坏、更改、泄露&#xff0c;网络系统连续可靠正常地运行&#xff0c;网络服务不中断。 网络安全的属…

作者头像 李华