选项
首页首页 Skill 开发运营和 CI/CD tao-run-on-local-docker

tao-run-on-local-docker

NVIDIA/skills NVIDIA/skills

在支持 NVIDIA GPU 的本地或远程 Docker 守护进程上,将 TAO SDK 作业作为 Docker 容器运行,包括预检查和凭据处理。

...展开全部
0
更新时间 2026-09-25

本地 Docker

一种单节点执行平台,它通过 Docker 守护进程将 TAO 任务作为命名 Docker 容器运行。 该守护进程可以位于代理主机上,也可以通过 DOCKER_HOST=ssh://user@host / Docker 上下文访问。它适用于开发、 调试、小规模运行,以及本地编码代理将任务提交至 远程 GPU 服务器的工作流。

当数据位于 Docker 主机本地或可通过 挂载卷/云凭据访问时,请使用本地 Docker。请勿将其用于远程集群调度、 多节点训练或需要 SLURM 队列处理的任务。

当代理运行在工作站或笔记本电脑上,但 Docker 守护进程和 GPU 位于另一台单 GPU 服务器上时,请使用远程 Docker。在远程 Docker 模式下, specs 中的所有本地文件系统路径将在远程 Docker 主机上解析, 而非在代理机器上。

预检

工作流必须在启动 Docker 作业前验证主机的 GPU 运行时环境。如果 检查失败,则提示用户批准安装,运行显示的安装 命令,并重新运行预检查。

# Host GPU runtime: NVIDIA driver 580, CUDA 13.0, NVIDIA Container Toolkit 1.19.0.
TAO_SKILL_BANK_ROOT="${TAO_SKILL_BANK_ROOT:-$PWD}"
SETUP_SCRIPT="${TAO_SKILL_BANK_ROOT}/skills/platform/tao-setup-nvidia-gpu-host/scripts/setup-nvidia-gpu-host.sh"

bash "$SETUP_SCRIPT" --backend docker --check-only || {
  echo "MISSING: TAO GPU host runtime is not ready."
  echo "After user approval, run:"
  echo "  bash \"$SETUP_SCRIPT\" --backend docker --install --yes"
  exit 1
}

# Mode 1 — direct docker (no Python). All you need is docker + the GPU runtime.
docker info >/dev/null 2>&1 || { echo "MISSING: docker daemon not reachable. Start Docker."; exit 1; }
docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi >/dev/null 2>&1 || {
  echo "MISSING: NVIDIA Container Toolkit not installed/configured. See:"
  echo "  bash \"$SETUP_SCRIPT\" --backend docker --install --yes"
  exit 1
}

# Mode 2 — TAO SDK wrapper. Adds Job handles, S3 I/O wrapping, ActionWorkflow.
# Skip this block if Mode 1 is sufficient for the user's request.
# When Mode 2 is in scope, read `tao-skill-bank:tao-run-platform` for the DockerSDK
# kwarg contract, build_entrypoint, and monitoring patterns.
# nvidia-tao-sdk is on public PyPI; pin lives in versions.yaml (wheels.tao_sdk_docker).
PIN=$("${TAO_SKILL_BANK_PATH:?}/scripts/resolve_versions_key.py" wheels.tao_sdk_docker)
python -c "import tao_sdk" 2>/dev/null || python -m pip install "$PIN"
python -c "import docker" 2>/dev/null || python -m pip install "$PIN"
python -c "import tao_sdk, docker"

# DockerSDK attaches every job container to ${DOCKER_NETWORK:-tao_default}.
# Create the network if it is missing; the operation is local and idempotent.
DOCKER_NETWORK_NAME="${DOCKER_NETWORK:-tao_default}"
docker network inspect "$DOCKER_NETWORK_NAME" >/dev/null 2>&1 || \
  docker network create "$DOCKER_NETWORK_NAME" >/dev/null

如果检查失败,代理会提示用户通过 Bash 授权安装/修复操作,然后才继续执行。上述可通过 pip 安装的 Python 依赖项和 Docker 网络创建属于例外情况:应自动安装/创建它们,然后重新运行预检查。

凭据

除访问 Docker 守护进程外,无需其他平台凭据。

可选环境变量:

  • DOCKER_HOST:可选的 Docker 守护进程 URL。若未设置,SDK 将使用 Docker Python 客户端的常规环境/默认套接字解析。此参数是 remote-docker 平台选项所必需。
  • DOCKER_NETWORK:作业容器的 Docker 网络。默认值为 tao_default.
  • DOCKER_USERNAME:注册表用户名。默认值是 $oauthtoken (针对 NGC)。
  • NGC_KEY:从 nvcr.io.
  • HOST_SSH_PATH:当 AutoML 脑容器需要 SSH 密钥 来监控远程 SLURM 子作业时,该路径将被挂载到容器中。
  • ACCESS_KEY、SECRET_KEY、S3_ENDPOINT_URL、S3_BUCKET_NAME: 针对仍需从本地容器读写云 存储的作业,可选的 S3 兼容存储设置。

启动前检查

在生成脚本或启动容器之前:

  1. 请验证 Docker 守护进程是否可达,NVIDIA Container Toolkit 是否已注册 为 Docker 运行时,GPU 及驱动程序版本是否已报告,以及测试 容器在启动前能否识别 GPU。对于远程 Docker,请通过 docker run ... nvidia-smi 远程守护进程查询 GPU;请勿使用 nvidia-smi 代理机上的本地资源。
  2. 验证每个本地/文件数据集的注释和媒体路径是否存在于 Docker 主机上。
  3. 对于 s3:// 数据集/结果,请验证 ACCESS_KEY 和 SECRET_KEY 已设置 且精确路径可通过 aws s3 ls。如果 aws 缺失, 请报告缺失的依赖项,并在安装前征得用户同意;安装完成后重新运行预检查 。
  4. 验证特定于模型的凭据,例如 HF_TOKEN 。
  5. 使用 nvidia-smi ,并在用户提出该约束条件时,避开已被 其他正在运行的作业占用的 GPU。在启动审核中显示所选的 GPU ID。
  6. 对于已知存在架构限制的模型/容器组合,请在启动前将 主机 GPU 计算能力与容器堆栈进行比较。如果 所选镜像无法针对主机架构进行 JIT 编译或运行内核,请尽早 阻止该操作,并要求提供兼容的镜像或平台。

尽可能使用打包的辅助工具进行这些检查:

${TAO_SKILL_BANK_PATH:-~/tao-skills-external}/scripts/check_tao_launch_preflight.py \
  --platform local-docker \
  --container-image "" \
  --path train_annotation=/abs/path/to/annotations.json \
  --path train_media=/abs/path/to/media

对于远程 Docker 守护进程,使用 remote-docker platform 并传递或导出 DOCKER_HOST。该辅助工具会验证远程 GPU/运行时的就绪状态,并通过只读绑定挂载检查 远程主机的数据集路径:

${TAO_SKILL_BANK_PATH:-~/tao-skills-external}/scripts/check_tao_launch_preflight.py \
  --platform remote-docker \
  --docker-host ssh://user@gpu-host \
  --container-image "" \
  --gpu-smoke-image ubuntu:22.04 \
  --path train_annotation=/remote/data/train/annotations.json \
  --path train_media=/remote/data/train

上述 --path 上述值必须存在于远程 Docker 主机上。请勿传递 仅存在于本地笔记本电脑或 Codex 主机上的路径。

多 GPU 和多节点

本地 Docker 不支持多节点。一个作业在本地 Docker 守护进程的主机上运行,且不进行跨主机协调。

本地主机的多GPU功能可通过NVIDIA Container Toolkit的 --gpus 标志(--gpus all 或 --gpus '"device=0,1,2,3"'). DockerSDK.create_job(gpu_count=N) 将请求转发至 --gpus)。单主机分布式初始化使用 localhost; torchrun --nproc-per-node=N 或 PyTorch DDP 均可照常运行。

后端详细信息

使用 SDK 后端值 local-docker。本地后端架构没有额外的 后端细节,因此大部分路由由环境和作业 参数控制:

{
  "backend_type": "local-docker",
  "num_gpu": 1
}

遵循 Brev SDK 的设计,平台/控制平面值保留在 SDK 状态和 Docker 标签中。SDK 不注入 BACKEND, HOST_PLATFORM, MONGOSECRET, DOCKER_HOST,也不会 DOCKER_NETWORK 注入到训练容器中。

容器执行

TAO SDK 的本地 Docker 处理程序通过 Docker Python 客户端启动容器:

  • 后端作业名称采用 tao-job- SDK 处理程序所采用的格式。
  • 命令通常为 ["/bin/bash", "-c", ""].
  • 容器以脱离模式运行。默认情况下,SDK 会保留容器,因此状态和 日志仍可查看,除非 DOCKER_AUTO_REMOVE=true.
  • /dev/shm 以 tmpfs 形式挂载。
  • Docker 守护进程会将配置的 Docker 网络应用到该任务 的容器上;该网络配置不会作为进程环境变量传递。
  • 在 替换容器启动之前,具有相同作业 ID 的现有容器会被停止并移除。

对于 GPU 访问,处理程序会自动检测主机类型:

  • Tegra 或 Jetson 主机使用 runtime="nvidia" 以及 NVIDIA_VISIBLE_DEVICES ,而 NVIDIA_DRIVER_CAPABILITIES=all.
  • 标准 x86 主机使用具有 device_requests 并具备 GPU 功能。

如果 num_gpus 为 0,则不分配任何GPU。如果 num_gpus 为 -1,则请求所有可见的 GPU。对于共享开发机器,应优先使用显式的GPU数量指定。 当有显式设备ID可用时,在共享机器上应优先使用这些ID,而非仅按数量选择, 以免启动过程占用其他任务正在使用的GPU。

存储

本地 Docker 支持本地和 file:// 路径,因为容器运行在 同一 Docker 主机上。请确保规范中的每个路径均满足以下条件之一:

  • 已由处理程序或外围服务挂载到容器中,
  • 或已可从容器内部访问,或
  • 带有匹配凭据的云 URI。

对于远程/共享文件系统,请优先选择拥有该文件系统的平台。 例如,在集群上使用 SLURM 配合 lustre:///... 在集群上处理 Lustre 路径。

监控

  • SDK 处理程序会直接映射 Docker 容器状态:已创建 -> 待处理, 正在运行/重启 -> 运行中,已暂停 -> 暂停,退出代码 0 -> 已完成, 非零退出代码 -> 错误。
  • 日志通过 Docker Python 客户端直接来自指定容器 (docker logs tao-job-).

如果容器已退出、已终止、正在被移除或无法找到,状态 核对机制将把后端进程视为已终止。

取消

取消操作将停止指定容器。GPU 所有权由 Docker / NVIDIA 运行时管理,而非由 TAO Core 的本地 GPU 管理器管理。

可选:通过 TAO SDK

若您需要作业句柄、通过 SDK 实现的 S3 I/O 封装 script_runner,或 跨会话持久化:

from tao_sdk.platforms.docker import DockerSDK

sdk = DockerSDK()  # reads DOCKER_HOST, NGC_KEY, S3 creds from env
job = sdk.create_job(
    image='nvcr.io/nvidia/tao/tao-toolkit:6.26.3-pyt',
    command='dino train -e /tmp/spec.yaml',
    gpu_count=1,
    inputs={'/data/train.json': 's3://bucket/coco/train.json'},
    outputs=['/results/'],
)

status = sdk.get_job_status(job.id)
logs = sdk.get_job_logs(job.id, tail=200)

这会封装相同的 docker run 调用封装在一个 Job 句柄中封装相同的调用,并将 入口点路由通过 script_runner ,从而 inputs/outputs 自动从 / 下载 或上传至 S3。若无需这些功能,只需直接使用 docker run 直接使用即可——无需安装 SDK。

故障模式

Docker 客户端未初始化:请确认已安装 Docker Python 包, 如果 DOCKER_HOST (若未使用默认本地套接字),并确认 进程能与守护进程通信。

GPU 分配失败:请求的 GPU 不可用,NVIDIA Container Toolkit 未配置,或者 Docker 守护进程无法创建 GPU 设备 请求。请减少 GPU 数量、等待其他任务完成,或确认 docker run --gpus ... 在主机上是否正常运行。

镜像拉取认证失败:请设置有效的 NGC_KEY 用于私有 nvcr.io 镜像 或运行 docker login nvcr.io -u '$oauthtoken' 。

容器意外退出:请检查 docker logs tao-job-、 配置 DOCKER_NETWORK以及 SDK 操作运行器生成的命令。

容器内路径不存在:主机上的本地路径未必 已挂载到作业容器中。请使用操作 运行器支持的路径约定,或通过外围服务配置显式的卷。

在 GitHub 上查看
---
name: tao-run-on-local-docker
description: Run TAO SDK jobs as Docker containers on a local or remote Docker daemon with NVIDIA GPU support, including preflight checks and credential handling.
license: Apache-2.0
---

# Local Docker

Single-node execution platform that runs TAO jobs as named Docker containers on
a Docker daemon. The daemon can be local to the agent host or remote through
`DOCKER_HOST=ssh://user@host` / a Docker context. It is useful for development,
debugging, small runs, and workflows where a local coding agent submits jobs to
a remote GPU box.

Use local Docker when the data is local to the Docker host or accessible through
mounted volumes/cloud credentials. Do not use it for remote cluster scheduling,
multi-node training, or jobs that need SLURM queueing.

Use remote Docker when the agent is running on a workstation or laptop but the
Docker daemon and GPUs are on another single GPU server. In remote Docker mode,
all local filesystem paths in specs are interpreted on the remote Docker host,
not on the agent machine.

## Preflight

The workflow must verify the host GPU runtime before starting Docker jobs. If
the check fails, prompt the user to approve the install, run the printed install
command, and rerun the preflight.

```bash
# Host GPU runtime: NVIDIA driver 580, CUDA 13.0, NVIDIA Container Toolkit 1.19.0.
TAO_SKILL_BANK_ROOT="${TAO_SKILL_BANK_ROOT:-$PWD}"
SETUP_SCRIPT="${TAO_SKILL_BANK_ROOT}/skills/platform/tao-setup-nvidia-gpu-host/scripts/setup-nvidia-gpu-host.sh"

bash "$SETUP_SCRIPT" --backend docker --check-only || {
  echo "MISSING: TAO GPU host runtime is not ready."
  echo "After user approval, run:"
  echo "  bash \"$SETUP_SCRIPT\" --backend docker --install --yes"
  exit 1
}

# Mode 1 — direct docker (no Python). All you need is docker + the GPU runtime.
docker info >/dev/null 2>&1 || { echo "MISSING: docker daemon not reachable. Start Docker."; exit 1; }
docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi >/dev/null 2>&1 || {
  echo "MISSING: NVIDIA Container Toolkit not installed/configured. See:"
  echo "  bash \"$SETUP_SCRIPT\" --backend docker --install --yes"
  exit 1
}

# Mode 2 — TAO SDK wrapper. Adds Job handles, S3 I/O wrapping, ActionWorkflow.
# Skip this block if Mode 1 is sufficient for the user's request.
# When Mode 2 is in scope, read `tao-skill-bank:tao-run-platform` for the DockerSDK
# kwarg contract, build_entrypoint, and monitoring patterns.
# nvidia-tao-sdk is on public PyPI; pin lives in versions.yaml (wheels.tao_sdk_docker).
PIN=$("${TAO_SKILL_BANK_PATH:?}/scripts/resolve_versions_key.py" wheels.tao_sdk_docker)
python -c "import tao_sdk" 2>/dev/null || python -m pip install "$PIN"
python -c "import docker" 2>/dev/null || python -m pip install "$PIN"
python -c "import tao_sdk, docker"

# DockerSDK attaches every job container to ${DOCKER_NETWORK:-tao_default}.
# Create the network if it is missing; the operation is local and idempotent.
DOCKER_NETWORK_NAME="${DOCKER_NETWORK:-tao_default}"
docker network inspect "$DOCKER_NETWORK_NAME" >/dev/null 2>&1 || \
  docker network create "$DOCKER_NETWORK_NAME" >/dev/null
```

If a check fails, the agent prompts the user to authorize the install/fix via Bash before proceeding. Pip-installable Python requirements and Docker network creation above are exceptions: install/create them automatically, then rerun preflight.

## Credentials

There are no platform credentials required beyond access to the Docker daemon.

Optional environment:

- **DOCKER_HOST**: Optional Docker daemon URL. If unset, the SDK uses the
  Docker Python client's normal environment/default socket resolution. Required
  for the `remote-docker` platform option.
- **DOCKER_NETWORK**: Docker network for job containers. Default is
  `tao_default`.
- **DOCKER_USERNAME**: Registry username. Default is `$oauthtoken` for NGC.
- **NGC_KEY**: Used when pulling private images from `nvcr.io`.
- **HOST_SSH_PATH**: Mounted into AutoML brain containers when they need SSH keys
  to monitor remote SLURM child jobs.
- **ACCESS_KEY**, **SECRET_KEY**, **S3_ENDPOINT_URL**, **S3_BUCKET_NAME**:
  Optional S3-compatible storage settings for jobs that still read/write cloud
  storage from a local container.

## Launch Preflight

Before generating scripts or starting containers:

1. Verify the Docker daemon is reachable, NVIDIA Container Toolkit is registered
   as a Docker runtime, GPUs and driver version are reported, and a smoke
   container can see GPUs before launch. For remote Docker, query GPUs through
   `docker run ... nvidia-smi` against the remote daemon; do not use local
   `nvidia-smi` from the agent machine.
2. Verify every local/file dataset annotation and media path exists on the
   Docker host.
3. For `s3://` datasets/results, verify `ACCESS_KEY` and `SECRET_KEY` are set
   and the exact paths are readable with `aws s3 ls`. If `aws` is missing,
   report the missing dependency and ask before installing it; rerun preflight
   after installation.
4. Verify model-specific credentials such as `HF_TOKEN` before launch.
5. Check current GPU occupancy with `nvidia-smi` and avoid GPUs already used by
   other running jobs when the user requested that constraint. Show the selected
   GPU ids in the launch review.
6. For model/container combinations with known architecture limits, compare
   host GPU compute capability with the container stack before launch. If the
   selected image cannot JIT or run kernels for the host architecture, block
   early and ask for a compatible image or platform.

Use the packaged helper for these checks when possible:

```bash
${TAO_SKILL_BANK_PATH:-~/tao-skills-external}/scripts/check_tao_launch_preflight.py \
  --platform local-docker \
  --container-image "<selected-image>" \
  --path train_annotation=/abs/path/to/annotations.json \
  --path train_media=/abs/path/to/media
```

For a remote Docker daemon, use the `remote-docker` platform and pass or export
`DOCKER_HOST`. The helper verifies remote GPU/runtime readiness and checks
remote-host dataset paths through read-only bind mounts:

```bash
${TAO_SKILL_BANK_PATH:-~/tao-skills-external}/scripts/check_tao_launch_preflight.py \
  --platform remote-docker \
  --docker-host ssh://user@gpu-host \
  --container-image "<selected-image>" \
  --gpu-smoke-image ubuntu:22.04 \
  --path train_annotation=/remote/data/train/annotations.json \
  --path train_media=/remote/data/train
```

The `--path` values above must exist on the remote Docker host. Do not pass
paths that exist only on the local laptop or Codex host.

## Multi-GPU and multi-node

**Multi-node is not supported on local Docker.** One job runs on the local Docker daemon's host with no cross-host coordination.

Multi-GPU **on the local host** is supported via the NVIDIA Container Toolkit's `--gpus` flag (`--gpus all` or `--gpus '"device=0,1,2,3"'`). `DockerSDK.create_job(gpu_count=N)` plumbs through to `--gpus`. Single-host distributed init uses `localhost`; `torchrun --nproc-per-node=N` or PyTorch DDP work as usual.

## Backend Details

Use the SDK backend value `local-docker`. The local backend schema has no extra
backend details, so most routing is controlled by environment and job
parameters:

```json
{
  "backend_type": "local-docker",
  "num_gpu": 1
}
```

Following the Brev SDK design, platform/control-plane values stay in SDK
state and Docker labels. The SDK does not inject `BACKEND`, `HOST_PLATFORM`,
`MONGOSECRET`, `DOCKER_HOST`, or `DOCKER_NETWORK` into the training container.

## Container Execution

The TAO SDK local Docker handler starts containers through the Docker Python
client:

- Backend job name uses the `tao-job-<job_id>` form used by SDK handlers.
- Command is usually `["/bin/bash", "-c", "<job command>"]`.
- Containers run detached. The SDK keeps containers by default so status and
  logs remain inspectable, unless `DOCKER_AUTO_REMOVE=true`.
- `/dev/shm` is mounted as tmpfs.
- The configured Docker network is applied by the Docker daemon for the job
  container; it is not passed through as a process environment variable.
- Existing containers with the same job id are stopped and removed before a
  replacement starts.

For GPU access, the handler auto-detects the host type:

- Tegra or Jetson hosts use `runtime="nvidia"` plus
  `NVIDIA_VISIBLE_DEVICES` and `NVIDIA_DRIVER_CAPABILITIES=all`.
- Standard x86 hosts use Docker `device_requests` with GPU capabilities.

If `num_gpus` is `0`, no GPUs are assigned. If `num_gpus` is `-1`, all visible
GPUs are requested. Prefer explicit GPU counts for shared development machines.
When explicit device ids are available, prefer them over count-only selection
on shared machines so the launch does not steal GPUs occupied by other tasks.

## Storage

Local Docker accepts local and `file://` paths because the container runs on the
same Docker host. Make sure every path in the spec is either:

- mounted into the container by the handler or surrounding service,
- reachable from inside the container already, or
- a cloud URI with matching credentials.

For remote/shared filesystems, prefer the platform that owns that filesystem.
For example, use SLURM plus `lustre:///...` for Lustre paths on a cluster.

## Monitoring

- The SDK handler maps Docker container state directly: created -> Pending,
  running/restarting -> Running, paused -> Paused, exit code 0 -> Complete,
  nonzero exit -> Error.
- Logs come directly from the named container through the Docker Python client
  (`docker logs tao-job-<job_id>`).

If the container has exited, died, is being removed, or cannot be found, status
reconciliation treats the backend process as terminated.

## Cancellation

Cancellation stops the named container. GPU ownership is managed by Docker /
the NVIDIA runtime, not by TAO Core's local GPU manager.

## Optional: via the TAO SDK

If you want Job handles, S3 I/O wrapping via the SDK's `script_runner`, or
durability across sessions:

```python
from tao_sdk.platforms.docker import DockerSDK

sdk = DockerSDK()  # reads DOCKER_HOST, NGC_KEY, S3 creds from env
job = sdk.create_job(
    image='nvcr.io/nvidia/tao/tao-toolkit:6.26.3-pyt',
    command='dino train -e /tmp/spec.yaml',
    gpu_count=1,
    inputs={'/data/train.json': 's3://bucket/coco/train.json'},
    outputs=['/results/'],
)

status = sdk.get_job_status(job.id)
logs = sdk.get_job_logs(job.id, tail=200)
```

This wraps the same `docker run` invocation under a `Job` handle and routes
the entrypoint through `script_runner` so `inputs`/`outputs` get downloaded
from / uploaded to S3 automatically. If you don't need those, just use
`docker run` directly — no SDK install required.

## Failure Modes

**Docker client not initialized**: Verify the Docker Python package is installed,
set `DOCKER_HOST` if you are not using the default local socket, and confirm the
process can talk to the daemon.

**GPU assignment failed**: Requested GPUs are unavailable, the NVIDIA Container
Toolkit is not configured, or the Docker daemon cannot create GPU device
requests. Use fewer GPUs, wait for another job to finish, or verify
`docker run --gpus ...` works on the host.

**Image pull auth failed**: Set a valid `NGC_KEY` for private `nvcr.io` images
or run `docker login nvcr.io -u '$oauthtoken'` on the Docker host.

**Container exited unexpectedly**: Check `docker logs tao-job-<job_id>`, the
configured `DOCKER_NETWORK`, and the command produced by the SDK action runner.

**Path missing inside container**: A local path on the host is not necessarily
mounted into the job container. Use a path convention supported by the action
runner or configure an explicit volume through the surrounding service.

安装 tao-run-on-local-docker

下载技能文件并将其解压到 .claude/skills/ 目录中。

下载ZIP

克隆仓库并复制技能文件到您的项目中。

git clone https://github.com/NVIDIA/skills/tree/main/skills/tao-run-on-local-docker # Copy SKILL.md to your .claude/skills/ directory

复制 复制
快速设置: 将技能文件夹复制到 .claude/skills/ Claude 会自动检测并使用该技能
仓库 NVIDIA/skills

相关技能

Verification &amp; Quality Assurance
更新时间 2026-06-29
klingai-upgrade-migration
更新时间 2026-07-03
base44-cli
更新时间 2026-06-29
Railway CLI Management
更新时间 2026-07-02
OR