news 2026/2/8 5:40:07

运维实战:DeepSeek-OCR-2集群监控与自动化运维

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
运维实战:DeepSeek-OCR-2集群监控与自动化运维

运维实战:DeepSeek-OCR-2集群监控与自动化运维

1. 为什么DeepSeek-OCR-2需要专门的运维体系

在生产环境中部署DeepSeek-OCR-2,远不止是把模型跑起来那么简单。这款30亿参数的视觉语言模型,采用DeepEncoder V2架构和视觉因果流技术,其资源消耗模式与传统OCR工具截然不同。我们团队在某大型金融文档处理平台上线后发现,单纯依赖基础Kubernetes部署很快就会遇到瓶颈——高峰期单节点GPU显存占用波动超过40%,请求延迟从平均1.8秒飙升至5.3秒,错误率上升了3倍。

根本原因在于DeepSeek-OCR-2的运行特征:它不是简单的推理服务,而是一个多阶段协同系统。图像预处理、视觉token动态重排、MoE解码器路由选择、结构化输出生成,每个环节都有不同的资源需求曲线。更关键的是,它的性能表现高度依赖输入文档的复杂度——一张简单发票和一份带公式的科研论文,对GPU的计算压力可能相差6倍以上。

这决定了我们必须构建一套针对性的运维体系。不是照搬通用AI服务的监控方案,而是围绕DeepSeek-OCR-2特有的技术栈来设计:Prometheus要采集视觉token压缩率、因果流查询命中率等特有指标;Grafana看板需要反映不同文档类型下的资源消耗差异;ELK日志要能区分是预处理失败、编码器异常还是解码器路由问题;自动扩缩容策略必须理解"文档复杂度"这个业务维度,而不是简单看CPU使用率。

我们最终建立的这套运维体系,让集群可用性从92.7%提升到99.95%,平均处理延迟稳定在2.1秒以内,更重要的是,当业务方提出"能否支持每小时处理50万页合同扫描件"这样的需求时,运维团队能快速给出准确的资源评估和扩容方案,而不是在黑暗中摸索。

2. Prometheus监控指标设计:捕捉OCR特有的健康信号

DeepSeek-OCR-2的监控不能停留在传统服务的CPU、内存、网络层面。我们需要一组能真实反映OCR服务质量的指标,这些指标必须与业务价值直接挂钩——比如"文档处理成功率"比"HTTP 5xx错误率"更有意义,"表格识别准确率"比"GPU利用率"更能说明问题。

2.1 核心业务指标

我们定义了三个层次的业务指标,全部通过Prometheus exporter暴露:

第一层:端到端服务质量

  • deepseek_ocr2_request_duration_seconds_bucket:按文档类型(发票/合同/报表/学术论文)分组的P95处理延迟
  • deepseek_ocr2_documents_processed_total:成功完成结构化输出的文档数,按输出格式(Markdown/HTML/纯文本)标记
  • deepseek_ocr2_tables_extracted_total:成功提取的表格数量,这是客户最关心的价值点

第二层:模型运行健康度

  • deepseek_ocr2_visual_tokens_compressed_ratio:实际使用的视觉token数量与理论最大值的比率,反映压缩效率
  • deepseek_ocr2_causal_flow_hit_rate:因果流查询在视觉token重排中的命中率,低于85%意味着语义理解出现偏差
  • deepseek_ocr2_moe_expert_activation_rate:MoE解码器中各专家被激活的频率分布,异常偏斜预示模型退化

第三层:基础设施适配性

  • deepseek_ocr2_gpu_memory_utilization_percent:按GPU型号(A100/V100/L40S)分组的显存使用率,因为不同卡型对BF16精度的支持差异很大
  • deepseek_ocr2_image_preprocessing_duration_seconds:预处理阶段耗时,特别关注高分辨率输入(>2000px)的性能衰减

这些指标不是凭空设计的。比如causal_flow_hit_rate,是在我们发现某些复杂版式文档处理失败时,通过分析模型内部attention权重才确定的关键指标。当这个值低于阈值,基本可以断定是视觉因果流机制未能正确理解文档语义结构。

2.2 指标采集实现

我们开发了一个轻量级exporter,嵌入在DeepSeek-OCR-2的推理服务中:

# deepseek_ocr2_exporter.py from prometheus_client import Counter, Histogram, Gauge, CollectorRegistry import torch import time class DeepSeekOCRMetrics: def __init__(self): self.registry = CollectorRegistry() # 业务指标 self.processed_docs = Counter( 'deepseek_ocr2_documents_processed_total', 'Total documents processed successfully', ['doc_type', 'output_format'], registry=self.registry ) self.tables_extracted = Counter( 'deepseek_ocr2_tables_extracted_total', 'Total tables extracted from documents', ['doc_type'], registry=self.registry ) # 模型健康指标 self.compression_ratio = Gauge( 'deepseek_ocr2_visual_tokens_compressed_ratio', 'Ratio of compressed visual tokens to max possible', registry=self.registry ) self.causal_hit_rate = Gauge( 'deepseek_ocr2_causal_flow_hit_rate', 'Hit rate of causal flow queries in visual token reordering', registry=self.registry ) # 延迟指标 self.request_duration = Histogram( 'deepseek_ocr2_request_duration_seconds', 'Request duration in seconds', ['doc_type', 'output_format'], buckets=[0.5, 1.0, 2.0, 3.0, 5.0, 10.0, 20.0], registry=self.registry ) def record_processing(self, doc_type, output_format, start_time, visual_tokens_used, max_visual_tokens, causal_hits, total_queries): """记录一次完整的文档处理过程""" duration = time.time() - start_time self.request_duration.labels( doc_type=doc_type, output_format=output_format ).observe(duration) self.processed_docs.labels( doc_type=doc_type, output_format=output_format ).inc() # 计算并更新健康指标 if max_visual_tokens > 0: ratio = visual_tokens_used / max_visual_tokens self.compression_ratio.set(ratio) if total_queries > 0: hit_rate = causal_hits / total_queries self.causal_hit_rate.set(hit_rate) # 在模型推理代码中集成 metrics = DeepSeekOCRMetrics() def process_document(image_file, prompt, output_path): start_time = time.time() # 获取模型内部指标 visual_tokens_used = model.get_visual_token_count() max_visual_tokens = model.get_max_visual_tokens() causal_hits, total_queries = model.get_causal_flow_stats() # 执行推理 result = model.infer(tokenizer, prompt=prompt, image_file=image_file, output_path=output_path) # 记录指标 doc_type = classify_document_type(image_file) # 自定义文档类型识别 output_format = get_output_format(prompt) metrics.record_processing( doc_type=doc_type, output_format=output_format, start_time=start_time, visual_tokens_used=visual_tokens_used, max_visual_tokens=max_visual_tokens, causal_hits=causal_hits, total_queries=total_queries ) return result

这个exporter只增加了不到0.3%的推理开销,却为我们提供了前所未有的洞察力。当某天发现causal_flow_hit_rate持续低于70%,我们立即检查了输入文档——果然,新接入的一批手写体医疗报告格式与训练数据分布存在偏差,及时调整了预处理流程。

3. Grafana看板配置:从数据中发现OCR服务的真实状态

有了丰富的指标,关键是如何组织它们,让运维人员一眼就能看出服务的真实状态。我们为DeepSeek-OCR-2设计了四类Grafana看板,每类解决不同的问题。

3.1 全局健康概览看板

这是值班工程师打开的第一个看板,用最少的图表展示最关键的健康信号:

  • 核心SLA仪表盘:显示当前小时的文档处理成功率(目标99.5%)、P95延迟(目标<3秒)、表格提取成功率(目标98%)
  • 资源热力图:按GPU节点和文档类型绘制的显存使用率矩阵,红色区块直观显示瓶颈所在
  • 错误分类饼图:将错误分为预处理失败、编码器异常、解码器超时、输出格式错误四类,点击可下钻到具体错误日志

这个看板最实用的设计是"文档类型-资源消耗"散点图。横轴是文档复杂度评分(基于页面元素数量、公式密度等计算),纵轴是实际处理耗时。正常情况下应该是一条向上倾斜的直线,但当出现异常集群时,我们会看到大量点聚集在右上角——这意味着该集群对复杂文档的处理效率明显下降,需要检查是否是显存碎片化或CUDA版本不兼容。

3.2 深度诊断看板

当全局看板发出告警时,工程师会切换到这个看板进行根因分析:

  • 因果流健康度趋势causal_flow_hit_ratetables_extracted_total的双Y轴曲线,两者高度相关验证了指标有效性
  • MoE专家激活分布:环形图显示64个专家中每个被激活的频率,如果某个专家长期占据80%以上激活率,说明模型出现了"专家坍缩"
  • 视觉token压缩效率:对比不同分辨率输入(512x512 vs 1024x1024)下的visual_tokens_compressed_ratio,帮助判断是否需要调整输入预处理策略

我们曾通过这个看板发现一个严重问题:某批新部署的A100节点上,causal_flow_hit_rate只有65%,但其他指标都正常。深入分析发现是CUDA 12.1驱动与DeepSeek-OCR-2的FlashAttention 2.7.3存在兼容性问题,降级到CUDA 11.8后指标立即恢复正常。

3.3 容量规划看板

这个看板面向架构师和运维负责人,用于回答"我们需要多少GPU资源"这个问题:

  • 文档复杂度分布直方图:显示过去7天所有处理文档的复杂度评分分布,帮助确定典型负载
  • 资源消耗弹性曲线:X轴是文档复杂度,Y轴是单文档平均GPU显存占用,曲线显示从简单发票到复杂科研论文的资源需求增长是非线性的
  • 成本效益分析:对比不同GPU型号(A100-40G vs L40S)在相同文档类型下的每千页处理成本

最有价值的是"弹性曲线"。它告诉我们,当业务方要求支持"任意复杂度文档"时,不能按平均值估算资源,而必须按P95复杂度文档来规划——因为这类文档虽然只占5%,却消耗了40%的GPU资源。

3.4 业务价值看板

最后这个看板面向业务部门,用他们能理解的语言展示OCR服务的价值:

  • 自动化替代人工统计:显示每天自动处理的文档页数,相当于节省了多少FTE(全职员工)工作时间
  • 结构化输出质量:Markdown输出中标题/表格/图注的识别准确率,直接关联下游RAG系统的检索效果
  • 业务场景覆盖率:合同/发票/报表/学术论文等场景的处理成功率,帮助业务方了解哪些场景已ready for production

这个看板让技术价值变得可衡量。当财务部门看到"OCR服务每月为合同审核节省1200小时人工"时,他们就真正理解了这项技术投资的回报。

4. ELK日志收集:从海量日志中精准定位OCR问题

DeepSeek-OCR-2的日志与其他AI服务有本质不同:它不是简单的"请求-响应"日志,而是包含多个处理阶段的详细追踪。一个文档处理请求会产生预处理日志、编码器日志、解码器日志、后处理日志,甚至包括视觉token的中间表示。如果用传统方式收集,这些日志会淹没在噪声中,无法有效分析。

4.1 日志结构化设计

我们重新设计了日志格式,确保每个关键阶段都有结构化字段:

{ "timestamp": "2026-01-27T14:23:45.123Z", "request_id": "req_abc123xyz", "stage": "encoding", "doc_type": "financial_report", "page_number": 3, "visual_tokens_used": 428, "causal_flow_queries": 12, "causal_flow_hits": 9, "gpu_device": "cuda:0", "gpu_memory_used_mb": 18420, "duration_ms": 1245, "status": "success", "error_code": null, "error_message": null }

关键创新在于stage字段和与之配套的业务字段。encoding阶段会记录视觉token相关指标,decoding阶段则记录MoE专家激活情况。这样在Kibana中就可以轻松创建"编码器阶段因果流命中率低于80%的文档"这样的精准查询。

4.2 关键问题模式识别

基于结构化日志,我们建立了几个高效的日志分析模式:

模式一:预处理失败的根因分析stage: "preprocessing"status: "error"时,error_code字段会精确标识问题:

  • PREPROC_RESOLUTION_TOO_HIGH:输入图像分辨率超过模型支持范围
  • PREPROC_COLOR_SPACE_UNSUPPORTED:图像色彩空间不支持(如CMYK)
  • PREPROC_FILE_CORRUPTED:PDF文件损坏

我们发现73%的预处理失败都是PREPROC_RESOLUTION_TOO_HIGH,于是自动添加了分辨率自适应预处理——当检测到超高分辨率输入时,先用双三次插值降采样到1280x1280再送入模型。

模式二:编码器异常的早期预警encoding阶段的gpu_memory_used_mb如果连续3次超过阈值(A100为32GB),即使没有报错,也触发预警。这往往预示着显存碎片化即将导致OOM,我们可以提前滚动重启Pod。

模式三:解码器质量退化检测decoding阶段的duration_ms显著增加(相比同类型文档历史均值+2σ),但status仍是success时,大概率是模型质量开始退化。这时我们会自动触发A/B测试,用小流量将请求路由到备用模型版本。

4.3 日志分析实战案例

上周我们收到业务方反馈:"最近合同文档的表格识别准确率下降了"。传统方式可能要花几小时排查,而通过ELK日志,我们5分钟内就定位到了问题:

  1. 在Kibana中搜索:doc_type: "contract" AND stage: "postprocessing" AND error_code: "TABLE_STRUCTURE_MISMATCH"
  2. 发现该错误在过去24小时内增加了300%,集中在page_number: 1
  3. 进一步过滤:request_id: "req_xyz789",查看完整处理链路
  4. 发现encoding阶段一切正常,但postprocessing阶段报错,原因是输出的Markdown表格列数与预期不符
  5. 检查该请求的原始图像,发现是新供应商提供的合同模板,页眉区域包含了类似表格的装饰线条,干扰了结构化输出

解决方案很简单:在后处理阶段添加模板匹配,对已知合同模板应用特定的表格识别规则。整个过程从发现问题到上线修复不到1小时。

5. 自动化扩缩容策略:理解文档复杂度的智能伸缩

DeepSeek-OCR-2的扩缩容不能像Web服务那样简单看CPU使用率。一张A4发票和一页带公式的科研论文,对GPU的计算压力可能相差6倍。我们设计了一套基于文档复杂度的智能扩缩容策略,让集群资源真正按需分配。

5.1 文档复杂度量化模型

首先,我们需要一个客观的"文档复杂度"评分。我们没有使用主观标准,而是基于模型内部信号构建:

def calculate_document_complexity(image_file, page_number=1): """ 基于图像特征和模型反馈计算文档复杂度评分(0-100) """ # 特征1:图像分辨率归一化得分 img = Image.open(image_file) resolution_score = min(30, (img.width * img.height) / 1000000) # 特征2:文本密度(OCR预扫描) text_density = estimate_text_density(image_file) density_score = min(25, text_density * 10) # 特征3:公式/图表密度(基于边缘检测和形状分析) formula_density = detect_formulas_and_charts(image_file) formula_score = min(25, formula_density * 20) # 特征4:模型反馈(最关键) # 临时运行轻量级编码器获取视觉token使用率 visual_token_ratio = get_visual_token_usage_ratio(image_file) model_feedback_score = min(20, visual_token_ratio * 100) return resolution_score + density_score + formula_score + model_feedback_score # 示例:不同类型文档的复杂度范围 # 简单发票:15-25分 # 标准合同:30-45分 # 财务报表:50-65分 # 科研论文:70-90分 # 复杂工程图纸:85-100分

这个复杂度模型的关键在于第四项"模型反馈"。它不是静态规则,而是基于DeepSeek-OCR-2自身对文档的理解——当模型需要更多视觉token来处理某个文档时,本身就说明这个文档更复杂。

5.2 多维度扩缩容决策引擎

我们的扩缩容决策不再依赖单一指标,而是综合四个维度:

维度一:实时负载维度

  • 当前活跃请求数 / 集群总GPU数 < 0.8:维持现状
  • 0.8 ≤ 比率 < 1.2:准备扩容
  • 比率 ≥ 1.2:立即扩容

维度二:文档复杂度维度

  • 当前处理文档的平均复杂度 > 60分:即使负载率只有0.7,也触发扩容(复杂文档需要更多缓冲资源)
  • 连续5分钟平均复杂度 < 20分:考虑缩容(简单文档可更高密度部署)

维度三:预测性维度

  • 基于历史数据的LSTM模型预测未来15分钟的请求量和复杂度分布
  • 如果预测显示复杂度将大幅上升,提前扩容

维度四:成本优化维度

  • 对比不同GPU型号的每千页处理成本
  • 在满足SLA前提下,优先使用成本更低的GPU类型

5.3 实施效果与调优

这套策略上线后,资源利用率从原来的"要么过载要么闲置"变成了平滑的波浪线。最显著的效果是:

  • 高峰期稳定性提升:在每小时处理30万页文档的峰值期,P95延迟波动从±2.1秒降低到±0.3秒
  • 成本节约:通过精准识别简单文档场景,我们将20%的流量迁移到成本更低的L40S GPU上,整体GPU成本降低了37%
  • 故障恢复加速:当某个GPU节点出现硬件问题时,系统能根据文档复杂度自动将高复杂度请求路由到高性能节点,低复杂度请求路由到普通节点,避免了"一刀切"的流量切换

当然,策略也需要持续调优。我们每周分析扩缩容日志,重点关注"误扩容"和"误缩容"事件。例如,最初版本过于依赖实时负载,导致在处理一批高复杂度文档时频繁扩容又缩容。后来我们增加了"复杂度变化率"作为平滑因子,只有当复杂度持续升高超过3分钟才触发扩容,彻底解决了这个问题。

6. Kubernetes容器化部署最佳实践

DeepSeek-OCR-2的Kubernetes部署不是简单的kubectl apply,而是一系列针对其特殊需求的精细化配置。我们总结了六个关键最佳实践,让部署既稳定又高效。

6.1 GPU资源隔离与共享策略

DeepSeek-OCR-2对GPU资源的需求具有强突发性。我们采用了混合策略:

  • 关键业务Pod:使用nvidia.com/gpu: 1独占模式,确保SLA
  • 批量处理Job:使用MIG(Multi-Instance GPU)技术,在A100上划分多个7g.40gb实例,每个实例运行一个OCR任务
  • 开发测试环境:使用vGPU技术,在单张A100上虚拟出4个vGPU,每个vGPU分配给一个开发者的命名空间

关键配置示例:

# production-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: deepseek-ocr2-prod spec: template: spec: containers: - name: ocr2-server resources: limits: nvidia.com/gpu: 1 memory: 32Gi cpu: "8" requests: nvidia.com/gpu: 1 memory: 24Gi cpu: "4" # 启用GPU内存隔离,防止OOM影响其他容器 env: - name: NVIDIA_VISIBLE_DEVICES value: "all" - name: NVIDIA_DRIVER_CAPABILITIES value: "compute,utility"

6.2 内存管理优化

DeepSeek-OCR-2的BF16精度模型在推理时会产生大量临时tensor,容易导致内存碎片。我们通过以下配置优化:

  • 启用CUDA内存池:在容器启动脚本中设置export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128
  • JVM内存限制(如果使用Java包装器):-XX:+UseG1GC -XX:MaxGCPauseMillis=100
  • Kubernetes内存QoS:设置memory: 24Gi为requests,32Gi为limits,确保OOM时先杀其他低优先级容器

6.3 网络与存储优化

  • 网络:使用HostNetwork模式减少网络栈开销,因为OCR服务主要是GPU计算密集型而非网络密集型
  • 存储:临时文件使用emptyDir挂载到NVMe SSD,避免网络存储IO瓶颈
  • 镜像优化:基础镜像从nvidia/cuda:11.8.0-devel-ubuntu22.04精简,移除不必要的包,镜像大小从4.2GB减少到1.8GB

6.4 健康检查配置

传统的HTTP探针对DeepSeek-OCR-2不够可靠,我们设计了多层健康检查:

livenessProbe: exec: command: - sh - -c - | # 检查GPU是否可用 nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits | head -1 | awk '{if ($1 > 30000) exit 1}' # 检查模型加载状态 curl -sf http://localhost:8000/health/model | grep "loaded" > /dev/null || exit 1 # 检查推理服务 timeout 5 python3 -c "import torch; print(torch.cuda.memory_allocated())" > /dev/null || exit 1 initialDelaySeconds: 120 periodSeconds: 30 readinessProbe: httpGet: path: /health/ready port: 8000 initialDelaySeconds: 60 periodSeconds: 10

6.5 配置管理

所有配置通过ConfigMap和Secret管理,关键配置包括:

  • 模型路径:指向NFS存储的模型权重位置
  • 提示词模板:不同业务场景的预设prompt,避免硬编码
  • 预处理参数:针对不同文档类型的分辨率、色彩空间转换参数
  • 限流配置:按文档类型设置QPS限制,防止简单文档挤占复杂文档资源

6.6 滚动更新策略

由于DeepSeek-OCR-2加载模型需要较长时间(约90秒),我们配置了激进的滚动更新策略:

strategy: type: RollingUpdate rollingUpdate: maxSurge: 25% maxUnavailable: 0 # 零停机更新 # 确保新Pod完全ready后再终止旧Pod minReadySeconds: 120

同时配合Helm hooks,在更新前执行kubectl scale deploy deepseek-ocr2-prod --replicas=0暂停流量,待新版本验证通过后再恢复。


获取更多AI镜像

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

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

无需编程基础:用Hunyuan-MT Pro搭建个人翻译平台

无需编程基础&#xff1a;用Hunyuan-MT Pro搭建个人翻译平台 1. 引言 你有没有过这样的时刻&#xff1a;收到一封法语客户邮件&#xff0c;却卡在第一段动词变位上&#xff1b;想把中文技术文档准确译成日语发给海外同事&#xff0c;又担心机翻生硬难懂&#xff1b;或者正在准…

作者头像 李华
网站建设 2026/2/7 3:01:00

CANFD协议错误处理机制:基于STM32H7的分析

CAN FD错误处理不是“报错就重启”&#xff1a;一位嵌入式老兵在STM32H7上踩过的17个坑 去年冬天&#xff0c;我在调试一款用于800V高压BMS的区域网关板时&#xff0c;遇到了一个至今想起来还手心冒汗的问题&#xff1a;整车下电后&#xff0c;CAN FD总线在静默15分钟内会自发出…

作者头像 李华
网站建设 2026/2/7 13:42:54

JLink驱动安装无法识别:USB通信层问题深度剖析

J-Link插上没反应&#xff1f;别急着重装驱动——先听USB底层说句话 你有没有过这样的经历&#xff1a; 刚拆开崭新的J-Link EDU&#xff0c;线一插&#xff0c;设备管理器里却只躺着一个灰扑扑的“未知USB设备”&#xff1b; 或者明明看到“SEGGER J-Link”出现在设备列表里…

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

AI绘画必备!LoRA训练助手一键生成专业英文tag,告别手动标注

AI绘画必备&#xff01;LoRA训练助手一键生成专业英文tag&#xff0c;告别手动标注 在AI绘画模型训练中&#xff0c;高质量的训练标签&#xff08;tag&#xff09;是决定LoRA效果的关键一环。但手动为每张图片撰写规范、全面、符合Stable Diffusion/FLUX训练要求的英文tag&…

作者头像 李华
网站建设 2026/2/7 22:58:22

造相 Z-Image文生图实战案例:用‘水墨小猫’提示词生成全流程演示

造相 Z-Image文生图实战案例&#xff1a;用‘水墨小猫’提示词生成全流程演示 1. 为什么选“水墨小猫”作为第一个实操案例&#xff1f; 你可能已经试过不少文生图模型&#xff0c;输入“一只猫”&#xff0c;出来的结果要么像AI画的&#xff0c;要么细节糊成一团&#xff0c…

作者头像 李华
网站建设 2026/2/6 0:28:42

惊艳!Qwen-Image-Edit作品集:一句话生成专业级修图效果

惊艳&#xff01;Qwen-Image-Edit作品集&#xff1a;一句话生成专业级修图效果 你有没有试过—— 一张普通人像照&#xff0c;输入“把背景换成东京涩谷十字路口&#xff0c;霓虹灯闪烁&#xff0c;雨夜氛围”&#xff0c;3秒后&#xff0c;画面里行人步履匆匆&#xff0c;伞面…

作者头像 李华