news 2026/6/10 0:46: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/6/9 1:02:33

FitGirl Repack Launcher完全攻略:从入门到精通的4个关键维度

FitGirl Repack Launcher完全攻略&#xff1a;从入门到精通的4个关键维度 【免费下载链接】Fitgirl-Repack-Launcher An Electron launcher designed specifically for FitGirl Repacks, utilizing pure vanilla JavaScript, HTML, and CSS for optimal performance and custom…

作者头像 李华
网站建设 2026/6/9 0:48:44

3步打造颠覆原版的宝可梦世界:个性化冒险完全指南

3步打造颠覆原版的宝可梦世界&#xff1a;个性化冒险完全指南 【免费下载链接】pk3DS Pokmon (3DS) ROM Editor & Randomizer 项目地址: https://gitcode.com/gh_mirrors/pk/pk3DS pk3DS作为一款强大的游戏定制工具&#xff0c;让你告别千篇一律的宝可梦冒险&#x…

作者头像 李华
网站建设 2026/6/9 1:02:04

从零构建智能瞄准系统:我的技术实践笔记

从零构建智能瞄准系统&#xff1a;我的技术实践笔记 【免费下载链接】AI-Aimbot Worlds Best AI Aimbot - CS2, Valorant, Fortnite, APEX, every game 项目地址: https://gitcode.com/gh_mirrors/ai/AI-Aimbot 作为一名计算机视觉爱好者&#xff0c;我一直对实时目标跟…

作者头像 李华
网站建设 2026/6/9 2:08:39

万物识别+弹性GPU部署方案:AI企业提效降本新选择

万物识别弹性GPU部署方案&#xff1a;AI企业提效降本新选择 你是否遇到过这样的问题&#xff1a;每天要处理成百上千张商品图、文档扫描件、工业检测样本&#xff0c;却只能靠人工一张张标注、分类、核对&#xff1f;招一个图像识别工程师成本动辄三四十万&#xff0c;而采购整…

作者头像 李华
网站建设 2026/6/9 0:57:14

亲测阿里Z-Image-Turbo:8步生成高清图,效果惊艳

亲测阿里Z-Image-Turbo&#xff1a;8步生成高清图&#xff0c;效果惊艳 你有没有试过在AI绘图工具里输入一段描述&#xff0c;然后盯着进度条等上五六秒&#xff0c;结果生成的图不是手多一只&#xff0c;就是建筑歪斜、文字糊成一片&#xff1f;更别说中文提示词经常被“意译…

作者头像 李华
网站建设 2026/5/26 8:36:04

5分钟部署VibeThinker-1.5B-WEBUI,轻松搞定LeetCode算法题

5分钟部署VibeThinker-1.5B-WEBUI&#xff0c;轻松搞定LeetCode算法题 你是否经历过这样的场景&#xff1a;深夜刷LeetCode&#xff0c;卡在一道动态规划题上&#xff0c;反复推导状态转移方程却始终缺一个关键灵感&#xff1b;面试前突击准备&#xff0c;想快速验证自己设计的…

作者头像 李华