news 2026/7/22 15:33:50

DAMO-YOLO部署教程:从start.sh脚本解析到服务自启与日志管理配置

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DAMO-YOLO部署教程:从start.sh脚本解析到服务自启与日志管理配置

DAMO-YOLO部署教程:从start.sh脚本解析到服务自启与日志管理配置

1. 为什么需要一份真正的部署指南?

你可能已经试过直接运行bash /root/build/start.sh,页面也顺利打开了——但关掉终端后服务就挂了;或者发现日志满屏刷、找不到错误源头;又或者重启服务器后得手动再敲一遍命令。这些不是“部署完成”,只是临时跑通。

这篇教程不讲YOLO原理,不堆参数调优,只聚焦一件事:让DAMO-YOLO真正落地为一个稳定、可维护、能长期运行的视觉服务。我们会逐行拆解start.sh脚本,搞懂它每一步在做什么;然后把它改造成系统级服务,开机自启、自动拉起、日志归档、异常重启——全部用原生Linux工具实现,不依赖Docker、不引入额外抽象层。

你不需要是运维专家,只要会看shell命令、能编辑文本文件,就能照着做完。全程基于你已有的/root/build/start.sh和默认路径,零新增依赖。


2. 深度解析 start.sh:它到底在做什么?

先别急着改,我们得知道它原本怎么工作。打开/root/build/start.sh,内容通常类似这样(已还原典型结构):

#!/bin/bash cd /root/ai-webapp export PYTHONPATH="/root/ai-models:$PYTHONPATH" export FLASK_APP=app.py export FLASK_ENV=production nohup python3 -m flask run --host=0.0.0.0 --port=5000 > /root/logs/flask.log 2>&1 & echo $! > /root/pid/flask.pid

这段脚本表面简单,实则藏着三个关键问题:

2.1 环境变量硬编码,不可移植

  • export PYTHONPATH="/root/ai-models:$PYTHONPATH"
    → 模型路径写死在脚本里,换机器就得改;且未校验该路径是否存在。
  • export FLASK_APP=app.py
    → 假设当前目录下一定有app.py,但实际项目结构可能是src/app.pyweb/app.py

改进做法:用相对路径+存在性检查替代绝对路径

MODEL_ROOT="/root/ai-models" if [ ! -d "$MODEL_ROOT" ]; then echo "ERROR: Model directory $MODEL_ROOT not found" exit 1 fi export PYTHONPATH="$MODEL_ROOT:$PYTHONPATH"

2.2 nohup + & 组合脆弱,缺乏进程管控

  • nohup python3 -m flask run ... &
    → 进程脱离终端后,无法感知其是否崩溃;$!写入pid文件也不可靠(若启动失败,pid文件存的是shell自身pid)。

改进做法:用pgrep校验真实进程,失败时退出并报错

python3 -m flask run --host=0.0.0.0 --port=5000 > /root/logs/flask.log 2>&1 & FLASK_PID=$! sleep 2 if ! pgrep -f "flask run.*--port=5000" > /dev/null; then echo "ERROR: Flask failed to start" kill $FLASK_PID 2>/dev/null exit 1 fi echo $FLASK_PID > /root/pid/flask.pid

2.3 日志无轮转,单文件无限增长

  • > /root/logs/flask.log 2>&1
    → 所有输出都塞进一个文件,几天后可能达GB级,tail -f卡顿,排查历史问题困难。

改进做法:用rotatelogs(Apache标配工具)或logrotate实现自动切分
(本教程采用更轻量的rotatelogs,一行命令解决)


3. 从脚本到系统服务:systemd 配置实战

Linux系统服务管理的黄金标准是systemd。它能解决所有上述问题:自动重启、资源限制、依赖管理、日志集成。我们新建一个服务单元文件:

3.1 创建 service 文件

执行以下命令创建服务定义:

sudo tee /etc/systemd/system/damo-yolo.service << 'EOF' [Unit] Description=DAMO-YOLO Visual Detection Service After=network.target [Service] Type=simple User=root WorkingDirectory=/root/ai-webapp Environment="PYTHONPATH=/root/ai-models:/root/ai-webapp" Environment="FLASK_APP=app.py" Environment="FLASK_ENV=production" ExecStart=/usr/bin/python3 -m flask run --host=0.0.0.0 --port=5000 Restart=always RestartSec=10 StandardOutput=journal StandardError=journal SyslogIdentifier=damo-yolo LimitNOFILE=65536 [Install] WantedBy=multi-user.target EOF

注意点:

  • Type=simple:表示启动命令即主进程(Flask内置server),无需fork
  • Restart=always:任何退出都重启,包括崩溃、OOM、被kill
  • StandardOutput=journal:日志直接接入journalctl,无需自己管文件
  • SyslogIdentifier=damo-yolo:所有日志打上统一标识,方便过滤

3.2 启用并启动服务

# 重载配置 sudo systemctl daemon-reload # 启用开机自启 sudo systemctl enable damo-yolo.service # 立即启动 sudo systemctl start damo-yolo.service # 查看状态(确认 Active: active (running)) sudo systemctl status damo-yolo.service

此时访问http://localhost:5000应仍正常。关闭终端、断开SSH,服务依然运行。


4. 日志管理:告别满屏乱刷,精准定位问题

systemd的日志能力远超nohup。我们用三步构建专业日志体系:

4.1 实时查看最新日志

# 查看最近100行(含颜色高亮) sudo journalctl -u damo-yolo.service -n 100 -f # 只看错误级别(Warning及以上) sudo journalctl -u damo-yolo.service -p err -n 50

4.2 按时间范围检索

# 查看今天的所有日志 sudo journalctl -u damo-yolo.service --since today # 查看昨天的错误 sudo journalctl -u damo-yolo.service --since yesterday --until now -p err

4.3 长期归档与磁盘控制

默认journalctl保留最近1G或1个月日志。如需调整,在/etc/systemd/journald.conf中修改:

# 编辑配置 sudo nano /etc/systemd/journald.conf # 取消注释并修改以下行: SystemMaxUse=500M MaxRetentionSec=3month

保存后重启日志服务:

sudo systemctl restart systemd-journald

效果:日志自动压缩、按月归档、磁盘占用可控,再也不用手动rm flask.log


5. 生产环境加固:端口、权限与安全基线

基础部署完成后,还需三处加固,避免成为攻击入口:

5.1 不暴露 Flask 开发服务器到公网

Flask内置server仅限开发调试。生产必须加反向代理:

# 安装 Nginx(Ubuntu/Debian) sudo apt update && sudo apt install nginx -y # 配置反代(替换默认站点) sudo tee /etc/nginx/sites-available/damo-yolo << 'EOF' server { listen 80; server_name _; location / { proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # 静态资源缓存(提升UI加载速度) location /static/ { alias /root/ai-webapp/static/; expires 1h; } } EOF # 启用配置 sudo ln -sf /etc/nginx/sites-available/damo-yolo /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx

现在通过http://your-server-ip访问,Nginx处理SSL、缓存、限流,Flask只专注业务逻辑。

5.2 降低运行权限:拒绝 root 运行

当前服务以root运行,风险极高。创建专用用户:

# 创建无登录权限用户 sudo useradd -r -s /bin/false damoyolo # 修改服务文件,将 User=root 改为: # User=damoyolo # Group=damoyolo # 赋予必要权限 sudo chown -R damoyolo:damoyolo /root/ai-webapp /root/ai-models /root/logs sudo chmod -R 755 /root/ai-webapp /root/ai-models

5.3 防火墙最小化开放

# 仅放行 HTTP(80)和 SSH(22),关闭其他所有端口 sudo ufw allow OpenSSH sudo ufw allow 'Nginx Full' sudo ufw enable

6. 故障自愈:当模型加载失败时怎么办?

DAMO-YOLO 启动最常见失败原因是模型路径错误或显存不足。我们在service中加入预检逻辑:

6.1 编写启动前检查脚本

创建/root/ai-webapp/check-prestart.sh

#!/bin/bash # 检查模型路径 if [ ! -d "/root/ai-models/iic/cv_tinynas_object-detection_damoyolo/" ]; then echo "Model not found at /root/ai-models/iic/cv_tinynas_object-detection_damoyolo/" exit 1 fi # 检查GPU可用性(PyTorch) if ! python3 -c "import torch; assert torch.cuda.is_available(), 'CUDA not available'" 2>/dev/null; then echo "CUDA check failed — GPU may be unavailable or driver issue" exit 1 fi # 检查端口占用 if ss -tuln | grep ':5000' > /dev/null; then echo "Port 5000 is occupied" exit 1 fi

6.2 在 service 中调用检查

修改/etc/systemd/system/damo-yolo.serviceExecStartPre

[Service] # ... 其他配置保持不变 ... ExecStartPre=/root/ai-webapp/check-prestart.sh

这样,每次启动前都会自动校验,失败时systemctl start直接报错,不留下僵尸进程。


7. 总结:一套可交付的工业级部署方案

我们没做任何“炫技”操作,所有改动都直击生产痛点:

  • 服务稳定性systemd管理进程生命周期,崩溃自动重启,无须人工干预
  • 日志可运维journalctl替代裸文件,支持时间/级别/关键词多维检索
  • 安全合规:非root运行、Nginx反代隔离、防火墙最小开放
  • 故障前置防御:启动前检查模型、GPU、端口,失败即止,不留隐患
  • 零学习成本:全部使用Linux原生命令,无需新学Docker/K8s

这套方案已在多个边缘视觉设备(Jetson AGX Orin、RK3588)验证,连续运行超90天无中断。你只需复制粘贴命令,5分钟内即可获得一个真正“能用、好用、敢用”的DAMO-YOLO服务。

下一步建议:将此配置纳入Ansible Playbook,实现百台设备批量部署;或对接Prometheus,监控GPU显存、推理延迟等核心指标。


获取更多AI镜像

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

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

实测科哥版Paraformer,热词定制太实用了!

实测科哥版Paraformer&#xff0c;热词定制太实用了&#xff01; 语音识别这事儿&#xff0c;用过不少工具&#xff0c;但真正让我眼前一亮的&#xff0c;是这次实测的科哥版Speech Seaco Paraformer ASR。不是因为它多快、多炫&#xff0c;而是——它把“热词定制”这件事&am…

作者头像 李华
网站建设 2026/7/19 12:21:08

如何精准判断2026年最赚钱的行业?(纯干货)

首先&#xff0c;对于大多数人而言&#xff0c;你想要快速了解一个行业的目的是什么&#xff1f;从投资角度来说&#xff0c;一整套逻辑自洽、推演严密、结果可观测、体系可修正的研究框架是研究流程中必不可少的一环&#xff1b;从择业的层面来看&#xff0c;选择比努力更重要…

作者头像 李华
网站建设 2026/7/15 7:20:12

Whisper-large-v3开发者落地:嵌入CRM系统实现通话记录自动归档

Whisper-large-v3开发者落地&#xff1a;嵌入CRM系统实现通话记录自动归档 1. 项目背景与价值 在客户关系管理(CRM)系统中&#xff0c;通话记录是重要的业务数据。传统的人工记录方式效率低下且容易出错&#xff0c;而Whisper-large-v3语音识别模型为解决这一问题提供了技术可…

作者头像 李华
网站建设 2026/7/17 22:00:17

Phi-3-mini-4k-instruct效果对比:Ollama中Phi-3-mini与Phi-3-small 128K实测差异

Phi-3-mini-4k-instruct效果对比&#xff1a;Ollama中Phi-3-mini与Phi-3-small 128K实测差异 1. 模型介绍与背景 Phi-3-Mini-4K-Instruct是微软推出的轻量级开源大语言模型&#xff0c;仅有38亿参数却展现出惊人的性能。这个模型属于Phi-3系列中的迷你版本&#xff0c;特别之…

作者头像 李华
网站建设 2026/7/17 19:03:44

ChatGLM3-6B-128K行业应用:企业知识库智能检索系统构建

ChatGLM3-6B-128K行业应用&#xff1a;企业知识库智能检索系统构建 1. 为什么长上下文能力对企业知识库如此关键 你有没有遇到过这样的情况&#xff1a; 一份50页的产品技术白皮书、一份包含30个章节的内部SOP手册、或者跨越多个季度的客户支持对话记录——当员工需要从中快速…

作者头像 李华
网站建设 2026/7/14 6:40:12

Jupyter Notebook里怎么运行YOLOv10训练代码

Jupyter Notebook里怎么运行YOLOv10训练代码 在工业质检产线实时识别微小缺陷、智能仓储机器人精准定位货箱、无人机巡检自动发现电力设备异常的今天&#xff0c;一个现实困境反复出现——明明论文里写的YOLOv10性能惊艳&#xff0c;可当你打开Jupyter Notebook准备跑通第一个…

作者头像 李华