mcpField
A
amc-setup-calibration-stack

amc-setup-calibration-stack

github.com/nvidia云与 DevOps3.8k642 次安装今天更新
代码仓库

关于 amc-setup-calibration-stack

此流程技能指导从发布容器部署 AutoMagicCalib 微服务和界面,涵盖代码库确认、镜像认证、Compose 启动及就绪检查。

主要功能

  1. 01定位现有 AMC 代码库
  2. 02登录 NVIDIA NGC
  3. 03按需下载 VGGT 模型
  4. 04配置并启动 Docker Compose
  5. 05检查服务状态并排查问题

适用场景

  1. 01从发布容器部署 AutoMagicCalib
  2. 02启动校准服务前下载 VGGT
  3. 03排查启动、端口或容器权限问题

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/nvidia/skills --skill amc-setup-calibration-stack

安装后在 Claude Code 中输入/amc-setup-calibration-stack确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

BENCHMARK.md
skill-card.md
skill.oms.sig
evals/
evals.json

详细介绍

技能:启动 AutoMagicCalib 发布版容器

通过发布版容器设置 AutoMagicCalib 微服务和 UI:解析 AMC 检出目录、登录 NGC、按需下载 VGGT、配置 Docker Compose、启动服务并验证就绪状态。

前提条件

  • 已安装 Docker 和 Docker Compose
  • 已配置 NVIDIA Docker Runtime(用于 GPU 支持)
  • 磁盘上有 auto-magic-calib 仓库。步骤 0b 会解析当前仓库、DeepStream tools/auto-magic-calib、DEEPSTREAM_REPO_ROOT 或 ~/auto-magic-calib;否则会在克隆 https://github.com/NVIDIA-AI-IOT/auto-magic-calib 前征求同意。
  • 拥有可访问 NVIDIA 容器注册表的 NGC 账户
  • 无需 sudo 即可运行 Docker;继续前用 docker ps 验证。

说明

步骤 0:验证 Docker 无需 sudo 即可运行
docker ps
  • 如果成功 → 继续。
  • 如果失败并显示“permission denied”→ 用户不在 docker 组中。请用户运行:
    sudo usermod -aG docker $USER && newgrp docker
    
    然后请用户确认 docker ps 可以正常运行,再继续。

Agent 提示:如果无法在 Agent 沙箱中运行 docker ps,请先让用户确认该命令可以正常运行(例如:“你能确认 docker ps 无需 sudo 即可运行吗?”),然后再继续。

步骤 0b:解析仓库检出目录

此技能需要 AMC 仓库资源(compose/、示例数据和 models/)。请先解析现有检出目录;克隆到 ~/auto-magic-calib 前征求同意。

REPO_URL="https://github.com/NVIDIA-AI-IOT/auto-magic-calib.git"
DEFAULT_CLONE_DIR="$HOME/auto-magic-calib"
CURRENT_GIT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || true)"

is_amc_checkout() {
  [ -n "$1" ] \
    && [ -f "$1/README.md" ] \
    && grep -q "AutoMagicCalib" "$1/README.md" 2>/dev/null \
    && [ -f "$1/compose/compose.yml" ] \
    && grep -q "auto-magic-calib-ms" "$1/compose/ms/compose.yml" 2>/dev/null \
    && grep -q "auto-magic-calib-ui" "$1/compose/ui/compose.yml" 2>/dev/null
}

REPO_ROOT=""
for candidate in \
  "$CURRENT_GIT_ROOT" \
  "${CURRENT_GIT_ROOT:+$CURRENT_GIT_ROOT/tools/auto-magic-calib}" \
  "${DEEPSTREAM_REPO_ROOT:+$DEEPSTREAM_REPO_ROOT/tools/auto-magic-calib}" \
  "$PWD/tools/auto-magic-calib" \
  "$DEFAULT_CLONE_DIR"; do
  if is_amc_checkout "$candidate"; then
    REPO_ROOT="$candidate"
    echo "✓ Using auto-magic-calib checkout: $REPO_ROOT"
    break
  fi
done

if [ -z "$REPO_ROOT" ]; then
  if [ -n "$CURRENT_GIT_ROOT" ] && [ -d "$CURRENT_GIT_ROOT/tools/auto-magic-calib" ]; then
    echo "Found $CURRENT_GIT_ROOT/tools/auto-magic-calib, but it is not an initialized AMC checkout."
    echo "If running from the DeepStream repository root:"
    echo "  git submodule update --init tools/auto-magic-calib"
  fi

  # Nothing usable on disk — STOP and ask the user for confirmation using the
  # host's question mechanism; if none is available, ask in chat and wait.
  # Do NOT clone silently from this block or clone over a tracked submodule path.
  echo "No usable auto-magic-calib checkout found. Ask the user for confirmation:"
  echo "  Clone $REPO_URL into $DEFAULT_CLONE_DIR? [y/N]"
  echo "On 'y' — run: git clone \"$REPO_URL\" \"$DEFAULT_CLONE_DIR\""
  exit 1
fi

cd "$REPO_ROOT"
export REPO_ROOT
echo "REPO_ROOT=$REPO_ROOT"

Agent 提示:切勿在未告知的情况下克隆。优先使用已初始化的 DeepStream tools/auto-magic-calib;不要克隆到该子模块路径。如果该路径存在但为空,请用户运行 git submodule update --init tools/auto-magic-calib。如果用户提供了其他 AMC 路径,请使用该路径。

步骤 0c:安装 Python venv(仅限新系统)

在全新系统上,可能尚未安装 pip 和 python3-venv。请先安装:

# Create a venv for HuggingFace CLI (project-local preferred)
REPO_DIR="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
HF_VENV="${REPO_DIR}/venv"
python3 -m venv "$HF_VENV" 2>/dev/null || {
  echo "ERROR: python3-venv not available." >&2
  echo "Install it manually: sudo apt install -y python3-venv python3-pip" >&2
  exit 1
}

# Install HuggingFace hub (needed for VGGT download)
"$HF_VENV/bin/pip" install --upgrade pip huggingface_hub

注意:如果已有包含 hf 的 venv,请跳过此步骤(检查仓库根目录下的 venv/bin/hf 或 ~/venv/amc/bin/hf)。

步骤 1:登录 NGC

使用主机的提问机制向用户索取 NGC API 密钥;如果没有可用的提问机制,请在聊天中询问并等待。然后运行:

echo "<NGC_API_KEY>" | docker login nvcr.io --username '$oauthtoken' --password-stdin
echo "✓ NGC authentication complete"
步骤 2:下载 VGGT 模型(如果尚未存在)
export REPO_ROOT=$(git rev-parse --show-toplevel)
cd "$REPO_ROOT"

if [ -f "models/vggt/vggt_1B_commercial.pt" ]; then
  echo "✓ VGGT model already present"
else
  echo "✗ VGGT model not found"
  echo "Options:"
  echo "  1. Continue without VGGT (AMC only - sufficient for most use cases)"
  echo "  2. Download VGGT model (~4.7GB, requires HuggingFace account)"
fi

下载 VGGT:请用户在 https://huggingface.co/facebook/VGGT-1B-Commercial 接受许可,并使用主机的提问机制索取读取令牌:https://huggingface.co/settings/tokens。通过 HF_TOKEN 传入令牌,以免其显示在 ps 输出中:

REPO_DIR="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
cd "$REPO_DIR"

# Find the HuggingFace CLI binary (named 'hf', not 'huggingface-cli')
HF_BIN="$(find "$REPO_DIR/venv" ~/venv/amc -name hf -type f 2>/dev/null | head -1)"
{ [ -z "$HF_BIN" ] || [ ! -x "$HF_BIN" ]; } && { echo "ERROR: hf binary not found or not executable; install the hf CLI (Step 0c) or set HF_BIN" >&2; exit 1; }

# Do NOT use --token on the command line (leaks via ps/argv). The HF CLI
# reads HF_TOKEN from the environment automatically.
HF_TOKEN="<HF_TOKEN>" "$HF_BIN" download facebook/VGGT-1B-Commercial \
  --local-dir models/vggt/

# Verify
ls -lh models/vggt/vggt_1B_commercial.pt
# Should show ~4.7GB file

重要:在对 models 目录设置 chown 1000:1000 之前下载模型——下载期间当前用户需要写入权限。下载完成后,在步骤 4 中设置权限。

步骤 3:配置 Compose 环境变量

Compose 环境文件用于控制端口和路径。启动前请更新该文件:

cd $REPO_ROOT/compose

# Find available backend port (8000-8009)
for port in {8000..8009}; do
  if ! lsof -Pi :$port -sTCP:LISTEN -t >/dev/null 2>&1; then
    MS_PORT=$port
    echo "Using backend port: $MS_PORT"
    break
  fi
done
[ -z "$MS_PORT" ] && { echo "ERROR: no free backend port in 8000-8009; free one or widen the range." >&2; exit 1; }

# Find available UI port (5000-5009)
for port in {5000..5009}; do
  if ! lsof -Pi :$port -sTCP:LISTEN -t >/dev/null 2>&1; then
    UI_PORT=$port
    echo "Using UI port: $UI_PORT"
    break
  fi
done
[ -z "$UI_PORT" ] && { echo "ERROR: no free UI port in 5000-5009; free one or widen the range." >&2; exit 1; }

# Get host IP
HOST_IP=$(hostname -I | awk '{print $1}')
echo "Host IP: $HOST_IP"

# Preserve existing keys and restrict permissions on the Compose environment file.
COMPOSE_ENV_BASENAME="env"
ENV_FILE=".${COMPOSE_ENV_BASENAME}"
if [ -f "$ENV_FILE" ]; then
  BACKUP="${ENV_FILE}.bak.$(date +%s)"
  cp "$ENV_FILE" "$BACKUP"
  chmod 600 "$BACKUP"
fi
touch "$ENV_FILE"
chmod 600 "$ENV_FILE"
set_env_key() {
  local k="$1" v="$2"
  if grep -qE "^${k}=" "$ENV_FILE"; then
    sed -i "s|^${k}=.*|${k}=${v}|" "$ENV_FILE"
  else
    echo "${k}=${v}" >> "$ENV_FILE"
  fi
}
set_env_key AUTO_MAGIC_CALIB_MS_PORT "${MS_PORT}"
set_env_key AUTO_MAGIC_CALIB_UI_PORT "${UI_PORT}"
set_env_key PROJECT_DIR "../../projects"
set_env_key MODEL_DIR "../../models"
set_env_key HOST_IP "${HOST_IP}"

# Keep timestamped Compose environment backups out of git.
GITIGNORE="$REPO_ROOT/.gitignore"
touch "$GITIGNORE"
BACKUP_PATTERN="compose/${ENV_FILE}.bak.*"
grep -qxF "$BACKUP_PATTERN" "$GITIGNORE" || echo "$BACKUP_PATTERN" >> "$GITIGNORE"

echo "✓ Compose environment file updated"
cat "$ENV_FILE"

重要:HOST_IP 必须是机器的网络 IP(不能是 localhost),这样 UI 容器才能通过浏览器访问后端。

可选:仅当 VGGT 模型挂载在非默认容器路径时,才设置 VGGT_MODEL_PATH;MS 容器中的默认路径为 /tmp/vggt_model/vggt_1B_commercial.pt。

RTSP 标定的可选操作:启动后使用 skills/amc-run-rtsp-calibration/SKILL.md。该技能会验证 VIOS 是否可访问;必要时使用临时 compose 覆盖文件重新启动微服务,以导出 VIOS_BASE_URL,且不会更改已签入的 compose 文件。

步骤 4:设置目录权限

容器以 UID/GID 1000 运行。projects 和 models 目录必须归该 UID 所有,容器才能正常读写:

cd "$REPO_ROOT"

# Create projects directory if it doesn't exist
mkdir -p projects

# Set ownership (required for containers to write calibration outputs).
# Do this AFTER VGGT download is complete (current user needs write access during download).
# Get explicit user confirmation before running sudo chown — it recursively changes
# ownership of $REPO_ROOT/projects and $REPO_ROOT/models to UID/GID 1000.
[ -d projects ] && [ -d models ] || {
  echo "ERROR: expected projects/ and models/ under $REPO_ROOT" >&2; exit 1;
}
echo "About to chown -R 1000:1000 on:"
echo "  $REPO_ROOT/projects"
echo "  $REPO_ROOT/models"
echo "(required because containers run as UID 1000). Confirm before proceeding."
sudo chown 1000:1000 -R projects
sudo chown 1000:1000 -R models

echo "✓ Permissions set"
步骤 5:启动服务

拉取镜像前,如果步骤 1 中通过身份验证的 NGC 密钥无法实际访问发布镜像,应立即失败;否则 docker compose up 可能会在完成部分操作后因 401/403 错误而中止。

cd $REPO_ROOT/compose

# Fail-fast image-access check: confirm the NGC key can reach every release
# image BEFORE pulling. `docker manifest inspect` checks registry access without
# downloading layers, and the image list is read from the resolved compose so it
# tracks the release tag automatically.
IMAGES=$(docker compose config --images | sort -u)
[ -z "$IMAGES" ] && { echo "ERROR: no images resolved from compose — check the Compose environment settings and chosen profile." >&2; exit 1; }
for img in $IMAGES; do
  echo "Checking access: $img"
  if ! docker manifest inspect "$img" >/dev/null 2>&1; then
    echo "NGC login succeeded, but this key cannot access the required image:" >&2
    echo "  $img" >&2
    echo "Provide an NGC key with access to this image's namespace, then re-run Step 1 (login) and retry." >&2
    exit 1
  fi
done

# Start all services (images pulled automatically on first run)
docker compose up -d

# Check containers are running
docker compose ps

具体镜像标签会随发布版本变化;请从当前启用的 compose 文件中读取标签,不要硬编码版本号。

步骤 6:确认服务正在运行
# Read ports from the Compose environment file.
COMPOSE_ENV_BASENAME="env"
COMPOSE_ENV_FILE="$REPO_ROOT/compose/.${COMPOSE_ENV_BASENAME}"
MS_PORT=$(grep AUTO_MAGIC_CALIB_MS_PORT "$COMPOSE_ENV_FILE" | cut -d= -f2)
UI_PORT=$(grep AUTO_MAGIC_CALIB_UI_PORT "$COMPOSE_ENV_FILE" | cut -d= -f2)
HOST_IP=$(grep HOST_IP "$COMPOSE_ENV_FILE" | cut -d= -f2)

# Wait for microservice readiness. Cold image pulls or first startup can need
# extra time after `docker compose up -d` returns.
READY_URL="http://localhost:${MS_PORT}/v1/ready"
echo "Waiting for microservice readiness at ${READY_URL} ..."
ready_response=""
for attempt in $(seq 1 24); do
  if ready_response=$(curl -fsS --max-time 5 "${READY_URL}" 2>/dev/null) && \
     echo "${ready_response}" | grep -q '"code"[[:space:]]*:[[:space:]]*0'; then
    echo "Microservice ready: ${ready_response}"
    break
  fi
  if [ "${attempt}" -lt 24 ]; then
    printf "  [%02d/24] Microservice not ready yet; retrying in 5s...\n" "${attempt}"
    sleep 5
  fi
done

if ! echo "${ready_response}" | grep -q '"code"[[:space:]]*:[[:space:]]*0'; then
  echo "ERROR: microservice did not report ready within 120 seconds: ${READY_URL}" >&2
  echo "Check status and logs:" >&2
  echo "  cd ${REPO_ROOT}/compose && docker compose ps" >&2
  echo "  cd ${REPO_ROOT}/compose && docker compose logs auto-magic-calib-ms" >&2
  exit 1
fi

# Check UI is serving
UI_STATUS=$(curl -s -o /dev/null -w "%{http_code}" --max-time 5 "http://localhost:${UI_PORT}")
if [ "${UI_STATUS}" != "200" ]; then
  echo "ERROR: Web UI returned HTTP ${UI_STATUS}; check docker compose ps and UI logs." >&2
  exit 1
fi
echo "Web UI ready: HTTP ${UI_STATUS}"

echo "Microservice: http://${HOST_IP}:${MS_PORT}"
echo "Web UI:       http://${HOST_IP}:${UI_PORT}"

成功标准

  • docker compose ps 显示 MS 和 UI 容器状态为 Up;MS 应处于健康状态。
  • /v1/ready 返回 code:0,且步骤 6 会打印微服务和 UI 的 URL。
  • 可以通过浏览器访问 http://<HOST_IP>:<AUTO_MAGIC_CALIB_UI_PORT>。
  • 项目保存在 $REPO_ROOT/projects/ 下。

故障排查

问题解决方法
Docker 权限被拒绝请用户运行 sudo usermod -aG docker $USER && newgrp docker,然后重试 docker ps。
docker login 被拒绝请提供当前有效的 NGC 密钥,然后重新登录。
无法访问所需镜像该密钥没有镜像命名空间的访问权限;请提供具有访问权限的密钥,然后重试步骤 1 和步骤 5。
缺少 python3 -m venv、pip 或 hf安装 python3-venv/python3-pip;HF 二进制文件名为 hf。
VGGT 权限错误在执行 chown 1000:1000 之前下载 VGGT;如需恢复,请还原 models/ 的用户所有权并重新下载。
端口被占用在 8000-8009 中选择一个空闲的 MS 端口,并在 5000-5009 中选择一个空闲的 UI 端口,然后更新 Compose 环境文件。
就绪状态超时或容器已退出运行 cd $REPO_ROOT/compose && docker compose ps,并检查 docker compose logs auto-magic-calib-ms。
项目/模型权限被拒绝仅针对 projects/ 或 models/ 重新执行步骤 4。
UI 无法连接后端确认 Compose 环境文件中的 HOST_IP 是机器的网络 IP,而不是 localhost。
GPU 不可用使用 docker run --rm --runtime=nvidia --gpus all ubuntu:20.04 nvidia-smi 验证 NVIDIA 运行时。

常见修复方法:

cd $REPO_ROOT/compose

# View logs
docker compose logs -f

# View logs for specific service
docker compose logs -f auto-magic-calib-ms

# Restart all services
docker compose restart

# Stop and remove containers
docker compose down

# Update Compose environment settings and relaunch
docker compose up -d

停止服务

cd $REPO_ROOT/compose

# Stop all services (containers removed, data persisted)
docker compose down

# Stop and remove volumes
docker compose down -v

相关技能

  • skills/amc-run-sample-calibration/SKILL.md - 使用随附的示例数据集对运行中的服务栈进行健全性检查
  • skills/amc-run-video-calibration/SKILL.md - 通过 REST API 使用自己的预录制 MP4 文件进行校准
  • skills/amc-run-rtsp-calibration/SKILL.md - 通过 VIOS 捕获实时 RTSP 流进行校准

评论

支持 Markdown